Скрипт ProfitByClose

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

И хотя у меня была уверенность, что в моем случае был профит, а у собеседника видимо небольшой депозит, не позволивший пересидеть просадку, все-же решил перепроверить в ручную. 3 разных подсчета на калькуляторе выдавали разные цифры 🙁  Невнимательность, блин. Пришлось это дело автоматизировать. Так и родился скрипт ProfitByClose.ex4.

profit-by-close-options

Кстати, скриптом можно не только прикинуть прибыль сетки ордеров, но и просто прибыль за определенный период времени. Например если задать время в формате без секунд, минут, часов (2016.08.04 00:00:00), то получится прибыль за этот день.

profit-alert

Сам скрипт можно скачать из «Центра загрузки». А ниже приведен его исходный код с подробными комментариями.

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

З.Ы. Что-то отображение кода на сайте глючит, убирает форматирование строк.

Вы можете пропустить чтение записи и оставить комментарий. Размещение ссылок запрещено.

1 комментарий к записи “Скрипт ProfitByClose”

  1. Пока писал пост, мелькнула мысль, что гораздо проще было бы в настройках задавать не одну дату, а две, и уже в одной строке проверять OrderCloseTime() между этими датами … но не пропадать же труду 🙂

Оставить комментарий

Вы должны быть авторизованы, чтобы разместить комментарий.