Maximale Länge eines Symbolnamens auf FOREX - Seite 4

 

Jetzt können Sie es auch auf FOREX verwenden (nimmt alle "krummen" Zeichen, auch wie _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:

Jetzt können Sie es auf FOREX verwenden (akzeptiert alle "krummen" Zeichen, auch wie _BTCUSD_i)

Zur kodobase

 
prostotrader:

Vor langer Zeit habe ich eine Plugin-Datei geschrieben, die automatisch die Magic

Was war die Aufgabe?

Bitte prüfen Sie, ob die Meldung "FOREX done." bei "krummen" Symbolen erscheint

Er erscheint nicht bei "EURUSD".

Ist das Basissymbol immer das erste im Paar?

Benutzerdefinierte Symbole können alles haben. Dies ist wahrscheinlich der bequemste Weg, um solche Prüfungen bei benutzerdefinierten Programmen durchzuführen.


SZ

Forum zum Thema Handel, automatisierte Handelssysteme und Strategietests

Bibliotheken: AutoMagic

Dmitry Fedoseev, 2017.02.03 13:31

Die Verwendung eines Chart-Handles zur Bildung einer Magie bedeutet, dass die Aufträge verloren gehen, wenn der Chart versehentlich geschlossen wird.

 
fxsaber:

Erscheint nicht auf EURUSD.

SZY

Korrigiert

Zu ZY hinzugefügt

Schreiben Sie etwas Besseres

 
prostotrader:

Korrigiert

Es funktioniert jetzt. Nun möchte ich ein paar Worte über die praktische Seite der Dinge hören.


ZS "AUDNZD"...

 
fxsaber:

Es funktioniert jetzt. Nun möchte ich ein paar Worte über die praktische Seite der Dinge hören.


ZS "AUDNZD"...

Erstellt automatisch ein einzigartiges Magik für den EA auf dem Chart mit der Möglichkeit, 65535 zusätzliche Magiks zu verwenden

Hinzugefügt

Ich habe kein FOREX.

Ich habe die FunktionGetForexName ohne Überprüfung geschrieben

 
prostotrader:

Erstellt automatisch ein einzigartiges Magik für den EA auf dem Chart mit der Möglichkeit, 65535 zusätzliche Magiks zu verwenden

Was also, wenn der EA durch das Schließen des Diagramms zu einem Zeitpunkt abgeschnitten wird, zu dem seine Positionen/Bestellungen vorhanden sind?


Ich bin mir nicht ganz sicher, warum so etwas bei Forex nicht funktioniert hat.

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:

Ich habe kein FOREX.

Do - MQ-Demo.

 
fxsaber:

Was also, wenn der EA durch das Schließen des Charts zu einem Zeitpunkt abgeschnitten wird, an dem eine Position/Auftrag vorliegt?


Wenn es eine Position gibt, können alle Daten abgerufen werden, wenn das Diagramm geschlossen wird, und die ausstehenden Aufträge für dieses Symbol können einfach "festgenagelt" werden.

Bisher ist noch niemand auf eine bessere Idee gekommen (um mehrere EAs für dasselbe Symbol zu öffnen)

 
fxsaber:

ZS "AUDNZD"...

AUDNZD funktioniert auf Roboforex