Comprimento máximo de um nome simbólico no FOREX - página 11

 
prostotrader:

Não vai funcionar.

O mesmo EA nos mesmos símbolos (diferentes).

Adicione todas as instâncias a uma cadeia (você também pode adicionar um caractere de período),

 
prostotrader:
Se alguém tem alguma idéia de como obter magiks únicos para cada pedido de forma diferente (sem muletas), por

Por favor, compartilhe.

int magic = (int)TimeCurrent();
int magic = (int)TimeLocal();
Como opção, sem dor de cabeça.
 
prostotrader:

O tempo, obrigado, dará singularidade a cada EA, e não há necessidade de ligar-se ao ChartID() e ao caminho para a EA,

Mas você ainda precisará salvar o assistente na Variável Global do terminal.

O tempo não dará exclusividade - reiniciar o terminal com todos os EAs habilitados - todos terão o mesmo tempo)

 
Konstantin Nikitin:
Como opção, sem dor de cabeça.

E se o usuário conseguir lançar 2 ou 3 EAs em um segundo?

 
Taras Slobodyanik:

o tempo não dará exclusividade - reinicie o terminal com EAs habilitados - todos terão o mesmo tempo)

Sim, exatamente

 
prostotrader:

E se o usuário conseguir lançar 2 ou 3 EAs em um segundo?

Bem, na verdade, isto é improvável.

Taras Slobodyanik:

o tempo não dará exclusividade - reinicie o terminal com os Expert Advisors habilitados - todos terão o mesmo tempo)

Mas aqui temos outra canção. Ao reiniciar a EA, o consultor especializado deve continuar a trabalhar com seu mágico para manter as posições previamente abertas. Portanto, lembrar não será um problema.

 
Konstantin Nikitin:

Bem, na verdade, não é muito provável.

Esta é uma história diferente. Ao reiniciar, o Expert Advisor deve continuar a trabalhar com seu mágico para manter as posições previamente abertas. Portanto, lembrar não vai doer.

Eu parei nesta variante para FOREX (FORTS sem mudanças)

Se alguém vier com um melhor, por favor, não hesite.

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

O Conselheiro Especialista deve ter

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

também muda no reinício, e a EA não poderá continuar trabalhando com os mesmos rótulos (a menos que você os salve)

A singularidade de cada cópia da EA nos parâmetros (entradas) e no símbolo.
Então, a etiqueta não precisa ser salva, ela será a mesma para os mesmos Parâmetros de Conselheiro Especialista.

 
prostotrader:

Esta versão foi aprovada para FOREX (FORTS sem alterações)

Se alguém vier com um melhor - você é bem-vindo.

A questão era sobre cada posição um mágico único. Ocorreu-me agora. É mais fácil pegar o último bilhete e defini-lo como um magik. Eu me aplicava de forma semelhante na copiadora. Pegou o ticket de posição de uma parte do servidor e o atribuiu à posição que foi aberta pelo mágico nos clientes. Também funciona sem nenhum esforço extra.

 
Konstantin Nikitin:

A pergunta foi para cada posição um mágico único. Agora eu estou pensando. É mais fácil pegar o último bilhete e colocá-lo como um magik. Eu usei o similar na copiadora. Tomou o ticket de posição da parte do servidor e o atribuiu à posição aberta pelo mágico nos clientes. Também funciona sem nenhum esforço extra.

Eu tenho que ter meu próprio mestre para cada pedido.

Você está certo, quando você recarregar o ChartID irá mudar, portanto, não precisamos salvar nada nas Variáveis Globais do terminal.

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