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

 

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

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

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

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 и следуюшие несложно обработать по аналогичным схемам. Просто нужно понять основную идею, эти квазиструктуры следуют за реальным списком ордеров, при любом сбое сразу после его получения соответствие можно легко восстановить.