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

 
Ihor Herasko:

是的,这也是我的观点。结果发现,脚本设法关闭了其中一个头寸,而事实上有两个,但PositionsTotal()返回1。然后,在关闭之后,循环结束条件得到满足,即PositionsTotal()返回2。

你可以插入打印件,以充分看到发生了什么事。

 
fxsaber:

可以插入打印件,以充分看到正在发生的事情。

是的,以确认推理是否正确。

#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())
    {
      Trade.Buy(0.01); // Если нет позиции и ордера - открываем позицию.
      
Print("Открытие. PositionsTotal: ", PositionsTotal()); 
    }
    
  Print("Выход. PostionsTotal: ", PositionsTotal());
}

结果。

2021.05.05 10:11:43.393 Test (EURUSD,M1)        Открытие. PositionsTotal: 0
2021.05.05 10:11:43.488 Test (EURUSD,M1)        Закрытие, т. к. PositionsTotal() равно 1
2021.05.05 10:11:43.535 Test (EURUSD,M1)        CTrade::OrderSend: market sell 0.01 position #2249868517  EURUSD [position closed]
2021.05.05 10:11:43.535 Test (EURUSD,M1)        Закрытие, т. к. PositionsTotal() равно 1
2021.05.05 10:11:43.615 Test (EURUSD,M1)        Открытие. PositionsTotal: 0
2021.05.05 10:11:43.697 Test (EURUSD,M1)        Закрытие, т. к. PositionsTotal() равно 1
2021.05.05 10:11:43.777 Test (EURUSD,M1)        Открытие. PositionsTotal: 0
2021.05.05 10:11:43.859 Test (EURUSD,M1)        Закрытие, т. к. PositionsTotal() равно 1
2021.05.05 10:11:43.941 Test (EURUSD,M1)        Открытие. PositionsTotal: 0
2021.05.05 10:11:44.023 Test (EURUSD,M1)        Открытие. PositionsTotal: 1
2021.05.05 10:11:44.101 Test (EURUSD,M1)        Закрытие, т. к. PositionsTotal() равно 1
2021.05.05 10:11:44.101 Test (EURUSD,M1)        Выход. PostionsTotal: 2

事实上,这个位置被单独悬空。

P.S.更正了帖子,因为复制粘贴,我在代码中放错了东西。
 
Ihor Herasko:

事实上,这个位置被单独悬挂了起来。

在日志中,很可能是最后一笔交易 的记录时间紧随脚本关闭的记录时间。

打印OrdersTotal也很重要。
 
fxsaber:

在日志中,很可能最后一笔交易 记录的时间紧随脚本收盘记录的时间。

你指的是这两份记录吗?

2021.05.05 10:11:44.101 Test (EURUSD,M1)        Закрытие, т. к. PositionsTotal() равно 1
2021.05.05 10:11:44.101 Test (EURUSD,M1)        Выход. PostionsTotal: 2

我认为这里的排序都是正确的。事实上有两个职位,但PositionsTotal()还没有被更新。因此,它返回1,仓位被关闭。而在交易操作被执行后,它被更新到与交易操作被执行前的状态相对应的状态。因此,我们得到2。

 
fxsaber:

这个问题已经讨论了很久了。几乎每个人都遇到过这种情况。这是第一次发现稳定的可重复的代码。

已经找到了一个解决方案。

那么解决方案是什么呢?

找到一个稳定的复制代码的困难是什么?一个动作是开仓或平仓,下一个动作是根据市场上或历史上的头寸数量 来决定。
 
Ihor Herasko:

你指的是这两个条目吗?

不,交易活动的最后记录是在第二份日志中。

 
fxsaber:

打印OrdersTotal也很重要。

我已经添加了印刷品。现在还剩下两个职位,正如预期的那样。

#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); // Если нет позиции и ордера - открываем позицию.
      printf("После открытия. PositionsTotal: %d, OrdersTotal: %d", PositionsTotal(), OrdersTotal());
    }
    
  Print("Выход. PostionsTotal: ", PositionsTotal());
}

结果。

2021.05.05 10:22:50.583 Test (EURUSD,M1)        Перед открытием. PositionsTotal: 0, OrdersTotal: 0
2021.05.05 10:22:50.663 Test (EURUSD,M1)        После открытия. PositionsTotal: 0, OrdersTotal: 1
2021.05.05 10:22:50.679 Test (EURUSD,M1)        Перед открытием. PositionsTotal: 0, OrdersTotal: 0
2021.05.05 10:22:50.757 Test (EURUSD,M1)        После открытия. PositionsTotal: 2, OrdersTotal: 0
2021.05.05 10:22:50.757 Test (EURUSD,M1)        Выход. PostionsTotal: 2
 
Dmitry Fedoseev:

解决办法是什么?

头寸数量 来决定。

这没有什么困难,我是临时写的。

 

它像这样开仓,完全没有停顿

#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)
            Trade.Buy(0.01); // Если нет позиции и ордера - открываем позицию.
  }
//+------------------------------------------------------------------+

图片来源

 
SanAlex:

它是这样开仓的,完全没有停顿

那么,谁来更新总数呢?))