Помогите - нужна функция

 

Помогите или может уже есть готовый вариант решения...

Нужно в советник добавить функцию которая будет сохранять в отдельном файле информацию по открытым позициям.

Информация нужна следующая:

1 - тикет ордера

2 - максимальная (в пунктах) просадка которая был у ордера

3 - "koment" ордера 

 

СПАСИБО ЗА ПОМОЩЬ !!!! 

 

Тот который в истории - зачем ???

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

 
Вам нужно добавить ордеру свойства, которых у него нет. То есть привязать к ордеру дополнительную структуру. Структур в MQL4 нет, я решал проблему заводя для каждого нового свойства отдельный массив.
 
renoshnik:

Помогите или может уже есть готовый вариант решения...

Нужно в советник добавить функцию которая будет сохранять в отдельном файле информацию по открытым позициям.

Информация нужна следующая:

1 - тикет ордера

2 - максимальная (в пунктах) просадка которая был у ордера

3 - "koment" ордера

СПАСИБО ЗА ПОМОЩЬ !!!!

Приблизительно, в виде скрипта, как-то так:
//+------------------------------------------------------------------+
//|                                                    renoshnik.mq4 |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
  {
   int Ticket,Shift,OpenTime,Drawdown,handle;
   string symbol,comment;
   double OpenPrice,Price,Spread;
//----
   FileDelete("renoshnik.csv");
   handle=FileOpen("renoshnik.csv", FILE_CSV|FILE_READ|FILE_WRITE,';');
   FileWrite(handle,"Тикет","Просадка","Комментарий");
//----
   for(int cnt=0;cnt<OrdersTotal();cnt++)
      {
      OrderSelect(cnt,SELECT_BY_POS);
         {
         if(OrderType()<2)
            {
            Ticket=OrderTicket();
            comment=OrderComment();
            symbol=OrderSymbol();
            OpenPrice=OrderOpenPrice();
            OpenTime=60*MathRound(OrderOpenTime()/60);
            Shift=iBarShift(symbol,PERIOD_M1,OpenTime);
            if(OrderType()==OP_BUY)
               Price=iLow(symbol,PERIOD_M1,iLowest(symbol,PERIOD_M1,MODE_LOW,Shift+1,0));
               Drawdown=MathRound((OpenPrice-Price)/MarketInfo(symbol,MODE_POINT));
            if(OrderType()==OP_SELL)
               {
               Spread=MarketInfo(symbol,MODE_SPREAD);
               Price=iHigh(symbol,PERIOD_M1,iHighest(symbol,PERIOD_M1,MODE_HIGH,Shift+1,0));
               Drawdown=MathRound((Price-OpenPrice)/MarketInfo(symbol,MODE_POINT)+Spread);
               }
            }
//----
         FileSeek(handle,0,SEEK_END);
         FileWrite(handle,Ticket,Drawdown,comment);
         }
      }
   FileClose(handle);
//----
   return(0);
  }
//+------------------------------------------------------------------+
 

Вопрос, для чего это нужно?

Если поставить ряд ограничений, то задача сильно упрощается.

Например:

  1. данные нужны с некоторой периодичностью, допустим, минута;
  2. вы согласны с тем, что если советник использует данные, записываемые в файл, то вы не сможете прогнать его на тестере;
  3. данные того минутного бара, на котором был открыт ордер не участвуют в расчете просадки;
  4. точная величина просадки неизвестна, из-за плавающего спреда, для коротких позиций.

Тогда, вам нужна не функция, а индикатор, который вешается на минутах. Индикатор отрабатывает только на начале нового бара.

И, несложно вывести в файл информацию:

тикет ордера; символ; тип ордера Buy/Sell; максимальная просадка; максимальный профит; "komment" ордера

Swanпредложил скрипт, из которого легко сделать индикатор по предложенному ТЗ

 
Swan:
Приблизительно, в виде скрипта, как-то так:



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

А возможноли, чтобы скрипт писал в файл только одно значение, например когда ордер сработал по ТР скрипт определял на истории максимальную просадку и заносил эти данные в историю.

Данные файла в работе советника не используются, это нужно для анализа работы после прогонки советника в тестере с разными настройками. Хочу немножко усовершенствовать свою работу на "откатах" https://www.mql5.com/ru/forum/126665

 
renoshnik:



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

А возможноли, чтобы скрипт писал в файл только одно значение, например когда ордер сработал по ТР скрипт определял на истории максимальную просадку и заносил эти данные в историю.

Данные файла в работе советника не используются, это нужно для анализа работы после прогонки советника в тестере с разными настройками. Хочу немножко усовершенствовать свою работу на "откатах" https://www.mql5.com/ru/forum/126665

скрипт исполняется один раз, при повторном вызове файл полностью перезаписывается.

Возможно. только этот код придется сурово обработать напильником :)

 

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

 

Хм, странно, дал же выше нормальный универсальный способ. Туда надо добавить массив-свойство OrdМахDrawdown[]. И на каждом тике для каждого ордера писать в этот массив их максимальные просадки. Когда понадобится новая характеристика (а наверняка же понадобится), добавить массив и для неё, и.т.д.

Массив нужен оттого, что одновременно может быть открыто несколько ордеров.

 
Candid:

Хм, странно, дал же выше нормальный универсальный способ. Туда надо добавить массив-свойство OrdМахDrawdown[]. И на каждом тике для каждого ордера писать в этот массив их максимальные просадки. Когда понадобится новая характеристика (а наверняка же понадобится), добавить массив и для неё, и.т.д.

Массив нужен оттого, что одновременно может быть открыто несколько ордеров.


Что произойдет?,

  1. если какой-либо ордер закроется;
  2. откроется новый ордер;
  3. на некоторое время пропадет связь;
  4. компьютер перезагрузится
  5. .....................

Универсальных способов не бывает

 
Mislaid:


Что произойдет?,

  1. если какой-либо ордер закроется;
  2. откроется новый ордер;
  3. на некоторое время пропадет связь;
  4. компьютер перезагрузится
  5. .....................

Универсальных способов не бывает

пп. 1 и 2 предусмотрены, вы невнимательно смотрели код примера.

п3. несложно обработать, нужно просто регулярно сверять количество ордеров в структуре с количеством реальных орлеров и добавлять "лишние" в структуру. В примере этого нет потому что он был ориентирован на работу с тестером.

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

п5 и следуюшие несложно обработать по аналогичным схемам. Просто нужно понять основную идею, эти квазиструктуры следуют за реальным списком ордеров, при любом сбое сразу после его получения соответствие можно легко восстановить.

Причина обращения: