English Русский 中文 Español Deutsch Português
テスターにおける再クオートのモデル化と Expert Advisor 安定性解析

テスターにおける再クオートのモデル化と Expert Advisor 安定性解析

MetaTrader 4トレーディングシステム | 17 2月 2016, 11:21
511 0
Murashov Anton
Murashov Anton

はじめに

Meta Trader 4 クライアントターミナルに埋め込まれているストラテジーテスタは、 Expert Advisorで実行されるトレーディング戦略の検証/クオリティー評価を行うためのひじょうに優れたツールです。ただ現時点では、そこには2つ重大な(私にとっては)特性があります。まず、シンボルに対する実際のティック履歴を使用していいなしい、そして1分足を基にしたティックをモデル化しています。次に、それはかなり頻繁にブローカーが再クオートする現象を考慮していません。特に小さなトレードボリュームで、またはひじょうに大きなトレードボリュームで、そしてまた『薄い』、すなわち流動性が低いマーケットにおけるものです。可能な再クオートの条件下では、EA を確認するチャンスがないことでみせかけの『聖杯』、『スパイク』上でのトレーディング、りーぷ、急上昇や非マーケットクオートにつながります。そのような戦略は実アカウントでは効果的ではないことは何度も説明され、証明されましたが、残念ながら自分の Expert Advisor が『スパイク』でトレードを行っているのか否か知ることはひじょうに多くの場合困難なのです。トレードが設定される履歴チャート上ではテスターがリープでトレードを開始するのを見ることは可能な場合もありますが、毎回というわけではありません。こういったとき、それが再クオート戦略を少しずつ減らすのか、またはただ収益性を低くするだけなのか予測するのもむつかしいものです。本稿では、この問題を解決するための私独自の方法を述べていきたいと思います。


前提条件と定義

再クオートはみなさんがトレードサーバーに送信したオーダーに対するブローカーの応答です。このブローカーの応答は価格(みなさんがトレードを開始しようとするもの)はもはや実価格ではないことを伝えます。それはみなさんのリクエストがターミナルで処理されている間に価格が激しく変動する流動性の低いまたは変動しやすいマーケットで頻繁に起こります。また、再クオートはブローアウトや非マーケットクオートで開始しようとするときにかなり頻繁です。

Expert Advisor が OP_SELL や OP_BUY のようなオーダーだけをオープンしたりクローズするとします。. 基本を変えることはありませんが、関数のいくつかは簡単になります。


ストラテジーテスタにおける再クオートモデル

オーダーのオープンおよびクローズにおいて、あらかじめ設定した可能性のある再クオートをシミュレーションすることを目的とします。まずわれわれの人為的な再クオートの発生確率を設定する特殊な外部変数を入力します。私の調査/モニタリングによると、低流動ペアブローアウトにおける再クオートの確率は 90 % に近いもので、そのため Expert Advisor 解析でこの値を採ることとします。

extern int RQF_TEST = 90;

任意値を返す関数 MathRand を使用するため、疑似乱数のシーケンスを初期化したほうが好ましいです。このために、関数 MathSrand はExpert Advisor の動作の最初で呼ばれます。乱数値生成とこの関数の目的に関するより詳しい情報は MQL 言語の参照本で入手可能です。language. MathRand 関数からの数の『無作為性』にもかかわらず、 MathSrand を使用しなければ、戦略を実行するときはいつも同じ結果を得ると言えるでしょう。そして一般的に言うと、それはわれわれには不適です。

int start()
  {
    //----
    MathSrand(TimeCurrent());

その後、独自の関数OrderSend および OrderClose を書く必要があります。. それを MyOrderSend および MyOrderClose と名付けます。

int MyOrderSend(int req_prob, string symbol, int cmd, double volume, double price, 
                int slippage, double stoploss, double takeprofit, 
                string comment="", int magic=0, datetime expiration=0, 
                color arrow_color=CLR_NONE)
  {
    if(IsTesting() && (MathRand() % 100) < req_prob && (cmd == OP_SELL || cmd == OP_BUY))
        return (-1); //modelling requote
    return(OrderSend(symbol, cmd, volume, price, slippage, stoploss, takeprofit, 
           comment, magic, expiration, arrow_color));
  }
 
bool MyOrderClose(int req_prob, int ticket, double lots, double price, int slippage,
                  color Color=CLR_NONE)
  {
    if(IsTesting() && (MathRand() % 100) < req_prob)
        return (false); //modelling requote
    return (OrderClose(ticket, lots, price, slippage, Color));
  }

EA 内の関数 OrderSend および OrderClose を最初の引数として入力された以前の外部変数である RQF_TEST のインディケーションを持つMyOrderSend と MyOrderClose で置き換えます。以下は私の EA からの例です。

OrderClose -> MyOrderClose:

if(MyOrderClose(RQF_TEST, ticket, amount, Bid, 0, Blue)) 
// PREV: if(OrderClose(ticket, amount, Bid, 0, Blue))
  {
    Print("Skalpel: Order #" + ticket + " closed! (BUY, " + Bid + ")");
            //... Something
  }
else
  {
    // Requote or something like this
    Print("Skalpel: Error while closing order #" + ticket + " (BUY)!");
    // ... Something
  }

OrderSend -> MyOrderSend:

ticket = MyOrderSend(RQF_TEST, Symbol(), OP_BUY, amount, Ask, 0, 
                     Bid-StopLoss*Point, Bid+TakeProfit*Point, 
                     NULL, EXPERT_MAGIC, 0, Blue);
// PREV: OrderSend(Symbol(), OP_BUY, amount, Ask, 0, Bid - StopLoss*Point, 
// Bid+TakeProfit*Point, NULL, EXPERT_MAGIC, 0, Blue);
 
if(ticket > 0)
    Print("Skalpel: Order #" + ticket + " opened! (BUY)");
else
    Print("Skalpel: Error while placing order."); 
    // ... Requote or something like this

結論および結果分析

まず変数 RQF_TEST の値がすべて説明されます。それは100件のトレードに対するクオートの数量を設定し、それに応じて値を再クオートがまったくない場合の 0 から、オーダーのオープンまたはクローズがまったく不可能な場合の 100 まで取ることができます。例にあるように RQF_TEST がis equal 90 であれば、100件のうち、トランザクションのオープンまたはクローズの試みおよそ90件は失敗に終わる、すなわち再クオートがシミュレーションされる、ことを意味しています。

実際、RQF_TEST のさまざまな値で受け取られた結果は再クオートやテスターとブローカーからのティックフロー差に対するみなさんの戦略の安定性を示しています。

RQF_TEST が成長するときに結果が劣れば、その戦略の有用性を確認する必要があります。なぜなら、再クオートに対する感度は、激しい一時的なブローアウトでトレードしている、または打ち負かすことを意味するからです。そのようなアドバイスの利用の結果についてはいろいろと言われました。

例として RQF_TEST の多様な値を持つ古典的な EAのブローアウトにおけるバランス処理を考察します。Expert Advisor は記事 "My first Grail" ()から採ります。それは可視化のためにわずかに変換されました。リミットタイプのオーダーはどれも通常のマーケットオーダーで実行され、確かに再クオートするとき、チャートがパラメータの劣化を示するようパラメータが収集されるのです。

再クオートなし(RQF_TEST = 0)


100件中90件で再クオートあり(RQF_TEST = 90)



明らかに状況は極端にひどいものです。特に検証する規定においては、 EURCHF は極端に流動的なペアで、落ちついたマーケットでさえ、再クオートは頻繁におこります。ブローアウトではなおさらです。そのため、再クオートが なければ、いくらよくできたチャートでも EA 利用の有用性は、消失します。



コメントと追加事項

実に、再クオートのために収益性のあったのがなかったのに変わる可能性のあるアドバイザーをみつけることはかなり困難です。私は、バランスチャートで長期間クオリティーのカットバックが明確に表示されるような Expert Advisor を探していました。通常、チャートの外見が同じ(定数)であるとき、再クオート(50 % のレベルでも)はトランザクションと利益の量を削減します。それには簡単な説明があります。:100件のうちの90件で、ブローカーが『危険な』オーダーオープンの許可を出さない場合、EA の使用が禁じられるまで、残りの 10 % で利益の pips をいくばくか受け取るのです。そのような状況は記事 "My first Grail " で述べられています。ただ、ブローカーが妨げない(それはです)とわれわれが予想したところで10 倍減った利益(そしてそれはまさに 90 % のレベルで報告する数字で、ただアドバイザーが100のうち90の『危険』を『見落として』いるのです)は『聖杯』のメリットをすべて台無しにrob してしまいます。すなわち銀行の預金よりかなり収益性が下がってしまいます。



MetaQuotes Ltdによってロシア語から翻訳されました。
元の記事: https://www.mql5.com/ru/articles/1442

添付されたファイル |
Graal2.mq4 (11.1 KB)
3Dグラフ-市場分析のプロのツール 3Dグラフ-市場分析のプロのツール
本稿では、3D グラフ作成用の簡単なライブラリとそのグラフを Microsoft Excel でののちの閲覧を書きます。準備には標準の MQL4 オプションを使い、*.csv ファイルにデータをエクスポートします。
履歴によるフィルター 履歴によるフィルター
本稿はトレード開始フィルターの不可欠な部分としての仮想トレーディングの利用について説明します。
MetaTrader4クライアントターミナルを扱う際の初心者が起こすミス MetaTrader4クライアントターミナルを扱う際の初心者が起こすミス
ミスは人間につきものです。みな失敗を犯します:多かれ少なかれ、無知や、うっかりしていいたせいでミスを犯します。訪ねていただいた以下の質問にお答えします:ターミナルタイム・テスト結果・ジャーナルへの表示・テスター用履歴・履歴インポート・レバレッジ・トラフィック・ヒント・スケーリング・計算ミス・不当なアカウント・エンプティニュース・価格の変化・不十分な資金・マーケット閉鎖などです。
サポート/レジスタンスレベルの表示 サポート/レジスタンスレベルの表示
本稿では MetaTrader 4 プログラムにおけるサポート/レジスタンスレベルの検出および表示について取り上げます。その便利で万能のインディケータはシンプルなアルゴリズムを基にしています。本稿ではまた、一つのワークスペース内の異なるタイムフレームからもたらされる結果を表示する、シンプルなインディケータの作成という有用なテーマにも取り組みます。