Preguntas de los principiantes MQL5 MT5 MetaTrader 5 - página 1097

 
Vladimir Karputov:

Tras la ejecución de una orden comercial, aparece una POSICIÓN, ¡no una ORDEN!

Hay servidores en los que se puede reproducir esta situación

PositionGetTicket(0) = 73401069 
PositionSelect(_Symbol) = true 
OrderGetTicket(0) = 73401069 
PositionsTotal() = 1
OrdersTotal() = 1, ORDER_STATE_STARTED


Es decir, tenemos la siguiente orden en el terminal al mismo tiempo

#73401069 2019.06.08 21:42:42 buy 1.00 BO Volatility 100 Index 0.5150 0.0000 0.0000 0.5150 0.00 0.00 0.00 Hello! 0


y la misma posición desde ella

#73401069 2019.06.08 21:42:42 buy 1.00 BO Volatility 100 Index 0.5150 0.0000 0.0000 0.5150 0.00 0.00 0.00 Hello! 0
 
Vladimir Karputov:

Así que primero describa con palabras lo que está haciendo y lo que quiere conseguir. Utilice "orden de compra" y "orden de venta" en lugar de ORDEN. El resultado es una "posición de COMPRA" o una "posición de VENTA".

De acuerdo, simplifiquemos nuestra discusión a ejemplos en código. Aquí está el código escrito en MQL4 - estoy interesado en la versión para probadores, es decir, comprobaciones mínimas, etc:

//+------------------------------------------------------------------+
//|                                                        tst__.mq4 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

int ticket1=-1;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   ticket1=-1;
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(ticket1<0) ticket1=OrderSend(_Symbol,OP_BUY,0.1,Ask,30,NormalizeDouble(Ask-100*_Point,_Digits),NormalizeDouble(Ask+100*_Point,_Digits));

   if(OrderSelect(ticket1,SELECT_BY_TICKET))
     {
      if(OrderCloseTime()>0)
        {
         int cmd=OrderType()==OP_BUY ? OP_SELL : OP_BUY;
         double tp = cmd==OP_BUY ? NormalizeDouble(Ask+100*_Point,_Digits) : NormalizeDouble(Bid-100*_Point,_Digits);
         double sl = cmd==OP_BUY ? NormalizeDouble(Ask-100*_Point,_Digits) : NormalizeDouble(Bid+100*_Point,_Digits);
         ticket1=OrderSend(_Symbol,cmd,0.1,Ask,30,sl,tp);
        }
     }
  }
//+------------------------------------------------------------------+

La esencia de la TS: cuando se abre una orden de compra al principio se empieza y se recuerda el ticket de la orden (se trabaja en el ticket), luego se comprueba si la orden está cerrada - se ve qué tipo de orden y se pone la orden contraria y se recuerda el ticket y así sucesivamente.

Necesito que se reproduzca un ejemplo similar en MQL5 utilizando SB CTrade

 
Igor Makanu:

OK, vamos a simplificar nuestra discusión a los ejemplos en el código, aquí está el código escrito en MQL4 - Estoy interesado en la versión para probador, es decir, un mínimo de controles, etc:

La esencia de la TS: cuando se abre una orden de compra al principio se empieza y se recuerda el ticket de la orden (se trabaja en el ticket), luego se comprueba si la orden está cerrada - se ve qué tipo de orden y se pone la orden contraria y se recuerda el ticket y así sucesivamente.

Necesito que se reproduzca un ejemplo similar en MQL5 utilizando SB CTrade

Aquí es donde el pequeño baterista dirá lo que piensa de ti))))
 
Alexey Viktorov:
Ahora el pequeño tamborilero te dirá lo que piensa de ti))))

dejarlo hablar, pero necesitamos saber si el número de ticket es abierto o cerrado, si es cerrado, necesitamos saber qué tipode orden comercial tenía la posición cerrada

(en negrita - ¡es una orden de todos modos! - porque en la cuenta de la cabecera del TC)

 
Igor Makanu:

OK, vamos a simplificar nuestra discusión a los ejemplos en el código. Escribí un código en MQL4 - Estoy interesado en la versión Tester, es decir, el mínimo de controles, etc:

El segundo OrderSend contiene un error. Y la normalización es innecesaria. En el foro (y no sólo) el código es más fácil de leer cuando es más corto.
void OnTick()
  {
   static int ticket1 = -1;
   
   if(ticket1<0) ticket1=OrderSend(_Symbol,OP_BUY,0.1,Ask,30,Ask-100*_Point,Ask+100*_Point);

   if(OrderSelect(ticket1,SELECT_BY_TICKET) && OrderCloseTime())
    {
     int cmd=1-OrderType();
     double open = cmd ? Bid : Ask;
     double tp = open - (cmd ? 1 : -1) * 100 * _Point;
     double sl = open + (cmd ? 1 : -1) * 100 * _Point;
     ticket1=OrderSend(_Symbol,cmd,0.1,open,30,sl,tp);
    }
  }

Necesito que se reproduzca un ejemplo similar en MQL5 utilizando CTrade SB

Necesito que se reproduzca un ejemplo similar en MQL5 utilizando CTrade SB.

 

Por lo tanto, lo básico es elPOSITION_IDENTIFIER, pero no el ticket de posición. Esto es importante precisamente por la red:

IDENTIFICADOR_DE_POSICIÓN

El identificador de la posición es un número único, que se asigna a cada posición recién abierta y no cambia a lo largo de su vida. Corresponde al ticket de la orden con la que se abrió la posición.

El identificador de la posición se especifica en cada orden (ORDER_POSITION_ID) y en cada operación (DEAL_POSITION_ID) que la haya abierto, modificado o cerrado. Utilice esta propiedad para buscar órdenes y operaciones relacionadas con la posición.

Cuando se invierte una posición en modo de compensación (una sola operación de entrada/salida), el identificador POSITION_IDENTIFIER de la posición no se modifica. Sin embargo, POSITION_TICKET se cambia por el ticket de la orden que dio lugar a la anulación. En el modo de cobertura no hay inversión de posiciones.

largo


Por lo tanto, hay que tener en cuenta el identificador de posición (POSITION_IDENTIFIER).


Ahora, una tarea más precisa: en la primera ejecución, abrimos una POSICIÓN DE COMPRA y la memorizamos (OJO: debemos memorizar el ID de la posición, no el ticket). Si la posición se ha cerrado, abrimos una posición opuesta: por ejemplo, antes había una posición de COMPRA, luego se cerró, lo que significa que abrimos una posición de VENTA de inmediato.


Ahora será mucho más fácil resolver el problema.

 
Vladimir Karputov:

Ahora será mucho más fácil resolver el problema.

Cuando escriba el ejemplo, mire un poco hacia adelante.

 
fxsaber:
El segundo OrderSend contiene un error. No necesito la normalización. En el foro (y no sólo) es más fácil leer el código cuando es más corto.

Sí, ya veo, escribí el código sobre la marcha - lo ejecuté en el probador - funciona, lo copié en el foro


fxsaber:

Tendrás que esforzarte un poco más.

Por eso pedí ayuda en el foro. - ¡Decidí estimar las capacidades de SB CTrade - tomé una tarea elemental como ejemplo y hasta ahora el resultado ha sido negativo!


Vladimir Karputov:

Ahora será mucho más fácil resolver el problema.

Te conozco como miembro activo del foro. ¿Podrías reproducir mi código, o más bien el código corregidode fxsaber, utilizando CTrade Server bajo MQL5?

 
Igor Makanu:

Sí, ya veo, escribí el código sobre la marcha - lo ejecuté en el probador - funciona, lo copié en el foro

Cuando empiezo a escribir un EA, siempre comienzo con una página en blanco (lo recomiendo). Probablemente, la mayoría de las veces, se inicia con una cabecera con funciones On.

 
Igor Makanu:

Por eso pedí ayuda en el foro. - Decidí evaluar las capacidades de CTrade: tomé una tarea elemental como ejemplo y hasta ahora el resultado ha sido negativo.

Hay un ejemplo aún más corto.

foro sobre trading, sistemas de trading automatizados y pruebas de estrategias de trading

Características del lenguaje mql5, complejidades y trucos

fxsaber, 2018.02.15 11:48

OrderCloseBy(OrderSend(_Symbol, OP_BUY, 1, Ask, 0, 0, 0), OrderSend(_Symbol, OP_SELL, 1, Bid, 0, 0, 0));

Es difícil de tratar en MT5 si no en el probador.

Razón de la queja: