Максисальная длина названия символа на FOREX - страница 5

 
prostotrader:

Если есть позиция, то все данные можно получить, при закрытии чарта, а отложенные ордера по этому символу просто "прибить".

Для чего получить? Серьезный минус Вашего варианта именно в том, что идет привязка к хэндлу чарта. 

Лучше, пока, никто не придумал (для открытия нескольких советников на одном и том же символе)

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

 
prostotrader:

На Roboforex AUDNZD работает

Print(GetForexName("AUDNZD"));
 
fxsaber:

Так а что делать, если советник отрубили, закрыв чарт в момент, когда есть его позиции/ордера?


Не совсем понял, почему нечто подобное не прокатило для Forex

Потому что не понятно, что ставить сначала

У EURUSD - base - EUR, а у  AUDNZD - base NZD

 
//+------------------------------------------------------------------+
//|                                                    AutoMagic.mqh |
//|                                 Copyright 2017-2018 prostotrader |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
//version   "1.01
//#define FORTS
//---
struct SYMBOL_MAGIC
{
  long ch_id;
  ulong magic;
};
SYMBOL_MAGIC symb_magic;
//-------------------------------------------------------------------+
// Split string function                                             |
//+------------------------------------------------------------------+
string SplitString(const string a_str,ulong &a_month,ulong &a_year)
  {
   int str_size=StringLen(a_str);
   int str_tire=StringFind(a_str, "-");
   int str_tochka=StringFind(a_str, ".", str_tire);
   if((str_tire>0) && (str_tochka>0) &&(str_size > 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 FOREX symbol function                                       |
//+------------------------------------------------------------------+
string GetForexName(const string a_str)
{
  string s_base = SymbolInfoString(Symbol(), SYMBOL_CURRENCY_BASE);
  string a_prof = SymbolInfoString(Symbol(), SYMBOL_CURRENCY_PROFIT);
  if(StringLen(s_base) == 3)
  {
    int base_pos = StringFind(a_str, s_base, 0);
    if(base_pos > -1)
    {
      switch(base_pos)
      {
        case 0:
        case 1:
        case 2:
          return(StringSubstr(a_str, base_pos, 6));
        break;
        default:
          {
            string left_str = StringSubstr(a_str, base_pos - 3, 3);
            string right_str = StringSubstr(a_str, base_pos + 3, 3);
            if(right_str == "")
            {
              return(StringSubstr(a_str, base_pos - 3, 6));
            }
            else
            if(StringLen(right_str) < 3)
            {
              return(StringSubstr(a_str, base_pos - 3, 6));
            }
            else
            {
              bool is_match = true;
              uchar uch_array[];
              int result = StringToCharArray(right_str, uch_array, 0, WHOLE_ARRAY, CP_ACP);
              if(result == 4)
              {
                for(int i=0; i < result - 1; i++)
                {
                  if((uch_array[i] < 65) || (uch_array[i] > 90))
                  {
                    is_match = false;
                    break;
                  } 
                }
                if(is_match == true)
                {
                  return(StringSubstr(a_str, base_pos, 6));  
                }
                else
                {
                  is_match = true;
                  result = StringToCharArray(left_str, uch_array, 0, WHOLE_ARRAY, CP_ACP);
                  if(result == 4)
                  {
                    for(int i=0; i < result - 1; i++)
                    {
                      if((uch_array[i] < 65) || (uch_array[i] > 90))
                      {
                        is_match = false;
                        break;
                      } 
                    }
                    if(is_match == true)
                    {
                      return(StringSubstr(a_str, base_pos - 3, 6));  
                    }  
                  } 
                }
              }  
            }
          }
        break;  
      }
    }
  }
  return("");
}  
//-------------------------------------------------------------------+
// Get Magic function                                                |
//+------------------------------------------------------------------+
ulong GetMagic(const string a_symbol)
{
//--- Get ChartID
  symb_magic.ch_id = ChartID();
//---
  if(SymbolSelect(Symbol(), true) == false)
  {
    Print(__FUNCTION__, ": Нет такого символа!");
    return(0);
  }  
#ifdef FORTS
//--- Test symdol
  if(StringLen(a_symbol)>10)
  {
    Print(__FUNCTION__, ": Не правильный символ!");
    return(0);
  }
  if(symb_magic.ch_id != 0)
  {
    ulong month = 0;
    ulong year = 0;
    string new_str=SplitString(a_symbol,month,year);
    if(StringLen(new_str)>0)
    {
      symb_magic.magic = 0;
      uchar char_array[];
      int result=StringToCharArray(new_str,char_array,0,WHOLE_ARRAY,CP_ACP);
      if(result>0)
      {
        ulong value;
        for(int i = 0; i < result - 1; i++)
        {
          value=ulong(char_array[i]);
          value<<=(56 -(i*8));
          symb_magic.magic += value;
        }
        month<<=24;
        symb_magic.magic += month;
        year<<=16;
        symb_magic.magic += year;
        ulong a_chid = ulong(symb_magic.ch_id);
        a_chid<<=16;
        return(symb_magic.magic&=symb_magic.ch_id);
      }
    }
  }
#else
  string in_str = GetForexName(a_symbol);
  if(in_str != "")
  { 
    Print("in_str = ", in_str);
    symb_magic.magic = 0;
    uchar char_array[];
    int result=StringToCharArray(a_symbol,char_array,0,WHOLE_ARRAY,CP_ACP);
    if(result>0)
    {
      ulong value;
      for(int i = 0; i < 6; i++)
      {
        value=ulong(char_array[i]);
        value<<=(56 -(i*8));
        symb_magic.magic += value;
      }  
      ulong a_chid = ulong(symb_magic.ch_id);
      a_chid<<=16;
      return(symb_magic.magic&=symb_magic.ch_id);
    }
  }
#endif    
  return(0); 
}
//-------------------------------------------------------------------+
// Is my magic function                                              |
//+------------------------------------------------------------------+
bool IsMyMagic(const ulong m_magic, const long chart_id)
{
  if(symb_magic.ch_id == chart_id)
  {
    ulong stored_magic=symb_magic.magic;
    stored_magic>>=16;
    ulong in_magic = m_magic;
    in_magic>>=16;
    if(in_magic == stored_magic) return(true);
  }
  return(false);
}
//+------------------------------------------------------------------+
2018.08.25 15:29:02.174 Magic_test (AUDNZD,M1)  in_str = AUDNZD
2018.08.25 15:29:02.384 Magic_test (AUDNZD,M1)  FOREX done.
int OnInit()
  {

  ulong a_magic = GetMagic(Symbol());
  if(a_magic != 0)
  {
    a_magic+=25;
    if(IsMyMagic(a_magic, ChartID()) == true)
    {
      Print("FOREX done.");
    }
  }
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
 

Есть способ сохранить магик в глобальную переменную ТЕРМИНАЛА, тогда вообще ничего не потеряется

Щас напишу

 
prostotrader:

Есть способ сохранить магик в глобальную переменную ТЕРМИНАЛА, тогда вообще ничего не потеряется

Щас напишу

При аварийном завершении она убивается.

 
prostotrader:

Потому что не понятно, что ставить сначала

У EURUSD - base - EUR, а у  AUDNZD - base NZD

Так всегда

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Максисальная длина названия символа на FOREX

fxsaber, 2018.08.25 14:12

string GetForexName( const string Symb )
{
  return(SymbolIsExist(Symb) ? SymbolInfoString(Symb, SYMBOL_CURRENCY_BASE) + SymbolInfoString(Symb, SYMBOL_CURRENCY_PROFIT) : NULL);
}

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

#include <crc64.mqh> // https://www.mql5.com/en/blogs/post/683577

string GetMagicString()
{
  return(MQLInfoString(MQL_PROGRAM_PATH/*MQL_PROGRAM_NAME*/) + _Symbol + (string)ChartID()/* + (string)_Period*/);
}

ulong GetMagic()
{
  uchar Bytes[];
  
  return(crc64(0, Bytes, StringToCharArray(GetMagicString(), Bytes)));
}
  
void OnStart()
{
  Print(GetMagic());
}
 
fxsaber:

Так всегда


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

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

Но про CRC я забыл, что она есть в MQL :)  спасибо

Тогда вообще не будет никаких проблем.

fxsaber: спасибо

 
Vitaly Muzichenko:

При аварийном завершении она убивается.

Глобальные переменные терминала для того и созданы, чтобы не "убивались"


 
fxsaber:

Так всегда


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

Ваш вариант не подойдёт, потому что на одном и том же символе можно запустить тот же советник