Авто Magic

 

Добрый день!

Достаточно часто мы используем одного эксперта на нескольких

символах. Но для каждого эксперта необходим свой Magic.

Расставляя магики вручную часто путаешься или забываешь какой номер уже

присвоен. Чтобы процесс присваивания номеров автоматизировать

необходимо в каждого своего эксперта вставить этот код

//+------------------------------------------------------------------+
//|                                                    AutoMagic.mq5 |
//|                                      Copyright 2017 prostotrader |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017 prostotrader"
#property link      "https://www.mql5.com"
#property version   "1.00"
//
struct magicnum
  {
   char              s_name[4];
   ulong             value;
  };
magicnum m_num;
ulong magic_number=0;
//
//+------------------------------------------------------------------+
//| Expert Get Symbol info function                                  |
//+------------------------------------------------------------------+
string GetSInfo(const string aSymbol)
  {
   int str_tire=0;
   ushort let_symbol;
   int str_size=StringLen(aSymbol);
   for(int i=0; i<str_size; i++)
     {
      let_symbol=StringGetCharacter(aSymbol,i);
      if(let_symbol=='-')
        {
         str_tire=i;
        }
     }
   if(str_tire!=0)
     {
      return(StringSubstr(aSymbol, 0, str_tire));
     }
   return("");
  }
//+------------------------------------------------------------------+
//| Expert Read symbols function                                     |
//+------------------------------------------------------------------+
ulong ReadSymbols(const string in_str)
  {
   if(in_str=="") return(0);
   string file_name="Symbols.bin";
   int file_handle;
//---  
   if(FileIsExist(file_name,0))
     {
      file_handle=FileOpen(file_name,FILE_READ|FILE_BIN|FILE_SHARE_READ);

      if(file_handle!=INVALID_HANDLE)
        {
         while(!FileIsEnding(file_handle))
           {
            FileReadStruct(file_handle,m_num);
            string info=CharArrayToString(m_num.s_name);
            StringTrimRight(info);
            if(in_str==info)
              {
               FileClose(file_handle);
               return(m_num.value);
              }
           }
         FileClose(file_handle);
        }
     }
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   string s_info= GetSInfo(Symbol());
   magic_number = ReadSymbols(s_info);
   if(magic_number==0)
     {
      Alert("Magic number not set!");
      return(INIT_FAILED);
     }
   return(INIT_SUCCEEDED);
  }
//--------------------

Создание файла Symbols.bin, который будет находится в файловой песочнице,

происходит в прикреплённом эксперте WriteSymbols

Файлы:
 

Если эксперты работают на разных символах, им не нужен разный магик (если проверять в эксперте не только магик, но и символ)

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

Автоматизировать выбор номера - плохая идея, практически не выполнимая.  

 
Dmitry Fedoseev:

Если эксперты работают на разных символах, им не нужен разный магик (если проверять в эксперте не только магик, но и символ)

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

Автоматизировать выбор номера - плохая идея, практически не выполнимая.  

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

да и проверку на символ производить не нужно... 

 
В любом случае: проверяется ли символ или нет, автоматическое придумывание магика это фикция - нерешаемая задача.
 
Dmitry Fedoseev:
В любом случае: проверяется ли символ или нет, автоматическое придумывание магика это фикция - нерешаемая задача.
Да ладно, чем datetime не годится? Ордера вряд ли по нескольку за 1 сек. ставить будете. Или можно еще хвостик прицепить какой-нибудь.
 
Alexey Volchanskiy:
Да ладно, чем datetime не годится? Ордера вряд ли по нескольку за 1 сек. ставить будете. Или можно еще хвостик прицепить какой-нибудь.

Тут целых два аргумента:

1. При перезапуске терминала вряд ли получатся разное значения у разных экспертов.

2. В рынке могут существовать ордера, если при запуске будет изменен магик, ордера будут потеряны. 

 
Alexey Volchanskiy:
Да ладно, чем datetime не годится? Ордера вряд ли по нескольку за 1 сек. ставить будете. Или можно еще хвостик прицепить какой-нибудь.

Алексей!

ФОРТС и ФОРЕКС аблолютно разные рынки и абсолютно разные идеологии. 

Я не видел ни одной стратегии на ФОРТС, чтобы торговали на одном сивмоле хотя бы 2 одинаковых советника.

Это у Вас (ФОРЕКС) есть Таймфреймы, индикаторы и пр. е....да.

В эксперте WriteSymbols выделянтся диаппозон с шагом 10000 (резервирование для данного символа 10000 магиков)

Этот диаппозон магиков ВСЕГДА один и тот же для данного символа, не важно сколько раз Вы будете перегружать советник или терминал.

Если у Вас отстался ордер, при перезагрузке терминала (советника), то выполнив элементарный цикл по просмотру действующих

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

Поэтому решение, которое написал выше, вполне достаточно для тогрговли на ФОРТС.

Непонятно почему Вы, ФОРЕКСники, постоянно пытаетесь что-то посоветовать (доказать) ФОРТСникам :)  

 
Dmitry Fedoseev:
В любом случае: проверяется ли символ или нет, автоматическое придумывание магика это фикция - нерешаемая задача.
Решаемая, с вероятностью 99.999999% и выше конфликтов не будет... Вижу необходимость написания библиотеки.
Вопрос в кодировании имени советника, инструмента, таймфрейма и параметров(две и более копии советников с разными параметрами). Можно ещё и комментарий задействовать, будет ещё меньше вероятность конфликтов магиков.
Файлы и глобальные переменные не используются, абсолютно не боится переноса на ВПС, другую систему и т.д.
........

 
prostotrader:

Алексей!

ФОРТС и ФОРЕКС аблолютно разные рынки и абсолютно разные идеологии. 

Я не видел ни одной стратегии на ФОРТС, чтобы торговали на одном сивмоле хотя бы 2 одинаковых советника.

Это у Вас (ФОРЕКС) есть Таймфреймы, индикаторы и пр. е....да.

В эксперте WriteSymbols выделянтся диаппозон с шагом 10000 (резервирование для данного символа 10000 магиков)

Этот диаппозон магиков ВСЕГДА один и тот же для данного символа, не важно сколько раз Вы будете перегружать советник или терминал.

Если у Вас отстался ордер, при перезагрузке терминала (советника), то выполнив элементарный цикл по просмотру действующих

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

Поэтому решение, которое написал выше, вполне достаточно для тогрговли на ФОРТС.

Непонятно почему Вы, ФОРЕКСники, постоянно пытаетесь что-то посоветовать (доказать) ФОРТСникам :)  

Миша, не надо сказочек, терминал тот же везде, принцип учета ордеров тот же, идентификаторы, тикеты, ордера, сделки, позиции. Не надо из себя какого-то уникума изображать, а то скорее можно подумать что ваш ФОРТС больше на секту похож - в том же мире живут, но им кажется, что у них что-то там сверх особенное, но это не у всех, а только у вас. 

Сами определитесь с тем, что пишите здесь. В цитате выделенное - теперь пишите что для символа выделены магики, перед этим писали, что для каждого эксперта свои. 

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

Получается, вообще - выдумана несуществующая проблема. А в качестве решения - извращенный способ проверки символа.

 
Aliaksandr Hryshyn:
Решаемая, с вероятностью 99.999999% и выше конфликтов не будет... Вижу необходимость написания библиотеки.
Вопрос в кодировании имени советника, инструмента, таймфрейма и параметров(две и более копии советников с разными параметрами). Можно ещё и комментарий задействовать, будет ещё меньше вероятность конфликтов магиков.
Файлы и глобальные переменные не используются, абсолютно не боится переноса на ВПС, другую систему и т.д.
........

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

Забавно так - когда не понимаешь как что-то работает, кажется оно обладает магической силой. Да? 

 

"Подредактировал" код. Существенно сократился до 3- функций

GetMagic - функция получения магика для символа, который является началом диаппозона магиков (65536) для него (символа)

Пришлось взять для диаппозона 2 байта, т.к 1 байт (256 магиков мне показалось мало)

IsMyMagic - функция принадлежности магика (любого из диаппозона) символу

SplitString - вспомогательная функция

OnInit - демонстрация работы функций

//+------------------------------------------------------------------+
//|                                                        Magic.mqh |
//|                                     Copyright 2017, prostotrader |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017 prostotrader"
#property link      "https://www.mql5.com"
#property version   "1.00"
//
ulong mem_magic = 0;
//-------------------------------------------------------------------+
// Split string function                                             |
//+------------------------------------------------------------------+
string SplitString(const string a_str,ulong &a_month,ulong &a_year)
  {
   int str_tire=0;
   int str_tochka=0;
   int str_size=StringLen(a_str);
   ushort let_symbol;
   for(int i=0;i<str_size;i++)
     {
      let_symbol=StringGetCharacter(a_str,i);
      if(let_symbol == '-') str_tire = i;
      if(let_symbol == '.')
        {
         str_tochka=i;
         break;
        }
     }
   if((str_tire!=0) && (str_tochka!=0))
     {
      a_month= ulong(StringToInteger(StringSubstr(a_str,str_tire+1,str_tochka-str_tire-1)));
      a_year = ulong(StringToInteger(StringSubstr(a_str,str_tochka+1,str_size-str_tochka-1)));
      if((a_month > 0) && (a_year > 0)) return(StringSubstr(a_str, 0, str_tire));
     }
   return("");
  }
//-------------------------------------------------------------------+
// Get Magic function                                                |
//+------------------------------------------------------------------+
ulong GetMagic(const string a_symbol)
  {
   ulong month = 0;
   ulong year = 0;
   string new_str=SplitString(a_symbol,month,year);
   if(StringLen(new_str)>0)
     {
      uchar char_array[];
      int result=StringToCharArray(new_str,char_array,0,WHOLE_ARRAY,CP_ACP);
      if(result>0)
        {
         ulong value;
         ulong cur_magic = 0;
         for(int i = 0; i < result; i++)
           {
            value=ulong(char_array[i]);
            value<<=(40 -(i*8));
            cur_magic+=value;
           }
         month<<=8;
         cur_magic += month;
         cur_magic += year;
         return(cur_magic <<= 16);
        }
     }
   return(0);
  }
//-------------------------------------------------------------------+
// Is my magic function                                              |
//+------------------------------------------------------------------+
bool IsMyMagic(const ulong m_magic)
  {
   ulong in_magic=m_magic;
   ulong stored_magic=mem_magic;
   in_magic>>=16;
   stored_magic>>=16;
   if(stored_magic == in_magic) return(true);
   return(false);
  }
//-------------------------------------------------------------------+
int OnInit()
  {
   mem_magic=GetMagic(Symbol());
   Print("Symbol = ",Symbol()," Magic = ",mem_magic);
   for(int i=0; i<5;i++)
     {
//Тестовая проверка на 5 магиков из диаппазона (65535)
      Print(IsMyMagic(mem_magic+i));
     }
//Минус 1 диаппозона
   Print(IsMyMagic(mem_magic-1));
//Превышение диаппозона
   Print(IsMyMagic(mem_magic+65536));
//Другой символ
   ulong m_magic=GetMagic("Si-3.17");
   Print("Symbol = Si-3.17 ",IsMyMagic(m_magic));
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+

 

2017.02.01 09:13:50.286 Magic (RTS-3.17,M1)     Symbol = RTS-3.17 Magic = 5932457868670337024
2017.02.01 09:13:50.286 Magic (RTS-3.17,M1)     true
2017.02.01 09:13:50.286 Magic (RTS-3.17,M1)     true
2017.02.01 09:13:50.286 Magic (RTS-3.17,M1)     true
2017.02.01 09:13:50.286 Magic (RTS-3.17,M1)     true
2017.02.01 09:13:50.286 Magic (RTS-3.17,M1)     true
2017.02.01 09:13:50.286 Magic (RTS-3.17,M1)     false
2017.02.01 09:13:50.286 Magic (RTS-3.17,M1)     false
2017.02.01 09:13:50.286 Magic (RTS-3.17,M1)     Symbol = Si-3.17 false


 

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