Максисальная длина названия символа на FOREX - страница 11

 
prostotrader:

Не прокатит.

Один и тот же советник на одном (разных) символах.

складываем все инпуты в строку (можно добавить и символ-период), 

 
prostotrader:
Если у кого-то есть идеи как получать по другому уникальные магики для каждого ордера (без костылей), по

поделитесь, пожалуйста.

int magic = (int)TimeCurrent();
int magic = (int)TimeLocal();
Как вариант, без головной боли.
 
prostotrader:

Время, спасибо Вам, даст уникальность каждому советнику, и не нужно привязываться к ChartID() и пути к советнику,

но все-равно нужно будет сохранять магик в Глобальную переменную терминала.

время не даст уникальности - перезапустите терминал со включенными советниками - у всех будет одно и тоже время)

 
Konstantin Nikitin:
Как вариант, без головной боли.

А вдруг пользователь успеет за сек. набросить 2 -3 советника?

 
Taras Slobodyanik:

время не даст уникальности - перезапустите терминал со включенными советниками - у всех будет одно и тоже время)

Да, точно

 
prostotrader:

А вдруг пользователь успеет за сек. набросить 2 -3 советника?

Ну на самом деле это мало вероятно.

Taras Slobodyanik:

время не даст уникальности - перезапустите терминал со включенными советниками - у всех будет одно и тоже время)

А вот тут уже другая песня. При перезапуске эксперт должен продолжать работать со своим магиком чтоб вести ранее открытые позиции. Так что запоминание не помешает.

 
Konstantin Nikitin:

Ну на самом деле это мало вероятно.

А вот тут уже другая песня. При перезапуске эксперт должен продолжать работать со своим магиком чтоб вести ранее открытые позиции. Так что запоминание не помешает.

Остановился на таком варианте для ФОРЕКС (ФОРТС без изменений)

Если кто-то придумает лучше - милости просим.

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

Соответственно в советнике

//+------------------------------------------------------------------+
//|                                                   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()

тоже изменяется при перезапуске, и советник не сможет продолжить работу с теми же метками (если их не сохранять)

Уникальность каждой копии советника в параметрах (инпутах) и в символе.
Тогда, метку не нужно сохранять, она будет одинакова для одинаковых советников-параметров.

 
prostotrader:

Остановился на таком варианте для ФОРЕКС (ФОРТС без изменений)

Если кто-то придумает лучше - милости просим.

Вопрос шел на каждой позиции уникальный магик. Сейчас подумалось. Проще брать последний тикет и ставить его магиком. Я подобное применял в копировальщике. Брал тикет позиции с серверной части и присваивал его открываемой позиции магиком в клиентах. То-же работает без лишних телодвижений.

 
Konstantin Nikitin:

Вопрос шел на каждой позиции уникальный магик. Сейчас подумалось. Проще брать последний тикет и ставить его магиком. Я подобное применял в копировальщике. Брал тикет позиции с серверной части и присваивал его открываемой позиции магиком в клиентах. То-же работает без лишних телодвижений.

Нужно иметь свой магик для каждого ордера.

Вы правы, при перезагрузке ChartID изменится, следовательно ничего не нужно сохранять в Глобальные переменные терминала.

//+------------------------------------------------------------------+
//|                                                    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);
  }
Причина обращения: