Расхождения результата тестера с торгующем советником.

 

Есть советник который торгует каждый день до определенного результата в $. Он складывает все закрытые позиции из истории и открытые текущие позиции. Когда профит достиг ждет следующего дня.
К примеру, советник прошел три дня, и по профиту заработал каждый день по 50$, итого должно быть 150$ за три дня, а в итоге в отчете пишет что чистая прибыль 40$, общая прибыль 115, общий убыток -75.
Как так я не понимаю. Подскажите где моя ошибка?


Есть две функции которые это считают. Если цена достигда профита, закрываются все ордера

//+------------------------------------------------------------------+
void OnTick()
  {
        if(CalculateProfitHistory() + CalculateProfitTrade() <= 50)
        {
         CloseAll();
        }
}
//+------------------------------------------------------------------+
double CalculateProfitHistory()
  {
   double oProfit = 0;
   for(int i = OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
        {
         if(OrderSymbol() == Symbol()&& OrderMagicNumber() == Magic)
           {
            if(OrderType() == OP_BUY || OrderType() == OP_SELL)
              {
               oProfit += OrderProfit();
              }
           }
        }
     }

   return(oProfit);
  }
//+------------------------------------------------------------------+
double CalculateProfitTrade()
  {
   double oProfit = 0;
   for(int i = OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
        {
         if(OrderSymbol() == Symbol()&& OrderMagicNumber() == Magic)
           {
            if(OrderType() == OP_BUY || OrderType() == OP_SELL)
              {
               oProfit += OrderProfit();
              }
           }
        }
     }


   return(oProfit);
  }
//+------------------------------------------------------------------+
void CloseAll()
  {
   for(int i = OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
        {
         if(OrderSymbol() == Symbol()&& OrderMagicNumber() == Magic)
           {
            if(OrderType() == OP_BUY)
              {
               if(!OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, Green))
                  Print("Не удалось закрыть ордер на покупку!");
              }
            if(OrderType() == OP_SELL)
              {
               if(!OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, Red))
                  Print("Не удалось закрыть ордер на продажу!");
              }
           }
        }
     }
  }
 
weblatters:

Есть советник который торгует каждый день до определенного результата в $. Он складывает все закрытые позиции из истории и открытые текущие позиции. Когда профит достиг ждет следующего дня.
К примеру, советник прошел три дня, и по профиту заработал каждый день по 50$, итого должно быть 150$ за три дня, а в итоге в отчете пишет что чистая прибыль 40$, общая прибыль 115, общий убыток -75.
Как так я не понимаю. Подскажите где моя ошибка?


Есть две функции которые это считают. Если цена достигда профита, закрываются все ордера

Если вы работаете с историей, то и кол-во надо брать с истории

//+------------------------------------------------------------------+
double CalculateProfitHistory()
  {
   double oProfit = 0;
   for(int i = OrdersTotal()-1; i>=0; i--) // OrdersHistoryTotal
     {
      if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
        {
         if(OrderSymbol() == Symbol()&& OrderMagicNumber() == Magic)
           {
            if(OrderType() == OP_BUY || OrderType() == OP_SELL)
              {
               oProfit += OrderProfit();
              }
           }
        }
     }

   return(oProfit);
  }

p.s. код написан корявенько.

 
Nikita Chernyshov #:

Если вы работаете с историей, то и кол-во надо брать с истории

p.s. код написан корявенько.

Спасибо!!!
Да, может код и кривоват) но я учусь...

 
weblatters #:

Спасибо!!!
Да, может код и кривоват) но я учусь...

Теперь встал еще один вопрос. Как сбросить счетчики по истории + профит при достижении профита?

 
weblatters #:

Теперь встал еще один вопрос. Как сбросить счетчики по истории + профит при достижении профита?

Там, где нужно остановиться в цикле, в этой точке пишите break

 
Nikita Chernyshov #:

Там, где нужно остановиться в цикле, в этой точке пишите break

Спасибо. Я уже решил эту задачу. Если интересно, то она здесь https://www.mql5.com/ru/forum/379784#comment_25268685

Как сбросить счетчики ордеров в истории?
Как сбросить счетчики ордеров в истории?
  • 2021.10.15
  • www.mql5.com
Есть советник который торгует каждый день до определенного результата в $. Он складывает все закрытые позиции из истории и открытые текущие позиции...
Причина обращения: