Нужен совет по организации учета ордеров

 

Здравствуйте.

Советник открывает ордера по сигналам индикатора, после чего сопровождает их сеткой, подобно иллану. Первый ордер сетки открывается только после закрытия "главного" (открытого по сигналу индикатора) ордера (в случае убытка). Следующий ордер сетки открывается после закрытия предыдущего в убыток. И так происходит до взятия прибыли.

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

Нужно для каждого рыночного ордера вытащить из истории тикеты предыдущих ордеров сетки и тикет главного ордера.

Так как сетки идут параллельно, ордера разных сеток в истории (не важно как отсортированной) перемешаны.

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

Подскажите пожалуйста, на сколько опасно использовать такое решение?

Генерировать отдельный мэджик для каждой серии - думаю, не вариант. Может случайно сгенерироваться мэджик, совпадающий с мэджиком другого эксперта. Да и "забыть историю и начать заново" путем смены мэджика в настройках не получится.

В голову приходят разве что файлы. Но пока не полностью придумал как можно организовать через файлы. Да и стоит ли оно того? Возможно, комменты - не такой уж и плохой способ?

 

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

У ордера из истории нужно брать часть комментария, которая от советника.

И комментарий всегда можно посмотреть, какой он был ордера в рынке и какой стал у этого ордера в истории.

 
тут недалеко обсуждали как лучше учёт таких сеток вести - посмотрите там https://www.mql5.com/ru/forum/231652#comment_6783477
 
Aleksey Semenov:
тут недалеко обсуждали как лучше учёт таких сеток вести - посмотрите там https://www.mql5.com/ru/forum/231652#comment_6783477

Там предлагается использовать использовать отдельные мэджики для каждой серии. Я упоминал этот способ выше. Да, это точно будет работать. Вот только может случиться беда, если пользователь запустит другой эксперт с рандомным мэджиком, а мой эксперт сгенерирует этот мэджик для одной из своих серий. Это единственный, но как по мне, довольно весомый недостаток этого способа. Хоть и вероятность очень мала, но мы же с деньгами работаем.

 
Maks_Knyazev:

Там предлагается использовать использовать отдельные мэджики для каждой серии. Я упоминал этот способ выше. Да, это точно будет работать. Вот только может случиться беда, если пользователь запустит другой эксперт с рандомным мэджиком, а мой эксперт сгенерирует этот мэджик для одной из своих серий. Это единственный, но как по мне, довольно весомый недостаток этого способа. Хоть и вероятность очень мала, но мы же с деньгами работаем.

Возьмите тикет ордера по сигналу в качестве магика для сетки.

 
Iurii Tokman:

У ордера из истории нужно брать часть комментария, которая от советника.

Да, я думал примерно так

const string LABEL        = "expert_name"; // Метка
const int    LABEL_LENGTH = 11,            // Длинна метки LABEL
             ID_LENGTH    = 12;            // Длинна идентификатора

// Возвращает комментарий для нового ордера. В id_integer принимает идентификатор. Длинна максимального значения id_integer не должна
// превышать ID_LENGTH. Об этом нужно дополнительно позаботиться.
string getComment(int id_integer)
  {
   return(StringConcatenate(LABEL, IntegerToString(id_integer, ID_LENGTH, '0')));
  }

// Вытягивает из комментария id в переменную id_integer
bool get_id_from_comment(string comment, int &id_integer)
  {
   // Найдем метку
   int position = StringFind(comment, LABEL);
   
   if(position == -1)
     {
      Print("Ошибка. Не удалось получить id, бла бла бла...");
      
      return(false);
     }
   
   // Зная позицию метки, длинну метки и длинну id, вытаскиваем из коммента строку в которой содержится метка и id
   string id_string = StringSubstr(comment, position, LABEL_LENGTH + ID_LENGTH);
   
   // Убедимся что id цел и не урезан
   if(StringLen(id_string) != LABEL_LENGTH + ID_LENGTH)
     {
      Print("Ошибка. Не удалось получить id, бла бла бла...");
      
      return(false);
     }
   
   // Теперь можно достать сам id integer
   id_integer = StringToInteger(StringSubstr(comment, position + LABEL_LENGTH, ID_LENGTH));
   
   return(true);
  }
Iurii Tokman:

И комментарий всегда можно посмотреть, какой он был ордера в рынке и какой стал у этого ордера в истории.

Но дело вот в чем


 
Alexey Viktorov:

Возьмите тикет ордера по сигналу в качестве магика для сетки.

Спасибо за совет. Думаю проблем с формированием id для сетки через меджики у меня не возникнет.

Вопрос только в выборе способа. В случае с мэджиками, как я выше писал, меня смущает возможность совпадения мэджиков разных экспертов. Да, у двух копий этого эксперта мэджики не совпадут. Но если пользователь в другое окно прикрепит советник другого автора, а мэджик ему задаст проведя рукой по цифрам на клавиатуре то вероятность совпадения таки есть. Хотя, возможно, это паранойя...

 

Подожду, возможно еще кто-нибудь из программистов поделится своим мнением.

Судя по всему, лучший вариант - мэджики. Вот только паранойя вопит мне о совпадениях...

 
Maks_Knyazev:

Спасибо за совет. Думаю проблем с формированием id для сетки через меджики у меня не возникнет.

Вопрос только в выборе способа. В случае с мэджиками, как я выше писал, меня смущает возможность совпадения мэджиков разных экспертов. Да, у двух копий этого эксперта мэджики не совпадут. Но если пользователь в другое окно прикрепит советник другого автора, а мэджик ему задаст проведя рукой по цифрам на клавиатуре то вероятность совпадения таки есть. Хотя, возможно, это паранойя...

Мне нравится такая самокритичность.

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

 
Maks_Knyazev:

Да, я думал примерно так

Но дело вот в чем


делал такую химию -

у основного ордера брал тикет и писал как коммент его сетки
такой вариант проходил когда тикет небольшой, потом его частично затирало

затем писал комент из трех букв, например - aaa, следующий aab, и т.д.
когда буквы заканчивались, проходило некоторое время - нужно фиксировать время при aaa и при zzz
теперь отследить можно по коменту и плюс по времени

 
Maks_Knyazev:

Генерировать отдельный мэджик для каждой серии - думаю, не вариант. 

Очень даже вариант.

Во-первых, в предлагаемом решении MagicNumber не генерируется (в смысле не создание рандомно), а рассчитывается. В это поле включается: 

  1. ID ордеров эксперта
  2. Индекс сетки.
  3. Индекс ордера в сетке.

Таким образом, само значение поля может случайно совпасть с Magic Number другого советника, но ведь идентификация ордера будет происходить не по полному значению поля, а только по его части. То есть совпасть должна именно часть поля, что еще больше уменьшает вероятность случайного совпадения, т. к. для этого у другого советника должен быть аналогичный принцип расчета значения поля. А такой советник (по чистой случайности  :))) ) будет разработан тем же разработчиком. Если не сможете сами себя проконтролировать, то да, не вариант. В этом случае вообще о программах говорить не приходится ))

Во-вторых, ID ордеров эксперта требуется только в том случае, если нужно запустить два и более экспертов на одном символе. Если же на одном символе работает только один эксперт, то проблема идентификации ордеров вообще не стоит.

В-третьих, сами для себя навсегда запоминаете (и своим клиентам постоянно напоминаете) о том, что при запуске двух и более экспертов на одном символе нужно обязательно указывать разные идентификаторы для экспертов. В своих экспертах иногда делаю даже специальный функционал, который автоматически проверяет используемые MagicNumber у работающих на этом же символе экспертов. Имеется в виду, что другие эксперты тоже так делают. Для сторонних разработок такую проверку, к сожалению, не сделать. Но со сторонними разработками вообще беда. Есть такие эксперты, которые все ордера считают своими. Здесь защита от дурака никак не сработает.

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