Lunghezza massima del nome di un simbolo sul FOREX - pagina 2

 

In realtà volevo fare qualcosa di carino per FORES, ma credo che non fosse destino.

Molto tempo fa ho scritto un file plug-in per Magic automatico, e ora l'ho modificato

Ho deciso di farlo per il forex, ma non era destino.

Se qualcuno aggiunge la funzioneGetForexName, funzionerà anche per il 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);
}
//+------------------------------------------------------------------+

Gli ultimi 2 byte sono utilizzati per utilizzare molti maghi in un EA.

chart_id - è usato per identificare il grafico (puoi aprire tutti i simboli identici che vuoi)

Prima di qualsiasi lavoro con Magic, chiamate la funzioneIsMyMagic, che controllerà se il mago appartiene al dato EA

 
prostotrader:

Non è chiaro come analizzare un simbolo se può avere qualcosa davanti :(

Crea un array di valute usate, per esempio "EUR" "USD" "JPY"
Poi usa questa funzione per accoppiare tutte le combinazioni possibili, per esempio "EURUSD" "EURJPY" "USDEUR" "USDJPY" "JPYEUR" "JPYUSD".
E ogni volta controlla se c'è un'occorrenza di questa combinazione nel nome del simbolo che stai analizzando. Se c'è un'occorrenza - il nome di sei lettere viene trovato.

 
Andrei Fandeev:

Crea un array di valute usate, per esempio "EUR" "USD" "JPY".
Poi usa questa funzione per accoppiare tutte le combinazioni possibili, per esempio "EURUSD" "EURJPY" "USDEUR" "USDJPY" "JPYEUR" "JPYUSD".
E ogni volta controlla se c'è un'occorrenza di questa combinazione nel nome del simbolo che stai analizzando. Se c'è un'occorrenza - il nome di sei lettere viene trovato.

Fai un favore a tutti, aggiungi la funzioneGetForexName

 
prostotrader:

Grazie, ma ho solo bisogno di ottenere il nome "nudo" della coppia (6 caratteri).

Forse qualcuno ha una soluzione pronta?

Aggiunto

Non è chiaro come analizzare un simbolo se può avere qualcosa davanti alla coppia stessa :(

i copiatori usano spesso 2 parametri prefisso e suffisso (un simbolo aggiuntivo prima o dopo EURUSD)

 
prostotrader:

Grazie, ma ho solo bisogno di ottenere il nome "nudo" della coppia (6 caratteri).

Forse qualcuno ha una soluzione pronta?

Aggiunto

Non è chiaro come analizzare un simbolo se può avere qualcosa davanti alla coppia stessa :(

StringFind

 

dipende dal broker mi ricordo una situazione che mi ha gettato in una specie di torpore - il cliente aveva un errore, che mi ha davvero spaventato e ho pensato che avrei dovuto scrivere dei kit grezzi per il riconoscimento dei simboli

2016.10.16 13:08:51.633 2016.08.25 04:39 Expert EURUSD(€),M15: OrderSend error 4106

2016.10.16 13:08:51.633 2016.08.25 04:40 Expert EURUSD(€),M15: nome simbolo sconosciuto EURUSD(ˆ) per funzione OrderSend

 
prostotrader:

Nel forex ci sono simboli per lo più con suffissi, con prefissi molto raramente, ma sempre la base (coppia) è scritta in lettere maiuscole e tutti i prefissi in lettere minuscole, quindi si può costruire su questo.

 
Vitaly Muzichenko:

Nel forex ci sono simboli con suffissi per lo più, prefissi molto raramente, ma sempre la base (coppia) è scritta in lettere maiuscole e tutti i prefissi in lettere piccole, quindi questo è un buon punto di partenza.

È più affidabile, soprattutto se si tratta di un parametro di ingresso per ridurre tutto a un singolo caso StringToLower o StringToUpper e cercare StringFind. Allora non importa dove o cosa viene aggiunto.

 

se si usano solo coppie di valute:

Per SymbolInfoString()

ENUM_SYMBOL_INFO_STRING

Identificatore

Descrizione

Tipo di proprietà

SIMBOLO_BASI

Nome dell'attività sottostante per il derivato

stringa

SIMBOLO_VALUTA_BASE

Valuta di base dello strumento

stringa

SIMBOLO_VALUTA_PROFITTO

Valuta del profitto

stringa

MARGINE_DI_VALUTA DEL SIMBOLO

Valuta in cui viene calcolato il margine

stringa

SIMBOLO_BANCARIO

Fonte della citazione attuale

stringa

SIMBOLO_DESCRIZIONE

Descrizione stringa del simbolo

stringa

FORMULA SIMBOLO

Formula per costruire il prezzo di un simbolo personalizzato

stringa

SIMBOLO_ISIN

Nome di un simbolo commerciale nel sistema ISIN (International Securities Identification Number). L'International Securities Identification Number è un codice alfanumerico di 12 cifre che identifica univocamente un titolo. La presenza di questa caratteristica è definita dal lato del server commerciale.

stringa

SIMBOLO_PAGINA

Indirizzo della pagina web che contiene informazioni sul simbolo. Questo indirizzo sarà visualizzato come link quando si visualizzano le proprietà del simbolo nel terminale

stringa

PERCORSO DEL SIMBOLO

Percorso nell'albero dei simboli

stringa

 
Konstantin Nikitin:

È più affidabile, soprattutto se si tratta di un parametro di ingresso, ridurre tutto a un caso StringToLower o StringToUpper e cercare StringFind. Allora non importa dove o cosa viene aggiunto.

Ma non capisco il problema, perché un carattere non può essere sostituito lì, indipendentemente dalla sua lunghezza

Motivazione: