伟大而可怕的MT4永远(或如何制定过渡策略) - 页 16

 

这样做效果很好--(取决于什么目的!?)

#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:

那就好办了--(取决于什么目的!?)

不要介入。他们在那里有一个特别的DC,他建立了各种阴谋诡计来抓MT的虫子。

 
Alexey Viktorov:

一个特别的DC,他建立了各种阴谋诡计来抓MT的虫子。

大多数经纪商按照同样的方案工作:Result.deal == 0。

例如,Signals是最受欢迎的剥头皮经纪人。

在著名的经纪商中,很难找到MT5按照不同的方案工作的地方。

 
SanAlex:

这样做的效果很好--(取决于什么目的!?)


究竟什么是 "效果好"?
你的代码中有一个错误,上面已经指出了。
 
fxsaber:

大多数经纪商按照同样的方案工作:Result.deal == 0。

例如,Signals是最受欢迎的剥头皮的经纪人。

在已知的经纪商中,很难找到MT5按照不同的方案工作的地方。

我不知道哪种黄牛的作用如此之大,以至于你没有时间去平仓......

如果你不介意的话,仍然可以尝试增加检查位置的数量

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

我认为这两个位置是开放的,也是封闭的。试图获得这两个职位的类型也无妨。如果它们的方向不同,就会证实我的猜测......

 
Ihor Herasko:

完成了。

结果。

好得到这个订单的状态。如果票据是已知的。

交易失败,执行价格为0。

交易请求结果的结构(MqlTradeResult)

作为对交易请求 的响应,交易服务器返回包含交易请求处理结果的数据,作为一个特殊的预定义结构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:

所以得到这个订单的状态。 如果知道这个票据。

交易失败,执行价格为0。

这就是问题所在:它已经过去了。当脚本完成时,有一个或两个位置被挂起(取决于你在代码中插入多少个打印机)。

代码。

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

结果。

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:

我不知道什么样的黄牛会如此卖力,以至于你无法及时平仓......

那里的一切都在时间中。只是MT5的一个建筑特点。

如果你不介意,请尝试添加检查位置的数量

这个检查存在于源代码中。

我认为,这两个位置是开放的,也是封闭的。试图获得这两个职位的类型也会有所帮助。如果它们的方向不同,就会证实我的猜测......

不存在所谓的关闭位置。

 
fxsaber:

我还没来得及贴出来。我将在24小时内发布。

它没有发挥作用,我发现了问题。

 
fxsaber:

没能成功,发现了问题。

期待着它。如果有什么需要帮助的地方,请写信。