Resultados de la prueba de expertos multidivisa - página 4

 
tol64:
Y podrías mostrar un ejemplo similar a lo que hice al principio de la rama. Incluya la negociación en un solo símbolo, pero pruébela en otro. Haz una captura de pantalla y pruébala en el símbolo en el que se está ejecutando la prueba. ¿Habrá una divergencia como la que se muestra al principio de la rama? Aunque si la formación de la barra se sigue en todos los símbolos, debería ser idéntica. Pero todavía hay que comprobar todo...

Bueno, no lo probaré. Puedo publicar el código y tú lo pruebas ;-):

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:

Bueno, no lo probaré. Puedo publicar el código y tú lo pruebas ;-):

)) Gracias por la variante dada. Ahora sólo comprobaré mi sugerencia, que se generó al señalar un posible error por parte de los participantes del foro Yedelkin e Interesante, y luego estaré encantado de probar su variante. Informaré de los resultados en detalle. ))
 

Yedelkin 

Observe la parte del código:

Aquí se puede ver que se "articula" una especie de indicador de "panel de control espía MCM" en dos caracteres diferentes. Es decir, tienes diferentes símbolos como fuentes de señal. Pero usted afirma que "operamos con el EURUSD", es decir, que la fuente de la señal es el mismo símbolo. Seamos claros.

Sólo operamos con el EURUSD.

En mis pruebas, considero el esquema escrito por Konstantin Gruzdev -Implementación del modo multidivisa en MetaTrader 5. ))) Todo está definido. Los archivos adjuntos contienen el indicador MCM del panel de control espía y el asesor experto MCM del panel de control espía. Al instalar el Asesor Experto en un gráfico, puede ver cómo funciona. El registro muestra claramente los eventos especificados recibidos por el Asesor Experto desde diferentes símbolos. Todo está claro, nada está mezclado.

Ahora he intentado especificar en OnChartEvent() el símbolo del que se recibe el ID, pero esto no ha cambiado los resultados. He eliminado el segundo carácter de OnInit() para eliminar cualquier posibilidad de recibir los eventos equivocados. La prueba se realizó ahora con 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);
      }
   }
}

Una prueba en el símbolo EURUSD del gráfico EURUSD:

Prueba en la herramienta EURUSD desde el gráfico GBPUSD:

Los resultados no son consistentes.

Interesante

A juzgar por este código, las señales provienen efectivamente de dos símbolos, pero el Asesor Experto puede procesar una de estas señales con un retraso.

El segundo símbolo ya no está presente, las señales provienen únicamente delEURUSD. Pero lamentablemente esto no resuelve el problema.

 
marketeer:

Bueno, no lo probaré. Puedo publicar el código y tú lo pruebas ;-):

Probada su versión. )) Los resultados son casi idénticos. Puede ser lo suficientemente bueno para las pruebas preliminares (rápidas). Utilizaremos la función OnTimer() para obtener resultados absolutamente idénticos.

Aquí están los resultados de las pruebas:

Prueba en la herramienta EURUSD desde el gráfico EURUSD:

Prueba en la herramienta EURUSD desde el gráfico GBPUSD:

 
MetaDriver:

Creo que 10 segundos es un intervalo demasiado corto. Si sólo interesan las barras formadas, el intervalo debe ser de al menos un minuto.

No tiene sentido hacerlo más corto, un minuto es el intervalo mínimo razonable...

Hice otra serie de pruebas para mostrar la inconsistencia de los resultados por encima de los 10 segundos. Vamos a comparar con el mismo "punto de referencia", que se proporcionó al principio del tema. Es decir, desde la función OnTick() por las barras diarias formadas cuando el Asesor Experto está en el símbolo bajo prueba. Aquí está:

Entonces todos los resultados serán de la función OnTimer(). El Asesor Experto está en el símbolo GBPUSD:

Prueba en el símbolo EURUSD del gráfico GBPUSD. El intervalo del temporizador es de 10 segundos:

Este es el resultado más preciso.

Prueba en el símbolo EURUSD del gráfico GBPUSD. El intervalo del temporizador es de 1 minuto:

Esto no es cierto. El resultado fue incluso significativamente mejor, lo que también es incorrecto y engañoso.

Una prueba en el EURUSD desde el gráfico del GBPUSD. El intervalo del temporizador era de 60 minutos:

El resultado no coincide con el punto de referencia en muchos lugares.

Prueba en el EURUSD desde el gráfico del GBPUSD. El intervalo del temporizador es de 1 día:

El resultado es más que nada no idéntico.

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

En general, para estar completamente seguros de que los resultados son correctos, los Asesores Expertos multimoneda deben ser probados a través de la función OnTimer(), estableciendo el intervalo mínimo.

 
tol64:

Hice otra serie de pruebas para mostrar la inconsistencia de los resultados por encima de los 10 segundos. Vamos a comparar con el mismo "punto de referencia", que se proporcionó al principio del tema. Es decir, desde la función OnTick() por las barras diarias formadas cuando el Asesor Experto está en el símbolo bajo prueba. Aquí está:

Entonces todos los resultados serán de la función OnTimer(). El Asesor Experto está en el símbolo GBPUSD:

Prueba en el símbolo EURUSD del gráfico GBPUSD. El intervalo del temporizador es de 10 segundos:

Este es el resultado más preciso.

Prueba en el símbolo EURUSD del gráfico GBPUSD. El intervalo del temporizador es de 1 minuto:

No es correcto. El resultado es incluso significativamente mejor, lo que también es erróneo y engañoso.

Una prueba en el EURUSD desde el gráfico del GBPUSD. El intervalo del temporizador es de 60 minutos:

El resultado no coincide con el punto de referencia en muchos lugares.

Prueba en el EURUSD desde el gráfico del GBPUSD. El intervalo del temporizador es de 1 día:

El resultado es más que nada no idéntico.

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

En general, para estar completamente seguros de los resultados correctos, los Asesores Expertos multidivisa deben ser probados a través de la función OnTimer() mientras se establece el intervalo mínimo.

No lo entiendo del todo. Has hecho una comparación equivocada.

La primera prueba es correcta: comparación de dos maneras de probar - en "su" herramienta y en otra. Y luego tomaste este primer resultado como referencia y comparaste todos los demás resultados con él.

Esto no es correcto. Debe comparar el resto de las ejecuciones de identidad no con el primer resultado, sino con ejecuciones de la misma frecuencia de tictac en "su" instrumento.

Serán diferentes de los "10 segundos", es natural, lo principal es que sean idénticos por parejas.

Por favor, complete la prueba.

De lo contrario, resultará que sólo has perdido el tiempo, consiguiendo extrañamente confirmar tu ilusión inicial "sobre las ventajas de la prueba de los 10 segundos" .

 
tol64:

Probado su opción. )) Los resultados son casi idénticos. Es lo suficientemente bueno para las pruebas preliminares (rápidas). Para obtener resultados completamente idénticos utilizaremos la función OnTimer().

Por lo que entiendo, no es mi forma de sincronización la que estás probando ahora, sino el generador de ticks de MetaTrader. La cuestión es que al ejecutar la prueba, se generaron diferentes bases de ticks - bajo el nombre de eurusd y bajo el nombre de gbpusd, y los resultados casi nunca son iguales. En realidad, si ejecuta dos EAs con el bloque de sincronización especificado en diferentes símbolos, la diferencia debería ser insignificante o ninguna.
 
MetaDriver:

No lo entiendo. Algo que comparaste incorrectamente.

La primera prueba es correcta: la comparación de dos formas de prueba: en "su" instrumento y en otro. Y luego tomaste ese primer resultado como referencia y comparaste todos los demás resultados con él.

Esto no es correcto. Debe comparar el resto de las ejecuciones de identidad no con el primer resultado, sino con ejecuciones de la misma frecuencia de tictac en "su" instrumento.

Serán diferentes de los "10 segundos", es natural, lo principal es que sean idénticos por parejas.

Por favor, complete la prueba.

De lo contrario, resultará una pérdida de tiempo, porque extrañamente consigue confirmar su ilusión inicial de "las ventajas de las pruebas de 10 segundos".

Bien. Ahora ya he empezado otra prueba larga. Se acabará cuando me despierte. Pero ya te puedo decir que son idénticos por parejas, porque lo he visto. Sólo me queda mostrarte. Pero puedes hacer la misma prueba tú mismo. Es un punto importante a la hora de probar los sistemas de negociación. Puede que esté haciendo algo mal)).

P.D. Lo principal era que no debían ser idénticos en pares porque al probar a través de la función OnTimer() parecen ser idénticos en cualquier caso. El objetivo era inicialmente hacerlos idénticos al resultado obtenido en el modo normal utilizando la función OnTick() con comprobación explícita de barras. Los asesores expertos que operan con un símbolo lo hacen perfectamente. Pero en la modalidad multidivisa era necesario averiguarlo. El resultado es evidente.

 
marketeer:
Por lo que tengo entendido, no es mi forma de sincronización la que has probado ahora, sino el generador de ticks de MetaTrader. La cuestión es que al realizar las pruebas se generaron diferentes bases de ticks - bajo el nombre de eurusd y bajo el nombre de gbpusd, y los resultados para ellos casi nunca serán iguales. En realidad, si ejecuta dos EAs con el bloque de sincronización especificado en diferentes símbolos, la diferencia debería ser insignificante o nula.
¿De qué realidad estás hablando? ¿Pruebas en tiempo real? Si es así, entonces estoy de acuerdo, por supuesto. Si cuelgas dos EAs en sus símbolos, todo será correcto. Pero estoy probando el modo multidivisa. Y un resultado idéntico se muestra sólo usando OnTimer() (10 segundos).
 
tol64:

El comercio es sólo en EURUSD.

Empecemos por la redacción correcta. En el ejemplo inicial se quiere tener "comercio en EURUSD". De hecho, se recibieron eventos personalizados de dos símbolos, y en el manejador de eventos se llamó a TradeSignalCounter()+TradePerformer() cuando se recibieron eventos de alguno de estos dos símbolos. Podemos suponer que la cola de eventos estaba siempre llena.

Ahora has eliminado una de las fuentes de señal pero has introducido la comprobación"if(sparam == Symbol_01)" en el manejador de eventos por alguna razón. Pero la siguiente pregunta es diferente. Según el código, el esquema de Lizar se utiliza en modo "Todos los ticks" y en cada tick de la fuente de la señal (EURUSD) se llaman las funciones TradeSignalCounter()+TradePerformer(). Interesante ya ha insinuado el posible desbordamiento de la cola de eventos. Pero quiero saber qué instrumento se utiliza como parámetro Symbol_01 de estas dos funciones, y si has intentado cambiar la periodicidad de los eventos en el esquema de Lizar.

Razón de la queja: