程序库: MT4Orders - 页 56

 
SysFX:

我有一个 MT4 EA,我正试图使用 MT4Orders 将其移植到 MT5,这样我就可以保持单一来源,但我遇到了一些问题......

1)当订单触及 SL 或 TP 时,如果 EA 在 OrderSend() 期间添加了注释,则通常的 [sl] 或 [tp] 文本不会附加到订单注释中。

这是 MT5 的正常行为吗?如果是,是否有可靠的方法来确定订单是否真的触及 SL/TP,还是被手动平仓?

(试图通过检查开盘价/收盘价/SL/TP 来决定是不可靠的,因为会出现滑点,尤其是当 SL 被移动到非常接近 TP 时)。

https://www.mql5.com/ru/forum/93352/page20#comment_7112531

https://www.mql5.com/ru/forum/93352/page18#comment_6246123

2) 当发生部分平仓时,开仓和平仓部分订单的注释不会显示 "to #xxxxxxxxx "和 "from #xxxxxxxxx "

,是否有可靠(希望简单)的方法来确定特定订单发生了什么?



3)未平仓交易的票据编号在平仓时会发生变化,因此我无法使用 OrderTicket() 跟踪订单,但 OrderTicketID() 似乎可以像 MT4 中的 OrderTicket() 一样工作,为平仓交易保留相同的 ID。

该值是恒定的,还是会在平台重启时发生变化?如果是恒定的,有什么好办法既能使用OrderTicketID(),又能保持与MT4的兼容性(因为OrderTicketID()不是MT4 函数)?

** OrderTicketID()似乎忽略了MT4_TICKET_TYPE指令,始终为 "长"。

SELECT_BY_TICKET能与OrderTicket/OrderTicketID/OrderTicketOpen正确配合使用。重新加载终端后,MT4Orders 的所有函数都不会更改其值。

在 MT5 中,同一个 OrderTicketID 可以有多个平仓头寸(在部分平仓的情况下)。出于同样的原因,未平仓头寸和已平仓头寸也可以拥有相同的订单票据 ID。由于这种模糊性,MT5 使用 OrderTicket - 为每个关闭/打开的仓位提供唯一的票据。


该库更新 用于跨平台(与 MT4 兼容)。


** OrderTicketID() 似乎忽略了 MT4_TICKET_TYPE 指令,始终为 "长"。
谢谢,已修复。
// 更改列表:
// 11.11.2020
// 修复:OrderTicketID() 和 OrderTicketOpen() 返回 TICKET_TYPE 中指定的值类型。
 
2) 当发生部分平仓时,开仓和平仓部分订单上的注释不会显示 "to #xxxxxxxxx "和 "from #xxxxxxxxx "

,是否有可靠(希望简单)的方法来确定特定订单发生了什么?

我的意思是这样的:

如果您在 MT4 中交易了 1.00 手,单子编号为 123456,您部分平仓了 0.40 手,那么单子编号 123456 在历史选项卡上显示为 0.40 手,其交易注释 显示为 "至 #NewTicket"。

在 "交易 "选项卡上,会出现新的 0.60 手交易,票据编号为 "NewTicket",其交易注释显示 "来自 #123456"

 
SysFX:

我的意思是

如果您在 MT4 中进行了 1.00 手的交易,交易单号为 123456,您部分平仓了 0.40 手,那么交易单号 123456 在历史选项卡上显示为 0.40 手,其交易注释显示为 "至 #NewTicket"。

在 "交易 "选项卡上,会出现新的 0.60 手交易,票据编号为 "NewTicket",其交易注释显示 "来自 #123456"

#include <MT4Orders.mqh> //https://www.mql5.com/zh/code/16006

#define  Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

void OnStart()
{
  const TICKET_TYPE Ticket = OrderSend(_Symbol, OP_BUY, 1, Ask, 0, 0, 0);
  
  if (OrderSelect(Ticket, SELECT_BY_TICKET))
    OrderClose(OrderTicket(), 0.4, OrderClosePrice(), 0);
}

该脚本会创建您的情况。写清楚在这种情况下你想获得什么?

 
fxsaber:

这个脚本创造了你的处境。写清楚在这种情况下你需要得到什么?

因此,在测试器中,下面一行将创建票据 #2(开仓存款为 #1)。

const TICKET_TYPE Ticket = OrderSend(_Symbol, OP_BUY, 1, Ask, 0, 0, 0);

然后,当下一行执行时,一个 0.6 手的新单子(#3)应该打开,而单子 #2 应该作为 0.4 手交易出现在订单历史中。

OrderClose(OrderTicket(), 0.4, OrderClosePrice(), 0);

在 MT4 中,#2 的订单注释为 "to #3",而 #3 的订单注释为 "from #2"。

在 MT5 中不会出现这种情况--交易/历史标签上不显示注释,OrdersToString() 只显示交易注释为 "0"。

测试程序和实际交易应具有相同的功能,我之所以提到测试程序,是因为票据编号是可以预料的。

 
SysFX:

在 MT4 中,#2 的订单注释为 "to #3",而#3 的订单注释为 "from #2"。

在 MT5 中不会出现这种情况--交易/历史选项卡上不显示注释,OrdersToString() 只显示交易注释为 "0"。

正如您已经注意到的,MT5 不会像 MT4 那样在部分执行时创建特定注释。


MT4Orders 绝不会模仿 MT4 的任何行为。 该库旨在利用 MT5 中 MT4 风格的交易 API。仅此而已。

这意味着如果您了解 MT4,就可以轻松编写 MT5 中的交易逻辑。


如果您需要考虑每个平台的一些细微差别,可以使用宏来实现。

#ifdef __MQL5__
  // MQL5 代码在此。
#else // #ifdef __MQL5__
  // MQL4 代码在此。
#endif // #ifdef __MQL5__ #else


如果您在 MT5 中遇到无法解决的问题,这里会有人提供帮助。很多事情都可以通过 MT4Orders 完成。

 
fxsaber:

正如您已经注意到的,MT5 不会像 MT4 那样在部分执行时创建某些注释。


MT4Orders 绝不会模仿 MT4 的任何行为。 该库旨在利用 MT5 中 MT4 风格的交易 API。仅此而已。

这意味着如果您了解 MT4,就可以轻松编写 MT5 中的交易逻辑。


如果您需要考虑每个平台的一些细微差别,可以使用宏来实现。


如果您在 MT5 中无法完成某些任务,这里会有人提供帮助。很多事情都可以通过 MT4Orders 完成。

是的 ...我意识到这是 MT5 行为造成的,并找到了解决该问题的方法。对我来说,更重要的 是解决 [sl] / [tp] 问题,现在这个问题解决得很好 - 谢谢您提供的信息 :)

 
我复制了它,却得到了一个空存档
 
grin4k:
我复制了它,得到的是一个空存档

是的,是空的。这是网站故障。

但如果代码已更新,就不要上传存档。压缩包没有更新。按文件下载。

 
fxsaber :

MT5 的案例很有意思。


交易被部分执行,之后又被删除。在这种情况下,DEAL_ORDER 的状态是 ORDER_STATE_CANCELED,而不是 FILLED/PARTIAL。

在这种情况下,DEAL_TIME_MSC 不等于 ORDER_TIME_DONE_MSC。

在这种情况下,ORDER_TYPE_FILLING 是什么?

我通过 url 代理审查器进行交易。设置止盈时,默认值是ORDER_TYPE_FILLING== ORDER_FILLING_IOC。您的情况不应该发生在 IOC 上,对吗?

 
如何处理错误 -GetLastError,以及 ERR_INVALID_PRICE、ERR_PRICE_CHANGED、ERR_REQUOTE、ERR_OFF_QUOTES、ERR_TRADE_CONTEXT_BUSY - 常量未定义。