La gran y terrible MT4 para siempre (o cómo hacer una estrategia de transición) - página 16

 

esto funciona bien - (dependiendo de qué propósito!?)

#include <Trade\Trade.mqh>
CTrade Trade;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   int total=PositionsTotal();
   int Ordertotal=OrdersTotal();
   while(!IsStopped() && (total <= 1))  // Закончим, когда появится более одной позиции.
      if(total == 1)
         Trade.PositionClose(PositionGetTicket(0)); // Если есть позиция - закрываем.
      else
         if(Ordertotal!=0)
            Trade.Buy(0.01); // Если нет позиции и ордера - открываем позицию.
  }
//+------------------------------------------------------------------+
 
SanAlex:

que funciona bien - (dependiendo de qué propósito!?)

No te involucres. Allí tienen un DC especial que construye todo tipo de intrigas para atrapar a los bichos de la MT.

 
Alexey Viktorov:

Un DC especial que construye todo tipo de intrigas para atrapar a los bichos de la MT.

La mayoría de los corredores trabajan según el mismo esquema: Result.deal == 0.

Por ejemplo, Signals es el broker más popular para el scalping.

Entre los corredores de renombre es bastante difícil encontrar donde MT5 funcione según un esquema diferente.

 
SanAlex:

esto funciona bien - (dependiendo de qué propósito!?)


¿Qué es exactamente lo que "funciona bien"?
Tienes un error en tu código, que ya ha sido señalado anteriormente.
 
fxsaber:

La mayoría de los corredores trabajan según el mismo esquema: Result.deal == 0.

Signals, por ejemplo, es el broker más popular para el scalping.

Entre los corredores conocidos es bastante difícil encontrar donde MT5 funciona según un esquema diferente.

No sé qué tipo de scalping funciona tanto como para no tener tiempo de cerrar una posición...

Si no te importa, sigue intentando añadir la comprobación del número de posiciones

    else if(!PositionsTotal() && !OrdersTotal())

Creo que las dos posiciones están abiertas y cerradas. No estaría mal intentar conseguir los tipos de estas dos posiciones. Si se dirigen de manera diferente, confirmará mis sospechas...

 
Ihor Herasko:

Hecho:

Resultado:

Bien obtener el estado de esta orden.Si el billete es conocido.

La operación falló, el precio de ejecución es 0.

Estructura del resultado de la solicitud de negociación (MqlTradeResult)

En respuesta a una solicitud de comercio, el servidor de comercio devuelve datos que contienen el resultado del procesamiento de la solicitud de comercio como una estructura especial predefinida MqlTradeResult.

struct MqlTradeResult
  {
   uint     retcode;          // Код результата операции
   ulong    deal;             // Тикет сделки, если она совершена
   ulong    order;            // Тикет ордера, если он выставлен
   double   volume;           // Объем сделки, подтверждённый брокером
   double   price;            // Цена в сделке, подтверждённая брокером
   double   bid;              // Текущая рыночная цена предложения (цены реквота)
   double   ask;              // Текущая рыночная цена спроса (цены реквота)
   string   comment;          // Комментарий брокера к операции (по умолчанию заполняется расшифровкой кода возврата торгового сервера)
   uint     request_id;       // Идентификатор запроса, устанавливается терминалом при отправке 
   uint     retcode_external; // Код ответа внешней торговой системы
  };

 
Rashid Umarov:

Si se conoce el estado de este pedido.

La operación falló, el precio de ejecución es 0.

Esa es la cuestión: ha pasado. Cuando el script termina, una o dos posiciones se quedan colgadas (dependiendo de cuántas impresoras se inserten en el código).

Código:

#define  PRINT(A) Print(#A + " = " + (string)(A))

#include <Trade\Trade.mqh>

void OnStart()
{
  CTrade Trade;
  
  while (!IsStopped() && (PositionsTotal() <= 1)) // Закончим, когда появится более одной позиции.
    if (PositionsTotal() == 1)
    {
      Trade.PositionClose(PositionGetTicket(0)); // Если есть позиция - закрываем.
      Print("Закрытие, т. к. PositionsTotal() равно 1");
    }
    else if (!OrdersTotal())
    {
      printf("Перед открытием. PositionsTotal: %d, OrdersTotal: %d", PositionsTotal(), OrdersTotal());
      Trade.Buy(0.01); // Если нет позиции и ордера - открываем позицию.
      PRINT(Trade.ResultRetcodeDescription());
      PRINT(Trade.ResultDeal());
      PRINT(Trade.ResultOrder());
      PRINT(Trade.ResultComment());
      if (OrderSelect(Trade.ResultOrder()))
         PRINT(OrderGetInteger(ORDER_STATE));
      printf("После открытия. PositionsTotal: %d, OrdersTotal: %d", PositionsTotal(), OrdersTotal());
    }
    
  Print("Выход. PostionsTotal: ", PositionsTotal());
}

Resultado:

2021.05.05 14:25:14.738 Test (EURUSD,M1)        Перед открытием. PositionsTotal: 0, OrdersTotal: 0
2021.05.05 14:25:14.821 Test (EURUSD,M1)        Trade.ResultRetcodeDescription() = done at 0.00000
2021.05.05 14:25:14.821 Test (EURUSD,M1)        Trade.ResultDeal() = 0
2021.05.05 14:25:14.821 Test (EURUSD,M1)        Trade.ResultOrder() = 2249888681
2021.05.05 14:25:14.821 Test (EURUSD,M1)        Trade.ResultComment() = Request executed
2021.05.05 14:25:14.821 Test (EURUSD,M1)        EnumToString(ENUM_ORDER_STATE(OrderGetInteger(ORDER_STATE))) = ORDER_STATE_PLACED
2021.05.05 14:25:14.821 Test (EURUSD,M1)        После открытия. PositionsTotal: 1, OrdersTotal: 1
2021.05.05 14:25:14.899 Test (EURUSD,M1)        Закрытие, т. к. PositionsTotal() равно 1
2021.05.05 14:25:14.899 Test (EURUSD,M1)        Выход. PostionsTotal: 2
 
Alexey Viktorov:

No sé qué tipo de scalping trabaja tanto que no puede cerrar una posición a tiempo...

Allí todo está en el tiempo. Es una característica arquitectónica de MT5.

Si no te importa, intenta añadir la comprobación del número de posiciones

Esta comprobación está presente en el código fuente.

Creo que las dos posiciones están abiertas y cerradas. También ayudaría tratar de conseguir los tipos de estas dos posiciones. Si están dirigidos de forma diferente, confirmaría mis sospechas...

No existe una posición de cierre.

 
fxsaber:

Todavía no he podido publicarlo. Lo publicaré en 24 horas.

No funcionó, encontré problemas.

 
fxsaber:

No funcionó, encontró problemas.

Lo estoy deseando. Si hay algo en lo que necesites ayuda, escríbenos.