晚上好。
伙计们,请帮助我。这个问题可能并不新鲜,但我没有找到一个解决方案(无论是在实践中还是在论坛上)。
我在终端中对2个不同的仪器运行2个不同的机器人。各地的魔法是不同的。机器人放置待定限额,程序OnTradeTransaction 允许我检测一个交易,并使用该交易放置待定止损单。
以下是贸易交易的代码
这是检查该交易是否属于机器人的函数的代码
这是待定止损单的程序代码
这是搜索历史中的订单和历史外的订单的函数代码
我将按照终端收到的顺序在日志中输出关于传入交易的信息。现在我有一个问题,我在用模拟账户交易时遇到过。
有时交易的顺序如下 TRADE_TRANSACTION_ORDER_DELETE, then TRADE_TRANSACTION_DEAL_AD, then TRADE_TRANSACTION_HISTORY_AD。在这种情况下,止损单往往不会在交易执行后下达。我想这是因为该订单已经被删除,但还没有被添加到历史中。这意味着我们无法在历史或终端中找到该交易的订单。虽然这很值得怀疑,但事实是没有下止损单,因为机器人在所有维度搜索订单后没有找到它(isFindOrder=false)。交易顺序可能是正确的,但顺序仍然无处可寻。
尝试了不同的方法,没有任何帮助。我现在想在一个程序的开始加入1秒的睡眠,以放置待定的订单,也许时间还不够。我甚至不知道还能在哪里挖掘。
请分享你的经验和想法。
我还没有开始翻阅所有的代码。我认为这种做法一点也不正确。
在交易类型TRADE_TRANSACTION_DEAL_ADD的时刻,我们必须选择trans.position并检查其魔力。
if(PositionSelectByTicket(trans.position) && PositionGetInteger(POSITION_MAGIC) == mag)
你也可以检查trans.symbol == _Symbol,并根据这些检查的结果做出决定。
我没有研究过所有的代码。在我看来,这种做法一点也不正确。
在TRADE_TRANSACTION_DEAL_ADD交易类型的时刻,应该选择trans.position并检查它的magik。
你也可以检查trans.symbol == _Symbol,并根据这些检查的结果做出决定。
我忘了补充,模式是网状的。这个位置对所有机器人来说都是一样的。也就是说,一个机器人买了一个头寸,第二个机器人也买了,TRADE_TRANSACTION_DEAL_AD事件以相反的顺序出现,第一个机器人没有看到这个结果。
而且从逻辑上讲,我需要从交易中获得订单注释,位置在这里没有什么帮助。请分享你的经验和想法。
一种情况
fxsaber, 2018.06.20 23:18
决定检查一下,当一个订单在系统中但不在终端中时,这些幻象订单的情况会持续多久。
// Советник отслеживает длительность ситуаций, когда ордер отсутствует среди текущих и исторических #define TOSTRING(A) #A + " = " + (string)(A) + "\n" #define TOSTRING2(A) #A + " = " + EnumToString(A) + " (" + (string)(A) + ")\n" bool OrderIsExist( const ulong &OrderTicket ) { return(OrderTicket ? OrderSelect(OrderTicket) || HistoryOrderSelect(OrderTicket) : true); } void OnTradeTransaction ( const MqlTradeTransaction &Trans, const MqlTradeRequest&, const MqlTradeResult& ) { static bool PrevIsExist = true; static ulong StartTime = 0; static ulong MaxInterval = 0; const ulong NowTime = GetMicrosecondCount(); const bool IsExist = OrderIsExist(Trans.order); if (!IsExist) { Print(TOSTRING2(Trans.type) + TOSTRING(Trans.order) + TOSTRING(OrderSelect(Trans.order)) + TOSTRING(HistoryOrderSelect(Trans.order))); if (PrevIsExist) StartTime = NowTime; } else if (!PrevIsExist) { const ulong Interval = NowTime - StartTime; Print(TOSTRING(Interval) + TOSTRING2(Trans.type) + TOSTRING(Trans.order) + TOSTRING(OrderSelect(Trans.order)) + TOSTRING(HistoryOrderSelect(Trans.order))); if (Interval > MaxInterval) { MaxInterval = Interval; Comment(TOSTRING(MaxInterval) + TOSTRING(Trans.order)); // mcs. } } PrevIsExist = IsExist; }
结果
2018.06.21 00:10:31.047 Trans.type = TRADE_TRANSACTION_ORDER_DELETE (2) 2018.06.21 00:10:31.047 Trans.order = 2210967406 2018.06.21 00:10:31.047 OrderSelect(Trans.order) = false 2018.06.21 00:10:31.047 HistoryOrderSelect(Trans.order) = false 2018.06.21 00:10:31.047 2018.06.21 00:10:31.080 Interval = 32643 2018.06.21 00:10:31.080 Trans.type = TRADE_TRANSACTION_HISTORY_ADD (3) 2018.06.21 00:10:31.080 Trans.order = 2210967406 2018.06.21 00:10:31.080 OrderSelect(Trans.order) = false 2018.06.21 00:10:31.080 HistoryOrderSelect(Trans.order) = true
32毫秒,一个订单在那里,但不在终端中!试想一下,如果交易逻辑在这个区间内执行,后果会怎样......。
有趣的是,幽灵订单最常出现在TRADE_TRANSACTION_ORDER_DELETE 和TRADE_TRANSACTION_DEAL_ADD(更罕见)交易类型。
非常糟糕的平台细微差别。
ZZY在5日的贸易交易速度有问题,很遗憾。
第二次
一个位置 上,订单总数增加了一个。
例如,没有头寸或订单 - 头寸总数=0,订单总数=0。
你设置了一个市场订单。职位总数=0,订单总数=1。
市场订单被执行 - OrdersTotal = 0。但职位总数=0!
尝试了不同的方法,没有任何效果。
写一个需要执行的简单行动。
他们做到了,但那不是很久以前。
我不太明白关于写一个简单的动作)请解释一下。
贸易目标是什么?
你的交易目标是什么?
我们下限价单,当它们触发时,我们下止损单 和获利单。当止损单触发时,我们就删除获利,反之亦然。最初的限价票,我们在此基础上设置止损单和止盈,写在止损单和止盈的注释中。这就是为什么获得订单注释很重要,这样当止损订单触发时,你可以找到具有相同注释的止盈,并删除它。
由于我们的机器人允许我们补仓,所以我们也应该下一个止损单和一个止盈单,并在买入更多仓位时对补仓单留下评论。
1秒钟的睡眠可以是一个好主意吗?要为所有交易TRADE_TRANSACTION_ORDER_DELETE和TRADE_TRANSACTION_HISTORY_ADD 提供时间。
- www.metatrader5.com
Илья Ребенок:
该机器人允许扩大规模,所以当我们买入更多的时候,我们也会下一个止损单和一个止盈单,并在票据中记录扩大规模。
我们可以同时有>=2个接受和停止指令吗?
晚上好。
伙计们,请帮助我。这个问题可能并不新鲜,但我没有找到一个解决方案(无论是在实践中还是在论坛上)。
我在终端中对2个不同的仪器运行2个不同的机器人。各地的魔法是不同的。机器人放置待定限额,程序OnTradeTransaction 允许我检测一个交易,并使用该交易放置待定止损单。
以下是贸易交易的代码
这是检查该交易是否属于机器人的函数的代码
这是待定止损单的程序代码
这是搜索历史中的订单和历史外的订单的函数代码
我将按照终端接收的顺序在日志文件中输出关于传入交易的信息。现在我有一个问题,我在用模拟账户交易时遇到过。
有时交易的顺序如下 TRADE_TRANSACTION_ORDER_DELETE, then TRADE_TRANSACTION_DEAL_AD, then TRADE_TRANSACTION_HISTORY_AD。在这种情况下,止损单往往不会在交易执行后下达。我想这是因为该订单已经被删除,但还没有被添加到历史中。这意味着我们无法在历史或终端中找到该交易的订单。虽然这很值得怀疑,但事实是没有下止损单,因为机器人在所有维度搜索订单后没有找到它(isFindOrder=false)。交易的顺序可能是正确的,但订单仍然无处可寻。 在所有情况下,机器人都能正确检测到交易,但没有进入下单阶段。然而,它也偶尔会正确工作,下单。
我已经尝试了不同的方法,没有任何效果。我现在考虑在待定下单程序开始时增加一个1秒钟的间隔。我不知道还有什么地方可以挖掘。
请分享你的经验和想法。