Maximale Länge eines Symbolnamens auf FOREX - Seite 11

 
prostotrader:

Es wird nicht funktionieren.

Derselbe EA auf denselben (unterschiedlichen) Symbolen.

Alle Instanzen zu einer Zeichenkette hinzufügen (Sie können auch einen Punkt hinzufügen),

 
prostotrader:
Wenn jemand eine Idee hat, wie man einzigartige Magie für jeden Auftrag anders (ohne Krücken), durch

Bitte teilen.

int magic = (int)TimeCurrent();
int magic = (int)TimeLocal();
Als Option, keine Kopfschmerzen.
 
prostotrader:

Time, danke, wird jedem EA Einzigartigkeit verleihen, und es besteht keine Notwendigkeit, an ChartID() und Pfad zum EA zu binden,

Sie müssen den Assistenten jedoch noch in der globalen Variable des Terminals speichern.

Die Zeit gibt keine Eindeutigkeit - starten Sie das Terminal mit allen aktivierten EAs neu - alle haben die gleiche Zeit)

 
Konstantin Nikitin:
Als Option, keine Kopfschmerzen.

Was ist, wenn der Nutzer es schafft, 2 oder 3 EAs in einer Sekunde zu werfen?

 
Taras Slobodyanik:

Zeit gibt keine Eindeutigkeit - starten Sie das Terminal mit aktivierten EAs neu - alle werden die gleiche Zeit haben)

Ja, genau.

 
prostotrader:

Was ist, wenn der Nutzer es schafft, 2 oder 3 EAs in einer Sekunde zu werfen?

Nun, eigentlich ist dies unwahrscheinlich.

Taras Slobodyanik:

die Zeit wird nicht eindeutig sein - starten Sie das Terminal mit aktivierten Expert Advisors neu - alle werden die gleiche Zeit haben)

Aber hier haben wir ein anderes Lied. Beim Neustart des EA muss der Expert Advisor weiterhin mit seinem Magier zusammenarbeiten, um die zuvor eröffneten Positionen beizubehalten. Das Erinnern wird also kein Problem sein.

 
Konstantin Nikitin:

Nun, das ist nicht sehr wahrscheinlich.

Dies ist eine andere Geschichte. Beim Neustart muss der Expert Advisor weiterhin mit seinem Magier zusammenarbeiten, um die zuvor eröffneten Positionen beizubehalten. Erinnern kann also nicht schaden.

Ich bin bei dieser Variante für FOREX (FORTS ohne Änderungen) stehen geblieben

Wenn jemand eine bessere Idee hat, zögern Sie bitte nicht.

//+------------------------------------------------------------------+
//|                                                    AutoMagic.mqh |
//|                                 Copyright 2017-2018 prostotrader |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
//version   "1.01
//#define FORTS
//---
#include ".\..\include\crc64.mqh"
//---
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 Magic function                                                |
//+------------------------------------------------------------------+
ulong GetMagic(const string a_symbol)
{
//--- Get ChartID
  symb_magic.ch_id = ChartID();
  if(SymbolSelect(Symbol(), true) == false)
  {
    Print(__FUNCTION__, ": Нет такого символа!");
    return(0);
  }
  if(symb_magic.ch_id != 0)
  {
#ifdef  FORTS
  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;
      return(symb_magic.magic);
    }
  }
#else
  uchar Bytes[];
  ulong result = crc64(0, Bytes, StringToCharArray(string(symb_magic.ch_id), Bytes, 0));
  if(result > 0)
  {
    symb_magic.magic = result<<12;
    if(ulong(GlobalVariableSet(Symbol() + ":" + DoubleToString(double(symb_magic.magic), 0), double(symb_magic.magic))) > 0)
    {
      Print("Terminal Global variable created.");
    }
    return(symb_magic.magic);
  }
#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;
    ulong in_magic = m_magic;
#ifdef  FORTS  
    stored_magic>>=16;
    in_magic>>=16;
    if(in_magic == stored_magic) return(true);
#else
   stored_magic>>=12;
  in_magic>>=12;
  if(m_magic == symb_magic.magic) return(true);
#endif     
  }
  return(false);
}
//-------------------------------------------------------------------+
// Get stired magic function                                         |
//+------------------------------------------------------------------+
ulong GetStoredMagic(const long cha_id)
{
  if(cha_id == symb_magic.ch_id)
  {
    return(symb_magic.magic);
  }
  return(0);  
}
//+------------------------------------------------------------------+

Der Expert Advisor sollte über Folgendes verfügen

//+------------------------------------------------------------------+
//|                                                   Magic_test.mq5 |
//|                                      Copyright 2018 prostotrader |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018 prostotrader"
#property link      "https://www.mql5.com"
#property version   "1.00"
#include   "AutoMagic.mqh"

ulong a_magic;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {

  a_magic = GetMagic(Symbol());
  if(a_magic != 0)
  {
    if(IsMyMagic(a_magic, ChartID()) == true)
    {
      Print("Magic = ", a_magic);
    }
  }
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
  
    string a_name = Symbol() + ":" + DoubleToString(double(a_magic), 0);
    if(GlobalVariableCheck(a_name) == true)
    {
      GlobalVariableDel(a_name);
      Print("Terminal Global variable deleted.");
    }
  }
 
ChartID()

ändert sich auch beim Neustart, und der EA kann nicht mehr mit denselben Beschriftungen arbeiten (es sei denn, Sie speichern sie)

Die Einzigartigkeit jeder Kopie des EA in Parametern (Eingaben) und im Symbol.
Dann muss die Bezeichnung nicht gespeichert werden, sie bleibt für dieselben Expert Advisor-Parameter gleich.

 
prostotrader:

Ich habe mich für diese Version für FOREX entschieden (FORTS ohne Änderungen)

Wenn jemand eine bessere Idee hat - bitte sehr.

Die Frage war auf jeder Position ein einzigartiger Magier. Das ist mir jetzt klar geworden. Es ist einfacher, das letzte Ticket zu nehmen und es als Magie einzusetzen. Ich habe mich ähnlich im Kopierer beworben. Nimmt das Ticket der Position von einem Serverteil und weist es einer Position zu, die von einem Magier in Clients geöffnet wurde. Es funktioniert auch ohne zusätzlichen Aufwand.

 
Konstantin Nikitin:

Die Frage ging an jede Position einen einzigartigen Magier. Jetzt denke ich nach. Es ist einfacher, das letzte Ticket zu nehmen und es als Magie einzusetzen. Ich habe das gleiche im Kopierer verwendet. Hat das Ticket der Position vom Serverteil genommen und es der Position zugewiesen, die der Magier im Client geöffnet hat. Außerdem funktioniert es ohne zusätzlichen Aufwand.

Ich muss für jeden Auftrag einen eigenen Master haben.

Sie haben Recht, beim erneuten Laden ändert sich die ChartID, daher müssen wir nichts in den globalen Variablen des Terminals speichern.

//+------------------------------------------------------------------+
//|                                                    AutoMagic.mqh |
//|                                 Copyright 2017-2018 prostotrader |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
//version   "1.01
//#define FORTS
//---
#include ".\..\include\crc64.mqh"
//---
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 Magic function                                                |
//+------------------------------------------------------------------+
ulong GetMagic(const string a_symbol)
{
//--- Get ChartID
  symb_magic.ch_id = ChartID();
  if(SymbolSelect(Symbol(), true) == false)
  {
    Print(__FUNCTION__, ": Нет такого символа!");
    return(0);
  }
  if(symb_magic.ch_id != 0)
  {
#ifdef  FORTS
  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;
      return(symb_magic.magic);
    }
  }
#else
  uchar Bytes[];
  ulong result = crc64(0, Bytes, StringToCharArray(string(symb_magic.ch_id), Bytes, 0));
  if(result > 0)
  {
    symb_magic.magic = result<<12;
    return(symb_magic.magic);
  }
#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;
    ulong in_magic = m_magic;
#ifdef  FORTS  
    stored_magic>>=16;
    in_magic>>=16;
    if(in_magic == stored_magic) return(true);
#else
   stored_magic>>=12;
  in_magic>>=12;
  if(m_magic == symb_magic.magic) return(true);
#endif     
  }
  return(false);
}
//-------------------------------------------------------------------+
// Get stщred magic function                                         |
//+------------------------------------------------------------------+
ulong GetStoredMagic(const long cha_id)
{
  if(cha_id == symb_magic.ch_id)
  {
    return(symb_magic.magic);
  }
  return(0);  
}
//+------------------------------------------------------------------+
#property copyright "Copyright 2018 prostotrader"
#property link      "https://www.mql5.com"
#property version   "1.00"
#include   "AutoMagic.mqh"

ulong a_magic;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {

  a_magic = GetMagic(Symbol());
  if(a_magic != 0)
  {
    if(IsMyMagic(a_magic, ChartID()) == true)
    {
      Print("Magic = ", a_magic);
    }
  }
   
//---
   return(INIT_SUCCEEDED);
  }