Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Опубликуй статью. Миллионы трейдеров ждут хороших идей!
Vitalie Postolache
11060
Vitalie Postolache 2014.12.21 00:41 

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

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

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

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

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

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);
}

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

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

Алексей Тарабанов
7220
Алексей Тарабанов 2014.12.21 02:00  
Цель расчета? 
Vitalie Postolache
11060
Vitalie Postolache 2014.12.21 02:10  
tara:
Цель расчета? 
В журнал выводить, уведомление отсылать, если отрицательное значение.
Алексей Тарабанов
7220
Алексей Тарабанов 2014.12.21 02:46  
Неинтересненько. 
khorosh
8043
khorosh 2014.12.21 10:05  
evillive:

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

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

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

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

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

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

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

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

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

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

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

Спасибо!

khorosh
8043
khorosh 2014.12.22 04:08  
evillive:

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

Спасибо!

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

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

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

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

khorosh
8043
khorosh 2014.12.22 07:45  
evillive:

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

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

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

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