Обсуждение статьи "Использование ORDER_MAGIC для торговли разными экспертами на одном инструменте"

 

Опубликована статья Использование ORDER_MAGIC для торговли разными экспертами на одном инструменте:

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

Рисунок 7. Результат бесконфликтной торговли трех советников с разными магиками

Автор: Николай

 

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

Например так:

enum Emagic
{
ENUM_DIGITAL_NAME      = 0, // цифровое имя советника
ENUM_CODE_INTERACTION  = 1, // код взаимодействия
ENUM_EXPERT_SYMBOL     = 2  // символ, на котором запущен советник
};

Это также может помочь при миграции с MQL4, например вот такое перечисление я использую для работы с ордерами

//ENUM_MT4_ORDER_TYPE
enum ENUM_MT4_ORDER_TYPE
//Типы торговых операций
{
OP_BUY  = 0, //Покупка 
OP_SELL = 1, //Продажа 
OP_BUYLIMIT  = 2, //Отложенный ордер BUY LIMIT 
OP_SELLLIMIT = 3, //Отложенный ордер SELL LIMIT 
OP_BUYSTOP   = 4, //Отложенный ордер BUY STOP 
OP_SELLSTOP  = 5  //Отложенный ордер SELL STOP 
};

Такой подход удобен, поскольку в независимости от положения идентификатора в перечислении его Код (цифровое значение не изменится)...

Также такой подход удобен если перечисление должно содержать идентификаторы с отрицательным значением


PS

Очень интересная статья, спасибо автору...


 
Interesting:

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

Например так:

Это также может помочь при миграции с MQL4, например вот такое перечисление я использую для работы с ордерами

Такой подход удобен, поскольку в независимости от положения идентификатора в перечислении его Код (цифровое значение не изменится)...

Также такой подход удобен если перечисление должно содержать идентификаторы с отрицательным значением


PS

Очень интересная статья, спасибо автору...


Для меня не принципиально, так как при объявлении перечисления значения назначаются по порядку автоматически,

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

 

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

request.magic
request.id1
request.id2
request.id3

Или хотя бы  укомплектовали терминал библиотекой, чтобы это как-то вошло в стандарты.

SetMagic(Magic,Id1,Id2,Id3) 

 

 
Integer:

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

Или хотя бы  укомплектовали терминал библиотекой, чтобы это как-то вошло в стандарты.

 

Совсем не факт, что для пользователя нужно писать инструкцию по работе с МАГИКОМ, даже если так то она не выйдет за пределы описания того как формируется МАГИК...

Считаю что на текущий момент это одна из лучших статей по поводу автоматизации торгов. скажу больше - я сам сторонник кодирования МАГИКА на более серьезном уровне чем 777777 или 555555, даже пожалуй предпочту помещать туда более детальную информацию, чем скажем это у автора сделано.

Вот только использовать при этом структуры не догадался (поскольку идея о кодировании идет еще с MQL4), хотя наверно стоял на пороге этого...

Также я не считаю нужным "записывать" в МАГИК какую либо информацию о символах по которым производятся торговые операции (это связанно с тем что эта информация итак храниться в другом месте и с момента возникновения ордера и до момента полного закрытия позиции не изменяется). Также я думаю вполне достаточно будет отвести под МАРКЕР (ИЛИ МАРКЕР, не скажу как там точно в генной инженерии) ЭКСПЕРТА три последних цифры МАГИКА (если не использовать код безопасности).

Это связано с тем что в ПЕРВОЙ из этих цифр можно закодировать 9-10 базовых классов экспертов, а в остальных двух его уникальный с точки зрения пользователя или разработчика номер. В итоге в норме получится от 900 до 1000 комбинаций.

Также предпочитаю алгоритм при котором советник распознает по крайней мере отложники установленные трейдером и кодирует их соответствующим образом.

PS

Бояться того что несколько экспертов перепутают кодированный МАГИК я думаю не стоит, по крайней мере считаю, что при определенном подходе это не так опасно (да и наверно вероятно) как кажется на первый взгляд. Тем более это становится не актуально если все эти эксперты (пусть даже от разных авторов) поддерживают такую методику шифрования МАГИКА и учитывают действия друг друга. В идеале только один эксперт должен торговать по той или иной паре...

 

В статье приводиться пример использования кодов, причём разряды используются не все и кодирование явно с избытком,

те если нужно даже эти 9 занятых разрядов можно ужать.

Кроме идентификации магику (те его оставшимся 9-ти разрядам) можно также передавать состояние баланса на момент выставления ордера.

Тк баланс врядли займёт больше 6 разрядов то ещё остаётся место для какого либо кодирования.


 
Urain:

В статье приводиться пример использования кодов, причём разряды используются не все и кодирование явно с избытком,

те если нужно даже эти 9 занятых разрядов можно ужать.

Кроме идентификации магику (те его оставшимся 9-ти разрядам) можно также передавать состояние баланса на момент выставления ордера.

Тк баланс врядли займёт больше 6 разрядов то ещё остаётся место для какого либо кодирования.

Ко всему этому надо еще прибавить 1000 или 10000, а перед раскодированием отнять, чтобы был гарантированный диапазон не занятых вашим методом магиков.

 
Integer:

Ко всему этому надо еще прибавить 1000 или 10000, а перед раскодированием отнять, чтобы был гарантированный диапазон не занятых вашим методом магиков.

Ну как это безболезненно сделать описано в статье( просто потребуется небольшая доработка по расширению диапазона шифрования),

проблем не вижу.

PS единственно тонкое место нужно не забыть баланс перевести в интегер иначе запятая даст глюк, как это сделать нужно смотреть по привязке если счёт центовый тогда умножить на 100 если такая точность не нужна тогда перевод в int с обрезанием.

 
Urain:

Ну как это безболезненно сделать описано в статье( просто потребуется небольшая доработка по расширению диапазона шифрования),

проблем не вижу.

PS единственно тонкое место нужно не забыть баланс перевести в интегер иначе запятая даст глюк, как это сделать нужно смотреть по привязке если счёт центовый тогда умножить на 100 если такая точность не нужна тогда перевод в int с обрезанием.

 

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

 
Integer:

 

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

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

Вот макс значение ulong 18 446 744 073 709 551 615 те 17*10^18 имеет все свободные поля. Стоит добавить при кодировании 17 000 000 000 000 000 000 и поставить при декодировании проверку содержит ли 20 и 19 разряд числа 1 и 7 и вы гарантированно определите кодированный ли магик или нет.

//+------------------------------------------------------------------+
//| Функция возвращает сборный магик, собранный из входных данных    |
//+------------------------------------------------------------------+
ulong Cmagic::SetMagic_request(int digital_name=0,int code_interaction=0)
  {
   if(digital_name>=1000)Print("Неверно задано цифровое имя советника (больше 1000)");
   if(code_interaction>=1000)Print("Неверно задан код опознания свой-чужой (больше 1000)");
   mag.digital_name     =digital_name;
   mag.code_interaction =code_interaction;
   mag.expert_symbol    =symbolexpert();
   mag.magicnumber      =17000000000000000000+// вот эта вставка даст 20 разрядов магику
                         mag.digital_name*(int)pow(1000,2)+
                         mag.code_interaction*(int)pow(1000,1)+
                         mag.expert_symbol;
   return(mag.magicnumber);
  }

и в декодере

//+------------------------------------------------------------------+
//| Функция разделяет магик на три части по три разряда              |
//| и возвращает ту часть, на которую указывает category             |
//+------------------------------------------------------------------+
int Cmagic::decodeMagic_result(int category)
  {
   string string_value=(string)mag.magicnumber;
   int rem=(int)MathMod(StringLen(string_value),3);
   if(rem!=0)
     {
      rem=3-rem;
      string srem="0";
      if(rem==2)srem="00";
      string_value=srem+string_value;
     }
   int start_pos=StringLen(string_value)-3*category;
   string value=StringSubstr(string_value,start_pos,3);
   if(StringLen(string_value)!=20)return((int)StringToInteger("0"));//если магика не 20 разрядов значит не кодированный
   return((int)StringToInteger(value));
  }

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

Кстати я использую при кодировании вот такое

(int)pow(1000,2)

смещение по разрядам но никто не запрещает переписать это через стринги, просто в статье я хотел показать оба метода и по возможности органично вписать(поэтому кодирование идёт через инт а декодирование через стринг) .

А вообще я стремился показать возможности а не дать чёрный ящик-преобразователь (лучше подарить человеку лопату чем ведро каши).

PS вот сказал одно закодил другое, ( у меня гроза так что сеть регулярно выбивает ) закодирована проверка не 1 и 7 в 20 и 19 разряде а наличие этих самых разрядов те если магик 20-ти разрядный значит исплользовалось кодирование, но сами понимаете проверку можно переиграть.






 

1.Спасибо автору за статью.
2.Что обозначает выражение (int) и  какое значение оно принимает  в int DIGITS=(int)-log10(SymbolInfoDouble(symbol,SYMBOL_VOLUME_STEP)); if(DIGITS<0)DIGITS=0;
3.Почему, при тестировании,выражение (int) и SYMBOL_VOLUME_STEP принимают значения Unknown identifier и как это влияет на результат  int DIGITS ?
4.Как работает код взаимодействия?
Имеет ли значение код взаимодействия, при работе советников на одном инструменте, где достаточно утанавливать либо одинакоые, или различные цифровые имена советников.

 

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