// 触发 SL/TP/SOvoidOnTradeTransaction ( constMqlTradeTransaction &Trans, constMqlTradeRequest &Request, constMqlTradeResult &Result )
{
if ((Trans.type == TRADE_TRANSACTION_ORDER_ADD) && OrderSelect(Trans.order))
{
constENUM_ORDER_REASON Reason = (ENUM_ORDER_REASON)OrderGetInteger(ORDER_REASON);
if (Reason == ORDER_REASON_TP)
Print("Position #" + (string)Trans.position + " - triggered TP.");
elseif (Reason == ORDER_REASON_SL)
Print("Position #" + (string)Trans.position + " - triggered SL.");
elseif (Reason == ORDER_REASON_SO)
Print("Position #" + (string)Trans.position + " - triggered StopOut.");
}
}
#include <MT4Orders.mqh>
#define BidSymbolInfoDouble(_Symbol, SYMBOL_BID)
#define AskSymbolInfoDouble(_Symbol, SYMBOL_ASK)
voidOnInit()
{
EventSetMillisecondTimer(1);
OrderSend(_Symbol, OP_BUY, 1, Ask, 100, Bid - _Point, Ask + _Point);
}
// 显示当前 MT5 未结订单表中存在 SL/TP/SO 订单voidOnTimer()
{
for (int i = OrdersTotal() - 1; i >= 0; i--)
if (OrderSelect(i, SELECT_BY_POS) &&
(OrderCloseReason() >= (int)ORDER_REASON_SL)) // 如果触发此条件,则无法修改/删除订单!
{
OrderPrint();
constlong Position = OrderGetInteger(ORDER_POSITION_ID); // 有可能,因为 MT4Orders 已配置为与 MQL5 交易应用程序接口并行工作constENUM_ORDER_REASON Reason = (ENUM_ORDER_REASON)OrderCloseReason();
if (Reason == ORDER_REASON_TP)
Print("Position #" + (string)Position + " - in the process of execution TP.");
elseif (Reason == ORDER_REASON_SL)
Print("Position #" + (string)Position + " - in the process of execution SL.");
elseif (Reason == ORDER_REASON_SO)
Print("Position #" + (string)Position + " - in the process of execution StopOut.");
}
}
结果
2017.09.1409:35:11.565 Position #1060283- triggered TP.
2017.09.1409:35:11.575#10602842017.09.1409:36:14 sell 1.00 EURUSD 1.188380.000000.000001.188380.000.000.00 [tp 1.18838] 02017.09.1409:35:11.575 Position #1060283- in the process of execution TP.
2017.09.1409:35:11.595#10602842017.09.1409:36:14 sell 1.00 EURUSD 1.188380.000000.000001.188380.000.000.00 [tp 1.18838] 02017.09.1409:35:11.595 Position #1060283- in the process of execution TP.
2017.09.1409:35:11.607#10602842017.09.1409:36:14 sell 1.00 EURUSD 1.188380.000000.000001.188380.000.000.00 [tp 1.18838] 02017.09.1409:35:11.607 Position #1060283- in the process of execution TP.
2017.09.1409:35:11.617#10602842017.09.1409:36:14 sell 1.00 EURUSD 1.188380.000000.000001.188380.000.000.00 [tp 1.18838] 02017.09.1409:35:11.617 Position #1060283- in the process of execution TP.
2017.09.1409:35:11.637#10602842017.09.1409:36:14 sell 1.00 EURUSD 1.188380.000000.000001.188380.000.000.00 [tp 1.18838] 02017.09.1409:35:11.637 Position #1060283- in the process of execution TP.
2017.09.1409:35:11.657#10602842017.09.1409:36:14 sell 1.00 EURUSD 1.188380.000000.000001.188380.000.000.00 [tp 1.18838] 02017.09.1409:35:11.657 Position #1060283- in the process of execution TP.
2017.09.1409:35:11.667#10602842017.09.1409:36:14 sell 1.00 EURUSD 1.188380.000000.000001.188380.000.000.00 [tp 1.18838] 02017.09.1409:35:11.667 Position #1060283- in the process of execution TP.
2017.09.1409:35:11.680#10602842017.09.1409:36:14 sell 1.00 EURUSD 1.188380.000000.000001.188380.000.000.00 [tp 1.18838] 02017.09.1409:35:11.680 Position #1060283- in the process of execution TP.
2017.09.1409:35:11.700#10602842017.09.1409:36:14 sell 1.00 EURUSD 1.188380.000000.000001.188380.000.000.00 [tp 1.18838] 02017.09.1409:35:11.700 Position #1060283- in the process of execution TP.
2017.09.1409:35:11.710#10602842017.09.1409:36:14 sell 1.00 EURUSD 1.188380.000000.000001.188380.000.000.00 [tp 1.18838] 02017.09.1409:35:11.710 Position #1060283- in the process of execution TP.
2017.09.1409:35:11.730#10602842017.09.1409:36:14 sell 1.00 EURUSD 1.188380.000000.000001.188380.000.000.00 [tp 1.18838] 02017.09.1409:35:11.730 Position #1060283- in the process of execution TP.
2017.09.1409:35:11.757#10602842017.09.1409:36:14 sell 1.00 EURUSD 1.188380.000000.000001.188380.000.000.00 [tp 1.18838] 02017.09.1409:35:11.757 Position #1060283- in the process of execution TP.
2017.09.1409:35:11.760#10602842017.09.1409:36:14 sell 1.00 EURUSD 1.188380.000000.000001.188380.000.000.00 [tp 1.18838] 02017.09.1409:35:11.760 Position #1060283- in the process of execution TP.
2017.09.1409:35:11.780#10602842017.09.1409:36:14 sell 1.00 EURUSD 1.188380.000000.000001.188380.000.000.00 [tp 1.18838] 02017.09.1409:35:11.780 Position #1060283- in the process of execution TP.
2017.09.1409:35:11.790#10602842017.09.1409:36:14 sell 1.00 EURUSD 1.188380.000000.000001.188380.000.000.00 [tp 1.18838] 02017.09.1409:35:11.790 Position #1060283- in the process of execution TP.
2017.09.1409:35:11.810#10602842017.09.1409:36:14 sell 1.00 EURUSD 1.188380.000000.000001.188380.000.000.00 [tp 1.18838] 02017.09.1409:35:11.810 Position #1060283- in the process of execution TP.
2017.09.1409:35:11.820#10602842017.09.1409:36:14 sell 1.00 EURUSD 1.188380.000000.000001.188380.000.000.00 [tp 1.18838] 02017.09.1409:35:11.820 Position #1060283- in the process of execution TP.
交易、自动交易系统和交易策略测试论坛
mql4语言的特点、精妙之处和工作技巧
fxsaber, 2017.09.11 20:29
下面将触及的主题,不仅涉及 MT4,还涉及 MT5 与其他平台。但为了便于理解,逻辑将在 MQL4 中编写,因此在本主题中。
与库直接相关的讨论。
在 MQL5 中出现 "原因 "标志之前,论坛上未结头寸的 SL/TP/SO 水平时,就会生成相应的市场订单,该订单在 MT5 的未结订单表中,直到执行为止。
因此,在 MT5 中,即使是纯 MQL5,也不可能修改/删除此类订单,MT5 交易逻辑要求检查未结订单是否实际冻结。
以下是在 MT4Orders 上编写交易逻辑时识别此类订单的条件及其触发示例
结果
您可以看到,TP 订单在未结订单中悬挂超过四分之一秒。任何修改/删除该订单的尝试都会导致错误。
请考虑 MT5 的这一功能(不仅在使用 MT4Orders 时)。
在 MQL5 中出现 "原因 "标志之前,论坛上未结头寸的 SL/TP/SO 水平时,就会生成相应的市场订单,该订单在 MT5 的未结订单表中,直到执行为止。
因此,在 MT5 中,即使是纯 MQL5,也不可能修改/删除此类订单,MT5 交易逻辑要求检查未结订单是否实际冻结。
以下是在 MT4Orders 上编写交易逻辑时识别此类订单的条件 及其触发示例
您可以看到 TP 订单在未结订单中悬挂了超过四分之一秒。任何修改/删除的尝试都会导致错误。
请将 MT5 的这一功能考虑在内(不仅是在使用 MT4Orders 时)。
现在库中已内置此条件检查功能,您可以像在 MT4 中一样工作
我从未在任何其他平台上见过这样的多样性)。
ORDER_STATE 参数的作用更大。对于 SL/TP 订单,它是ORDER_STATE_STARTED。但绝不能忽略所有 ORDER_STATE_STARTED(解释起来需要很长时间)。这就是为什么依赖 ORDER_STATE 是错误的,而需要 ORDER_REASON。
ORDER_STATE 是另一回事。假设一个仓位部分由挂单开立,而其余订单仍挂着。那么历史记录中就会出现一笔交易,但订单本身还没有出现。如果该订单随后完全成交,那么要了解它所产生的第一笔交易是部分开仓,就不能查看该订单的 ORDER_STATE。
总之,有很多情况下都会出现这种 STATE 实际上.....我们必须引入人性化的 OrderOpenState() 和 OrderCloseSate(),但这很头疼(而且只有少数人会用)。当然,这还是一个简单的谜题。它们有很多,有些甚至没有被怀疑过。总而言之,能够在几乎不降低工作效率的情况下,将部分谜题解出工作状态和人类形态,已经很不错了。我认为,图书馆满足了一半以上的需求。
ORDER_STATE 参数的作用更大。对于 SL/TP 订单,它是ORDER_STATE_STARTED。但绝不能忽略所有 ORDER_STATE_STARTED(解释起来需要很长时间)。这就是为什么依赖 ORDER_STATE 是错误的,而需要 ORDER_REASON。
ORDER_STATE 是另一回事。假设一个仓位部分由挂单开立,而其余订单仍挂着。那么历史记录中就会出现一笔交易,但订单本身还没有出现。如果该订单随后完全成交,那么要了解它所产生的第一笔交易是部分开仓,就不能查看该订单的 ORDER_STATE。
总之,有很多情况下都会出现这种 STATE 实际上.....。有必要引入人性化的 OrderOpenState() 和 OrderCloseSate(),但这是个麻烦事(只有少数人会用)。当然,这还是一个简单的谜题。谜题有很多,其中有些甚至没有被怀疑过。总而言之,能够在几乎不降低工作效率的情况下,将部分谜题解出工作状态和人类形态,这是件好事。我认为这个程序库满足了我一半以上的需求。
关于交易、自动交易系统和测试交易策略的论坛
智能交易系统:量子 103
fxsaber, 2017.09.26 09:55 pm.
智能交易系统的跨平台变体MT5 真实点差回溯测试结果
我附上了 MT4 风格的 MT5 回溯测试报告,因为标准报告难以阅读--请参见预告片中的两种报告。
您可以清楚地看到滑点和佣金对该 EA MT5 回溯测试结果的影响。
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Советники:量子 103
fxsaber, 2017.09.26 09:55
跨平台版智能交易系统MT5 真实点差回溯测试结果
附上 MT4 风格报告 MT5-backtest,因为标准报告读取困难 - 在附件中查看两者。
您可以清楚地看到滑点和佣金对 MT5 回溯测试结果的影响。
关于交易、自动交易系统和测试交易策略的论坛
专家顾问:显示订单
fxsaber, 2017.10.09 13:22
跨平台变体关于交易、自动交易系统和测试交易策略的论坛
专家顾问:Xarax
fxsaber, 2017.10.11 13:44
跨平台变体