// トリガー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);
}
// SL/TP/SO注文が現在のMT5オープン注文のテーブルに存在することを示す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取引APIと並行して動作するように設定されているため、可能性があります。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で書かれますので、このスレッドで。
ライブラリに直接関係する議論。
未決済ポジションの SL/TP/SOレベルがトレードサーバーによって受け入れられると、対応する成行注文が生成され、それが約定するまでMT5の未決済注文のテーブルにあることを明確に示していました。
したがって、MT5では、純粋なMQL5であっても、このような注文の変更/削除は不可能であり、MT5の取引ロジックでは、未決済注文が実際に凍結されているかどうかを確認する必要があります。
以下は、MT4Ordersで取引ロジックを記述する際に、そのような注文を識別するための条件と、そのトリガーの例を示しています。
結果
TP注文が未決済注文の中に4分の1秒以上ぶら下がっていることがわかります。この注文を変更/削除しようとすると、エラーが発生します。
MT5のこの機能を考慮してください(MT4Ordersで作業するときだけではありません)。
未決済ポジションの SL/TP/SOレベルがトレードサーバーによって受け入れられると、対応する成行注文が生成され、それが約定するまでMT5の未決済注文のテーブルにあることを明確に示していました。
したがって、MT5では、純粋なMQL5であっても、このような注文の変更/削除は不可能であり、MT5の取引ロジックでは、未決済注文が実際に凍結されているかどうかをチェックする必要があります。
以下に、MT4Ordersで取引ロジックを記述する際に、そのような注文を識別するための条件と、そのトリガーの例を示します。
TP注文が未決済注文の中に4分の1秒以上ぶら下がっていることがわかります。これを変更/削除しようとすると、エラーが発生します。
MT5 のこの機能を考慮してください (MT4Orders を使用しているときだけではありません)。
この条件のチェックは現在ライブラリに組み込まれており、MT4 と同様に作業できます。
他のプラットフォームでは、このような多様性は見たことがない)。
ORDER_STATEパラメータはさらに大きな役割を果たします。SL/TP注文ではORDER_STATE_STARTED です。しかし、すべてのORDER_STATE_STARTEDを無視してはいけません(説明するのに時間がかかります)。そのため、ORDER_STATEに依存するのは間違いであり、ORDER_REASONが必要である。
ORDER_STATEは別の話である。保留中の注文から部分的にポジションがオープンされ、残りの注文がまだぶら下がっているとする。その場合、ヒストリには取引があるが、注文自体はまだない。その注文が完全に成立した場合、その注文によって発生した最初の取引が部分的にオープンされたことを理解するためには、その注文の元となった注文のORDER_STATEを見ることはできない。
とにかく、この状態には非常に多くの状況があります。人間のOrderOpenState()とOrderCloseSate()を導入しなければならないが、頭の痛い問題だ(そして、それを使う人は限られている)。もちろん、単純なパズルであることに変わりはない。たくさんあるし、中には疑われることすらないものもある。全体として、生産性をほとんど落とすことなく、部分的に作業状態と人間の形に解けるのはいいことだ。ニーズの半分以上は、ライブラリーが満たしていると思う。
ORDER_STATEパラメータはさらに大きな役割を果たします。SL/TP注文ではORDER_STATE_STARTED です。しかし、すべてのORDER_STATE_STARTEDを無視してはいけません(説明するのに時間がかかります)。そのため、ORDER_STATEに依存するのは間違いであり、ORDER_REASONが必要である。
ORDER_STATEは別の話である。保留中の注文から部分的にポジションがオープンされ、残りの注文がまだぶら下がっているとする。その場合、ヒストリには取引があるが、注文自体はまだない。その注文が完全に成立した場合、その注文によって発生した最初の取引が部分的にオープンされたことを理解するためには、その注文の元となった注文のORDER_STATEを見ることはできない。
いずれにせよ、このような状態は、実際には非常に多く存在する。人間のOrderOpenState()とOrderCloseSate()を導入する必要があるが、頭が痛くなる(一部の人しか使わない)。もちろん、単純なパズルであることに変わりはない。たくさんあるし、中には疑われることすらないものもある。全体として、ほとんど生産性を落とすことなく、部分的に作業状態や人間の形に解けるのはいいことだ。このライブラリーは私のニーズの半分以上を満たしていると思う。
取引、自動取引システム、取引戦略のテストに関するフォーラム
エキスパートアドバイザー: Quantum 103
fxsaber, 2017.09.26 09:55.
エキスパートアドバイザーのクロスプラットフォーム版MT5のリアルティックでのバックテスト結果
標準レポートが見づらいので、MT4スタイルのMT5バックテストレポートを添付しました - 予告編で両方ご覧ください。
このEAのMT5バックテスト結果にスリッページと手数料が影響していることがよくわかります。
(この場合、"ヴォルフガング "は "ヴォルフガング "を意味します)
Советники:量子103
fxsaber, 2017.09.26 09:55
エキスパートアドバイザーのクロスプラットフォーム版MT5でのリアルティックでのバックテスト結果
標準レポートでは読みにくいため、MT4スタイルのレポートMT5-backtestを添付しました。
このアドバイザーのスリッページと手数料がMT5-backtestの結果に与える影響がよくわかります。
取引、自動取引システム、取引戦略のテストに関するフォーラム
エキスパート・アドバイザー:注文の表示
fxsaber, 2017.10.09 13:22
クロスプラットフォームのバリエーション取引、自動取引システム、取引戦略のテストに関するフォーラム
エキスパートアドバイザー:Xarax
fxsaber, 2017.10.11 13:44
クロスプラットフォームのバリアント