Resultados de testes de peritos multimoedas - página 4

 
tol64:
E poderia mostrar um exemplo semelhante ao que eu fiz no início do ramo. Incluir o comércio apenas sobre um símbolo, mas testá-lo sobre outro. Tirar uma fotografia do ecrã e testá-lo no símbolo em que o teste está a decorrer. Haverá uma divergência como a que se verificou no início do ramo? Embora se a formação da barra for rastreada em todos os símbolos, esta deve ser idêntica. Mas ainda precisa de verificar tudo...

Bem, não vou testá-lo. Posso afixar o código e vocês testam-no ;-):

string Instruments[] = ...
int SymbolCount = ArraySize(Instruments);

void RefreshRates(string symbol)
{
  MqlTick tick;
  SymbolInfoTick(symbol, tick);
  SymbolInfoDouble(symbol, SYMBOL_BID);
}

bool Synchronization()
{
  static bool Sync = true;

  string StrUnsync;
  int u = 0;

  datetime dt0 = (datetime)SeriesInfoInteger(_Symbol, Period(), SERIES_LASTBAR_DATE);
  
  for(int j = 0; j < SymbolCount; j++)
  {
    RefreshRates(Instruments[j]);
    datetime dt = (datetime)SeriesInfoInteger(Instruments[j], Period(), SERIES_LASTBAR_DATE);
    if(dt != dt0)
    {
      StrUnsync = StrUnsync + Instruments[j] + " ";
      u++;
    }
  }
  if(u > 0)
  {
    Print("Some symbols are unsynchonized:", StrUnsync);
    Sync = false;
    return(false);
  }
  else
  {
    if(!Sync)
    {
      Print("Synchronization done");
    }
    Sync = true;
  }
  return(true);
}

void OnTick()
{
  if(!Synchronization()) return;
  ...
}
 
marketeer:

Bem, não vou testá-lo. Posso afixar o código e vocês testam-no ;-):

)) Obrigado pela variante dada. Agora vou apenas verificar a minha sugestão, que foi gerada ao apontar possíveis erros pelos participantes do fórum Yedelkin e Interessante, e depois terei todo o prazer em testar a vossa variante. Comunicarei os resultados em pormenor. ))
 

Yedelkin 

Note a parte do código:

Aqui pode ver que "dobra" algum tipo de indicador "Spy Control Panel MCM" em dois caracteres diferentes. Ou seja, tem símbolos diferentes como fontes de sinal. Mas afirma que "negociamos no EURUSD", ou seja, a fonte do sinal é um e o mesmo símbolo. Sejamos claros.

Só negociamos em EURUSD.

Nos meus testes, considero o esquema escrito por Konstantin Gruzdev -Implementação do Modo Multidivisas no MetaTrader 5. ))) Tudo está definido. Os ficheiros anexos contêm o indicador do painel de controlo de espionagem MCM e o exConsultor Especialista MCM do painel de controlo de espionagem MCM. Ao instalar o Expert Advisor num gráfico, pode ver como funciona. O registo mostra claramente os eventos especificados recebidos pelo Conselheiro Especialista a partir de diferentes símbolos. Tudo é claro, nada é misturado.

Tentei agora especificar no OnChartEvent() o símbolo a partir do qual o ID é recebido, mas isto não alterou os resultados. Retirei o segundo carácter do OnInit() para eliminar qualquer possibilidade de receber os eventos errados. O teste foi agora realizado utilizando esta variante:

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

 return(0);
}

void OnChartEvent(const int id,         // идентификатор события
                  const long&   lparam, // флаг события поступившего от агента панели.
                                        // Флаги соответствуют перечислению ENUM_CHART_EVENT_SYMBOL.
                  const double& dparam, // цена
                  const string& sparam  // инструмент 
                 )
{
 // Объявление массивов переменных для торговых сигналов
 static datetime New_Bar[1];  
 static bool UpSignal[1], DnSignal[1];
 
 if(id >= CHARTEVENT_CUSTOM)
   {
    if(sparam == Symbol_01)
      {
       // Получение торговых сигналов
       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 sobre o símbolo EURUSD do gráfico do EURUSD:

Teste sobre a ferramenta EURUSD a partir do gráfico GBPUSD:

Os resultados não são consistentes.

Interessante

A julgar por este código, os sinais provêm efectivamente de dois símbolos. No entanto, o Conselheiro Especialista pode processar um destes sinais com um atraso.

O segundo símbolo já não está presente, os sinais vêm apenas deEURUSD. Mas infelizmente, isto não resolve o problema.

 
marketeer:

Bem, não vou testá-lo. Posso afixar o código e vocês testam-no ;-):

Testou a sua versão. )) Os resultados são quase idênticos. Pode ser suficientemente bom para testes preliminares (rápidos). Utilizaremos a função OnTimer() para obter resultados absolutamente idênticos.

Aqui estão os resultados dos testes:

Teste na ferramenta EURUSD a partir do gráfico EURUSD:

Teste sobre a ferramenta EURUSD a partir do gráfico GBPUSD:

 
MetaDriver:

Penso que 10 segundos é um intervalo demasiado curto. Se apenas as barras formadas forem de interesse, o intervalo deve ser de pelo menos um minuto.

Não vale a pena encurtá-lo, um minuto é o intervalo mínimo razoável.

Fez outra série de testes para mostrar a inconsistência dos resultados acima dos 10 segundos. Vamos comparar com a mesma "referência", que foi fornecida no início do tópico. Ou seja, da função OnTick() pelas barras diárias formadas quando o Expert Advisor está sobre o símbolo em teste. Aqui está:

Então todos os resultados serão da função OnTimer(). O Expert Advisor está no símbolo GBPUSD:

Teste sobre o símbolo EURUSD do gráfico GBPUSD. O intervalo do temporizador é de 10 segundos:

Este é o resultado mais exacto.

Teste sobre o símbolo EURUSD do gráfico GBPUSD. O intervalo de tempo é de 1 minuto:

Isto não é verdade. O resultado foi ainda significativamente melhor, o que também é incorrecto e enganador.

Um teste no EURUSD a partir do gráfico GBPUSD. O intervalo do temporizador era de 60 minutos:

O resultado não coincide com a referência em muitos locais.

Teste no EURUSD a partir do gráfico GBPUSD. O intervalo de tempo é de 1 dia:

O resultado é mais do que tudo o que não é idêntico.

-------------------------

Em geral, para se ter total confiança nos resultados correctos, os Expert Advisors com múltiplas moedas devem ser testados através da função OnTimer(), definindo o intervalo mínimo.

 
tol64:

Fez outra série de testes para mostrar a inconsistência dos resultados acima dos 10 segundos. Vamos comparar com a mesma "referência", que foi fornecida no início do tópico. Ou seja, da função OnTick() pelas barras diárias formadas quando o Expert Advisor está sobre o símbolo em teste. Aqui está:

Então todos os resultados serão da função OnTimer(). O Expert Advisor está no símbolo GBPUSD:

Teste sobre o símbolo EURUSD do gráfico GBPUSD. O intervalo do temporizador é de 10 segundos:

Este é o resultado mais exacto.

Teste sobre o símbolo EURUSD do gráfico GBPUSD. O intervalo do temporizador é de 1 minuto:

Não está correcto. O resultado é ainda significativamente melhor, o que também é errado e enganador.

Um teste no EURUSD a partir do gráfico GBPUSD. O intervalo do temporizador é de 60 minutos:

O resultado não coincide com a referência em muitos locais.

Teste no EURUSD a partir do gráfico GBPUSD. O intervalo do temporizador é de 1 dia:

O resultado é mais do que tudo o que não é idêntico.

-------------------------

Em geral, para se ter total confiança nos resultados correctos, os Expert Advisors com múltiplas moedas devem ser testados através da função OnTimer() enquanto se fixa o intervalo mínimo.

Não compreendo bem. Fez uma comparação errada.

O primeiro teste está correcto: comparação de duas formas de teste - na "sua" ferramenta e noutra. E depois tomou este primeiro resultado como referência e comparou todos os outros resultados com ele.

Isto não é correcto. Deve comparar o resto das corridas de identidade não com o primeiro resultado, mas com corridas da mesma frequência de ticking no "seu" instrumento.

Serão diferentes dos "10 segundos", é natural, o principal é que devem ser idênticos em pares.

Por favor, complete o teste.

Caso contrário, acabará por perder apenas o seu tempo, conseguindo estranhamente confirmar a sua ilusão inicial "sobre as vantagens do teste dos 10 segundos" .

 
tol64:

Testou a sua opção. )) Os resultados são quase idênticos. É suficientemente bom para testes preliminares (rápidos). Para obter resultados completamente idênticos, utilizaremos a função OnTimer().

Tanto quanto sei, não é a minha forma de sincronização que está a testar agora, mas o gerador de carraças MetaTrader. A questão é que quando se executa o teste, foram geradas diferentes bases de carrapatos - sob o nome de eurusd e sob o nome de gbpusd, e os resultados quase nunca são iguais. Na realidade, se executar dois EAs com o bloco de sincronização especificado em símbolos diferentes, a diferença deve ser insignificante ou nula.
 
MetaDriver:

Não percebo bem. Algo que se comparou incorrectamente.

O primeiro teste está correcto: comparar duas formas de teste - no "seu" instrumento e em outro. E depois tomou esse primeiro resultado como referência e comparou todos os outros resultados com ele.

Isto não é correcto. Deve comparar o resto das corridas de identidade não com o primeiro resultado, mas com corridas da mesma frequência de ticking no "seu" instrumento.

Serão diferentes dos "10 segundos", é natural, o principal é que devem ser idênticos em pares.

Por favor, complete o teste.

Caso contrário, acabará por ser uma perda de tempo, pois estranhamente consegue confirmar a sua ilusão inicial de "as vantagens dos testes de 10 segundos".

Bom. Agora já comecei outro longo teste. Acabará quando eu acordar. Mas já vos posso dizer que são idênticos aos pares, porque já o vi. Tudo o que me resta é mostrar-vos. Mas poderia fazer o mesmo teste você mesmo. É um ponto importante no teste de sistemas de comércio. Posso estar a fazer algo de errado)).

P.S. O principal era que eles não devem ser idênticos aos pares porque ao testar através da função OnTimer() eles parecem ser idênticos em qualquer caso. O objectivo era inicialmente torná-los idênticos ao resultado obtido no modo normal utilizando a função OnTick() com verificação explícita das barras. Consultores especializados que negoceiam com um símbolo fazem-no na perfeição. Mas no modo multimoedas, era necessário descobrir. O resultado é óbvio.

 
marketeer:
Tanto quanto sei, não é a minha forma de sincronização que já testaram, mas o gerador de carraças MetaTrader. A questão é que quando se executaram os testes, geraram-se diferentes bases de carrapatos - sob o nome eurusd e sob o nome gbpusd, e os resultados para eles quase nunca serão iguais. Na realidade, se executar dois EAs com o bloco de sincronização especificado em símbolos diferentes, a diferença deve ser insignificante ou nula.
De que realidade está a falar? Testes em tempo real? Se assim for, então concordo, claro. Se pendurar dois EAs nos seus símbolos, tudo estará correcto. Mas estou a testar o modo multi-divisas. E um resultado idêntico é mostrado apenas usando OnTimer() (10 segundos).
 
tol64:

A negociação é apenas em EURUSD.

Vamos começar com a redacção correcta. No exemplo inicial, gostaria de ter "comércio no EURUSD". De facto, foram recebidos eventos personalizados a partir de dois símbolos, e no manipulador de eventos TradeSignalCounter()+TradePerformer() foram chamados quando foram recebidos eventos a partir de qualquer um destes dois símbolos. Podemos assumir que a fila do evento esteve sempre cheia.

Agora retirou uma das fontes de sinal mas introduziu a verificação"if(sparam == Symbol_01)" no manipulador do evento por alguma razão. Mas a questão seguinte é diferente. De acordo com o código, o esquema de Lizar é utilizado no modo "Todos os carrapatos" e a cada carrapato da fonte do sinal (EURUSD) são chamadas funções TradeSignalCounter()+TradePerformer(). O interesse já deu a entender um possível transbordo da fila de eventos. Mas quero saber que instrumento é utilizado como parâmetro Symbol_01 destas duas funções, e se tentou alterar a periodicidade dos eventos no esquema de Lizar.