English Русский 中文 Español Deutsch Português
トレーディングロボットのためのFalseトリガー保護

トレーディングロボットのためのFalseトリガー保護

MetaTrader 4トレーディングシステム | 15 9月 2016, 12:08
1 325 0
Aleksandr Masterskikh
Aleksandr Masterskikh

イントロダクション

この記事では、繰り返しトリガーを除去することにより、取引ロボットの動作の安定性を高めるさまざまな方法について説明します。別々のエントリーと決済のアルゴリズムを使用します。


問題の本質

falseトリガの問題は、現在のロウソク足のボラティリティが高い相場で特に顕著であり、トレーディングロボットのアルゴリズムに対する予防策はありません。その結果として、複数のエントリーと決済を引き起こします。

結果は様々で、トレーディングロボットの開発者によって設定された相場パラメーターのアルゴリズムに依存します。いずれにしても、スプレッドによるトレーダーのコストは、トリガの数に比例して増加しています。

この記事では、取引EAの動作の安定性に影響を与え、散乱を回避するのに役立ちます。金融商品の分析対象を考慮しています。(これは、別の主題で - インパルス均衡理論とシステムに基づいています)。ここでは、金融相場を分析する方法に直接依存しないソフトウェアの対策に焦点を当てます。

それでは、この問題を解決しましょう。例として、MT4で利用可能な"MACDサンプル"EAを使用します。

これは今年の10月の2日にスパイクしたポジションの例で示した散乱問題の視覚的な解釈です。

スクリーンショットでは明らかに単一のロウソク足に8つ以上のトリガーを(買いエントリ)示しています。それらの内、ひとつだけが正しいもので、残りは間違いです。

このケースでfalseトリガの背後にあるものは、次のとおりです。

  • 利益確定の値が小さすぎるために、これは起こっています。
  • また、決済した後にEAのトリガーが発生することで何重ものエントリーが発生しています。

フィルタリングの問題は意図的に発生しないと結論付けています。そのため、この問題を解決するには次の要因を考慮する必要があります。

  • time (足の長さ),
  • トリガーの数 (counter),
  • 振幅(ロウソク足の範囲)。


エントリーアルゴリズムにおけるソリューション

最も簡単かつ同時にエントリポイントを修正する確実な方法は、時間因子です。理由は次のとおりです。

  • トリガーの量をカウントするということは、ループ処理をするということになります。これはつまり、アルゴリズムを複雑にするだけでなく、処理速度を低下させます。
  • 価格水準の基準が不均一になってローソク足の逆転で返すため、振幅と価格の関連する制御レベルを繰り返すことができます。
  • 時間は不可逆的なので、一方向にのみ進みます。したがって、この問題を解決する方法として最も適切です。

この方法にすればエントリーアルゴリズムはより正確になります。オーダーを出す瞬間に( OrderSend)を送信します。

よって、ポジションを開くときに、モーメント(現在時刻)を記録します。しかし、どうやって指定されたロウソク足の第二のエントリを禁止するアルゴリズムを組めばよいでしょうか。前もって、エントリーのタイミングを知ることはできません。したがって、前もってエントリーアルゴリズムに介入することはできません。トリガーを算出することなく、ロウソク足のすべての必然的なエントリを禁止する必要があります。

解決策は非常に簡単です。まず、詳細をで明確にし、その後いくつかのコメントでコードを書きます。これが補助コードです。取引のアルゴリズムに配置する必要があります(黄色で強調表示)( MACD Sample_plus1.mq4参照):

//+------------------------------------------------------------------+
//|                                                  MACD Sample.mq4 |
//|                   Copyright 2005-2014, MetaQuotes Software Corp. |
//|                                              https://www.mql4.com |
//+------------------------------------------------------------------+
#property copyright   "2005-2014, MetaQuotes Software Corp."
#property link        "https://www.mql4.com"

input double TakeProfit    =50;
input double Lots          =0.1;
input double TrailingStop  =30;
input double MACDOpenLevel =3;
input double MACDCloseLevel=2;
input int    MATrendPeriod =26;
//---(М15は60сх15=900сに等しいため、新しい変数を入力します。
datetime Time_open=900;
//---新しい変数(第一エントリで足が開く時間)を入力します。
datetime Time_bar = 0;

//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
void OnTick(void)
  {
   double MacdCurrent,MacdPrevious;
   double SignalCurrent,SignalPrevious;
   double MaCurrent,MaPrevious;
   int    cnt,ticket,total;
//---
//初期データチェック
//エキスパートが正常に動作することを確認することが重要です
//チャートとユーザーは、外部設定を行っていません 
//変数(Lots、StopLoss、TakeProfit、 
//トレーリングストップ)今回は、TakeProfitをチェック
//100未満の足チャート
//---
   if(Bars<100)
     {
      Print("bars less than 100");
      return;
     }
   if(TakeProfit<10)
     {
      Print("TakeProfit less than 10");
      return;
     }
//---コーディングを単純化し、アクセスデータを高速化するための内部変数の中に置かれています
   MacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0);
   MacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);
   SignalCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);
   SignalPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1);
   MaCurrent=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,0);
   MaPrevious=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,1);

   total=OrdersTotal();
   if(total<1)
     {
      //---保有ポジションがない
      if(AccountFreeMargin()<(1000*Lots))
        {
         Print("We have no money. Free Margin = ",AccountFreeMargin());
         return;
        }
      //---ロングポジション(買い)可能性
      
      //---新しい文字列を入力します(新しい足が開いている場合は繰り返しエントリの禁止を削除します)
      if( (TimeCurrent() - Time_bar) > 900 ) Time_open = 900; 
      
      if(MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious<SignalPrevious && 
         MathAbs(MacdCurrent)>(MACDOpenLevel*Point) && MaCurrent>MaPrevious && 
         (TimeCurrent()-Time[0])<Time_open) //一度だけ実行されるエントリーアルゴリズムに新しい文字列を入力してください
        {
         ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,"macd sample",16384,0,Green);
         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
             {
              Print("BUY order opened : ",OrderOpenPrice());
              Time_open = TimeCurrent()-Time[0]; //足から新しい文字列を入力します。決済の瞬間までエントリー
              Time_bar = Time[0]; //新しい文字列を入力します(第一エントリの足の時間を記録)
             }
           }
         else
            Print("Error opening BUY order : ",GetLastError());
         return;
        }


続き:

エントリーの瞬間まで、現在のロウソク足を開いた瞬間から次の時間のギャップを使用しています。この値は、最初のエントリをトリガすることを可能にし、予め設定された、かなり大きな時間値(全体ロウソク足の長さ)を比較します。ポジションを開く時点では、決済の時点までロウソク足の開始から時間差の値Time_openを書き込むことにより、変数の(減少)値を変更します。そして、任意の瞬間で、値が(TimeCurrent() - Time[0])を超えます。(TimeCurrent() - Time[0]) < Time_open が不可能のままになるエントリポイントで書いた値は、このロウソク足の結果としてエントリをブロックすることにより達成されます。

この方法で、エントリの量と価格の動きの振幅の分析なしに、falseトリガの問題を解決しました。

以下は、EAのエントリ(「MACD Sample_plus1」)の初期のアルゴリズムのような単純な改善の結果です。

falseトリガが存在しない、ロウソク足に1つのエントリのみが存在することがわかり、散乱が完全に排除されます。この問題がEAの設定を変更する必要なしに解決されることは明らかで、デフォルトで設定は完全に保存されます。

ポジションの迅速な決済がもたらす多重エントリーを排除するために、エントリーアルゴリズムを改善します。これは、この特定の場合にはインパルスが良好です。


決済アルゴリズムにおけるソリューション

最初の問題では、利益を増加させる取引ロボットの散乱を除去することを含むので、このテーマに関連して金融商品のダイナミクスを解析する問題を考慮せず、パラメータを固定して制限します。

これまで、パラメータと時間係数を使用しているエントリの後は、次のロウソク足が開いた時点で、再度、厳密に時間によってポジションをを規制します。決済アルゴリズムの表示:

if(!OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
         continue;
      if(OrderType()<=OP_SELL &&   //保有ポジションを確認する
         OrderSymbol()==Symbol())  //シンボルチェック
        {
         //---ロングポジションが開かれる
         if(OrderType()==OP_BUY)
           {
            //---決済すべきですか?
            if(/* MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious &&//決済の新しい条件を乱さないように、MACDでexitトリガーのコードを削除
               MacdCurrent>(MACDCloseLevel*Point) &&
             */
               Bid > OrderOpenPrice() &&  // 新しい文字列を入力 - オプション(エントリーレベルにおいて正の領域での価格)
               TimeCurrent() == Time[0] ) //新しい文字列(決済アルゴリズムの簡単な入力をしてください:)
              {
               //---決済順序
               if(!OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet))
                  Print("OrderClose error ",GetLastError());

               return;
              }


エントリーアルゴリズムが機能するマイナーな修正は、ポジションがTimeCurrent() == Time[0]の瞬間まで続き、インパルス後の新ロウソク足の開始時に決済します。最終的には、多重エントリーの保護に加えて、良好な利益(画像「MACD Sample_plus2」を参照)になりました。

この目的のため、決済に必要な条件はポジションを取ることができない決済アルゴリズムからMACDによってトリガを削除する必要がありました。

したがって、散乱の問題をエントリーと決済のアルゴリズムで別々に解くことができると思われます。さて、エントリーにこれらのアルゴリズムを接続し、ポジションを閉じることによって問題を解決する方法を説明しましょう。


エントリーと決済のアルゴリズムを接続

全体のプロセスの特定の予備的モデリングを意味します。保有ポジション - 管理 - 決済ポジション。これは、エントリーと決済のアルゴリズムで使用されるインジケーターや関数のシフトを選択する際に反映されています。

決済アルゴリズムでTimeCurrent() = Time[0]の条件を使用し、現在のロウソク足の開始により厳密に設定されている場合、その後、エントリーアルゴリズムは前の確定足でテストする必要があるので、決済条件が満たされる可能性があります。したがって、任意の追加条件なしTimeCurrent() = Time[0]の状態でポジションを決済するためには、全体アルゴリズムは、前の足(完成した)で実装することが必要です。値の比較にインジケーターの設定のオフセットをする必要があります。この場合、値の比較は正確になり、現在のロウソク足の始まりは決済アルゴリズムに論理的な結末となります。

このように、決済とエントリの接続アルゴリズムはまた、時間的要因にリンクされています。


結論

EAのfalseトリガの問題は、時間係数を使用することによって解決されます。EA操作の安定性は、インジケータまたは関数が計算される足の決済点を固定し、接続することによって達成することができます。

EAのコードは次のとおりです。最初のものが( MACD_Sample.mq4)、改善されたエントリを持つものが( MACD Sample_plus1.mq4)、さらに改善された決済を持つのが( MACD_Sample_plus2.mq4)です。売りチャンネルが改善されたアルゴリズムを比較するため、意図的に変更せずに、買いチャネルが改善されています。

すべてのEAはデモを目的としており、実際の取引用には意図されていません。

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

添付されたファイル |
MACD_Sample.mq4 (6.1 KB)
MQL5とQLUAの比較ーなぜMQL5での取引操作は28倍速いのか? MQL5とQLUAの比較ーなぜMQL5での取引操作は28倍速いのか?
多くのトレーダーは、どれくらいの速さで自分の注文が取引所に到達し、どれくらいの時間で実行されるのか、そしていつトレーダーの取引ターミナルに取引操作の結果が反映されるのかということについてよく考えるものだと思います。今まで誰もMQL5とQLUAのプログラムを使用した取引操作速度の比較測定を行っていないので、この比較を行いたいと思います。
キャンバスクラスの学習。アンチエイリアスと影 キャンバスクラスの学習。アンチエイリアスと影
キャンバスクラスのアンチエイリアシングアルゴリズムは、アンチエイリアスが使用されているすべての構造の基本です。この記事では、アルゴリズムがどのように動作するかについて扱い、可視化に関連する例を示します。また、グラフィックオブジェクトの描画の色合いをカバーし、キャンバス上の図形を描画するために開発された詳細なアルゴリズムがあります。数値解析ライブラリALGLIBは、計算に使用します。
裁量トレードに向けたファジーロジック 裁量トレードに向けたファジーロジック
この記事では、ファジィ集合論を適用することにより、裁量の取引戦略を改善する方法を提案します。例として、相場参入のために過度に形式的な基準をぼかすため、ファジーロジックアプリケーションや戦略の検索、パラメータの選択について、ひとつひとつ説明してきました。このように、戦略の変更後、相場の状況に反応してポジションを開く柔軟な条件を使用します。
グラフィカルインタフェースX: Easy And Fast (簡単で手早い)ライブラリの更新(ビルド2) グラフィカルインタフェースX: Easy And Fast (簡単で手早い)ライブラリの更新(ビルド2)
シリーズの前回の記事の出版以来、Easy And Fast ライブラリにはいくつかの新機能が加わりました。ライブラリの構造とコードは部分的に最適化され、CPUの負荷が少し軽減されています. 多くのコントロールクラスで繰り返して現れるメソッドは、CElement基本クラスに移動されました。