
На написание этого скрипта меня натолкнула сегодняшняя ситуация в сервисе автокопирования сделок, когда на волатильности пары евро-доллар, советник лидера на открывал 7 колен ордеров, которые, к счастью, закрылись. Но на соответствующем форуме кто-то из подписчиков этого же лидера пожаловался, что у него все закрылось в минус.
И хотя у меня была уверенность, что в моем случае был профит, а у собеседника видимо небольшой депозит, не позволивший пересидеть просадку, все-же решил перепроверить в ручную. 3 разных подсчета на калькуляторе выдавали разные цифры 🙁 Невнимательность, блин. Пришлось это дело автоматизировать. Так и родился скрипт ProfitByClose.ex4.
Кстати, скриптом можно не только прикинуть прибыль сетки ордеров, но и просто прибыль за определенный период времени. Например если задать время в формате без секунд, минут, часов (2016.08.04 00:00:00), то получится прибыль за этот день.
Сам скрипт можно скачать из «Центра загрузки». А ниже приведен его исходный код с подробными комментариями.
#property copyright "Copyright 2016, HomeTrade.ru" #property link "http://hometrade.ru" #property version "1.00" #property strict #property show_inputs extern datetime CloseDate=D'2016.08.04 14:13:00'; //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { //--- Вывод информации о профите Alert("Профит = ",DoubleToStr(ProfitOnClose(CloseDate),2)); } //+------------------------------------------------------------------+ //рассчитаем значение профита по всем ордерам, закрывшимся в заданный момент времени closeTime //и по символу symbol double ProfitOnClose(datetime closeTime,string symbol="") { double res=0; for (int i=0; i<OrdersHistoryTotal(); i++) //пробежимся по истории { if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) { if (symbol=="" || OrderSymbol()==symbol ) //если это наш символ или любой { if (CompareDate(closeTime,OrderCloseTime())) res+=OrderProfit(); //проверяем условие совпадения времени } } } return(res); } //проверка двух дат с нечетким условием совпадения //date1 наша дата может быть короткой //closeTime - полная дата из ордера OrderCloseTime bool CompareDate(datetime date1,datetime closeTime) { //Тут надо посмотреть формат первой даты //Полный '2016.08.04 14:13:45' //Без секунд '2016.08.04 14:13:00' //Без минут '2016.08.04 14:00:00' //Без часа '2016.08.04 00:00:00' int sec=TimeSeconds(date1); //есть ли секунды в передаваемой дате if (sec>0) { return (date1==closeTime); //точное сравнение с секундами } //Без секунд: проверяем совпадение между началом минуты и через одну //'2016.08.04 14:13:00' <=closeTime< '2016.08.04 14:14:00' int min=TimeMinute(date1); if (min>0) //секунд нет, минуты есть { return (date1<=closeTime && (date1+60)>=closeTime); } //Без минут: проверяем совпадение между началом часа и через час //'2016.08.04 14:00:00' <=closeTime< '2016.08.04 15:00:00' int hour=TimeHour(date1); if (hour>0) //секунд нет, минут нет, час есть { return (date1<=closeTime && (date1+3600)>=closeTime); } //Без часа: проверяем совпадение между началом дня и на следующий день //'2016.08.04 00:00:00' <=closeTime< '2016.08.05 00:00:00' return (date1<=closeTime && (date1+86400)>=closeTime); }
З.Ы. Что-то отображение кода на сайте глючит, убирает форматирование строк.
Пока писал пост, мелькнула мысль, что гораздо проще было бы в настройках задавать не одну дату, а две, и уже в одной строке проверять OrderCloseTime() между этими датами … но не пропадать же труду 🙂