Вопрос по закрытым ордерам

 

Нашёл код возврата прибыли за текущий день взамен нерабочему, который подсчитывает исключительно по открытым ордерам.

Сам код:


double Earn(datetime startDate = 0)
{
   double result = 0;
  
   for (int i = 0; i <= OrdersHistoryTotal(); i++)
   {
      if (OrderSelect(i,SELECT_BY_POS, MODE_HISTORY))
      {
         if(OrderMagicNumber()==Magic)
         {
            if (startDate < OrderCloseTime())
               result += OrderProfit() + OrderSwap() + OrderCommission();
         }
      }
   }
  
   return(result);


Должен быть выбран предварительно с текущей датой:

datetime d0 = StrToTime(TimeToStr(TimeCurrent(),TIME_DATE)); // сегодня

Comment("\n Profit: ", Earn(d0));

Но код почему то прибыль не показывает по закрытым ордерам



 

А чему равно значение переменной Magic? Совпадает с теми ордерами, которые закрыты?

Ну и заодно ускорение кода:

double Earn(datetime startDate = 0)
{
   double result = 0;
  
   for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS, MODE_HISTORY))
         continue;

      if(OrderMagicNumber()==Magic)
         continue;

      if (startDate > OrderCloseTime())
         break;

      result += OrderProfit() + OrderSwap() + OrderCommission();
   }
  
   return(result);

вызов функции также можно сократить:

#define SECONDS_PER_DAY     int(60 * 60 * 24)

Comment("\n Profit: ", Earn(TimeCurrent() / SECONDS_PER_DAY * SECONDS_PER_DAY));
 
Ihor Herasko:

А чему равно значение переменной Magic? Совпадает с теми ордерами, которые закрыты?

Ну и заодно ускорение кода:

вызов функции также можно сократить:

Earn(TimeCurrent() / SECONDS_PER_DAY * SECONDS_PER_DAY)

Другими словами текущую дату в секундах разделить на квадрат времени в секундах за день ?  И что получиться? 

      if(OrderMagicNumber()==Magic)
         continue;

Знак равенства в данном примере означает что вы пропустите все ордера выставленные роботом.

      if (startDate > OrderCloseTime())
         break;

 А этот пример прервёт функцию. Не пропустит вариант, а вообще прервёт любые проверки всех последующих ордеров.


Спасибо конечно за помощь, но это пока не работающий код.

Если у кого может помочь, то заранее "Спасибо".

 
Aliaksei Karalkou:

Другими словами текущую дату в секундах разделить на квадрат времени в секундах за день ?  И что получиться?

Никаого квадрата там нет. Вспомните последовательность выполнения операций. Деление и умножение выполняется последовательно. В этом примере получается: Текущее время разделить на количество секунд в сутках, получится дробное число и по законам mql дробная часть отбрасывается, затем умножается на это-же количество секунд и получается время на начало дня, то-есть ДАТА:00:00

Aliaksei Karalkou:

Знак равенства в данном примере означает что вы пропустите все ордера выставленные роботом.

Это просто Игорь не обратил внимание на это и не исправил на !=

Aliaksei Karalkou:

 А этот пример прервёт функцию. Не пропустит вариант, а вообще прервёт любые проверки всех последующих ордеров.

Прервёт если запросить ордера с завтрашней датой.


А вообще, такой код очень просто проверить в режиме отладки. На первый взгляд код должен работать.

 
Ihor Herasko:

А чему равно значение переменной Magic? Совпадает с теми ордерами, которые закрыты?

Ну и заодно ускорение кода:

вызов функции также можно сократить:

Alexey Viktorov:

Никаого квадрата там нет. Вспомните последовательность выполнения операций. Деление и умножение выполняется последовательно. В этом примере получается: Текущее время разделить на количество секунд в сутках, получится дробное число и по законам mql дробная часть отбрасывается, затем умножается на это-же количество секунд и получается время на начало дня, то-есть ДАТА:00:00

Это просто Игорь не обратил внимание на это и не исправил на !=

Прервёт если запросить ордера с завтрашней датой.


А вообще, такой код очень просто проверить в режиме отладки. На первый взгляд код должен работать.

 Всем Спасибо! Код заработал!!!

Причина обращения: