#include <Trade\Trade.mqh>
voidOnStart()
{
CTrade Trade;
while (!IsStopped() && (PositionsTotal() <= 1)) // Закончим, когда появится более одной позиции.if (PositionsTotal() == 1)
{
Trade.PositionClose(PositionGetTicket(0)); // Если есть позиция - закрываем.Print("Закрытие, т. к. PositionsTotal() равно 1");
}
elseif (!OrdersTotal())
{
Trade.Buy(0.01); // Если нет позиции и ордера - открываем позицию.
Print("Открытие. PositionsTotal: ", PositionsTotal());
}
Print("Выход. PostionsTotal: ", PositionsTotal());
}
结果。
2021.05.0510:11:43.393 Test (EURUSD,M1) Открытие. PositionsTotal: 02021.05.0510:11:43.488 Test (EURUSD,M1) Закрытие, т. к. PositionsTotal() равно 12021.05.0510:11:43.535 Test (EURUSD,M1) CTrade::OrderSend: market sell 0.01 position #2249868517 EURUSD [position closed]
2021.05.0510:11:43.535 Test (EURUSD,M1) Закрытие, т. к. PositionsTotal() равно 12021.05.0510:11:43.615 Test (EURUSD,M1) Открытие. PositionsTotal: 02021.05.0510:11:43.697 Test (EURUSD,M1) Закрытие, т. к. PositionsTotal() равно 12021.05.0510:11:43.777 Test (EURUSD,M1) Открытие. PositionsTotal: 02021.05.0510:11:43.859 Test (EURUSD,M1) Закрытие, т. к. PositionsTotal() равно 12021.05.0510:11:43.941 Test (EURUSD,M1) Открытие. PositionsTotal: 02021.05.0510:11:44.023 Test (EURUSD,M1) Открытие. PositionsTotal: 12021.05.0510:11:44.101 Test (EURUSD,M1) Закрытие, т. к. PositionsTotal() равно 12021.05.0510:11:44.101 Test (EURUSD,M1) Выход. PostionsTotal: 2
#include <Trade\Trade.mqh>
voidOnStart()
{
CTrade Trade;
while (!IsStopped() && (PositionsTotal() <= 1)) // Закончим, когда появится более одной позиции.if (PositionsTotal() == 1)
{
Trade.PositionClose(PositionGetTicket(0)); // Если есть позиция - закрываем.Print("Закрытие, т. к. PositionsTotal() равно 1");
}
elseif (!OrdersTotal())
{
printf("Перед открытием. PositionsTotal: %d, OrdersTotal: %d", PositionsTotal(), OrdersTotal());
Trade.Buy(0.01); // Если нет позиции и ордера - открываем позицию.printf("После открытия. PositionsTotal: %d, OrdersTotal: %d", PositionsTotal(), OrdersTotal());
}
Print("Выход. PostionsTotal: ", PositionsTotal());
}
结果。
2021.05.0510:22:50.583 Test (EURUSD,M1) Перед открытием. PositionsTotal: 0, OrdersTotal: 02021.05.0510:22:50.663 Test (EURUSD,M1) После открытия. PositionsTotal: 0, OrdersTotal: 12021.05.0510:22:50.679 Test (EURUSD,M1) Перед открытием. PositionsTotal: 0, OrdersTotal: 02021.05.0510:22:50.757 Test (EURUSD,M1) После открытия. PositionsTotal: 2, OrdersTotal: 02021.05.0510:22:50.757 Test (EURUSD,M1) Выход. PostionsTotal: 2
#include <Trade\Trade.mqh>
CTrade Trade;
//+------------------------------------------------------------------+//| Script program start function |//+------------------------------------------------------------------+voidOnStart()
{
//---int total=PositionsTotal();
int Ordertotal=OrdersTotal();
while(!IsStopped() && (total <= 1)) // Закончим, когда появится более одной позиции.if(total == 1)
Trade.PositionClose(PositionGetTicket(0)); // Если есть позиция - закрываем.elseif(!Ordertotal)
Trade.Buy(0.01); // Если нет позиции и ордера - открываем позицию.
}
//+------------------------------------------------------------------+
是的,这也是我的观点。结果发现,脚本设法关闭了其中一个头寸,而事实上有两个,但PositionsTotal()返回1。然后,在关闭之后,循环结束条件得到满足,即PositionsTotal()返回2。
你可以插入打印件,以充分看到发生了什么事。
可以插入打印件,以充分看到正在发生的事情。
是的,以确认推理是否正确。
结果。
事实上,这个位置被单独悬空。
P.S.更正了帖子,因为复制粘贴,我在代码中放错了东西。事实上,这个位置被单独悬挂了起来。
在日志中,很可能是最后一笔交易 的记录时间紧随脚本关闭的记录时间。
打印OrdersTotal也很重要。在日志中,很可能最后一笔交易 记录的时间紧随脚本收盘记录的时间。
你指的是这两份记录吗?
我认为这里的排序都是正确的。事实上有两个职位,但PositionsTotal()还没有被更新。因此,它返回1,仓位被关闭。而在交易操作被执行后,它被更新到与交易操作被执行前的状态相对应的状态。因此,我们得到2。
这个问题已经讨论了很久了。几乎每个人都遇到过这种情况。这是第一次发现稳定的可重复的代码。
已经找到了一个解决方案。
那么解决方案是什么呢?
找到一个稳定的复制代码的困难是什么?一个动作是开仓或平仓,下一个动作是根据市场上或历史上的头寸数量 来决定。你指的是这两个条目吗?
不,交易活动的最后记录是在第二份日志中。
打印OrdersTotal也很重要。
我已经添加了印刷品。现在还剩下两个职位,正如预期的那样。
结果。
解决办法是什么?
头寸数量 来决定。
这没有什么困难,我是临时写的。
它像这样开仓,完全没有停顿
它是这样开仓的,完全没有停顿
那么,谁来更新总数呢?))