Уважаемые форумчане, не могли бы вы подсказать как учитывать срабатывание лоссов в советнике. Есть необходимость, чтобы советник закрывался после двух лоссов подряд. Я пробовал вот так:
extern int Losses = 0;
int orders=HistoryTotal(); // history orders total
for(int ii=orders-1;ii>=0;ii--)
{
if(OrderSelect(ii,SELECT_BY_POS, MODE_HISTORY)==false) { Print("Error in history!");
break; }
if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;
//----
if(OrderProfit()>0) break;
if(OrderProfit()<0) Losses++;
}
Беда в том, что после срабатывания стоп-лосов советник более не запускается, ибо переменную Losses обнулить невозможно - она всё равно приобретает ненулевое значение, черпая его из недавней истории -)).
Не могли бы вы присоветовать, как можно учитывать лоссы, чтобы потом при перезапуске советника они более не учитывались?
Заранее благодарен...
Сергей
void PostLoss(){ datetime oct; int j=-1; if(OrdersHistoryTotal()!=0){ for(int i=OrdersHistoryTotal()-1;i>=0;i--){ if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) continue; if(OrderSymbol()!=Symbol())continue; if(OrderMagicNumber()==Sell||OrderMagicNumber()==Buy){ if (oct<OrderCloseTime()) { oct=OrderCloseTime(); j=i;} if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) { int tik=OrderTicket(); if(GlobalVariableGet("tik")!=tik){ GlobalVariableSet("tik",tik); if(OrderProfit()>0){GlobalVariableSet("seriy",0);} if(OrderProfit()<0){ double a=GlobalVariableGet("seriy"); double b=a+1; GlobalVariableSet("seriy",b); }}}}}}} int init() { GlobalVariableSet("tik",0); GlobalVariableSet("seriy",0);
void PostLoss(){ datetime oct; int j=-1; if(OrdersHistoryTotal()!=0){ for(int i=OrdersHistoryTotal()-1;i>=0;i--){ if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) continue; if(OrderSymbol()!=Symbol())continue; if(OrderMagicNumber()==Sell||OrderMagicNumber()==Buy){ if (oct<OrderCloseTime()) { oct=OrderCloseTime(); j=i;} if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) { int tik=OrderTicket(); if(GlobalVariableGet("tik")!=tik){ GlobalVariableSet("tik",tik); if(OrderProfit()>0){GlobalVariableSet("seriy",0);} if(OrderProfit()<0){ double a=GlobalVariableGet("seriy"); double b=a+1; GlobalVariableSet("seriy",b); }}}}}}} int init() { GlobalVariableSet("tik",0); GlobalVariableSet("seriy",0);
void PostLoss(){ datetime oct; int j=-1; if(OrdersHistoryTotal()!=0){ for(int i=OrdersHistoryTotal()-1;i>=0;i--){ if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) continue; if(OrderSymbol()!=Symbol())continue; if(OrderMagicNumber()==Sell||OrderMagicNumber()==Buy){ if (oct<OrderCloseTime()) { oct=OrderCloseTime(); j=i;} if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) { int tik=OrderTicket(); if(GlobalVariableGet("tik")!=tik){ GlobalVariableSet("tik",tik); if(OrderProfit()>0){GlobalVariableSet("seriy",0);} if(OrderProfit()<0){ double a=GlobalVariableGet("seriy"); double b=a+1; GlobalVariableSet("seriy",b); }}}}}}} int init() { GlobalVariableSet("tik",0); GlobalVariableSet("seriy",0);
int start() { PostLoss();и она будет считать убыточную серию если прибыль обнулится а если опять убытки то будет считать серию убытков
[quote]Беда в том, что после срабатывания стоп-лосов советник более не запускается, ибо переменную Losses обнулить невозможно - она всё равно приобретает ненулевое значение, черпая его из недавней истории -)).
[/quote]
Оставь ее там же, только убери слово extern.
extern int Losses = 0; int orders=HistoryTotal(); // history orders total datetime StartTime; int init() { StartTime = TimeCurrent(); } for(int ii=orders-1;ii>=0;ii--) { if(OrderSelect(ii,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Error in history!"); break; } if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue; //---- if(OrderProfit()>0) break; if(OrderProfit()<0 && OrderCloseTime() > StartTime) Losses++; }По-моему так проще и без применения глобальных переменных.
!!!!!! Спасибо!!!!!!!!
Откройте тайну, зачем Losses объявлять extern?
Другое дело, что пытаться инкрементировать константу инпут-параметра - ошибка.
Но это уже чисто программерские штучки (типа читайте основы программирования на любом языке мира).
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Уважаемые форумчане, не могли бы вы подсказать как учитывать срабатывание лоссов в советнике. Есть необходимость, чтобы советник закрывался после двух лоссов подряд. Я пробовал вот так:
extern int Losses = 0;
int orders=HistoryTotal(); // history orders total
for(int ii=orders-1;ii>=0;ii--)
{
if(OrderSelect(ii,SELECT_BY_POS, MODE_HISTORY)==false) { Print("Error in history!"); break; }
if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;
//----
if(OrderProfit()>0) break;
if(OrderProfit()<0) Losses++;
}
Беда в том, что после срабатывания стоп-лосов советник более не запускается, ибо переменную Losses обнулить невозможно - она всё равно приобретает ненулевое значение, черпая его из недавней истории -)).
Не могли бы вы присоветовать, как можно учитывать лоссы, чтобы потом при перезапуске советника они более не учитывались?
Заранее благодарен...
Сергей