Resultados de testes de peritos multimoedas

 

Depois de ter lido os artigos sobre a construção de EA multi-moeda, fazer perguntas e obter respostas dos "porteiros" da comunidade, para mim a pergunta permanece: "Como compor o código EA de tal forma que os resultados do teste sejam correctos? O objectivo do tópico é apenas descobrir esta questão.

Testei-o utilizando três métodos diferentes sugeridos por membros da comunidade.

-OnTick().

-OnChartEvent(). Este método é sugerido por Konstantin Gruzdev no seu artigo"Implementation of the multi-currency mode in MetaTrader 5".

-OnTimer().

Pedi emprestado a Nikolay Kositsin o esquema de Consultor Especialista em múltiplas moedas, que descreveu em pormenor no seu artigo"Criar um Consultor Especialista que negoceia com símbolos diferentes".

Para o teste escrevi uma simples EA porque a essência está em comparar os resultados do teste. A "referência" será o resultado do gráfico diário EURUSD desde 2000. Então este resultado com os mesmos parâmetros será comparado com o resultado que foi obtido a partir do gráfico GBPUSD. Em princípio, há apenas um instrumento envolvido nos testes, mas os resultados devem ser idênticos independentemente do instrumento que está a ser testado.

OnTick()

int OnInit()
{
 return(0);
}

void OnDeinit()
{
}

void OnTick()
{  
 // Объявление массивов переменных для торговых сигналов
 static datetime New_Bar[1];  
 static bool UpSignal[1], DnSignal[1];
   
 // Получение торговых сигналов
 TradeSignalCounter(0,Symbol_01,Trade_01,Timeframe_01,UpSignal,DnSignal,New_Bar);

 // Совершение торговых операций
 TradePerformer(0,Symbol_01,Trade_01,Timeframe_01,Stop_Loss_01,Take_Profit_01,Slippage_01,UpSignal,DnSignal,New_Bar);
}

Um teste no EURUSD a partir do gráfico do EURUSD:

Etiqueta: 01_tick

Um teste no EURUSD a partir do gráfico GBPUSD:

Etiqueta:02_tick

Os resultados do teste não são consistentes.

OnChartEvent()

enum ENUM_CHART_EVENT_SYMBOL
  {
   CHARTEVENT_NO        =0,          // События отключены
   CHARTEVENT_INIT      =0,          // Событие "инициализация" 
   
   CHARTEVENT_NEWBAR_M1 =0x00000001, // Событие "новый бар" на 1 -минутном графике
   CHARTEVENT_NEWBAR_M2 =0x00000002, // Событие "новый бар" на 2 -минутном графике
   CHARTEVENT_NEWBAR_M3 =0x00000004, // Событие "новый бар" на 3 -минутном графике
   CHARTEVENT_NEWBAR_M4 =0x00000008, // Событие "новый бар" на 4 -минутном графике
   
   CHARTEVENT_NEWBAR_M5 =0x00000010, // Событие "новый бар" на 5 -минутном графике
   CHARTEVENT_NEWBAR_M6 =0x00000020, // Событие "новый бар" на 6 -минутном графике
   CHARTEVENT_NEWBAR_M10=0x00000040, // Событие "новый бар" на 10-минутном графике
   CHARTEVENT_NEWBAR_M12=0x00000080, // Событие "новый бар" на 12-минутном графике
   
   CHARTEVENT_NEWBAR_M15=0x00000100, // Событие "новый бар" на 15-минутном графике
   CHARTEVENT_NEWBAR_M20=0x00000200, // Событие "новый бар" на 20-минутном графике
   CHARTEVENT_NEWBAR_M30=0x00000400, // Событие "новый бар" на 30-минутном графике
   CHARTEVENT_NEWBAR_H1 =0x00000800, // Событие "новый бар" на 1 -часовом графике
   
   CHARTEVENT_NEWBAR_H2 =0x00001000, // Событие "новый бар" на 2 -часовом графике
   CHARTEVENT_NEWBAR_H3 =0x00002000, // Событие "новый бар" на 3 -часовом графике
   CHARTEVENT_NEWBAR_H4 =0x00004000, // Событие "новый бар" на 4 -часовом графике
   CHARTEVENT_NEWBAR_H6 =0x00008000, // Событие "новый бар" на 6 -часовом графике
   
   CHARTEVENT_NEWBAR_H8 =0x00010000, // Событие "новый бар" на 8 -часовом графике
   CHARTEVENT_NEWBAR_H12=0x00020000, // Событие "новый бар" на 12-часовом графике
   CHARTEVENT_NEWBAR_D1 =0x00040000, // Событие "новый бар" на дневном графике
   CHARTEVENT_NEWBAR_W1 =0x00080000, // Событие "новый бар" на недельном графике
     
   CHARTEVENT_NEWBAR_MN1=0x00100000, // Событие "новый бар" на месячном графике   
   CHARTEVENT_TICK      =0x00200000, // Событие "новый тик"
   
   CHARTEVENT_ALL       =0xFFFFFFFF, // Все события включены
  };

...

int OnInit()
{
 if(iCustom("EURUSD",PERIOD_D1,"Spy Control panel MCM",ChartID(),0,CHARTEVENT_TICK) == INVALID_HANDLE)
   { Print("Ошибка установки шпиона на EURUSD"); return(true);}
   
 if(iCustom("GBPUSD",PERIOD_D1,"Spy Control panel MCM",ChartID(),1,CHARTEVENT_TICK) == INVALID_HANDLE)
   { Print("Ошибка установки шпиона на GBPUSD"); return(true);}
}

void OnDeinit()
{
}

void OnChartEvent(const int id,         // идентификатор события
                  const long&   lparam, // флаг события поступившего от агента панели.
                                        // Флаги соответствуют перечислению ENUM_CHART_EVENT_SYMBOL.
                  const double& dparam, // цена
                  const string& sparam  // инструмент 
                 )
{
 if(id >= CHARTEVENT_CUSTOM)      
   {
    // Объявление массивов переменных для торговых сигналов
    static datetime New_Bar[1];  
    static bool UpSignal[1], DnSignal[1];
      
    // Получение торговых сигналов
    TradeSignalCounter(0,Symbol_01,Trade_01,Timeframe_01,UpSignal,DnSignal,New_Bar);
   
    // Совершение торговых операций
    TradePerformer(0,Symbol_01,Trade_01,Timeframe_01,Stop_Loss_01,Take_Profit_01,Slippage_01,UpSignal,DnSignal,New_Bar);
   }
}

Teste no EURUSD a partir do gráfico EURUSD:

Etiqueta:01_evento == 01_tick

O resultado é idêntico ao resultado marcado como 01_tick.

Teste no EURUSD a partir do gráfico GBPUSD:

Etiqueta:02_evento ~= 02_tick

Os resultados dos testes não são consistentes.

OnTimer()

int OnInit()
{
 EventSetTimer(10);

 return(0);
}

void OnDeinit()
{
 EventKillTimer();
}

void OnTimer()
{
 // Объявление массивов переменных для торговых сигналов
 static datetime New_Bar[1];  
 static bool UpSignal[1], DnSignal[1];
   
 // Получение торговых сигналов
 TradeSignalCounter(0,Symbol_01,Trade_01,Timeframe_01,UpSignal,DnSignal,New_Bar);

 // Совершение торговых операций
 TradePerformer(0,Symbol_01,Trade_01,Timeframe_01,Stop_Loss_01,Take_Profit_01,Slippage_01,UpSignal,DnSignal,New_Bar);
}

O temporizador está definido para 10 segundos.

Teste sobre o instrumento EURUSD a partir do gráfico EURUSD:

Etiqueta: 01_tempo == 01_tick && 01_tempo == 01_evento

Um teste no EURUSD a partir do gráfico GBPUSD:

Etiqueta: 02_time == 01_tick && 02_time == 01_evento

Os resultados dos testes são idênticos. Apenas num lugar vi uma pequena imprecisão. Também reparei que quanto menor o intervalo no temporizador, mais exacto é o resultado. Ou seja, mesmo que o teste seja realizado em barras diárias e o intervalo no testador esteja definido para, por exemplo, 1 hora, o teste funcionará significativamente mais rápido do que 10 segundos, mas os resultados do teste não corresponderão.

------

E é tudo. Interessado na opinião de todos e ainda mais interessante nos métodos de solução))))


 

Na minha opinião, não é correcto comparar estas opções separadamente.

Pessoalmente, aderi à opinião de que o temporizador no desenho animado deve ser, e o que lhe será acrescentado (carraças ou eventos) é uma questão à parte.

Na minha opinião, todos os manipuladores disponíveis devem ser utilizados, a questão está apenas no seu preenchimento e implementação do algoritmo geral.

 
tol64:

"Como é que se elabora o código do examinador para que os resultados do teste sejam correctos?".

Inicialmente não compreendi a afirmação da pergunta. O que quer dizer com resultados de testes "correctos", e por que razão devem ser alcançados?
 
Interesting:

Na minha opinião, não é correcto comparar estas opções separadamente.

Pessoalmente, sou de opinião que o temporizador no desenho animado deve estar presente, e o que lhe será acrescentado (carraças ou eventos) é uma questão à parte.

A ideia é que todos os manipuladores disponíveis devem ser utilizados na mula, é apenas uma questão do seu enchimento e da implementação do algoritmo geral.


Porque é que é incorrecto comparar estas opções? Dentro dos limites de um simples Expert Advisor quando a decisão é tomada depois de a barra ser formada com o símbolo necessário e o TF necessário, penso que é correcto.

Incorrecto como é mencionado abaixo, seria se um algoritmo mais complexo para analisar a situação actual usando as mesmas carraças fosse adicionado. Mas só estou interessado nas barras formadas.

 
Yedelkin:
Inicialmente não compreendi a pergunta. O que quer dizer com resultados de testes "correctos", e por que razão devem ser alcançados?

Ou seja, as que correspondem à realidade. Seja qual for o carácter que testarmos, os resultados devem ser idênticos. Neste caso, o resultado idêntico só foi alcançado através da utilização da função OnTimer().

Estou muito interessado no método de Konstantin Gruzdev. Talvez esteja a fazer algo errado, foi por isso que não obtive os resultados correctos (fiáveis). Espero também pelos seus comentários sobre esta questão.

 
tol64:

Porque é que é incorrecto comparar estas opções? No âmbito deste simples Expert Advisor, quando a decisão é tomada depois de a barra ser formada com o símbolo certo e o TF certo, penso que é correcto.

Incorrecto como é mencionado abaixo, seria se acrescentássemos um algoritmo mais complexo para analisar a situação actual usando as mesmas carraças. Mas só estou interessado em bares formados.

Não discuto, é correcto em teoria, mas na prática há muitas questões.

Por exemplo, aqui está o seguinte - é implementado no manipulador de carraças, mas a ligação com o servidor é perdida. Como irá o sistema funcionar e como irá detectar se algo correr mal?

Realização apenas em temporizador - Opção mais ou menos aceitável, mas necessita de um compromisso razoável na escolha do período (mas mesmo assim haverá algumas dificuldades).

Eventos - Os próprios eventos também não são muito eficientes. Em geral, o processamento de carraças e eventos deve ser implementado de modo a utilizar os recursos da forma mais eficaz e permitir que o Consultor Especialista passe a processar uma nova porção de dados com bastante rapidez.

Yedelkin:
Não compreendi a pergunta desde o início. Qual é o significado de resultados de testes "correctos", e porque devem ser obtidos?

Também penso que não se devem alcançar resultados 100% idênticos. Além disso, é estranho limitar as possibilidades de multiplicação a UM símbolo de comércio.

Digamos que pelo menos dois símbolos serão comercializados (um dos quais poderá eventualmente ser um símbolo gráfico).

 
tol64:

Ou seja, as que correspondem à realidade. Seja qual for o símbolo que testarmos, os resultados devem ser idênticos.

Acreditem, procurar a 100% a não-identidade é auto-engano e ilusão. Tão ilusória como um GRAAL eternamente funcional. Uma certa quantidade de erro/não identidade deve ser sempre considerada.

E como está, testar um desenho animado não é muito revelador. A discussão sobre mults deve ser apenas em termos de comércio com múltiplos símbolos ou de comércio com múltiplas estratégias sobre um só símbolo.

Os resultados PROSTANTEMENTE idênticos não são importantes num símbolo múltiplo, os mecanismos importantes que permitem aos peritos tomar decisões comerciais tendo em conta as posições e a história.

Por exemplo, tente negociar dois símbolos EURUSD e GBPUSD, enquanto que a negociação deve ser realizada usando hedging e sinais no segundo símbolo.

 
Interesting:

Acreditem, a procura de 100% de não-identidade é uma auto-engano e uma ilusão. Tão ilusória como o sempre trabalhador GRAAL. É sempre necessário considerar uma certa margem de erro/não identidade.

E como está, testar um desenho animado não é muito revelador. A discussão sobre mults deve ser apenas em termos de comércio com múltiplos símbolos ou de comércio com múltiplas estratégias sobre um só símbolo.

Os resultados PROSTANTEMENTE idênticos não são importantes num símbolo múltiplo, os mecanismos importantes que permitem aos peritos tomar decisões comerciais tendo em conta as posições e a história.

Por exemplo, tente negociar dois símbolos EURUSD e GBPUSD, enquanto que a negociação deve ser realizada usando hedging e sinais no segundo símbolo.

Agora está a olhar para o panorama geral, como a EA deve funcionar. Saltemos todas as dificuldades e detalhes técnicos da implementação do programa para uma verdadeira comercialização. O assunto é muito crítico neste artigo.

1. Um sistema de comércio simples. Baseia-se nas barras formadas.

2. Um teste sobre um símbolo, mas a partir de outro símbolo.

Simplifiquei intencionalmente a estrutura ao mínimo. É feito para facilitar a análise dos resultados dos testes. Pode testar todos os símbolos, mas os resultados não se tornarão melhores. Ficará com uma confusão que será mais difícil e mais demorada de analisar. O Conselheiro Especialista mostrará a acção exacta sobre o símbolo em que está localizado, mas fará uma confusão em todos os outros, que é exactamente o que estes resultados mostram. Os resultados dos testes devem ser idênticos, caso contrário verifica-se que o consultor especializado faz entradas correctas num símbolo, enquanto que nos outros não, ou não segue exactamente o sistema. Esta discrepância é bastante perceptível.

Até agora, a identidade só pode ser alcançada através da função OnTimer().

P.S. Eu não acredito no GRAILS. Ou melhor, eu compreendo-o de forma diferente de muitos outros).

 

Aqui está o resultado de uma vez em cinco caracteres através da função OnTimer():

Seja qual for o símbolo a partir do qual o teste é realizado, o resultado é sempre o mesmo.

Mas ao utilizar outros métodos(OnTick() e OnChartEvent()), os resultados seriam diferentes ao alterar o símbolo onde se encontra o Expert Advisor. E apenas confirma que o Expert Advisor realiza acções incorrectas sobre outros símbolos.

É evidente a razão pela qual isto acontece com OnTick(). Já foi discutido muitas vezes. Mas o método OnChartEvent() continua a ser questionável.

 

tol64:

Com OnTick(), é claro porque é que isto acontece. Isto já foi discutido muitas vezes. Mas o método OnChartEvent() continua a ser questionável.

Precisamos de ter em conta um possível atraso no tratamento do evento, ou mesmo um possível LOSS do evento.
Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Основы языка / Функции / Функции обработки событий - Документация по MQL5
 
tol64:

Ou seja, as que correspondem à realidade. Seja qual for o carácter que testarmos, os resultados devem ser idênticos. Neste caso, o resultado idêntico só foi alcançado quando OnTimer() foi utilizado.

Vejo-o de forma aproximada. De facto, está a escolher um "motor" sobre o qual vai construir o seu Expert Advisor multi-currency. Para isso, pega-se numa estratégia comercial primitiva e executa-se primeiro de acordo com o esquema "a fonte do sinal e o manipulador do sinal num único símbolo", e depois de acordo com o esquema "a fonte do sinal e o manipulador do sinal em símbolos diferentes". Será isto correcto?

Se assim for, não compreendo bem frases como "Test on EURUSD tool from GBPUSD chart". Que símbolo, neste caso, é a fonte do sinal, e a qual é o manipulador do sinal ligado?

Razão: