Цель расчета?
Собственно проблема вот какая, советник открывает усредняющую серию, потом, когда эта серия закрыта, нужно посчитать прибыль именно этой серии. Для тестера всё легко и просто, запоминаю баланс в начале работы функции закрытия, перед завершением работы функции закрытия вычитаю старое зачение баланса из нового и получаю значение прибыли.
Но как только перехожу на торговлю в реальном времени, могут возникнуть проблемы:
а) не все ордера серии закроются за один проход функции закрытия (ну там потеря связи, ошибки исполнения), оставшиеся ордера будут закрыты на следующей попытке (следующий бар, в худшем случае) и прибыль будет посчитана только по ним;
б) серия закрыта вручную или сторонним скриптом, советник в таком случае вообще прибыль не посчитает, ведь его функция закрытия не будет задействована.
Значит, надо пересчитать ордера из истории торговли, найти самую свежую серию одинакового типа, принадлежащую именно данному советнику и на данном символе (причём в историю могут вклиниться результаты торговли других советников и серия окажется разорванной на несколько частей), и посчитать их прибыль в цикле, на первом же ордере другого типа от этого советника считать что серия закончилась, цикл прерывать и вернуть значение советнику - подумал я так и сваял функцию:
Но не тут-то было, функция возвращает прибыль только первого ордера серии, найденного в истории торговли, дальше не считает, даже в тестере.
Как лучше будет всё посчитать, чтобы в любой ситуации прибыль по серии была посчитана правильно, даже при вмешательстве трейдера и работе нескольких советников одновременно?
Попробуй плюсик добавить:
... lastlos+=OrderProfit()+OrderCommission()+OrderSwap(); //иначе - считаем прибыль ...
Попробуй плюсик добавить:
О! То что надо, я и не заметил что там суммирования не было, думал что цикл закрывается раньше чем надо )))
Спасибо!
О! То что надо, я и не заметил что там суммирования не было, думал что цикл закрывается раньше чем надо )))
Спасибо!
Как это, ведь профит первого ордера подсчитывается последним в цикле, а значит цикл выполнился до конца.
В цикле первым попадается выделенный ордер, советник так устроен, что первым закрывается последний по порядку ордер серии, то есть самый молодой. Ну и в результате только его прибыль выводилась функцией, вот я и полагал, что цикл после него прерывался.
Но, как оказалось, там просто суммирование останавливалось на этом ордере, а цикл искал дальше, но уже ничего не считал.
Выводил в журнал результаты расчёта по обоим методам, "тестерный" метод выдавал в этом случае правильное значение -43,53 а обсуждаемая тут функция выводила +32,58.
В цикле первым попадается выделенный ордер, советник так устроен, что первым закрывается последний по порядку ордер серии, то есть самый молодой. Ну и в результате только его прибыль выводилась функцией, вот я и полагал, что цикл после него прерывался.
Но, как оказалось, там просто суммирование останавливалось на этом ордере, а цикл искал дальше, но уже ничего не считал.
Выводил в журнал результаты расчёта по обоим методам, "тестерный" метод выдавал в этом случае правильное значение -43,53 а обсуждаемая тут функция выводила +32,58.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Собственно проблема вот какая, советник открывает усредняющую серию, потом, когда эта серия закрыта, нужно посчитать прибыль именно этой серии. Для тестера всё легко и просто, запоминаю баланс в начале работы функции закрытия, перед завершением работы функции закрытия вычитаю старое зачение баланса из нового и получаю значение прибыли.
Но как только перехожу на торговлю в реальном времени, могут возникнуть проблемы:
а) не все ордера серии закроются за один проход функции закрытия (ну там потеря связи, ошибки исполнения), оставшиеся ордера будут закрыты на следующей попытке (следующий бар, в худшем случае) и прибыль будет посчитана только по ним;
б) серия закрыта вручную или сторонним скриптом, советник в таком случае вообще прибыль не посчитает, ведь его функция закрытия не будет задействована.
Значит, надо пересчитать ордера из истории торговли, найти самую свежую серию одинакового типа, принадлежащую именно данному советнику и на данном символе (причём в историю могут вклиниться результаты торговли других советников и серия окажется разорванной на несколько частей), и посчитать их прибыль в цикле, на первом же ордере другого типа от этого советника считать что серия закончилась, цикл прерывать и вернуть значение советнику - подумал я так и сваял функцию:
Но не тут-то было, функция возвращает прибыль только первого ордера серии, найденного в истории торговли, дальше не считает, даже в тестере.
Как лучше будет всё посчитать, чтобы в любой ситуации прибыль по серии была посчитана правильно, даже при вмешательстве трейдера и работе нескольких советников одновременно?