Bibliotecas: Expert - página 6

 
fxsaber:

O autor de um EA nunca defenderá a negociação de seu EA quando os resultados no testador forem ruins.

Ele não o fará, mas esses não são sinais - os Expert Advisors são vendidos independentemente do centro de corretagem. Então, deveria ser obrigatório especificar o vendedor, onde ele obtém tais resultados, e isso é uma espécie de propaganda do DC....

 
Aleksey Vyazmikin:

Não vou me intrometer, mas esses não são sinais - os consultores são vendidos independentemente do CD. Então, deveria ser obrigatório especificar o vendedor, onde ele obtém esses resultados, e isso é uma espécie de propaganda do CD....

Provavelmente, o raciocínio teórico às vezes é bom. Mas ainda estou interessado na prática relacionada a esta postagem. Ela foi escrita neste tópico por um motivo.

Proponho que se pare de criticar por todos os lados.

 
fxsaber:

No mercado, já vi muitas vezes os autores anexarem arquivos de conjunto de seus TCs para cada personagem. Assim, os compradores os utilizam.


Proponho usar a seguinte lógica para os TCs do Market

  • Um parâmetro de entrada é adicionado
  • Se essa pasta for especificada pelo usuário, o Expert Advisor pegará automaticamente todos os sets dessa pasta e executará suas versões correspondentes.
  • O usuário só precisa colocar o arquivo de set na pasta e especificar o caminho para essa pasta ao iniciar o Expert Advisor (o autor do Expert Advisor pode inserir esse caminho de uma só vez).
  • Se o usuário cometer um erro e executá-lo duas vezes, ele poderá ser automaticamente impedido de fazer isso.

Essa abordagem também é conveniente para iniciar seu próprio TS com um clique.

Obviamente, a solução pode ser universal para ambas as plataformas. Em termos gerais, apenas uma linha precisará ser adicionada ao código-fonte de qualquer Expert Advisor.


Provavelmente, é assim que lançarei os EAs de agora em diante. Se alguém encontrar uma falha nesse método ou uma opção de melhoria, me avise.

A execução no testador será diferente da on-line (afinal, as pastas são diferentes); para combinar uma cópia específica do EA com um conjunto, você precisará fazer algo a mais.

Bem, e apenas gerenciar esse rebanho de EAs sem sua própria visualização parece difícil.

Além disso, a alteração do conjunto de conjuntos será acompanhada pela reinicialização de todos os EAs.


Os gráficos MT individuais funcionam como "arquivos transparentes", que são arquivados na "pasta rígida" do perfil. Isso permite que você coloque as informações necessárias em cada arquivo ou retire/substitua facilmente o arquivo necessário. E você pode mudar para outra "pasta rígida" alterando o perfil. Bastante conveniente.

Eu me deparei com a necessidade de substituir um parâmetro em todos os EAs (por exemplo, risco). Fiz isso por substituição em massa em arquivos de modelo ou por meio de uma variável mestre especial. Seria conveniente envolver isso em uma função conveniente.

 
Andrey Khatimlianskii:

A execução no testador será diferente da on-line (as pastas são diferentes); para combinar uma cópia específica do EA com o conjunto, você precisará fazer algo a mais.

Não haverá diferença.

Bem, e simplesmente gerenciar esse rebanho de EAs sem sua própria visualização parece difícil.

Não mais complicado do que é agora.

Além disso, as alterações no conjunto serão acompanhadas por uma reinicialização de todos os consultores.

O EA será iniciado normalmente. Somente se você quiser, poderá especificar uma pasta com os conjuntos.

Os gráficos MT individuais funcionam como "arquivos transparentes", que são arquivados na "pasta rígida" do perfil. Isso permite que você coloque as informações necessárias em cada arquivo ou retire/substitua facilmente o arquivo necessário. E você pode mudar para outra "pasta rígida" alterando o perfil. Muito conveniente.

É claro que você pode até mesmo ler/gravar perfis automaticamente em MQL5\Profiles\Charts\.... Mas os perfis são bem diferentes.

Deparei-me com a necessidade de substituir um parâmetro em todos os EAs (por exemplo, risco). Fiz isso por substituição em massa em arquivos de modelo ou por meio de uma variável mestre especial. Seria conveniente envolver isso em uma função conveniente.

Essa funcionalidade está entre os exemplos da biblioteca.


No entanto, você deve distinguir entre a alteração dos parâmetros de entrada pelo método de reinicialização e pela tecla F7 manualmente. A primeira é uma reinicialização completa, a segunda não. Há ocasiões em que você precisa do segundo. Mas isso não pode ser implementado em MQL.

 
fxsaber:

Não haverá diferença.

Como? Selecionando o conjunto que você deseja?


fxsaber:

Não é mais complicado do que é agora.

No momento, cada EA em execução tem seu próprio conjunto.

Mas como o "gerenciador", que executa 10 Expert Advisors, se comportará se alguns deles alterarem os parâmetros manualmente? E o que acontecerá depois de reiniciar o gerenciador? Os conjuntos originais serão iniciados?

 
Andrey Khatimlianskii:

Como? Selecionando um conjunto necessário?

MQL_TESTER.

Agora, cada Expert Advisor em execução tem seu próprio conjunto.

Mas como um "gerenciador" que executa 10 Expert Advisors se comportará se alguns deles tiverem seus parâmetros alterados manualmente? E o que acontecerá depois de reiniciar o gerenciador? Os conjuntos originais serão iniciados?

O gerenciador não deve ser usado. Aparentemente, somente por meio de código poderei mostrar o que quis dizer. Obrigado por sua participação.

 
fxsaber:

MQL_TESTER.

Você pode dar uma resposta um pouco mais detalhada?

É possível determinar que a inicialização está no testador, é claro. Mas não há acesso à pasta de conjuntos (ou há, se você tiver acesso à pasta kamon), e não faz sentido ler esses conjuntos - você precisa testar apenas um deles.

E, após o teste, você precisa combiná-lo com o Expert Advisor em execução (por exemplo, para interrompê-lo ou alterar algum parâmetro). Para fazer isso, preciso ir até a pasta com os conjuntos, encontrar o conjunto necessário e editá-lo?


Nesse caso, a negociação em todos os conjuntos de um EA parece mais razoável. Com a possibilidade de escolher uma ou várias estratégias (conjuntos).

 
Andrey Khatimlianskii:

Posso obter uma resposta um pouco mais detalhada?

É possível determinar que a inicialização está no testador, é claro. Mas não há acesso à pasta de conjuntos (ou há, se for o kamon), e não faz sentido ler esses conjuntos - você precisa testar apenas um deles.

E, após o teste, você precisa combiná-lo com o Expert Advisor em execução (por exemplo, para interrompê-lo ou alterar algum parâmetro). Para fazer isso, preciso ir até a pasta com os conjuntos, encontrar o conjunto necessário e editá-lo?

Um arquivo de opção personalizado é usado para o testador. A partir dele, qualquer conjunto é iniciado com um clique. É superconveniente.

Se você não tiver um arquivo de opções, trabalhará da maneira antiga. Ou seja, nada é complicado.

Nesse caso, parece mais razoável negociar todos os conjuntos com um único EA. Com a possibilidade de escolher uma ou várias estratégias (conjuntos).

Essa opção está sempre disponível no Tester - carregar um conjunto.

 
Eu recomendaria incluir essa verificação em seus EAs
// Exemplo de proteção entre plataformas contra o lançamento errôneo do clone do EA.

#include <fxsaber\Expert.mqh> // https://www.mql5.com/pt/code/19003

string GetExpertData( const ulong Chart = 0 ) 
{ 
  string Str = NULL; 

  MqlParam Parameters[]; 
  string Names[]; 

  if (EXPERT::Parameters(Chart, Parameters, Names)) 
  { 
    Str += "\n" + ::ChartSymbol(Chart) + " " + ::EnumToString(::ChartPeriod(Chart)) + " " + Parameters[0].string_value + "\n"; 

    const int Amount = ::ArraySize(Names); 

    for (int i = 0; i < Amount; i++) 
      Str += (string)i + ": "+ Names[i] + " = " + Parameters[i + 1].string_value + "\n"; 
  } 

  return(Str); 
} 

// O mesmo consultor está sendo executado?
long IsRunning( void )
{ 
  long Res = 0;
  const string Str = GetExpertData();
  long Chart = ::ChartFirst(); 

  while (!Res && (Chart != -1)) 
    if ((Chart != ::ChartID()) && EXPERT::Is() && (Str == GetExpertData(Chart)))
      Res = Chart;
    else
      Chart = ::ChartNext(Chart); 

  return(Res); 
}

input int Range1 = 1;
input int Range2 = 1;

int OnInit()
{
  return(!MQLInfoInteger(MQL_TESTER) && IsRunning() &&
         (MessageBox("This EA is already running." +
                     GetExpertData() + "\nRun?", MQLInfoString(MQL_PROGRAM_NAME), MB_YESNO) == IDNO) ?
         INIT_FAILED : INIT_SUCCEEDED);
}
 

// O MT4-advisor mostra em qual modo Long/Short ele foi executado.

#include <fxsaber\Expert.mqh> // https://www.mql5.com/pt/code/19003

int GetLongShortFlag( const int Chart_ID = 0 )
{
  MqlParam Params[];
  string Names[];
  
  const int Res = EXPERT::Parameters(Chart_ID, Params, Names);
  
  return(((Res & 3) << 1) + (Res & 1));
}

string LongShortToString( const int Chart_ID = 0 )
{
  const int Flag = GetLongShortFlag(Chart_ID);
  string Str = NULL;
  
  if ((bool)(Flag & SYMBOL_TRADE_MODE_LONGONLY) && (bool)(Flag & SYMBOL_TRADE_MODE_SHORTONLY))
    Str = "Long & Short";
  else if ((bool)(Flag & SYMBOL_TRADE_MODE_LONGONLY))
    Str = "Only Long";
  else if ((bool)(Flag & SYMBOL_TRADE_MODE_SHORTONLY))
    Str = "Only Short";
    
  return(Str);
}

int OnInit()
{
  Alert(LongShortToString());
  
  return(INIT_FAILED);
}