Comprimento máximo de um nome simbólico no FOREX - página 2

 

Na verdade eu queria fazer algo bom para FORES, mas acho que não era para ser.

Há muito tempo atrás eu escrevi um arquivo de plug-in para Magic automático, e agora eu o ajustei

Decidi fazer isso também para o mercado cambial, mas não era para ser assim.

Se alguém acrescentar a funçãoGetForexName a ela, ela funcionará também para FOREX.

//+------------------------------------------------------------------+
//|                                                    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)
{
  //??????? Из любого названия пары функция долна возвращать ТОЛЬКО саму пару (н-р UERUSD)
  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);
}
//+------------------------------------------------------------------+

Os últimos 2 bytes são usados para usar muitos feiticeiros em uma EA.

chart_id - é usado para identificar o gráfico (você pode abrir quantos símbolos idênticos quiser)

Antes de qualquer trabalho com Magic, chame a funçãoIsMyMagic, que verificará se o mágico pertence à EA em questão

 
prostotrader:

Só não está claro como analisar um símbolo se ele pode ter algo na frente dele :(

Criar uma gama de moedas usadas, por exemplo "EUR" "USD" "JPY".
Em seguida, use esta função para emparelhar todas as combinações possíveis, por exemplo "EURUSD" "EURJPY" "USDEUR" "USDJPY" "JPYEUR" "JPYUSD".
E cada vez que você verifica se há uma ocorrência desta combinação no nome do símbolo que você está analisando. Se houver uma ocorrência - o nome de seis letras é encontrado.

 
Andrei Fandeev:

Criar uma gama de moedas usadas, por exemplo "EUR" "USD" "JPY".
Em seguida, use esta função para emparelhar todas as combinações possíveis, por exemplo "EURUSD" "EURJPY" "USDEUR" "USDJPY" "JPYEUR" "JPYUSD".
E cada vez que você verifica se há uma ocorrência desta combinação no nome do símbolo que você está analisando. Se houver uma ocorrência - o nome de seis letras é encontrado.

Faça um favor a todos, acrescente a funçãoGetForexName

 
prostotrader:

Obrigado, mas eu só preciso obter o nome "nu" do par (6 caracteres).

Talvez alguém tenha uma solução já feita?

Adicionado

Só não está claro como analisar um símbolo se ele pode ter algo na frente do próprio par :(

os copiadores usam frequentemente 2 parâmetros de prefixo e sufixo (um símbolo adicional antes de EURUSD ou depois)

 
prostotrader:

Obrigado, mas eu só preciso obter o nome "nu" do par (6 caracteres).

Talvez alguém tenha uma solução já feita?

Adicionado

Só não está claro como analisar um símbolo se ele pode ter algo na frente do próprio par :(

StringFind

 

Depende do corretor, lembro-me de uma situação que me colocou em uma espécie de estupor - o cliente teve um erro, o que realmente me assustou e achei que teria que escrever kits brutos para o reconhecimento do símbolo

2016.10.16 13:08:51.633 2016.08.25 04:39 Perito EURUSD(EUR),M15: Erro no envio de encomendas 4106

2016.10.16 13:08:51.633 2016.08.25 04:40 Perito EURUSD(EUR),M15: nome do símbolo desconhecido EURUSD(ˆ) para a função OrderSend

 
prostotrader:

Em forex há símbolos na maioria das vezes com sufixos, com prefixos muito raramente, mas sempre a base (par) é escrita em letras maiúsculas e todos os prefixos em letras minúsculas, de modo que você pode construir sobre isso.

 
Vitaly Muzichenko:

Em forex há símbolos com sufixos na maioria das vezes, prefixos muito raramente, mas sempre a base (par) é escrita em letras maiúsculas e todos os prefixos em letras pequenas, portanto este é um bom ponto de partida.

É mais confiável, especialmente se for um parâmetro de entrada, reduzir tudo a um único caso StringToLower ou StringToUpper e pesquisar StringFind. Então, não importa onde e o que é acrescentado.

 

se apenas pares de moedas forem utilizados:

Para SymbolInfoString()

ENUM_SÍMBOLO_INFO_STRING

Identificador

Descrição

Tipo de propriedade

SÍMBOLO_BASE

Nome do ativo subjacente para o derivativo

corda

BASE_DE_MOEDA_SÍMBOLO

Moeda base do instrumento

corda

SÍMBOLO_CURRENCY_PROFIT

Moeda de lucro

corda

SÍMBOLO_MOEDA_MARGIN

Moeda na qual a margem é calculada

corda

SYMBOL_BANK

Fonte de cotação atual

corda

SIMBOLOGIA_DESCRIÇÃO

Descrição de corda do símbolo

corda

SYMBOL_FORMULA

Fórmula para a construção do preço de um símbolo personalizado

corda

SYMBOL_ISIN

Nome de um símbolo comercial no sistema International Securities Identification Number (ISIN). O Número Internacional de Identificação de Títulos é um código alfanumérico de 12 dígitos que identifica de forma única um título. A presença desta característica é definida no lado do servidor comercial.

corda

SYMBOL_PAGE

Endereço da página web que contém informações sobre o símbolo. Este endereço será exibido como um link ao visualizar as propriedades do símbolo no terminal

corda

SÍMBOLO_PATH

Caminho na árvore de símbolos

corda

 
Konstantin Nikitin:

É mais confiável, especialmente se for um parâmetro de entrada, reduzir tudo para um caso StringToLower ou StringToUpper e pesquisar StringFind. Então, não importa onde ou o que é acrescentado.

Mas eu não entendo o problema, por que um personagem não pode ser substituído ali, independentemente de seu comprimento

Razão: