Maximale Länge eines Symbolnamens auf FOREX - Seite 2

 

Eigentlich wollte ich etwas Nettes für FORES tun, aber es hat wohl nicht sollen sein.

Vor langer Zeit habe ich eine Plug-in-Datei für Magic geschrieben, und jetzt habe ich sie überarbeitet

Ich beschloss, es auch für Forex zu tun, aber es sollte nicht sein.

Wenn jemand die FunktionGetForexName hinzufügt, wird sie auch für FOREX funktionieren.

//+------------------------------------------------------------------+
//|                                                    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);
}
//+------------------------------------------------------------------+

Die letzten 2 Bytes werden verwendet, um eine Vielzahl von Assistenten in einem EA zu verwenden.

chart_id - wird zur Identifizierung des Diagramms verwendet (Sie können so viele identische Symbole öffnen, wie Sie möchten)

Bevor Sie mit Magic arbeiten, rufen Sie die FunktionIsMyMagic auf, die prüft, ob der Magier zu dem angegebenen EA gehört

 
prostotrader:

Es ist nur nicht klar, wie man ein Symbol analysieren kann, wenn es irgendetwas vorangestellt haben kann :(

Erstellen Sie ein Array der verwendeten Währungen, zum Beispiel "EUR" "USD" "JPY".
Verwenden Sie dann diese Funktion, um alle möglichen Kombinationen zu paaren, zum Beispiel "EURUSD" "EURJPY" "USDEUR" "USDJPY" "JPYEUR" "JPYUSD".
Und jedes Mal prüfen Sie, ob diese Kombination im Namen des zu analysierenden Symbols vorkommt. Wenn es ein Vorkommen gibt, wird der Name mit sechs Buchstaben gefunden.

 
Andrei Fandeev:

Erstellen Sie ein Array der verwendeten Währungen, zum Beispiel "EUR" "USD" "JPY".
Verwenden Sie dann diese Funktion, um alle möglichen Kombinationen zu paaren, zum Beispiel "EURUSD" "EURJPY" "USDEUR" "USDJPY" "JPYEUR" "JPYUSD".
Und jedes Mal prüfen Sie, ob diese Kombination im Namen des zu analysierenden Symbols vorkommt. Wenn es ein Vorkommen gibt, wird der Name mit sechs Buchstaben gefunden.

Tun Sie allen einen Gefallen und fügen Sie die FunktionGetForexName hinzu

 
prostotrader:

Danke, aber ich brauche nur den "bloßen" Namen des Paares (6 Zeichen).

Vielleicht hat jemand eine fertige Lösung?

Hinzugefügt

Es ist nur nicht klar, wie man ein Symbol analysiert, wenn es etwas vor dem Paar selbst haben kann :(

Kopierer verwenden häufig 2 Parameter: Präfix und Suffix (ein zusätzliches Symbol vor oder nach EURUSD)

 
prostotrader:

Danke, aber ich brauche nur den "bloßen" Namen des Paares (6 Zeichen).

Vielleicht hat jemand eine fertige Lösung?

Hinzugefügt

Es ist nur nicht klar, wie man ein Symbol analysiert, wenn es etwas vor dem Paar selbst haben kann :(

StringFind

 

Es hängt vom Makler ab. Ich erinnere mich an eine Situation, die mich in eine Art Stupor versetzte - der Kunde hatte einen Fehler, der mich wirklich erschreckte, und ich dachte, dass ich grobe Kits für die Symbolerkennung schreiben müsste

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

2016.10.16 13:08:51.633 2016.08.25 04:40 Expert EURUSD(€),M15: unbekannter Symbolname EURUSD(ˆ) für OrderSend-Funktion

 
prostotrader:

Im Devisenhandel gibt es meist Symbole mit Suffixen, sehr selten mit Präfixen, aber immer wird die Basis (das Paar) groß und alle Präfixe klein geschrieben, so dass man darauf aufbauen kann.

 
Vitaly Muzichenko:

Im Devisenhandel gibt es meist Symbole mit Suffixen, sehr selten mit Präfixen, aber immer wird die Basis (das Paar) groß und alle Präfixe klein geschrieben, so dass dies ein guter Ausgangspunkt ist.

Es ist zuverlässiger, vor allem wenn es sich um einen Eingabeparameter handelt, alles auf einen einzigen Fall StringToLower oder StringToUpper zu reduzierenund StringFindzu suchen.Dann ist es egal, wo und was hinzugefügt wird.

 

wenn nur Währungspaare verwendet werden:

Für SymbolInfoString()

ENUM_SYMBOL_INFO_STRING

Kennung

Beschreibung

Art der Immobilie

SYMBOL_BASIS

Name des Basiswerts des Derivats

String

SYMBOL_WÄHRUNG_BASIS

Basiswährung des Instruments

String

SYMBOL_WAEHRUNG_GEWINN

Gewinnwährung

String

SYMBOL_WAEHRUNG_MARGIN

Währung, in der die Marge berechnet wird

String

SYMBOL_BANK

Aktuelle Zitatquelle

String

SYMBOL_BESCHREIBUNG

String-Beschreibung des Symbols

String

SYMBOL_FORMULA

Formel zur Berechnung des Preises für ein benutzerdefiniertes Symbol

String

SYMBOL_ISIN

Name eines Handelssymbols im System der Internationalen Wertpapier-Identifikationsnummer (ISIN). Die internationale Wertpapierkennnummer ist ein 12-stelliger alphanumerischer Code zur eindeutigen Identifizierung eines Wertpapiers. Das Vorhandensein dieses Merkmals wird auf der Seite des Handelsservers definiert.

String

SYMBOL_PAGE

Adresse der Webseite, die Informationen über das Symbol enthält. Diese Adresse wird bei der Anzeige der Symboleigenschaften im Terminal als Link angezeigt

String

SYMBOL_PATH

Pfad im Symbolbaum

String

 
Konstantin Nikitin:

Es ist zuverlässiger, insbesondere wenn es sich um einen Eingabeparameter handelt, alles auf einen einzigen Fall StringToLower oder StringToUpper zu reduzierenund StringFindzu suchen.Dann spielt es keine Rolle, wo und was hinzugefügt wird.

Aber ich verstehe das Problem nicht, warum ein Zeichen dort nicht sofort ersetzt werden kann, unabhängig von seiner Länge