// Пример неправильного считывания торгового окружения на каждом тике// Скрипт эмулирует два тика ТС, которая должна открыть одну позицию, если ее нет.#include <Trade/Trade.mqh>
// Возвращает количество позиций по символуint GetAmountPositions( conststring Symb )
{
int Res = 0;
// Этот MQL5-код с ошибкойfor (int i = PositionsTotal() - 1; i >= 0; i--)
if (PositionGetSymbol(i) == Symb)
Res++;
/*
// В MT4 такой код выполняется без ошибки
for (int i = OrdersTotal() - 1; i >= 0; i--)
if (OrderSelect(i, SELECT_BY_POS) && (OrderType() <= OP_SELL) && (OrderSymbol() == Symb))
Res++;
*/return(Res);
}
// Пример OnTickvoid ExampleOnTick()
{
static CTrade Trade;
// Если нет позиции, открываемif (!GetAmountPositions(_Symbol))
Trade.Buy(1);
}
// Эмуляция прихода двух Tick-событийvoidOnStart()
{
ExampleOnTick();
Sleep(10); // Между двумя тиками ~10 мс.
ExampleOnTick();
}
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+voidOnTick()
{
//....int total=0; // для расчета количества открытых советником позиций//....//--- main cyclefor(int i=PositionsTotal()-1;i>=0;i--)
if(m_position.SelectByIndex(i)) // selects the position by index for further access to its propertiesif(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==m_magic)
{
total++; // расчет количества открытых позиций//....if(total==0) // Если нет открытых советником позиций
{
if(!RefreshRates())
{
PrevBars=iTime(1);
return;
}
//--- open BUY if(MACD_MAIN_2>MACD_SIGNAL_2 && MACD_MAIN_4<MACD_SIGNAL_4) // Сигнал на покупку
{
double sl=(InpStopLoss!=0)?m_symbol.Ask()-ExtStopLoss:0.0;
double tp=(InpTakeProfit!=0)?m_symbol.Ask()+ExtTakeProfit:0.0;
OpenBuy(sl,tp); // Отправка маркет-ордера на покупкуreturn;
}
//--- open SELLif(MACD_MAIN_2<MACD_SIGNAL_2 && MACD_MAIN_4>MACD_SIGNAL_4) // Сигнал на продажу
{
double sl=(InpStopLoss!=0)?m_symbol.Bid()+ExtStopLoss:0.0;
double tp=(InpTakeProfit!=0)?m_symbol.Bid()-ExtTakeProfit:0.0;
OpenSell(sl,tp); // Отправка маркет-ордера на продажу
}
}
return;
}
При поступлении сигнала противоположная позиция закрывается. Также советник может закрывать половину позиции (параметр Profit for closing half of the position), может переводить позицию в безубыток (параметр Breakeven). Размер открываемой позиции может задавать вручную (параметр Lots) или в процентах риска от свободной маржи (параметр Risk in...
トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム
チャート交換の見分け方は?
fxsaber さん 2018.02.08 12:39
一部の関数で、ChartID入力パラメータがゼロの場合、値の再計算が行われない。現在のチャートの実データが必要な場合は、フルIDを使用する必要があります。
トレーディング、自動売買システム、ストラテジーテストに関するフォーラム
position_ticket != position_identifier
fxsaber さん 2018.02.12 20:14
結論
これがブローカーのハックの特殊性ではなく、通常のMT5の動作であると仮定すると
弱点
ZZY 完全に確定した仮説です。
トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム
position_ticket != position_identifier
パベル・コルチン さん 2018.02.12 13:31
(よくわからない、確認しにくい、部分的な位置の閉鎖に似ている)
仕組みはこうだ。
1) 保留注文が部分的に発生 - Position_ID = Order_Ticket1 のポジションが開設された。
2)残った注文は新しい注文Order_Ticket2に変換さ れ、実行を待ちます。新しいOrder_Ticket2 != Order_Ticket1 なぜなら同じOrder_Ticketの注文は履歴に2つ存在できないからです。
3) 残りの注文が執行された - Position_ID = Order_Ticket2 のポジションが開かれる
履歴には2つのオーダーがあり、端末には2つのポジションがあり、すべてが対応しています。
トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム
"トレーダー向けLifeHack: 定義にForEachを混ぜる(#define)" に関するディスカッション
fxsaber さん 2018.02.14 10:54
パフォーマンス測定
結果
完全に勘違いしてました!SymbolInfoDouble は SymbolInfoTick の 2 倍の速度になります。
トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム
"トレーダー向けLifeHack: 定義にForEachを混ぜる(#define)" に関するディスカッション
fxsaber さん 2018.02.14 11:58
無能。テスターでの結果
パフォーマンスが必要な場合(Optimizer)には、SymbolInfoDoubleを使用 するのがよいでしょう。現実世界では、何の違いもないのです。
ZZY機能速度測定は、性能が重要視される環境で測定すべき - テスター。
トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム
バグ、バグ、質問
fxsaber さん 2018.02.12 23:10
2台の取引用デモサーバーでBUYポジションを手動で開設する。
ロボフォレックス-メタトレーダー5
FXOpen-MT5
同じ色の線は、同じものを示しています。しかし、明らかに順番が違うことがわかる。Roboでは、注文実行のメッセージは取引が実行された後に出てきます。オープンではBEFORE!このため、OrderSend は運を返しますが、トランザクションはまだありません。つまり、履歴のある非同期OrderSendを取得する。
FXOpen-MT5用コード
結果
この状況には、次のような説明があります。
トレーディング、自動売買システム、ストラテジーテストに関するフォーラム
バグ、バグ、質問
ラシード・ウマロフ さん 2018.02.15 06:25
外部の取引システムに注文を送信した場合、MetaTrader 5取引サーバーはその応答を待たず、直ちに「注文が発注されました」としてリクエストの結果を返します。このため、OrderSend は、約定した取引に関する情報がまだないため、常に deal=0 を返します。OnTradeまたはOnTradeTransactionでキャッチする。
取引イベントリスナーの例は、 MOEX用取引ロボットを作成する際に開始する場所- TradeTransactionListener.mq5 の記事で紹介されています。
OrderSend - 成行注文を送信 します。注文が発注 されました- Result.orderを読み取る必要があります。しかし、誰も取引(複数可)を待ってはいない。取引はたくさんあるかもしれないし、その実行時間の合計も定義されてはいない。
ブローカー側の出力の具体的な実装に依存します。一般的な場合、定義されていません。
ですから、FXOpen-MT5のデモ口座は他のデモとは一線を画しており、コードのテストとして使用することを強くお勧めします。
例えば、MQL5でこのような取引ロジックでスクリプトを書いてみることを提案します(MQL4スタイルはクイックセンス表示のためだけです)。
全然、簡単じゃないんです。また、部分実行に取り組むには、前述のデモサーバーをお勧めします。
MT5でよくある間違いの一つを解説した投稿を削除しました。
ポストが大きかった。まさか削除されるとは思わなかった。削除の理由を教えてほしい。また削除されるのはマゾいから。
トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム
オーダーループの整理
fxsaber さん 2018.02.16 09:40
MT5では全くうまくいっていない。問題を示す例
このスクリプトをポジションのないシンボルで実行した場合、最終的に何が起こると思いますか?
正解は、1つまたは2つのポジション が空くということです。
その理由は、こうです。最初のOrderSendの後、成行注文が現れ、その実行の瞬間に新しいティックが来れば、まだポジションはなく、2回目のOrderSendが行われる。
このため、一見正常に見えるMT5のパターンも正常に 動作せず、結果としてcodobaseにあるMT5 Expert Advisorのほとんどが 動作しなくなります。同時に、ほぼ同じMT4テンプレートも 問題なく動作し続けます。
PositionTotalの一見良いアイデアは、MT5では成行注文のOrdersTotalも分析する必要があるため、やや影が薄くなっています。
気をつけよう!
このため、一見正常に見えるMT5のパターンも正常に動作 せず、結果として、コドベースのほとんどのMT5 EAが 動作しなくなります。
その証拠に、MT5のコドベースのExpert Advisorのほとんどを取り上げることができます。何かを選ぶのではなく、現時点での最新のExpert Advisorを 取り上げましょう。QBでMT5-publishingの経験が豊富な作者が書いているのが良い。
ソースコードには以下のような文字列があります(私のコメントはハイライトされています)。
前述と同じ状況です。
トレーディング、自動売買システム、ストラテジーテストに関するフォーラム
mql5言語の特殊性、ヒントとコツ
fxsaber さん 2018.02.16 19:52
最初のOrderSendの後、成行注文が表示され、その実行前に新しいティックが来たら、まだポジションはなく、2回目のOrderSendが行われます。
PositionTotalの一見良いアイデアは、MT5では成行注文のOrdersTotalも分析する必要があるため、やや影が薄くなっています。
つまり、一般的なケースでは、Expert Advisorは1つのポジションではなく、2つ、3つなどのポジションを開くことになります。ティックの受信頻度や成行注文の約定時間によって異なります。
コドベースのほぼ全てのMT5用EAは、MT5用テンプレートと 同じロジックで書かれているため、含まれているバグも同じです。これは、残念ながらKBのほぼすべてのMT5 EAに当てはまります。
ネッティングでは、同じシンボルに対して、同時にオープンポジションと、どちらかの方向の複数の成行注文が存在することがあります。例えば、買いのポジションと買いの注文。確かに、非同期のルールがあちこちにあったので、そういうデモ口座は見つけられませんでした。
トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム
バグ、バグ、質問
fxsaber さん 2018.02.14 08:58
OnTradeTransaction イベント全体のシーケンスは、OrderSend が完了した後に発生します。
電子ブック
取引注文を手動で送信する。
ログ
2018.02.14 09:41:46.671 '8854170': instant sell 1.00 EURUSD at 1.23673 2018.02.14 09:41:46.853 '8854170': accepted instant sell 1.00 EURUSD at 1.23673 2018.02.14 09:41:46.853 '8854170': deal #192088422 sell 1.00 EURUSD at 1.23673 done (based on order #208541700) 2018.02.14 09:41:46.853 '8854170': order #208541700 sell 1.00 / 1.00 EURUSD at 1.23673 done in 190.608 ms
Expert Advisorの結果
時間列とEAの数値データから、取引注文の実行時間がOnTradeTransactionイベントのシーケンスに影響を与えない ことが完全にわかります。非同期は地獄に落ちる!ここまでひどいことをやってのけたんだ。1755年製造。
例えば、OrderSendAsyncの成行注文をTerminalで行った場合、成行注文は一瞬たりとも表示されない。おそらく開発者は、少しでもスピードアップを図るために、このような方法をとったのでしょう。
トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム
記事「MetaTrader 5におけるトレード戦略の最適化の可視化」についての考察"
fxsaber さん 2018.02.22 08:39
フレームモードでは、OnInit、OnDeinit、OnTick、OnTrade、OnTradeTransaction、OnTimerは無視されます。OnChartEventのみ動作します。
もちろん、OnChartEvent例外のため、frame-modeフラグのチェックは必須です。