Errores, fallos, preguntas - página 480

 
papaklass:
Ahora se actualiza y se intenta resolver de nuevo. He puesto huellas en casi todas las líneas. Informaré de los resultados.

Aquí está la corrida con su inserto, en el momento en que se fijó el stop loss:

2011.08.09 00:41:08 Core 1 2011.01.14 01:41:27 Posición larga por EURUSD a cerrar de stop-loss
2011.08.09 00:41:08 Core 1 2011.01.14 01:41:27 -----------------Deal #63 sl 1.33328
2011.08.09 00:41:08 Core 1 2011.01.01.14 01:41:27 oldDealsTotal=62 newDealsTotal=63
2011.08.09 00:41:08 Core 1 2011.01.14 01:41:27 CSampleExpert::Trade
2011.08.09 00:41:08 Core 1 2011.01.14 01:41:27 orden ejecutada vender 0.15 a 1.33328 [#63 vender 0.15 EURUSD a 1.33328]
2011.08.09 00:41:08 Core 1 2011.01.14 01:41:27 deal performed [#63 sell 0.15 EURUSD at 1.33328]
2011.08.09 00:41:08 Core 1 2011.01.14 01:41:27 deal #63 sell 0.15 EURUSD at 1.33328 done (based on order #63)
2011.08.09 00:41:08 Core 1 2011.01.14 01:41:27 stop loss activado comprar 0.15 EURUSD 1.32127 sl: 1.33328 tp: 1.35139 [#63 vender 0.15 EURUSD a 1.33328]
2011.08.09 00:41:08 Core 1 2011.01.13 18:32:00 Posición larga de EURUSD a modificar trailing
 
Evidentemente el resultado diferente es un procesamiento diferente en OnTrade, yo sólo busco operaciones, sólo me interesan, tú en cambio entiendo que estás procesando todos los eventos clasificándolos y aquí hay algo liado en alguna parte.
 
¿Supongo que el mercado de apuestas de futuros también es una demo? Tomó uno real del MMVB, los lotes no coinciden.
 
papaklass:

Coloco órdenes pendientes con una duración de 1 hora. Transcurrida una hora, las órdenes que no se han activado se cierran a la hora de su vencimiento. Si se cierran varias órdenes simultáneamente, y antes del cierre, la función HistoryOrdersTotal() tenía un valor distinto de cero, entonces pierde algunas órdenes. Por ejemplo, antes del cierre de 8 órdenes, la función tenía un valor de 4, pero después del cierre, tiene un valor de 10. Se han perdido dos órdenes.


¿Qué quiere decir con que "las órdenes se perdieron"? Hay que tener en cuenta que los mensajes que llegan a OnTrade() pueden llevar información sobre más de un evento comercial. Además, si se envían varios mensajes simultáneamente, al procesar el primer mensaje, la caché histórica puede haber cambiado ya, y se puede tener la sensación de "eventos perdidos".

Por favor, lea el artículo Eventos comerciales en MetaTrader 5:

Conclusión

Todas las operaciones en la plataforma comercial MetaTrader 5 son asíncronas, y el envío de mensajes sobre todos los cambios en la cuenta comercial se realiza de forma independiente, por lo que no hay que tratar de rastrear un solo evento según la regla "Una solicitud - Un evento comercial". Si se quiere determinar exactamente lo que ha cambiado después del evento Trade, hay que analizar todas las operaciones, posiciones y órdenes en cada llamada del manejador OnTrade y compararlas con el estado que teníamos antes de que apareciera el evento.
 
papaklass:
He solicitado específicamente el valor de HistoryOrdersTotal(), que era igual a 4, antes de cerrar las órdenes. Después de cerrar 8 órdenes, el valor de HistoryOrdersTotal() debería haber sido igual a 12 (4 + 8), pero era igual a 10. He adjuntado un archivo de registro, en él podemos ver situaciones similares en más de una ocasión. También he adjuntado el Asesor Experto, con el que se obtiene esto. Hazlo tú mismo y lo verás todo.

Intenta cambiar la función, ¿qué pasará?

void OnTrade(){
//---
   HistorySelect(dayStart,TimeTradeServer());      
   Print("              ",__FUNCTION__,"  :  historyOrdersTotal = ",HistoryOrdersTotal(),"   ",TimeTradeServer()); 
}
     
 
El informe HTML de la ejecución del comprobador no siempre se guarda en un archivo?
 
zigan:
El informe HTML de la ejecución del comprobador no siempre se guarda en un archivo.

Describa con más precisión. En qué circunstancias.

 
alexvd:

Describa con más precisión. En qué circunstancias.

Rara vez, aproximadamente una de cada 20-30 pruebas - abrir la pestaña "Resultados

hago clic en guardar informe XML - obtengo el archivo de informe, ¡todo está bien!

haga clic en guardar informe HTML - aparece la ventana para guardar el archivo, se cuelga con la ProgressBar vacía durante un rato (brevemente), luego la ProgressBar se llena rápidamente y la ventana se cierra... Pero no se crea ningún archivo de informe.

No puedo especificar un patrón de cuándo ocurre esto exactamente.

 
Rosh:

Intenta cambiar la función, ¿qué pasará?

No creo que esto ayude. OnTrade, por principio, no puede funcionar como lo hace Papaklass.

La clave es que"hay que analizar todas las operaciones, posiciones y órdenes en cada llamada al gestor OnTrade y compararlo con el estado en el que estaba antes de aparecer" . En el ejemplo de que estamos considerando, con órdenes pendientes, esto sólo se aplica a las órdenes en el historial. Para evitar la pérdida de pedidos, yo cambiaría el código de esta manera:

Introduce una variable global int oldHistoryOrders; y en Ontrade, algo así:

//--------------------------ТОРГОВЫЕ СОБЫТИЯ-------------------------------------------------------------+
void OnTrade(){
//---
   Print(__FUNCTION__);
   HistorySelect(0,TimeCurrent()+1);      
   int newHistoryOrders=HistoryOrdersTotal();
   if(oldHistoryOrders==newHistoryOrders) return;
   Print("oldHistoryOrders=",oldHistoryOrders," newHistoryOrders=",newHistoryOrders);
   for(int i=oldHistoryOrders;i<newHistoryOrders;i++)
      Print("Order ",i," #",HistoryOrderGetTicket(i));
   oldHistoryOrders=newHistoryOrders;    
//   Print("              ",__FUNCTION__,"  :  historyOrdersTotal = ",newHistoryOrders,"   ",dayStart); 
}
Archivos adjuntos:
 
papaklass:

No es así como trabajo con OnTrade() tal y como lo has descrito. En mi código adjunto, he eliminado todo, dejando sólo la parte que resalta el error de la función. Prácticamente no tengo bucles en mi EA. El EA maneja un solo símbolo en un solo tick. Por lo tanto, no necesito ciclos. Procesé todos los símbolos dentro de los 12 ticks.

PS: OnTrade() me informa de un evento de comercio. Y qué evento ha ocurrido es definido por mis funciones sin bucles.

Bueno, vale, sólo me refería a tu ejemplo que demuestra, supuestamente, la pérdida de órdenes por la función OnTrade. OnTrade funciona de forma asíncrona, no por ticks, por lo que no le importa cuántos símbolos procesa en un tick. Si se le caducan un montón de órdenes vacías a la vez, no puede prescindir de la solución. He cambiado su código para mostrar que OnTrade no se pierde nada. Incluso lo he ejecutado en el probador y todo parece estar en su sitio. Los tickers de todas lasórdenes borradas impresas por la impresora de OnTrade están presentes en el registro. ¿Has probado mi versión?
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров - Документация по MQL5
Razón de la queja: