Longitud máxima de un nombre de símbolo en FOREX - página 4

 

Ahora, también puede utilizarlo en FOREX (toma cualquier carácter "torcido", incluso como _BTCUSD_i )

//+------------------------------------------------------------------+
//|                                                    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);
  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 != "")
  { 
    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);
}
//+------------------------------------------------------------------+
 
prostotrader:

Ahora, usted puede utilizarlo en FOREX (acepta cualquier carácter "torcido", incluso como _BTCUSD_i)

A la kodobase

 
prostotrader:

Hace mucho tiempo escribí un archivo plug-in para recuperar automáticamente Magic

¿Cuál era la tarea?

Por favor, compruebe si el mensaje "FOREX done." aparece en los símbolos "torcidos".

No aparece en "EURUSD".

¿El símbolo base es siempre el primero del par?

Los símbolos personalizados pueden tener cualquier cosa. Probablemente sea la forma más conveniente de realizar estas comprobaciones en las personalizadas.


SZ

Foro sobre comercio, sistemas de comercio automatizados y pruebas de estrategias

Bibliotecas: AutoMagic

Dmitry Fedoseev, 2017.02.03 13:31

El uso de un asa del gráfico para formar un magik significa que si el gráfico se cierra accidentalmente, las órdenes se perderán.

 
fxsaber:

No aparece en el EURUSD.

SZY

Corregido

Añadido a ZY

Escribe algo mejor

 
prostotrader:

Corregido

Ya funciona. Ahora me gustaría escuchar unas palabras sobre el lado práctico de las cosas.


ZS "AUDNZD"...

 
fxsaber:

Ya funciona. Ahora me gustaría escuchar unas palabras sobre el lado práctico de las cosas.


ZS "AUDNZD"...

Crea automáticamente un Magik único para el EA en el gráfico con la capacidad de utilizar 65535 Magiks adicionales

Añadido

No tengo FOREX.

Escribí la funciónGetForexName sin comprobar

 
prostotrader:

Crea automáticamente un Magik único para el EA en el gráfico con la capacidad de utilizar 65535 Magiks adicionales

Entonces, ¿qué pasa si el EA se corta al cerrar el gráfico en un momento en que hay sus posiciones/órdenes?


No estoy muy seguro de por qué algo así no ha funcionado en Forex

bool SymbolIsExist( const string Symb = NULL )
{
  ResetLastError();

  SymbolInfoInteger((Symb == NULL) ? _Symbol : Symb, SYMBOL_CUSTOM);

  return(::GetLastError() != ERR_MARKET_UNKNOWN_SYMBOL);
}

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

void OnStart()
{
  Print(GetForexName(_Symbol));
}
 
prostotrader:

No tengo FOREX.

Do - MQ-Demo.

 
fxsaber:

¿Y qué pasa si el EA se corta al cerrar el gráfico en un momento en el que hay una posición/orden?


Si hay una posición, entonces todos los datos pueden ser recuperados cuando el gráfico se cierra, y las órdenes pendientes en este símbolo pueden ser simplemente "clavadas".

Nadie ha tenido todavía una idea mejor (para abrir varios EAs sobre el mismo símbolo)

 
fxsaber:

ZS "AUDNZD"...

AUDNZD funciona en Roboforex