Ответить
10.05.2012, 07:52
Аватар для A1ex
A1ex A1ex вне форума ~~~~~
Регистрация: 17.01.2009 / Сообщений: 6,662
Поблагодарили 9,279 раз(а) / Репутация: 9284
  • Отправить сообщение для A1ex с помощью ICQ

По умолчанию Добавляем функцию lock (лок) в исходный код советника

1. В исходный код советника добавляем переменные.

Скрытый текст

extern double Risk = 5;
extern int lock_min_step = 30; //ограничение на минимальный шаг, чтобы не получилось каждый пипс новый лок
extern int lock_part = 2; //насколько частей будем дробить убыток который находится в рынке, если 2 то значит на 1/2
string lock_signalsymbol = "EURUSD";
static double lock_eqviti,lock_last, lock_lot;
static bool lock_flag,flagADX,old_uptrend;

2. Функцию start() переименовываем в start_main() и добавляем над ней:
int start(){
double AccountRisk = (AccountBalance()-AccountEquity())/AccountBalance()*100;
if (AccountRisk >Risk) lock_flag=true;
if(OrdersTotal()<1){lock_eqviti=AccountBalance();lock_last = Close[0];}
if(lock_flag) start_lock(); else start_main();
return(0);
}

3. В функцию init() добавляем
int init(){
init_lock();
return(0);
}

4. Ниже добавляем:
int init_lock(){
lock_eqviti=AccountBalance();
lock_lot = 0;
lock_last = Close[0];
flagADX=true;
old_uptrend=false;
signal();
lock_flag = false;
return(0);
}

void start_lock(){
int sig,step;
if(OrdersTotal()<1){init_lock();return(0);}
notakeprofit();
if (AccountEquity()>=lock_eqviti){CloseAllFirstProfit();init_lock();return(0);}
else{
sig=signal();
step =MathAbs(sig);
if (step<lock_min_step) return(0);
if (Ask>lock_last+(step*Point) && sig>0 ){
if (lock_lot==0)lock_lot=NormalizeLot(GetAmountLotFromOpenPos("", OP_SELL,-1)/lock_part);
RefreshRates();
OrderSend(Symbol(),OP_BUY,lock_lot,Ask,5,0,0,"lock",0,Blue);
lock_last = Ask;
}
if (Bid<lock_last-(step*Point) && sig<0){
if (lock_lot==0) lock_lot=NormalizeLot(GetAmountLotFromOpenPos("", OP_BUY,-1)/lock_part);
RefreshRates();
OrderSend(Symbol(),OP_SELL,lock_lot,Bid,5,0,0,"lock",0,Blue);
lock_last = Bid;
}
}
return;
}

int signal() {
int i, j, result;
double smin, smax, SsMax, SsMin, SSP, price,KanalMin,KanalMax;
SSP = MathCeil(150 / iADX(lock_signalsymbol, PERIOD_M5, 14, PRICE_TYPICAL, MODE_MAIN, 1));
for (j = 120; j >= 0; j--) {
SsMax = iHigh(lock_signalsymbol, PERIOD_M5,j);SsMin = iLow(lock_signalsymbol, PERIOD_M5,j);
for (i = j; i <= j + SSP - 1; i++) {
price = iHigh(lock_signalsymbol, PERIOD_M5,i);
if (SsMax < price)SsMax = price;
price = iLow(lock_signalsymbol, PERIOD_M5,i);if (SsMin >= price)SsMin = price;}
smin = SsMin + (SsMax - SsMin)*0.30;smax = SsMax - (SsMax - SsMin)*0.30;
if (iClose(lock_signalsymbol, PERIOD_M5,j) < smin) {flagADX = false; KanalMin = smin;}
if (iClose(lock_signalsymbol, PERIOD_M5,j) > smax) {flagADX = true; KanalMax=smax;}
result = 0;
if (flagADX != old_uptrend && flagADX == true) result = +1;
if (flagADX != old_uptrend && flagADX == false) result = -1;
old_uptrend = flagADX;
}
if (Digits==5)return(MathAbs(NormalizeDouble((KanalMax-KanalMin)/Point/10,0))*result);
if (Digits==4)return(MathAbs(NormalizeDouble((KanalMax-KanalMin)/Point,0))*result);
}

void CloseAllFirstProfit() {
int i, k=OrdersTotal();
for (i=k-1; i>=0; i--) if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) if (OrderType()==OP_BUY || OrderType()==OP_SELL) if (OrderProfit()+OrderSwap()>0) ClosePosBySelect();
k=OrdersTotal();
for (i=k-1; i>=0; i--) if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) if (OrderType()==OP_BUY || OrderType()==OP_SELL) ClosePosBySelect();
}

void ClosePosBySelect() {
if (OrderType()==OP_BUY) OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 100, CLR_NONE);
if (OrderType()==OP_SELL) OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 100, CLR_NONE);
}

double GetAmountLotFromOpenPos(string sy="", int op=-1, int mn=-1) {
double l=0;
int i,k=OrdersTotal();
if (sy=="0") sy=Symbol();
for (i=0; i<k; i++) if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) if (OrderSymbol()==sy || sy=="") if (OrderType()==OP_BUY || OrderType()==OP_SELL) if (op<0 || OrderType()==op) if (mn<0 || OrderMagicNumber()==mn) l+=OrderLots();
return(l);
}

bool notakeprofit(){
bool ok=true;
for (int i=OrdersTotal(); i >=0; i--) if ( OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) if (OrderSymbol() == Symbol() && OrderTakeProfit()>0){ OrderModify(OrderTicket(), OrderOpenPrice(), OrderStopLoss(),NormalizeDouble(0,Digits), 0, CLR_NONE);ok=false;return(ok);}
return(ok);
}

double NormalizeLot(double lo, bool ro=True, string sy="") {
double l, k;
if (sy=="" || sy=="0") sy=Symbol();
double ls=MarketInfo(sy, MODE_LOTSTEP);
double ml=MarketInfo(sy, MODE_MINLOT);
double mx=MarketInfo(sy, MODE_MAXLOT);
if (ml==0) ml=0.1;
if (mx==0) mx=100;
if (ls>0) k=1/ls; else k=1/ml;
if (ro) l=MathCeil(lo*k)/k; else l=MathFloor(lo*k)/k;
if (l<ml) l=ml;
if (l>mx) l=mx;
return(l);
}
[свернуть]

Последний раз редактировалось Ирина К; 30.05.2014 в 21:16.
10.05.2012, 08:57
Аватар для SW111
SW111 SW111 вне форума Friend Of Rigden
Регистрация: 06.07.2011 / Адрес: желаю слинять в ОАЭ на ПМЖ / Сообщений: 2,089
Поблагодарили 3,497 раз(а) / Репутация: 3499
хмм...может научите как код статистки вставить в любого робота?
код статистики прилагаю...
10.05.2012, 09:01
Аватар для A1ex
A1ex A1ex вне форума ~~~~~
Регистрация: 17.01.2009 / Сообщений: 6,662
Поблагодарили 9,279 раз(а) / Репутация: 9284
  • Отправить сообщение для A1ex с помощью ICQ
хмм...может научите как код статистки вставить в любого робота?
код статистики прилагаю...
Вы сами скачать пробовали? Для статы лучше использовать сову:

Последний раз редактировалось A1ex; 10.05.2012 в 09:04.
10.05.2012, 09:41
Аватар для sly
sly sly вне форума Местный житель
Регистрация: 15.11.2008 / Сообщений: 296
Поблагодарили 282 раз(а) / Репутация: 282
Добавте пожалуйста в этот советник функцию лок при достижении определённого % от депо.
10.05.2012, 09:50
Аватар для A1ex
A1ex A1ex вне форума ~~~~~
Регистрация: 17.01.2009 / Сообщений: 6,662
Поблагодарили 9,279 раз(а) / Репутация: 9284
  • Отправить сообщение для A1ex с помощью ICQ
Добавте пожалуйста в этот советник функцию лок при достижении определённого % от депо.
С этим не ко мне. Могу добавить только то что написано.
tai78 
10.05.2012, 11:22
Аватар для SW111
SW111 SW111 вне форума Friend Of Rigden
Регистрация: 06.07.2011 / Адрес: желаю слинять в ОАЭ на ПМЖ / Сообщений: 2,089
Поблагодарили 3,497 раз(а) / Репутация: 3499
Вы сами скачать пробовали? Для статы лучше использовать сову:
пробовал...хрень какая-то...

а в вашей сове многа букав...ниасилил...

но вы натолкнули меня на мысль...спасиба...
10.05.2012, 11:26
Аватар для tai78
tai78 tai78 вне форума Новичок форума
Регистрация: 08.07.2010 / Сообщений: 95
Поблагодарили 11 раз(а) / Репутация: 12
попробовал добавить, выдал вот такие ошибки
'GetAmountLotFro' - variable not defined D:\Disk C\÷àñòü äèñêà Ä\MetaTrader Finam\experts\Dracula Forex Robot V _II.mq4 (2709, 39)

if (lock_lot==0)lock_lot=NormalizeLot(GetAmountLotFro mOpenPos("", OP_SELL,-1)/lock_part);

'KanalMa' - variable not defined D:\Disk C\часть диска Д\MetaTrader Finam\experts\Dracula Forex Robot V _II.mq4 (2742, 47)
'x' - variable not defined D:\Disk C\часть диска Д\MetaTrader Finam\experts\Dracula Forex Robot V _II.mq4 (2742, 55)

if (Digits==5)return(MathAbs(NormalizeDouble((KanalMa x-KanalMin)/Point/10,0))*result);
if (Digits==4)return(MathAbs(NormalizeDouble((KanalMa x-KanalMin)/Point,0))*result);

Все дошло,спасибо,в коде есть орфографичесие ошибки.

Последний раз редактировалось tai78; 10.05.2012 в 11:49. Причина: разобрался (орфографические ошибки)
10.05.2012, 11:55
Регистрация: 05.01.2012 / Сообщений: 1,149
Поблагодарили 7,802 раз(а) / Репутация: 7846
попробовал добавить, выдал вот такие ошибки
Видимо неправильно прописали. Функции.
Замените в советнике start() на start_main(), а функцию лока
int start(){
double AccountRisk = (AccountBalance()-AccountEquity())/AccountBalance()*100;
if (AccountRisk >Risk) lock_flag=true;
if(OrdersTotal()<1){lock_eqviti=AccountBalance();l ock_last = Close[0];}
if(lock_flag) start_lock(); else start_main();
return(0);
}

пропишите в советник выше start_main()
4. Ниже добавляем: это в самый конец советника.
Ну и init() по схеме. также и в шапке советника 1. В исходный код.....
10.05.2012, 12:06
Аватар для tai78
tai78 tai78 вне форума Новичок форума
Регистрация: 08.07.2010 / Сообщений: 95
Поблагодарили 11 раз(а) / Репутация: 12
Видимо неправильно прописали. Функции.
Замените в советнике start() на start_main(), а функцию лока
int start(){
double AccountRisk = (AccountBalance()-AccountEquity())/AccountBalance()*100;
if (AccountRisk >Risk) lock_flag=true;
if(OrdersTotal()<1){lock_eqviti=AccountBalance();l ock_last = Close[0];}
if(lock_flag) start_lock(); else start_main();
return(0);
}
пропишите в советник выше start_main()
4. Ниже добавляем: это в самый конец советника.
Ну и init() по схеме. также и в шапке советника 1. В исходный код.....
Да нее,там просто в коде ошибки я так понял вот эти:l ock_last ...
тоесть стоят пробелы я их убрал и перестал ругатся,тока бы терь понять что это сработал лок в советнике,пока тока замечаю что при просадке в 5% он закрывает все позиции.
10.05.2012, 12:17
Регистрация: 05.01.2012 / Сообщений: 1,149
Поблагодарили 7,802 раз(а) / Репутация: 7846
Да нее,там просто в коде ошибки я так понял вот эти:l ock_last ...
тоесть стоят пробелы я их убрал и перестал ругатся,тока бы терь понять что это сработал лок в советнике,пока тока замечаю что при просадке в 5% он закрывает все позиции.
Попробуйте так.
int start(){
if (AccountProfit()<-Профит) lock_flag=true;
if(OrdersTotal()<1){lock_eqviti=AccountBalance();l ock_last = Close[0];}
if(lock_flag) start_lock(); else start_main();
return(0);
}
Профит замените на риск и тогда будет от просадки в валюте.
11.05.2012, 15:58
Аватар для sly
sly sly вне форума Местный житель
Регистрация: 15.11.2008 / Сообщений: 296
Поблагодарили 282 раз(а) / Репутация: 282
Попробуйте так.
int start(){
if (AccountProfit()<-Профит) lock_flag=true;
if(OrdersTotal()<1){lock_eqviti=AccountBalance();l ock_last = Close[0];}
if(lock_flag) start_lock(); else start_main();
return(0);
}
Профит замените на риск и тогда будет от просадки в валюте.
Попробуйте вы добавить лок в сову, может получится.

Последний раз редактировалось sly; 11.05.2012 в 16:15.
11.05.2012, 16:59
Регистрация: 05.01.2012 / Сообщений: 1,149
Поблагодарили 7,802 раз(а) / Репутация: 7846
Попробуйте вы добавить лок в сову, может получится.
Пояснения в коде.

Последний раз редактировалось strannik-ps; 23.02.2015 в 01:11.
sly 
11.05.2012, 17:49
Аватар для sly
sly sly вне форума Местный житель
Регистрация: 15.11.2008 / Сообщений: 296
Поблагодарили 282 раз(а) / Репутация: 282
Пояснения в коде.
Золотой вы человек я пока ещё толком не разобрался с этим локом но уже вижу что безопасная торговля стала. СПАСИБО!
11.05.2012, 17:50
Аватар для sly
sly sly вне форума Местный житель
Регистрация: 15.11.2008 / Сообщений: 296
Поблагодарили 282 раз(а) / Репутация: 282
Пояснения в коде.
Есть тема одна? за денежку возмётесь написать бота?
13.05.2012, 10:23
Аватар для tai78
tai78 tai78 вне форума Новичок форума
Регистрация: 08.07.2010 / Сообщений: 95
Поблагодарили 11 раз(а) / Репутация: 12
Попробуйте так.
int start(){
if (AccountProfit()<-Профит) lock_flag=true;
if(OrdersTotal()<1){lock_eqviti=AccountBalance();l ock_last = Close[0];}
if(lock_flag) start_lock(); else start_main();
return(0);
}
Профит замените на риск и тогда будет от просадки в валюте.
а что надо прописать в коде и как это выглядит, чтоб было видно хотяб в журнале что сработал ЛОК?
13.05.2012, 10:52
Регистрация: 05.01.2012 / Сообщений: 1,149
Поблагодарили 7,802 раз(а) / Репутация: 7846
а что надо прописать в коде и как это выглядит, чтоб было видно хотяб в журнале что сработал ЛОК?
Пост #12 для примера.
А для отображения в журнале отвечает функция Print на Code Base много описано про нее.
tai78 
13.05.2012, 11:12
Аватар для tai78
tai78 tai78 вне форума Новичок форума
Регистрация: 08.07.2010 / Сообщений: 95
Поблагодарили 11 раз(а) / Репутация: 12
Пост #12 для примера.
А для отображения в журнале отвечает функция Print на Code Base много описано про нее.
я по 12 посту и переделал,но там вроде нет информационной функции о срабатывании лока
14.05.2012, 16:13
Аватар для tai78
tai78 tai78 вне форума Новичок форума
Регистрация: 08.07.2010 / Сообщений: 95
Поблагодарили 11 раз(а) / Репутация: 12
Пост #12 для примера.
А для отображения в журнале отвечает функция Print на Code Base много описано про нее.
посмотрите пожалуйста правильно ли я вставил лок,почемуто в тестере тестируется тока когда меняешь risk и просадку, тоесть от этого меняется торговля ее режим, но при изменении параметра lock_part - торговля неменяется((. И должно ли всегда отображатся когда нажимаешь открыть график после тестирования-сам ADX, у меня отобразился лишь тока раз и то когда risk ставишь 100, если поставить другое значение то он неотображается.
14.05.2012, 16:28
Регистрация: 05.01.2012 / Сообщений: 1,149
Поблагодарили 7,802 раз(а) / Репутация: 7846
посмотрите пожалуйста правильно ли я вставил лок,почемуто в тестере тестируется тока когда меняешь risk и просадку, тоесть от этого меняется торговля ее режим, но при изменении параметра lock_part - торговля неменяется((. И должно ли всегда отображатся когда нажимаешь открыть график после тестирования-сам ADX, у меня отобразился лишь тока раз и то когда risk ставишь 100, если поставить другое значение то он неотображается.
Попробуй с Такими изменениями. А лучше будет убрать риск, чтоб от просадки в валюте работал.

Последний раз редактировалось strannik-ps; 23.02.2015 в 01:11.
14.05.2012, 17:00
Аватар для tai78
tai78 tai78 вне форума Новичок форума
Регистрация: 08.07.2010 / Сообщений: 95
Поблагодарили 11 раз(а) / Репутация: 12
Попробуй с Такими изменениями. А лучше будет убрать риск, чтоб от просадки в валюте работал.
хорошо,сейчас попробую, а в валюте тогда как получится,если я правильно понял, ставлю скажем при просадке в 200, советник будет открывать локирующий лот через каждые 200$ просадки, а соответственно так как включен мартин и при увеличении лота он скажем откроет лотом 1 и пойдет от этого лота просадка еще 200, а лот то большой и просадка на 200 быстро получится он откроет еще пусть следующий лот 1.5 и опять же не в нашу сторону,может сильно в минус уйти,будет прибавлятся и прибавлятся,тоесть "Параметр просадка" надо тоже чтоб скажем увеличивался при увеличении лота,надеюсь вы меня поняли что я хотел сказать)))
Ответить


Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Выкл.
Pingbacks are Выкл.
Refbacks are Выкл.



Текущее время: 02:43. Часовой пояс GMT.


Перевод: zCarot
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
SEO by vBSEO