Скачать MetaTrader 5

Как правильно посчитать прибыль закрытой серии?

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Vitalie Postolache
12271
Vitalie Postolache  

Собственно проблема вот какая, советник открывает усредняющую серию, потом, когда эта серия закрыта, нужно посчитать прибыль именно этой серии. Для тестера всё легко и просто, запоминаю баланс в начале работы функции закрытия, перед завершением работы функции закрытия вычитаю старое зачение баланса из нового и получаю значение прибыли.

Но как только перехожу на торговлю в реальном времени, могут возникнуть проблемы:

а) не все ордера серии закроются за один проход функции закрытия (ну там потеря связи, ошибки исполнения), оставшиеся ордера будут закрыты на следующей попытке (следующий бар, в худшем случае) и прибыль будет посчитана только по ним;

б) серия закрыта вручную или сторонним скриптом, советник в таком случае вообще прибыль не посчитает, ведь его функция закрытия не будет задействована.

Значит, надо пересчитать ордера из истории торговли, найти самую свежую серию одинакового типа, принадлежащую именно данному советнику и на данном символе (причём в историю могут вклиниться результаты торговли других советников и серия окажется разорванной на несколько частей), и посчитать их прибыль в цикле, на первом же ордере другого типа от этого советника считать что серия закончилась, цикл прерывать и вернуть значение советнику - подумал я так и сваял функцию:

double lastloss()
{
  int typ=-1,cnt=0;
  double lastlos=0;
  for(int h=OrdersHistoryTotal()-1; h>=0; h--) //перебираем ордера в истории, от самого свежего к началу истории
  {
    if(OrderSelect(h,SELECT_BY_POS,MODE_HISTORY)) 
    {
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) //если это ордер нашего советника, 
      { 
        if(cnt==0) typ=OrderType();             //если это первый наш ордер, запоминаем его тип
        if(cnt>0 && OrderType()!=typ) break;    //если это не первый ордер и его тип не равен типу первого ордера, выход из цикла
        lastlos=OrderProfit()+OrderCommission()+OrderSwap(); //иначе - считаем прибыль
        cnt++;   //и увеличиваем счётчик                              
      }
    }
  }
return(lastlos);
}

Но не тут-то было, функция возвращает прибыль только первого ордера серии, найденного в истории торговли, дальше не считает, даже в тестере.

Как лучше будет всё посчитать, чтобы в любой ситуации прибыль по серии была посчитана правильно, даже при вмешательстве трейдера и работе нескольких советников одновременно?

Алексей Тарабанов
7316
Алексей Тарабанов  
Цель расчета? 
Vitalie Postolache
12271
Vitalie Postolache  
tara:
Цель расчета? 
В журнал выводить, уведомление отсылать, если отрицательное значение.
Алексей Тарабанов
7316
Алексей Тарабанов  
Неинтересненько. 
khorosh
8263
khorosh  
evillive:

Собственно проблема вот какая, советник открывает усредняющую серию, потом, когда эта серия закрыта, нужно посчитать прибыль именно этой серии. Для тестера всё легко и просто, запоминаю баланс в начале работы функции закрытия, перед завершением работы функции закрытия вычитаю старое зачение баланса из нового и получаю значение прибыли.

Но как только перехожу на торговлю в реальном времени, могут возникнуть проблемы:

а) не все ордера серии закроются за один проход функции закрытия (ну там потеря связи, ошибки исполнения), оставшиеся ордера будут закрыты на следующей попытке (следующий бар, в худшем случае) и прибыль будет посчитана только по ним;

б) серия закрыта вручную или сторонним скриптом, советник в таком случае вообще прибыль не посчитает, ведь его функция закрытия не будет задействована.

Значит, надо пересчитать ордера из истории торговли, найти самую свежую серию одинакового типа, принадлежащую именно данному советнику и на данном символе (причём в историю могут вклиниться результаты торговли других советников и серия окажется разорванной на несколько частей), и посчитать их прибыль в цикле, на первом же ордере другого типа от этого советника считать что серия закончилась, цикл прерывать и вернуть значение советнику - подумал я так и сваял функцию:

Но не тут-то было, функция возвращает прибыль только первого ордера серии, найденного в истории торговли, дальше не считает, даже в тестере.

Как лучше будет всё посчитать, чтобы в любой ситуации прибыль по серии была посчитана правильно, даже при вмешательстве трейдера и работе нескольких советников одновременно?

Попробуй плюсик добавить:

...
lastlos+=OrderProfit()+OrderCommission()+OrderSwap(); //иначе - считаем прибыль
...
Vitalie Postolache
12271
Vitalie Postolache  
khorosh:

Попробуй плюсик добавить:

О! То что надо, я и не заметил что там суммирования не было, думал что цикл закрывается раньше чем надо )))

Спасибо!

khorosh
8263
khorosh  
evillive:

О! То что надо, я и не заметил что там суммирования не было, думал что цикл закрывается раньше чем надо )))

Спасибо!

Как это, ведь профит первого ордера подсчитывается последним в цикле, а значит цикл выполнился до конца.
Vitalie Postolache
12271
Vitalie Postolache  
khorosh:
Как это, ведь профит первого ордера подсчитывается последним в цикле, а значит цикл выполнился до конца.

В цикле первым попадается выделенный ордер, советник так устроен, что первым закрывается последний по порядку ордер серии, то есть самый молодой. Ну и в результате только его прибыль выводилась функцией, вот я и полагал, что цикл после него прерывался.

Но, как оказалось, там просто суммирование останавливалось на этом ордере, а цикл искал дальше, но уже ничего не считал.

Выводил в журнал результаты расчёта по обоим методам, "тестерный" метод выдавал в этом случае правильное значение -43,53 а обсуждаемая тут функция выводила +32,58.

khorosh
8263
khorosh  
evillive:

В цикле первым попадается выделенный ордер, советник так устроен, что первым закрывается последний по порядку ордер серии, то есть самый молодой. Ну и в результате только его прибыль выводилась функцией, вот я и полагал, что цикл после него прерывался.

Но, как оказалось, там просто суммирование останавливалось на этом ордере, а цикл искал дальше, но уже ничего не считал.

Выводил в журнал результаты расчёта по обоим методам, "тестерный" метод выдавал в этом случае правильное значение -43,53 а обсуждаемая тут функция выводила +32,58.

Это как раз профит последнего ордера в цикле(последняя итерация), который выполняется в функции. Порядок закрытия в советнике и перебора ордеров в функции противоположны. При закрытии он первый, а при переборе в функции он последний.
Vitalie Postolache
12271
Vitalie Postolache  
Мда, а ведь и правда, чего это я...
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий