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

 

Hmm, extraña situación, al igual que la actividad en el tema que planteé, tenía una pregunta, desde mi punto de vista específica, pero en lugar de una respuesta hasta ahora obtuve "¿por qué lo necesitas?

Quiero hacerlo con SB CTrade, aquí hay un ejemplo (compilado de 2 mis ejemplos): Abrimos cadanueva barra a 9 TF por una orden, memorizamos el ticket y determinamos la dirección de una orden cerrada por el número de ticket.

En MQL4, el código para el probador se vería así

//+------------------------------------------------------------------+
//|                                                        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
input int TP = 100;
input int SL = 100;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class CNewbar
  {
private:
   datetime          mnewtime;
   ENUM_TIMEFRAMES   mperiod;
public:
                     CNewbar()                        { mperiod=PERIOD_CURRENT;  mnewtime=TimeCurrent(); }
                     CNewbar(ENUM_TIMEFRAMES period)  { mperiod=period;          mnewtime=TimeCurrent(); }
   bool              NewBar(){ datetime t=iTime(NULL,mperiod,0); if(mnewtime<t){ mnewtime=t; return(true); } return(false);  }
  };

ENUM_TIMEFRAMES  TF[9]={PERIOD_M1,PERIOD_M5,PERIOD_M15,PERIOD_M30,PERIOD_H1,PERIOD_H4,PERIOD_D1,PERIOD_W1,PERIOD_MN1};
CNewbar *BAR[9];
int ticket[9];
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   for(int i=0;i<9;i++) BAR[i]=new CNewbar(TF[i]);
   ArrayInitialize(ticket,-1);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   for(int i=0;i<9;i++) delete BAR[i];
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   for(int i=0;i<9;i++)
      if(BAR[i].NewBar())
        {
         if(ticket[i]<0) ticket[i]=OrderSend(_Symbol,OP_BUY,0.1,Ask,30,Ask-SL*_Point,Ask+TP*_Point);
         if(OrderSelect(ticket[i],SELECT_BY_TICKET) && OrderCloseTime()>0)
           {
            int cmd=1-OrderType();
            double open=cmd ? Bid : Ask;
            double tp = open - (cmd ? 1 : -1) * TP * _Point;
            double sl = open + (cmd ? 1 : -1) * SL * _Point;
            ticket[i]=OrderSend(_Symbol,cmd,0.1,open,30,sl,tp);
           }
        }
  }

necesitamos un código para el probador, es decir, el mínimo número de comprobaciones y el trabajo más rápido posible en el optimizador.

¿Cómo escribir este código en MQL5 con SB CTrade?

 
Igor Makanu:

Hmm, extraña situación, al igual que la actividad en el tema que planteé, tenía una pregunta, desde mi punto de vista específica, pero en lugar de una respuesta hasta ahora obtuve "¿por qué lo necesitas?

Quiero hacerlo con SB CTrade, aquí hay un ejemplo (compilado de 2 mis ejemplos): Abrimos cada nueva barra a 9 TF por una orden, memorizamos el ticket y determinamos la dirección de una orden cerrada por el número de ticket.

En MQL4, el código para el probador se vería así

¿Cómo escribir este código en MQL5 utilizando SB CTrade?

Foro sobre trading, sistemas de trading automatizados y comprobación de estrategias

FAQ de principiantes MQL5 MT5 MetaTrader 5

Vladimir Karputov, 2019.07.21 12:56

Así, la base es elPOSITION_IDENTIFIER, pero no el ticket de posición. Es importante sólo 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:

Es decir, CTrade no sabe detectar de forma independiente si una orden está abierta o cerrada, ¿cuál fue el tipo de la última orden cerrada?

¿qué biblioteca debo utilizar para este fin?

 
Igor Makanu:

es decir, ¿CTrade no sabe detectar de forma independiente si una orden está abierta o cerrada? ¿cuál fue el tipo de la última orden cerrada?

¿Qué biblioteca debemos utilizar para ello?

Ya te lo he dicho cientos de veces, así que por favor elimina la palabra "orden" de tu vocabulario. Hasta que no lo hagas, no podrás seguir adelante. De todos modos, probablemente no podré ayudarte. Eso es lamentable.

 
Vladimir Karputov:

Bueno, te lo he dicho cientos de veces: elimina la palabra "orden" de tu vocabulario. Hasta que no lo hagas, no podrás seguir adelante. De todos modos, probablemente no pueda ayudarte. Es una pena.

Bueno, dime qué quieres decir con eso:

GN      0       16:24:14.030    Core 1  2018.06.06 08:00:00   Sell market. Ticket = 20
JF      0       16:24:14.030    Core 1  2018.06.06 08:00:00   Sell market. Identifier = 0
FQ      0       16:24:14.030    Core 1  2018.06.19 16:00:00   ======closePosition======
HG      0       16:24:14.030    Core 1  2018.06.19 16:00:00   market buy 0.10 AUDUSD, close #20 (0.73633 / 0.73637 / 0.73633)
PH      0       16:24:14.030    Core 1  2018.06.19 16:00:00   deal #21  buy 0.10 AUDUSD at 0.73637 done (based on order #21)
 KJ      0       16:24:14.030    Core 1  2018.06.19 16:00:00   deal performed [#21  buy 0.10 AUDUSD at 0.73637]
IL      0       16:24:14.030    Core 1  2018.06.19 16:00:00   order performed buy 0.10 at 0.73637 [#21  buy 0.10 AUDUSD at 0.73637]
RN      0       16:24:14.030    Core 1  2018.06.19 16:00:00   CTrade::OrderSend: market buy 0.10 position #20  AUDUSD [done at 0.73637]
HN      0       16:24:14.030    Core 1  2018.06.19 16:00:00   Позиция с магиком 2544113114312914, тикетом 20 и лотом 0.1 успешно закрыта.
LO      0       16:24:14.030    Core 1  2018.06.19 16:00:00   Очистка данных произведена.
CH      0       16:24:14.030    Core 1  2018.06.19 16:00:00   ======checkMargin======
OF      0       16:24:14.030    Core 1  2018.06.19 16:00:00   market buy 0.10 AUDUSD (0.73633 / 0.73637 / 0.73633)
DS      0       16:24:14.030    Core 1  2018.06.19 16:00:00   deal #22  buy 0.10 AUDUSD at 0.73637 done (based on order #22)
 RM      0       16:24:14.030    Core 1  2018.06.19 16:00:00   deal performed [#22  buy 0.10 AUDUSD at 0.73637]
DS      0       16:24:14.030    Core 1  2018.06.19 16:00:00   order performed buy 0.10 at 0.73637 [#22  buy 0.10 AUDUSD at 0.73637]
FF      0       16:24:14.030    Core 1  2018.06.19 16:00:00   CTrade::OrderSend: market buy 0.10 AUDUSD [done at 0.73637]
MJ      0       16:24:14.030    Core 1  2018.06.19 16:00:00   magic = 2544113114312914
RR      0       16:24:14.030    Core 1  2018.06.19 16:00:00   balance = 11308.94
JK      0       16:24:14.030    Core 1  2018.06.19 16:00:00   lot = 0.10
HQ      0       16:24:14.030    Core 1  2018.06.19 16:00:00   Buy market. Ticket = 22
CJ      0       16:24:14.030    Core 1  2018.06.19 16:00:00   Buy market. Identifier = 20
HR      0       16:24:14.030    Core 1  2018.07.04 08:00:00   ======closePosition======
FI      0       16:24:14.030    Core 1  2018.07.04 08:00:00   market sell 0.10 AUDUSD, close #22 (0.74021 / 0.74025 / 0.74021)
RF      0       16:24:14.030    Core 1  2018.07.04 08:00:00   deal #23  sell 0.10 AUDUSD at 0.74021 done (based on order #23)
 ID      0       16:24:14.030    Core 1  2018.07.04 08:00:00   deal performed [#23  sell 0.10 AUDUSD at 0.74021]
GM      0       16:24:14.030    Core 1  2018.07.04 08:00:00   order performed sell 0.10 at 0.74021 [#23  sell 0.10 AUDUSD at 0.74021]
NQ      0       16:24:14.030    Core 1  2018.07.04 08:00:00   CTrade::OrderSend: market sell 0.10 position #22  AUDUSD [done at 0.74021]
PO      0       16:24:14.030    Core 1  2018.07.04 08:00:00   Позиция с магиком 2544113114312914, тикетом 22 и лотом 0.1 успешно закрыта.
FO      0       16:24:14.030    Core 1  2018.07.04 08:00:00   Очистка данных произведена.
CH      0       16:24:14.030    Core 1  2018.07.04 08:00:00   ======checkMargin======
OI      0       16:24:14.030    Core 1  2018.07.04 08:00:00   market sell 0.10 AUDUSD (0.74021 / 0.74025 / 0.74021)
JO      0       16:24:14.030    Core 1  2018.07.04 08:00:00   deal #24  sell 0.10 AUDUSD at 0.74021 done (based on order #24)
 LM      0       16:24:14.030    Core 1  2018.07.04 08:00:00   deal performed [#24  sell 0.10 AUDUSD at 0.74021]
ND      0       16:24:14.030    Core 1  2018.07.04 08:00:00   order performed sell 0.10 at 0.74021 [#24  sell 0.10 AUDUSD at 0.74021]
LI      0       16:24:14.030    Core 1  2018.07.04 08:00:00   CTrade::OrderSend: market sell 0.10 AUDUSD [done at 0.74021]
OJ      0       16:24:14.030    Core 1  2018.07.04 08:00:00   magic = 2544113114312914
RR      0       16:24:14.030    Core 1  2018.07.04 08:00:00   balance = 11335.85
DK      0       16:24:14.030    Core 1  2018.07.04 08:00:00   lot = 0.10
PN      0       16:24:14.030    Core 1  2018.07.04 08:00:00   Sell market. Ticket = 24
QE      0       16:24:14.030    Core 1  2018.07.04 08:00:00   Sell market. Identifier = 22
NR      0       16:24:14.030    Core 1  2018.07.19 00:00:00   ======closePosition======
NF      0       16:24:14.030    Core 1  2018.07.19 00:00:00   market buy 0.10 AUDUSD, close #24 (0.73968 / 0.73989 / 0.73968)
JI      0       16:24:14.030    Core 1  2018.07.19 00:00:00   deal #25  buy 0.10 AUDUSD at 0.73989 done (based on order #25)
 QK      0       16:24:14.030    Core 1  2018.07.19 00:00:00   deal performed [#25  buy 0.10 AUDUSD at 0.73989]
MM      0       16:24:14.030    Core 1  2018.07.19 00:00:00   order performed buy 0.10 at 0.73989 [#25  buy 0.10 AUDUSD at 0.73989]
PN      0       16:24:14.030    Core 1  2018.07.19 00:00:00   CTrade::OrderSend: market buy 0.10 position #24  AUDUSD [done at 0.73989]
DO      0       16:24:14.030    Core 1  2018.07.19 00:00:00   Позиция с магиком 2544113114312914, тикетом 24 и лотом 0.1 успешно закрыта.
LP      0       16:24:14.030    Core 1  2018.07.19 00:00:00   Очистка данных произведена.
KK      0       16:24:14.030    Core 1  2018.08.08 16:00:00   ======checkMargin======
RI      0       16:24:14.030    Core 1  2018.08.08 16:00:00   market sell 0.10 AUDUSD (0.73933 / 0.73937 / 0.73933)
GO      0       16:24:14.030    Core 1  2018.08.08 16:00:00   deal #26  sell 0.10 AUDUSD at 0.73933 done (based on order #26)
 OM      0       16:24:14.030    Core 1  2018.08.08 16:00:00   deal performed [#26  sell 0.10 AUDUSD at 0.73933]
JD      0       16:24:14.030    Core 1  2018.08.08 16:00:00   order performed sell 0.10 at 0.73933 [#26  sell 0.10 AUDUSD at 0.73933]
QI      0       16:24:14.030    Core 1  2018.08.08 16:00:00   CTrade::OrderSend: market sell 0.10 AUDUSD [done at 0.73933]
HN      0       16:24:14.030    Core 1  2018.08.08 16:00:00   Sell market. Ticket = 26
CF      0       16:24:14.030    Core 1  2018.08.08 16:00:00   Sell market. Identifier = 0
 
Vladimir Karputov:

Bueno, te lo he dicho cientos de veces: elimina la palabra "orden" de tu vocabulario. Hasta que no lo hagas, no podrás seguir adelante. De todos modos, probablemente no pueda ayudarte. Es una pena.

¿De acuerdo? Permítame reformular la pregunta:

Cómo se utiliza un ticket recordado con CTrade::ResultOrder()

para averiguarlo:

1. si la posición está cerrada

2. ¿qué tipo de trato tenía la posición cerrada?

3. necesitamos manejar simultáneamente 9 posiciones, órdenes o tickets, o ... OnAnyTerminology en una cuenta de cobertura


¿en esta formulación mi pregunta es inequívoca? (ejemplo reproducible en MQl4 publicado anteriormente)

ZS: No puedo olvidar el orden de las palabras, lamentablemente esta palabra se utiliza en la ayuda junto con otros términos:https://www.mql5.com/ru/docs/standardlibrary/tradeclasses/ctrade/ctraderequestorder

 
Igor Makanu:

Hm, es una situación extraña, parecía haber planteado el tema, mi pregunta era específica desde mi punto de vista, pero en lugar de una respuesta obtuve "¿por qué lo necesitas?

La razón es la incompetencia de los que responden. He tardado cinco minutos en escribirlo y un intento en comprobarlo.


MT4

Foro sobre trading, sistemas de trading automatizados y comprobador de estrategias

Preguntas de los principiantes MQL5 MT5 MetaTrader 5

fxsaber, 2019.07.21 12:54

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);
    }
  }


MT5

#include <Trade\Trade.mqh>

#define  Bid SymbolInfoDouble(_Symbol, SYMBOL_BID)
#define  Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

void OnTick()
{
  static CTrade Trade; // Не стал возиться с Deviation.
  static ulong ticket1 = 0;
 
  if (!ticket1)
    ticket1 = Trade.PositionOpen(_Symbol, ORDER_TYPE_BUY, 0.1, Ask, Ask - 100 * _Point, Ask + 100 * _Point) ? Trade.ResultOrder() : 0;
  else if (!PositionSelectByTicket(ticket1) && HistorySelectByPosition(ticket1))
  {
    ENUM_ORDER_TYPE cmd = (ENUM_ORDER_TYPE)HistoryOrderGetInteger(HistoryOrderGetTicket(HistoryOrdersTotal() - 1), ORDER_TYPE);
    double open = cmd ? Bid : Ask;
    double tp = open - (cmd ? 1 : -1) * 100 * _Point;
    double sl = open + (cmd ? 1 : -1) * 100 * _Point;
    ticket1 = Trade.PositionOpen(_Symbol, cmd, 0.1, open, sl, tp) ? Trade.ResultOrder() : 0;
  }
}


No es necesario ser un experto en la materia para escribir esto, sólo es necesario conocer los fundamentos de MT5.


ZS En la red hay un pequeño matiz para determinar el tipo de posición cerrada. Pero aquí no juega ningún papel.

 
fxsaber:

No necesitas ser fuerte para escribir esto, sólo necesitas saber lo básico de MT5.

Gracias.

Sí, estaba buscando una solución si no podía escribirla en cinco líneas con SB

Pero cuanto entendí, que un SB CTrade no será capaz de resolver mi problema? Y tuve que usar CPositionInfo también? - ¿Si quiero acompañar 9 posiciones por varios TFs al mismo tiempo?

ZS: Estoy sentado en la ayuda MQL5 con la televisión inteligente - bastante bien descrito funciones comerciales, el uso de SatB está bajo una pregunta .... creo que tiene sentido usar SB para estrategias primitivas, un poco más complicadas - la funcionalidad es insuficiente o no es obvio el uso, tal vez necesito más práctica - voy a tratar de "torcer" el SB


Gracias de nuevo.

 
fxsaber:

La razón es la incompetencia tan contestada. He tardado cinco minutos en escribir y un intento en comprobarlo.


MT4


MT5


No es necesario ser un experto en la materia para escribir esto, sólo es necesario conocer los fundamentos de MT5.


No es necesario que conozcas los fundamentos, sólo necesitas conocer los fundamentos básicos de MT5. Pero eso no importa aquí.

Aquí es donde

ENUM_ORDER_TYPE cmd = (ENUM_ORDER_TYPE)HistoryOrderGetInteger(HistoryOrderGetTicket(HistoryOrdersTotal() - 1), ORDER_TYPE);

hay una trampa potencial.

En la lista histórica las garantías no están dispuestas en el orden en que aparecen en dicha lista. Me encontré con esto al desarrollar la biblioteca. Confié en ello. Pero resultó no ser tan sencillo. Pruebe a poner órdenes de límite y stop sucesivamente en el siguiente orden: límite -> stop -> límite -> límite -> stop y borre cada una de ellas en cualquier orden y vea cuál es la última orden registrada en la lista del historial. Se sorprenderá.

 
Artyom Trishkin:

Aquí es donde

hay un error potencial.

En la lista del historial, los pedidos no están dispuestos en el orden en que aparecen en la lista. Me encontré con esto al desarrollar la biblioteca. Confié en ello. Pero resultó no ser tan sencillo. Pruebe a poner órdenes de límite y stop sucesivamente en el siguiente orden: límite -> stop -> límite -> límite -> stop y borre cada una de ellas en cualquier orden y vea cuál es la última orden registrada en la lista del historial. Se sorprenderá.

No hay ningún error, ya que la lista se genera a través de HistorySelectByPosition.

Razón de la queja: