mql5言語の特徴、微妙なニュアンスとテクニック

 
このトピックでは、mql5言語での 文書化されていない作業方法、特定の問題を解決する例について説明します。このブランチの内容は、議論というよりFAQに近いものにしてほしい。経験豊富なプログラマーの皆さんには、ぜひ解決策やプログラミングのテクニックを教えていただきたいと思います。特にヘルプに記載されていない機能を網羅していることは歓迎すべきことです。
 
fxsaber:

成行注文でポジションが 正常にオープンさ れた場合、毎回ゼロのResult.dealが取得されるのですか?

BODより
Result dealのチケットが埋まることを保証するものではありません。満たされるかどうかは、商品の実行モードと特定のサーバーの設定に依存します。
ゼロでないResult.dealを予約した人 - 行動を起こす。
 
OrderSend が 実行されると、関連する注文、ポジション、または取引への対処が常に成功するわけではあり ません。過去や現在の取引情報が正しくなるまでに数十ミリ秒待つ必要がある場合がある。
 
fxsaber
OrderSend が実行されると、関連する注文、ポジション、または取引への対処が常に成功するわけではあり ません。過去や現在の取引情報が正しくなるのを数十ミリ秒待つ必要がある場面があります。
MT4でも同じで、特定のサーバーに依存します。
 
取引を発生させた注文の価格を常に知ることができるわけではありません
 
クローズドポジション のSL/TPレベルを調べることができないことがあります。

トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム

クローズドポジションのTakeProfit(およびStopLoss)

fxsaber さん 2016.07.17 20:19

ヘッジTakeProfitの導入前は、オープンポジションは指値注文の形で取引所に保存されず、MT5の取引サーバーに保存されていました。その時点では、指値注文ではなく、指値の成行注文として取引所に送信されました。

この機能は、TPがトリガーされたときにテスターで非常によく見えます:適切な成行注文(指値ではなく)が表示されます。Takeprofitは存在しない取引所型の注文なので(成行注文と指値注文しかない)、この状態は十分に「市場性」の範囲内だった。

ヘッジファンドが登場しても状況は変わらず、テイクプロフィットは仮想のままでした。MT4では状況が異なります。MT4ブリッジの長年の経験から、MT4のテイクプロフィット注文は指値注文であることが標準となっています。

この仮想だからこそ、MT5の一部の機能が跡形もなく引きずられているのです。MT5ではtakeprofitは置かない方が良いだけでなく、指値の場合は、 ポジションをクローズ した後に、MQL5でそのtakeprofitとstoplossの値を知る方法が ないのだそうです。

これは無差別に非難しているのではなく、何時間もかけて、すべてがどのように動くのか(HistorySelectByPositionやその他のものは役に立ちません)を見つけようとした結果なのです。そして、もし間違っていたら、喜んで謝ります。杞憂ではなく、RoboForexEU-MetaTrader5サーバーでテスター用のExpert Advisor(その方がわかりやすい)を表示しており、ポジションを開いてからSLとTPレベルをつけています。

void OnTick()
{
  static bool Flag = true;

  if (Flag)
  {
    // Открываем SELL-позицию
    MqlTradeRequest Request = {0};

    Request.action = TRADE_ACTION_DEAL;

    Request.symbol = Symbol();
    Request.volume = 1;
    Request.price = SymbolInfoDouble(Symbol(), SYMBOL_BID);

    Request.type = ORDER_TYPE_SELL;

    MqlTradeResult Result;

    if (OrderSend(Request, Result))
    {
      // Устанавливаем SL и TP
      Request.position = Result.deal;

      Request.action = TRADE_ACTION_SLTP;

      Request.tp = Result.ask - 10 * _Point;
      Request.sl = Result.ask + 10 * _Point;

      if (OrderSend(Request, Result))
        Print("Сделка в тестере закроется либо по SL, TP, либо по окончании бэктеста")    ;

      Flag = false;
    }
  }
}

このEAでは、(OnDeinitで)1つのクローズポジションのSLとTPを定義することはできません。そういうものなのでしょうか?


引用から、MT5でのポジションのTPは常に成行注文であることもわかります。リミットの相手をブックマークしてはいけない - 上記参照。
 

トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム

バグ、バグ、質問

スラワ さん 2017.02.14 13:46

なぜ?ワンアクションで十分です。

マーケットレビューでシンボルが選択され、そのシンボルの履歴がExpert Advisorに保持されている限り、同期が保たれるのです。Expert Advisorによる保持は、1本のバーをコピーするなどして、少なくとも2分に1回この履歴にアクセスすることを意味します。履歴が同期していれば、1本のバーをコピーするのにかかる時間はなく、わずか数プロセッササイクルで済みます。あるいは、今ここで言われたように、バーの 数を求め、また数クロックサイクル

トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム

バグ、バグ、質問

アレクセイ・コジツィン さん 2017.02.14 13:47

インジケーターには2分間隔が含まれていますか?

はい、また、同期の事実を確認することで、同期も保持されるのでしょうか?

トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム

バグ、バグ、質問

スラワ さん 2017.02.14 13:50

これは、指標にも当てはまります。1分タイマーを作成し、対象となるすべてのタイムスケールのバーの本数を 問い合わせる。

タイミングファクトを確認しても、タイミングは保持されない。

 
fxsaber
OrderSend が実行された後、適切な注文、ポジション、または取引を参照することは、必ずしも成功しません。過去や現在の取引情報が正しくなるのを数十ミリ秒待つ必要がある場面もある。

数ミリ秒を待つ必要はないのです。

メッセージはOnTradeTransactionで 表示されます。

コードを見る

ファイル:
 
プロストトレーダー

数ミリ秒を待つ必要はないのです。

メッセージはOnTradeTransactionで 表示されます。

は、コードを参照してください。

スクリプトにはない。スクリプトではなく、EA+ExpertRemoveを使うのは馬鹿らしい。

さらに、OrderSendは180秒間サーバーからの応答がない場合、タイムアウトでクラッシュします。これは、OnTradeTransactionがチケット待ちで永遠に蓄積される可能性があることを示唆している。そして、あなたのスクリプトのようにOnTradeTransactionに1つのorder_ticketだけという選択肢はまずいです。非同期送信の後、注文のリストを使った作業がある。だから非同期なんです。バッチを扱うために。また、バッチを使った作業がないのであれば、非同期は決して必要ありません。

 
MT4-OrderClosePriceのトリックは MT5でも有効です -PositionGetDouble(POSITION_PRICE_CURRENT).
理由: