Discusión sobre el artículo "Transacciones comerciales. Estructuras de solicitud y respuesta, descripción y registro." - página 8

 
MrBrooklin #:

Entonces, ¿cómo encontró este controlador de eventos una posición abierta después de un día de negociación?

Saludos, Vladimir.

Los milagros no ocurren. Usted hizo la lógica. Usted debe ver por qué ... ¿Qué buscaste en el manejador cuando se disparó? ¿Cómo buscaste ... Y qué es exactamente lo que lo desencadenó.

Hay un evento - las señales de controlador. En ella es necesario filtrar estos eventos ...

Pero en general, no me basé en estos manejadores. Yo controlaba la diferencia entre el pasado y el estado actual. Y en base a eso. Tomé decisiones sobre qué hacer.

 
Artyom Trishkin #:
Alexei respondió. Depende del intermediario.

¿Es una afirmación o una suposición? No hago la pregunta porque no tenga otra cosa que hacer. Quiero entender.

Saludos, Vladimir.

 
Artyom Trishkin #:
No existen los milagros.

Mi primer mentor de electrónica también decía lo mismo cuando trabajaba en el Centro Regional de Servicios Informáticos (en tiempos de la URSS). Estoy completamente de acuerdo con él y contigo. Así que debe haber alguna explicación lógica para el problema. Y una vez en 8 meses de operar con el Asesor Experto en una cuenta real. Es por eso que estoy tratando de averiguarlo para eliminar cualquier posibilidad de tal situación.

Saludos, Vladimir.

 

Voy a tratar de aplicar esta variante del uso de la función OnTradeTransaction() en la vida real, para que el Asesor Experto siempre encuentre una posición abierta. He resaltado en amarillo la parte del código que debería excluir "perdiendo de vista" el hecho de una posición abierta:

//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
void  OnTradeTransaction(
   const MqlTradeTransaction&    trans,   // estructura de las transacciones comerciales
   const MqlTradeRequest&        request, // estructura de la solicitud
   const MqlTradeResult&         result   // estructura de la respuesta
)
  {
   if(trans.type==TRADE_TRANSACTION_DEAL_ADD)
     {
      if(HistoryDealSelect(trans.deal) && HistoryDealGetInteger(trans.deal,DEAL_ENTRY)==DEAL_ENTRY_IN)
        {
         pos_ticket=trans.position;
         pos_open=trans.price;
        }
     }
  }
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
void Open_Add_Position()
  {
//--- si una posición con medjik y ticket de la última posición abierta es seleccionada por el símbolo actual
   if((PositionSelectByTicket(pos_ticket) || PositionSelect(_Symbol)) &&
      PositionGetString(POSITION_SYMBOL)==_Symbol &&
      PositionGetInteger(POSITION_MAGIC)==Magic_Number)
     {
      ....... тогда выполняем определённые действия с целью открытия дополнительной позиции
     }
  }

Funciona bien en el probador, voy a ver cómo se comporta en el comercio real.

Saludos, Vladimir.

 
MrBrooklin posición abierta. He resaltado en amarillo la parte del código que debe excluir el hecho de una posición abierta de "caer fuera de la vista":

Funciona bien en el tester, ya veré qué pasa en la operativa real.

Saludos, Vladimir.

Vladimir, no hay ninguna conexión entre estas funciones. Elimine la función OpTradeTransaction() y el código funcionará exactamente igual.

Si la estrategia implica la apertura de varias posiciones y cuenta hadge, esta parte del código

if((PositionSelectByTicket(pos_ticket) || PositionSelect(_Symbol)) &&

puede hacer mucho daño.

 
Alexey Viktorov #:

Vladimir, no hay ninguna conexión entre estas funciones. Elimine la función OpTradeTransaction() y el código funcionará exactamente igual.

Si la estrategia prevé la apertura de varias posiciones y cuenta hadge, entonces esta parte del código

puede hacer mucho daño.

Alexey, gracias por preguntar constantemente y me ayuda en la mejora del código EA. Ahora al grano. Sí, tengo una cuenta de cobertura y se pueden abrir múltiples posiciones. La conexión entre OpTradeTransaction() y la parte del código que sugieres eliminar es directa. En OpTradeTransaction() obtengo el ticket de posición y su precio de apertura para usarlo en la apertura de posición(es) adicional(es). Todo funcionaba perfectamente hasta ahora. El problema surgió cuando el Asesor Experto no "vio" una posición abierta una vez. No me di cuenta antes y pensé que el problema ocurría sólo una vez, pero después de pasarlo por el historial y mirar la impresión con más detalle, me di cuenta de que ocurría más de una vez y no dos. No me había dado cuenta antes, pero ahora me he dado cuenta de que el problema se producía a veces cuando una posición pasaba de una sesión de negociación a otra. Subrayo: a veces. ¿Por qué? No puedo entenderlo. Mi corredor de divisas tiene un rollover entre las sesiones de negociación. Tal vez por eso, tal vez no. No lo sé. Ahora tengo una situación similar, pero todavía me falta una condición para abrir una posición adicional. Quiero probar el nuevo código y ver si va a hacer ningún daño o no. No tengo miedo de hacer un experimento, porque no será peor y sobre todo porque ya he aprendido a "resolver" malas situaciones con mis manos. Simplemente detengo el trabajo de ambos robots y abro una posición al precio que necesito.

Saludos, Vladimir.

 
MrBrooklin #:

Alexey, gracias por estar constantemente incitándome y ayudándome a mejorar el código del EA. Ahora al grano. Sí, tengo una cuenta de cobertura y se pueden abrir múltiples posiciones. La conexión entre OpTradeTransaction() y la parte del código que sugieres eliminar es directa. En OpTradeTransaction() obtengo el ticket de posición y su precio de apertura para utilizarlo en la apertura de posición(es) adicional(es). Todo funcionaba perfectamente hasta ahora. El problema surgió cuando el Asesor Experto no "vio" una posición abierta una vez. No lo había notado antes y pensé que el problema ocurría sólo una vez, pero después de recorrer el historial y mirar la impresión con más detalle, me di cuenta de que ocurría más de una vez y no dos. Simplemente no me había dado cuenta antes, y ahora me he dado cuenta de que el problema se producía a veces cuando una posición pasaba de una sesión de negociación a otra. Subrayo: a veces. ¿Por qué? No puedo entenderlo. Mi corredor de divisas tiene un rollover entre las sesiones de negociación. Tal vez por eso, tal vez no. No lo sé. Ahora tengo una situación similar, pero todavía me falta una condición para abrir una posición adicional. Quiero probar el nuevo código y ver si va a hacer ningún daño o no. No tengo miedo de hacer un experimento, porque no será peor y sobre todo porque ya he aprendido a "resolver" malas situaciones con mis manos. Simplemente paro el trabajo de ambos robots y abro una posición al precio que necesito a mano.

Saludos, Vladimir.

El problema es que PositionSelect(_Symbol) no selecciona necesariamente la última posición. Por lo tanto, si no has recibido un ticket de posición en OnTradeTransaction(), te arriesgas a tomar una decisión basada en datos erróneos.

 
Alexey Viktorov #:

El problema es que PositionSelect(_Symbol) no selecciona necesariamente la última posición. Por lo tanto, si no se obtiene una entrada de posición en OnTradeTransaction(), se corre el riesgo de tomar una decisión basada en datos erróneos.

Gracias por la sugerencia. Lo pensaré un poco y veré cómo puede perjudicar en el trading real. No puedo estar de acuerdo con la idea de abandonar la función OnTradeTransaction() todavía. Tenemos que entender a fondo el problema y luego tomar una decisión final.

Saludos, Vladimir.

 
MrBrooklin #:

Gracias por el consejo. Lo pensaré un poco y veré cómo puede perjudicar en el trading real. No puedo estar de acuerdo en abandonar la función OnTradeTransaction() todavía. Necesito entender a fondo el problema y luego tomar una decisión final.

Saludos, Vladimir.

No he dicho que se rechace. Pero las ventajas de utilizarlo de este modo son nulas.

 
Alexey Viktorov #:
Elimine la función OpTradeTransaction() y el código funcionará exactamente igual

A mi entender, eliminar una función es como negarse a usarla. No importa quién y cómo lo diga, lo principal es entenderlo. : )

Saludos, Vladimir.