Discusión sobre el artículo "Biblioteca para el desarrollo rápido y sencillo de programas para MetaTrader (Parte XXXIV): Eliminación de órdenes y posiciones según condiciones" - página 2

 
Artyom Trishkin:
Sí, lo harán. Porque ahí se ha cambiado la forma de almacenar los datos de la cuenta. Esto está escrito al final del artículo como advertencia:
-----
Para su información:
desde que cambiamos la estructura del objeto cuenta (cambiamos el tamaño de las matrices uchar para almacenar las propiedades de cadena de la cuenta y añadimos una propiedad entera más), todos los archivos previamente guardados de los objetos cuenta ya no se cargarán correctamente. Si se encuentran en la carpeta común de terminales en el directorio \Files\DoEasy\Accounts\, entonces todos ellos deben ser eliminados antes de iniciar este asesor de prueba - se volverán a crear al cambiar de una cuenta a otra con un nuevo tamaño de la estructura de objetos.
-----

He borrado todos los archivos BIN de la cuenta en la carpeta común para asegurarse de que su carga de código completo. se carga sin error acerca de `CAccount::Load` (pero el principal problema era incorrecto ignorar eventos y todavía existe)

Luego abrí algunas operaciones manualmente y las cerré con un script lo más rápido posible. Volví a tener este error

CEventsCollection::CreateNewEvent, Línea 768: Este evento ya está en la lista

Sabemos que esos eventos son de diferentes posiciones cerradas en MT4, pero el código del motor no puede entenderlo. ¿Es el motor capaz de entender el cierre de múltiples operaciones / eventos en un corto período de tiempo en absoluto?


Aquí están todos los mensajes de registro:

2020.08.21 21:23:50.604 mhdbzr-34 AUDCAD,H1: OnDoEasyEvent: Posición cerrada

2020.08.21 21:23:50.600 mhdbzr-34 AUDCAD,H1: - Posición cerrada: 2020.08.21 19:51:47.000 -

AUDCAD Posición cerrada Comprar #573142748 al precio 0.94405, Ganancia -0.22 USD

2020.08.21 21:23:50.368 Script CloseTradesFast4Test AUDCAD,H1: eliminado

2020.08.21 21:23:50.364 CloseTradesFast4Test AUDCAD,H1: uninit reason 0

2020.08.21 21:23:50.364 CloseTradesFast4Test AUDCAD,H1: close #573142747 buy 0.01 AUDCAD at 0.94404 at price 0.94375

2020.08.21 21:23:50.148 mhdbzr-34 AUDCAD,H1: OnDoEasyEvent: Posición cerrada

2020.08.21 21:23:50.146 mhdbzr-34 AUDCAD,H1: - Posición cerrada: 2020.08.21 19:51:47.000 -

AUDCAD Posición cerrada Comprar #573142748 al precio 0.94405, Ganancia -0.22 USD

2020.08.21 21:23:49.942 CloseTradesFast4Test AUDCAD,H1: cerrar #573142748 comprar 0.01 AUDCAD a precio 0.94405 a precio 0.94376

2020.08.21 21:23:49.725 mhdbzr-34 AUDCAD,H1: CEventsCollection::CreateNewEvent, Línea 768: Este evento ya está en la lista

2020.08.21 21:23:49.520 CloseTradesFast4Test AUDCAD,H1: close #573142752 buy 0.01 AUDCAD at 0.94406 at price 0.94376

2020.08.21 21:23:49.257 mhdbzr-34 AUDCAD,H1: OnDoEasyEvent: Posición cerrada

2020.08.21 21:23:49.255 mhdbzr-34 AUDCAD,H1: - Posición cerrada: 2020.08.21 19:51:52.000 -

AUDCAD Posición cerrada Sell #573142755 at price 0.94366, Profit -0.37 USD

2020.08.21 21:23:49.086 CloseTradesFast4Test AUDCAD,H1: cerrar #573142755 vender 0.01 AUDCAD a precio 0.94366 a precio 0.94414

2020.08.21 21:23:48.815 mhdbzr-34 AUDCAD,H1: OnDoEasyEvent: Posición cerrada

2020.08.21 21:23:48.812 mhdbzr-34 AUDCAD,H1: - Posición cerrada: 2020.08.21 19:51:53.000 -

AUDCAD Posición cerrada Sell #573142757 at price 0.94366, Profit -0.37 USD

2020.08.21 21:23:48.661 CloseTradesFast4Test AUDCAD,H1: cerrar #573142756 vender 0.01 AUDCAD a precio 0.94366 a precio 0.94415

2020.08.21 21:23:48.352 mhdbzr-34 AUDCAD,H1: OnDoEasyEvent: Posición cerrada

2020.08.21 21:23:48.350 mhdbzr-34 AUDCAD,H1: - Posición cerrada: 2020.08.21 19:51:53.000 -

AUDCAD Posición cerrada Sell #573142757 at price 0.94366, Profit -0.37 USD

2020.08.21 21:23:48.237 CloseTradesFast4Test AUDCAD,H1: cerrar #573142757 vender 0.01 AUDCAD a precio 0.94366 a precio 0.94415

2020.08.21 21:23:47.537 CloseTradesFast4Test AUDCAD,H1: inicializado

2020.08.21 21:23:47.520 Script CloseTradesFast4Test AUDCAD,H1: cargado con éxito

2020.08.21 21:23:31.762 Operaciones automáticas activadas

 
Mohammad Bazrkar :

Elimino todos los archivos BIN de la cuenta en la carpeta común para asegurarse de que su carga de código completo. se carga sin error acerca de `CAccount::Load` (pero el principal problema era incorrecto ignorar eventos y todavía existe)

Luego abrí algunas operaciones manualmente y las cerré con un script lo más rápido posible. Tengo este error de nuevo:

CEventsCollection::CreateNewEvent, Línea 768: Este evento ya está en la lista

Sabemos que esos eventos son de diferentes cierres de posiciones en MT4, pero el código del motor no puede entenderlo. ¿Es el motor capaz de entender múltiples cierres de operaciones / eventos en un corto período de tiempo en absoluto?

Por favor, describa paso a paso lo que está haciendo para obtener este error.

 
Artyom Trishkin:

Por favor, describa paso a paso lo que está haciendo para obtener este error.

He modificado el código de tu EA para que sólo reciba eventos. (Adjunté la versión modificada en mensajes anteriores, se llama `mhdbzr-34`)

  1. ejecute el EA para empezar a observar.
  2. abrir algunas operaciones de compra/venta en la cuenta demo con los mismos lotes, rápido (haciendo clic rápido en el botón de compra/venta en el gráfico)
  3. ejecute un script para cerrar esas operaciones lo más rápido posible. (el nombre de mi script es `CloseTradesFast4Test`)
  4. revisa los mensajes de registro, veras que el motor no cerro algunas posiciones probablemente con ese mensaje de error rojo que escribi aqui.
 
Mohammad Bazrkar :

He modificado tu código EA para que sólo reciba eventos. (He adjuntado la versión modificada en mensajes anteriores, se llama `mhdbzr-34`)

  1. ejecute el EA para empezar a observar.
  2. abrir algunas operaciones de compra/venta en la cuenta demo con los mismos lotes, rapido (haciendo click rapido en el boton de compra/venta en el grafico)
  3. ejecute un script para cerrar esas operaciones lo más rápido posible. (mi nombre de script es ` CloseTradesFast4Test `)
  4. revisa los mensajes de registro, veras que el motor no cerro algunas posiciones probablemente con ese mensaje de error rojo que escribi aqui.

Dale a tu script para cerrar posiciones.

 
Artyom Trishkin:

Da tu guión para cerrar posiciones.

aquí está el código:

void OnStart()
{
   for(int i=OrdersTotal()-1; i>-1; i--)
   {
      if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){ continue; }
      if(OrderSymbol()!= _Symbol){ continue;}
      //--
      RefreshRates();
      int res = OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 100);
   }
}
 

aquí hay otra prueba; esta vez no reconoció las posiciones cerradas, las pasó por alto con las anteriores en dos casos.

2020.08.27 20:30:18.880 Expert mhdbzr-34 AUDCAD,H1: eliminado

2020.08.27 20:30:18.869 mhdbzr-34 AUDCAD,H1: uninit razón 1

2020.08.27 20:28:35.617 mhdbzr-34 AUDCAD,H1: OnDoEasyEvent: Posición cerrada

2020.08.27 20:28:35.617 mhdbzr-34 AUDCAD,H1: OnDoEasyEvent: Posición cerrada

2020.08.27 20:28:35.617 mhdbzr-34 AUDCAD,H1: - Posición cerrada: 2020.08.27 18:58:03.000 - AUDCAD Cerrado Compra #573721560 al precio 0.95218, Beneficio -2.29 USD

2020.08.27 20:28:35.614 mhdbzr-34 AUDCAD,H1: - Posición cerrada: 2020.08.27 18:58:04.000 - AUDCAD Cerrado Comprar #573721562 al precio 0.95218, Beneficio -2.29 USD

2020.08.27 20:28:35.582 Script CloseTradesFast4Test AUDCAD,H1: eliminado

2020.08.27 20:28:35.577 CloseTradesFast4Test AUDCAD,H1: uninit reason 0

2020.08.27 20:28:35.577 CloseTradesFast4Test AUDCAD,H1: close #573721560 buy 0.10 AUDCAD at 0.95218 at price 0.95188

2020.08.27 20:28:35.177 CloseTradesFast4Test AUDCAD,H1: close #573721562 buy 0.10 AUDCAD at 0.95218 at price 0.95188

2020.08.27 20:28:35.161 mhdbzr-34 AUDCAD,H1: OnDoEasyEvent: Posición cerrada

2020.08.27 20:28:35.158 mhdbzr-34 AUDCAD,H1: - Posición cerrada: 2020.08.27 18:58:06.000 - AUDCAD Cerrado Venta #573721573 al precio 0.95190, Ganancia -2.06 USD

2020.08.27 20:28:34.739 CloseTradesFast4Test AUDCAD,H1: cerrar #573721571 comprar 0.10 AUDCAD a 0.95224 al precio 0.95191

2020.08.27 20:28:34.695 mhdbzr-34 AUDCAD,H1: OnDoEasyEvent: Posición cerrada

2020.08.27 20:28:34.691 mhdbzr-34 AUDCAD,H1: - Posición cerrada: 2020.08.27 18:58:06.000 - AUDCAD Cerrado Vender #573721573 al precio 0.95190, Ganancia -2.06 USD

2020.08.27 20:28:34.306 CloseTradesFast4Test AUDCAD,H1: cerrar #573721573 vender 0.10 AUDCAD a precio 0.95190 a precio 0.95217

2020.08.27 20:28:34.180 mhdbzr-34 AUDCAD,H1: OnDoEasyEvent: Posición cerrada

2020.08.27 20:28:34.177 mhdbzr-34 AUDCAD,H1: - Posición cerrada: 2020.08.27 18:58:09.000 - AUDCAD Cerrado Venta #573721582 al precio 0.95190, Ganancia -2.14 USD

2020.08.27 20:28:33.883 CloseTradesFast4Test AUDCAD,H1: cerrar #573721577 vender 0.10 AUDCAD a precio 0.95190 a precio 0.95217

2020.08.27 20:28:33.664 mhdbzr-34 AUDCAD,H1: OnDoEasyEvent: Posición cerrada

2020.08.27 20:28:33.660 mhdbzr-34 AUDCAD,H1: - Posición cerrada: 2020.08.27 18:58:09.000 - AUDCAD Cerrado Venta #573721582 al precio 0.95190, Ganancia -2.14 USD

2020.08.27 20:28:33.440 CloseTradesFast4Test AUDCAD,H1: cerrar #573721582 vender 0.10 AUDCAD a precio 0.95190 a precio 0.95218

2020.08.27 20:28:32.946 CloseTradesFast4Test AUDCAD,H1: inicializado

2020.08.27 20:28:32.928 Script CloseTradesFast4Test AUDCAD,H1: cargado con éxito

2020.08.27 20:28:09.413 mhdbzr-34 AUDCAD,H1: OnDoEasyEvent: Posición abierta

2020.08.27 20:28:09.411 mhdbzr-34 AUDCAD,H1: - Posición abierta: 2020.08.27 18:58:09.000 - AUDCAD Abierto 0.10 Sell #573721582 [0.10 Market-order Sell #573721582] al precio 0.95190

2020.08.27 20:28:07.664 mhdbzr-34 AUDCAD,H1: OnDoEasyEvent: Posición abierta

2020.08.27 20:28:07.659 mhdbzr-34 AUDCAD,H1: - Posición abierta: 2020.08.27 18:58:07.000 - AUDCAD Abierto 0.10 Sell #573721577 [0.10 Market-order Sell #573721577] al precio 0.95190

2020.08.27 20:28:06.755 mhdbzr-34 AUDCAD,H1: OnDoEasyEvent: Posición abierta

2020.08.27 20:28:06.752 mhdbzr-34 AUDCAD,H1: - Posición abierta: 2020.08.27 18:58:06.000 - AUDCAD Abierto 0.10 Sell #573721573 [0.10 Market-order Sell #573721573] al precio 0.95190

2020.08.27 20:28:05.911 mhdbzr-34 AUDCAD,H1: OnDoEasyEvent: Posición abierta

2020.08.27 20:28:05.909 mhdbzr-34 AUDCAD,H1: - Posición abierta: 2020.08.27 18:58:05.000 - AUDCAD Abierta 0.10 Compra #573721571 [0.10 Market-order Compra #573721571] al precio 0.95224

2020.08.27 20:28:04.587 mhdbzr-34 AUDCAD,H1: OnDoEasyEvent: Posición abierta

2020.08.27 20:28:04.582 mhdbzr-34 AUDCAD,H1: - Posición abierta: 2020.08.27 18:58:04.000 - AUDCAD Abierto 0.10 Compra #573721562 [0.10 Market-order Compra #573721562] al precio 0.95218

2020.08.27 20:28:04.101 mhdbzr-34 AUDCAD,H1: OnDoEasyEvent: Posición abierta

2020.08.27 20:28:04.099 mhdbzr-34 AUDCAD,H1: - Posición abierta: 2020.08.27 18:58:03.000 - AUDCAD Abierta 0.10 Compra #573721560 [0.10 Market-order Compra #573721560] al precio 0.95218

2020.08.27 20:27:59.245 mhdbzr-34 AUDCAD,H1: inicializado

2020.08.27 20:27:59.244 mhdbzr-34 AUDCAD,H1: Cuenta 13278180: mhdbzr test (Alpari) 5537.01 USD, 1:100, Hedge, Cuenta Demo MetaTrader 4

2020.08.27 20:27:49.794 Expert TestDoEasy\Part34\mhdbzr-34 AUDCAD,H1: cargado con éxito

Abrí esas operaciones manualmente en el mercado en vivo en la cuenta demo, no utilizando el entorno de prueba. (y cerré con el script como lo hice antes)

(aquí está la captura de pantalla para asegurarse de que sucedió)

Archivos adjuntos:
 
Mohammad Bazrkar :

aquí hay otra prueba; esta vez no reconoció las posiciones cerradas, las erró con las anteriores en dos casos.

Abrí esas operaciones manualmente en el mercado real en la cuenta demo, no utilizando el entorno de prueba. (y cerré con el script como lo hice antes)

(aquí está la captura de pantalla para estar seguro de que sucedió)

Estoy buscando la causa del problema. No será rápido. Gracias por las pruebas.

 
Artyom Trishkin:

Estoy buscando la causa del problema. No será rápido. Gracias por las pruebas.

(aquí está mi opinión)

esas posiciones cerradas estan en el mismo segundo, una de ellas es manejada en el tiempo del tick anterior, entonces en el nuevo tick, tiene `new_history_orders=1` pero dos posiciones en la `list` y ordenadas probablemente mal, porque dos items tienen el mismo tiempo de cierre en el segundo.

            //--- Obtener la lista de posiciones cerradas (EventsCollection.mqh líneas 205-230)
            CArrayObj* list=this.GetListHistoryPositions(list_history);
            if(list!=NULL)
              {
               //--- Ordenar la nueva lista por un tiempo de cierre de posición
               list.Sort(SORT_BY_ORDER_TIME_CLOSE);
               //--- Toma el número de posiciones igual al número de nuevas posiciones cerradas desde el final de la lista en un bucle (los últimos N eventos)
               int total=list.Total(), n=new_history_orders;
               for(int i=total-1; i>WRONG_VALUE && n>0; i--,n--)
                 {
                  //--- Recibe una posición de la lista. Si se trata de una posición, buscar los datos de la orden de apertura y establecer un evento de negociación.
                  COrder* position=list.At(i);
                  if(position!=NULL && position.Status()==ORDER_STATUS_HISTORY_ORDER)
                    {
                     //--- Si hay una orden de control de una posición cerrada
                     COrderControl* ctrl=this.GetOrderControlByTicket(list_control,position.Ticket());
                     if(ctrl!=NULL)
                       {
                        //--- Establecer (1) un tipo de orden que llevó a abrir una posición y un (2) ID de posición, y crear un evento de cierre de posición.
                        this.m_type_first=(ENUM_ORDER_TYPE)ctrl.TypeOrder();
                        this.m_position_id=position.Ticket();
                        this.CreateNewEvent(position,list_history,list_market,list_control);
                       }
                    }
                 }
              }

si la orden ya esta en la lista y arroja un mensaje de error, entonces borra el objeto de posicion y reanuda el conteo en este bucle for, pero creo que no deberia contar n, cuando la orden ha sido borrada dentro de lafuncion CreateNewEvent , para atrapar la proxima posicion valida.

tambien necesitamos entender las posiciones manejadas recientemente, para saltar ordenes mal ordenadas y no contar para `n`.

 
Mohammad Bazrkar :

(esta es mi opinión)

esas posiciones cerradas estan en el mismo segundo, una de ellas es manejada en tiempo de tick anterior, asi que en nuevo tick, tiene `new_history_orders =1` pero dos posiciones en la `lista` y ordenadas probablemente mal, porque dos items tienen el mismo tiempo de cierre en segundo.

si la orden ya esta en la lista y arroja un mensaje de error, entonces elimina el objeto de posición y reanuda el conteo en este bucle for, pero creo que no debería contar n, cuando la orden ha sido eliminada dentro de la función CreateNewEvent , para capturar la siguiente posición válida.

Tambien necesitamos entender las posiciones manejadas recientemente, para omitir ordenes mal ordenadas y no contar para `n`.

Gracias, lo solucionaré.

 

Hola Artyom, recuerdo que mencionaste este futuro shell gráfico la primera vez que leí estos artículos hace algunas semanas... ¿Puedes dar más detalles sobre tu visión al respecto y lo que nos permitirá hacer en la práctica?