Учет лоссов

[Удален]  

Уважаемые форумчане, не могли бы вы подсказать как учитывать срабатывание лоссов в советнике. Есть необходимость, чтобы советник закрывался после двух лоссов подряд. Я пробовал вот так:

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 обнулить невозможно - она всё равно приобретает ненулевое значение, черпая его из недавней истории -)).

Не могли бы вы присоветовать, как можно учитывать лоссы, чтобы потом при перезапуске советника они более не учитывались?

Заранее благодарен...

Сергей

[Удален]  
Sserg777:

Уважаемые форумчане, не могли бы вы подсказать как учитывать срабатывание лоссов в советнике. Есть необходимость, чтобы советник закрывался после двух лоссов подряд. Я пробовал вот так:

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);
[Удален]  
lovova:
Вчера подобную проблему решал вот что получилось работает как мне надо
 
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);
Понимаю, что испытываю ваше терпение, но к своему стыду не могу понять как использовать эту функцию... Какую переменную вытаскивать в start для того, чтобы увидеть, что лосс случился... Прошу прощения за слабое знание языка...
[Удален]  
Sserg777:
lovova:
Вчера подобную проблему решал вот что получилось работает как мне надо
 
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);
Понимаю, что испытываю ваше терпение, но к своему стыду не могу понять как использовать эту функцию... Какую переменную вытаскивать в start для того, чтобы увидеть, что лосс случился... Прошу прощения за слабое знание языка...
Просто
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++;
         
        }
По-моему так проще и без применения глобальных переменных.
[Удален]  
Scriptong:По-моему так проще и без применения глобальных переменных.

!!!!!! Спасибо!!!!!!!!
 
Откройте тайну, зачем Losses объявлять extern?
[Удален]  
Roger:
Откройте тайну, зачем Losses объявлять extern?
Надо полагать для того, чтобы в Losses хранилось определяемое пользователем значение, в данном случае - кол-во допустимых убыточных ордеров.
Другое дело, что пытаться инкрементировать константу инпут-параметра - ошибка.
Но это уже чисто программерские штучки (типа читайте основы программирования на любом языке мира).