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

 
prostotrader:

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

¿Para qué lo quieres? La grave desventaja de su variante es exactamente la unión con el mango de la carta.

A nadie se le ha ocurrido uno mejor (para abrir varios EAs sobre un mismo símbolo).

Es posible desprenderse del asa, pero en este caso, tenemos que conectarla a otra cosa. Por ejemplo, a los parámetros de entrada del EA + camino hacia él. Sin embargo, esta solución también tiene su propia desventaja.

 
prostotrader:

En Roboforex AUDNZD funciona

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

¿Y 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

Porque no está claro qué colocar primero

Para el EURUSD labase es el EUR y parael AUDNZD la base es el 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()
  {
//---
   
  }
 

Hay una manera de almacenar el magik en una variable global TERMINAL, entonces no se pierde nada en absoluto

Lo escribiré ahora.

 
prostotrader:

Hay una manera de almacenar el magik en una variable global TERMINAL, entonces no se pierde nada en absoluto

Lo escribiré.

Cuando se estrella, se mata.

 
prostotrader:

Porque no está claro qué poner primero

Para el EURUSD labase es el EUR y parael AUDNZD la base es el NZD

Siempre

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

Longitud máxima de un nombre de símbolo en 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);
}

Te estás inventando una bicicleta llamada "no es una función hash universal". He aquí una variante sencilla, con la misma funcionalidad que la suya

#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:

Siempre es así.


Te estás inventando una bicicleta llamada "no es una función hash universal". He aquí una variante sencilla, con la misma funcionalidad que la suya

Los dos últimos bytes se reservan para los magos adicionales de esta carta

Pero me olvidé de CRC que está en MQL :) gracias

Entonces no habrá ningún problema.

fxsaber: gracias

 
Vitaly Muzichenko:

Cuando se estrella, se mata.

Por eso se creanvariables globales de terminal, para que no se "maten


 
fxsaber:

Siempre es así.


Te estás inventando una bicicleta llamada "no es una función hash universal". He aquí una variante sencilla, con la misma funcionalidad que la suya

Su variante no funcionará, porque puede ejecutar el mismo EA en el mismo símbolo