English Русский 中文 Español Deutsch Português
preview
ゲータ―オシレーター(Gator Oscillator)による取引システムの設計方法を学ぶ

ゲータ―オシレーター(Gator Oscillator)による取引システムの設計方法を学ぶ

MetaTrader 5トレーディング | 6 2月 2023, 11:37
290 0
Mohamed Abdelmaaboud
Mohamed Abdelmaaboud

はじめに

    最も人気のあるテクニカル指標に基づいて取引システムを設計する方法を学ぶことについての連載の新しい記事へようこそ。ここでは、MQL5プログラミング言語によって取引システムを作成する方法だけでなく、すべての言及されたテクニカル指標について学ぶことができます。今回は、これらの人気指標の1つであるゲータ―オシレーターについて、その内容や使い方とともに、取引に役立つMetaTrader 5で使用できる取引システムの作成方法を詳しく学びます。また、より良い結果を得るための新しい取引方法に目を向けることができるようにしたいと思います。 

      この指標について、以下のトピックを通じて、できる限りカバーしていきます。

      1. ゲータ―オシレーターの定義
      2. ゲータ―オシレーターの戦略
      3. ゲータ―オシレーターの設計図
      4. ゲータ―オシレーター取引システム
      5. 結論

      MetaTrader 5の取引ターミナルを使用して言及した戦略をテストし、MetaTrader 5に組み込まれているMetaQuotes言語(MQL5)プログラミング言語によって取引システムを構築する予定です。MetaTrader 5とMQL5のIDEをダウンロードして使う方法がわからない場合は、以前の記事から「MetaEditorでMQL5のコードを書く」を読んで、詳細をご覧ください。

      ここで、前述の戦略を使用する前には、テストして、それが有用で有益であることを確認する必要があることをお伝えする必要があります。万人に適したものはありませんし、ここでの主な目的は、主な概念と指標の背後にある根源を学ぶための教育に限られているからです。また、プログラミングのスキルを向上させたいのであれば、この記事のコードや他のコードを自分で書いてみる必要があるということもお伝えしておきます。

      免責条項:すべての情報は「現状有姿」で提供され、情報提供のみを目的としており、取引目的やアドバイスを目的としたものではありません。いかなる結果も保証するものではありません。読者がこれらの資料を自分の取引口座で使用する場合、自己責任でおこなってください。


      ゲータ―オシレーターの定義

      このセクションでは、ゲータ―オシレーターをより詳細に識別し、その背後にある主要な概念を理解・認識し、適切かつ効果的に使用することができるようにします。ゲータ―オシレーターは、ビル・ウィリアムズによって考案された指標で、相場がトレンドにあるかレンジ相場にあるか、トレンドがある場合はそのトレンドがどの程度継続するかとともに、取引の開始や終了のタイミングを判断するのに役立ちます。この2つが取引において非常に重要であることは周知の通りです。ゲータ―オシレーターはアリゲーター(Alligator)指標をベースにしています。このアリゲーター指標については、以前の「アリゲーターによる取引システムの設計方法を学ぶ」稿で詳しく説明しています。

      ゲータ―オシレーターの計算についてははこれから見ますが、アリゲーターのバランスラインの収束と発散を表示します。以下は、ゲータ―オシレーターの計算方法です。

      • ステップ1:価格の中央値を計算する。

      Median Price = (High + Low) /2

      • ステップ2:「顎」「歯」「唇」を計算する。
      アリゲーターの顎 = SMMA (Median Price, 13,8)
      アリゲーターの歯 = SMMA (Median Price, 8, 5)
      アリゲーターの唇 = SMMA (Median Price, 5, 3)
      • ここで、

      Median Price:価格の種類(中央値)

      High:最高価格

      Low:最安価格

      SMMA:平滑化移動平均は移動平均の一種で、データ、期間、シフト(存在する場合)を平滑化する方法です。例えば、SMMA (Median Price, 13, 5)は、中央値から得られる平滑化移動平均であるSMMAをデータの種類として、平滑化期間を13、未来へのシフトを5とすることを意味します。 

      アリゲーターの顎:アリゲーター指標の青い線

      アリゲーターの歯:アリゲーター指標の赤い線

      アリゲータの唇:アリゲーター指標の緑の線

      ゲータ―オシレーターは先ほどの計算で作成されますが、この指標はMetaTrader 5に組み込まれているため、手動で計算する必要はありません。利用可能なテクニカル指標のリストから選択して、以下のようにチャートに挿入するだけでよいのです。

      MetaTrader 5を開き、[挿入] -> [インディケータ] -> [Bill Williams] -> [Gator Oscillator]をクリックします。

      ゲータ―の挿入

      Gator Oscillatorを選択すると、以下のようなパラメータウィンドウが表示されます。

      ゲーターパラメータ

      前の図には、ゲータ―オシレーターの望ましい設定を決定するためのパラメータがあります(以下と同じ)。

      1. 顎の期間
      2. 顎の水平シフト
      3. 歯の期間
      4. 歯の水平シフト
      5. 唇の期間
      6. 唇の水平シフト
      7. 平均化法
      8. ゲータを計算する際に使用する価格の種類
      9. ゲーターのup値の色
      10. ゲーターのdown値の色
      11. ゲーターのバーの幅  

      望まれるパラメータをすべて決定した後、この指標は次のようにチャートの下に追加されていることがわかります。

      ゲーターの追加

      前のチャートでわかるように、正のup値と負のdown値を持つことが明確に分かるゲータ―オシレーターがあるいることが分かります。また、各バーとその1つ前のバーとの関係に基づいて、緑と赤のバーがあります。現在のバーが1つ前より高い場合は現在のバーは緑で、逆に、現在のバーが1つ前より低い場合は、現在のバーは赤になります。 


      ゲータ―オシレーターの戦略

      このトピックでは、ゲータ―オシレーターで使用できる簡単な戦略を教育目的で紹介します。このような戦略を実際の口座で使用する前には、必ずテストして、自分にとって有用であることを確認する必要があります。

        戦略1:Gator Status Identifier

          この戦略では、指標のバーからゲータ―の状態を特定する必要があります。それによると、ゲータ―の状態は4つあります。両方のバーが赤の場合、ゲーターは睡眠状態にあります。両方のバーが緑の場合は、捕食状態です。両方のバーが赤の後に緑になれば覚醒状態で、両方のバーが緑の後に赤になれば飽食状態となります。

          単純に言うと次のようになります。

          両バーとも赤 ==> 睡眠状態

          両バーとも緑 ==> 捕食状態

          両バーとも赤の次に緑 ==> 覚醒状態

          両バーとも緑の次に赤 ==> 飽食状態

            戦略2:Gator signals

              この戦略では、ゲータ―オシレーターに基づいたシグナルを取得する必要があります。ゲータ―が覚醒状態にある場合は、良いエントリを探すシグナルが必要です。捕食状態にある場合は、現在のポジションを保持するシグナルが必要です。飽食状態にある場合は、良いエグジットを探すシグナルが必要です。ゲータ―の状態がその他の場合は、何も必要ありません。

              単純に言うと次のようになります。

              ゲーター = 覚醒状態 ==> 良いエントリを探す

              ゲーター = 捕食状態 ==> 現在ポジションを保持する

              ゲーター = 飽食状態 ==> 良いエグジットを探す

              ゲーター = 他の状態 ==> 何もしない

                戦略3:Gator with MA

                  この戦略では、ゲータ―のシグナルと移動平均のシグナルを組み合わせることになります。バーが2本とも緑で、終値が移動平均値を上回っている場合は、良い買いポジションを探すシグナルです。もう1つのシナリオは、ゲータ―オシレーターのバーが2本とも赤で、終値が移動平均値を下回っている場合で、これは良い売りポジションを探すシグナルです。その他の場合は何もしません。

                  単純に言うと次のようになります。

                  両方のバーが緑で終値 > 移動平均線 ==> 良い買いポジションを探す

                  両方のバーが赤で終値 < 移動平均値 ==> 良い売りポジションを探す

                  その他の場合は何もしない


                  ゲータ―オシレーターの設計図

                  このセクションでは、取引システムを効果的かつ簡単に構築するために、言及したすべての戦略についてステップバイステップで設計図を作成します。このステップを踏むことで、重要なステップを忘れたり、物事をうまく進めるために作業を繰り返したりすることを避けることができます。たとえ作成に時間がかかったとしても、多くの時間を節約することになるため、このステップは取引システムの開発には非常に重要で不可欠だと私は考えています。自分の考えを明確なステップで整理することで、コンピュータに何をさせるべきかを理解することに努めます。

                    戦略1:Gator Status Identifier

                      この戦略の概念に基づいて、ゲータ―オシレーターのいくつかの値(現在のup、現在の2つまで前のup、現在のdown、現在の2つまで前のdown)を自動的にティックごとに確認するために使用できるコンピュータまたはエキスパートアドバイザー(EA)を作成することが必要です。この確認の後、EAは、各値のポジションを判断して、2つの比較をおこなう必要があります。1つ目は、現在のゲータ―のup値と1つ前のゲータ―のup値のどちらが大きいかの比較、2つ目は、現在のゲータ―のdown値と1つ前のゲータ―のdown値のどちらが大きいかの比較です。この比較の結果が、ゲータ―の状態を識別するためのシグナルとなります。

                      現在のup値が1つ前のup値を下回ると同時に現在のdown値が1つ前のdown値を上回る場合、睡眠状態のシグナルがチャートにコメントとして返されます。2つ目のケースとして、現在のup値が前回のup値を上回ると同時に現在のdown値が前回のdown値を下回る場合、捕食状態のシグナルがチャートにコメントとして返されます。3つ目のケースとして、1つ前のup値が2つ前のup値を下回り、1つ前のdown値が2つ前のdown値を上回り、現在のup値が1つ前のup値を上回り、現在のdown値が1つ前のdown値を下回る場合、覚醒状態のシグナルがチャートにコメントとして返されます。4番目(最後)の状態では、1つ前のup値が2つ前のup値を上回り、1つ前のdown値が2つ前のdown値を下回ると同時に、現在のup値が1つ前のup値を下回り、現在のdown値が1つ前のdown値を上回る場合、飽食状態のシグナルがチャートにコメントとして返されます。

                      この取引システムの設計図を簡単な図にすると次のようになります。

                      Gator Status Identifierの設計図


                        戦略2:Gator signals

                          この取引戦略の主旨からすると、エントリ、エグジット、または現在のポジションを保持する良いタイミングのシグナルを返すために使用できる取引システムを作る必要があります。取引システムは、現在のup値と2つ前までのup値に加え、現在のdown値と2つ前までのdown値を継続的に確認し、ゲータ―の状態に応じたシグナルを出す必要があります。

                          取引システムが返すべき1つ目のシグナルは、チャート上のコメントとして示される「良いエントリを探す」シグナルです。これは、1つ前のup値が2つ前のup値を下回り、1つ前のdown値が2つ前のdown値を上回ると同時に、現在のup値が1つ前のup値を上回り、現在のdown値が1つ前のup値を下回る場合の覚醒状態のシグナルです。

                          2つ目のシグナルは、チャート上のコメントとして示される「現在のポジションを保持」シグナルです。これは、現在のup値が1つ前のup値を上回り、現在のdown値が1つ前のdown値を下回る場合の捕食状態のシグナルです。

                          3つ目のシグナルは、チャート上のコメントとして示される「良いエグジットを探す」シグナルです。これは、1つ前のup値が2つ前のup値を上回り、1つ前のdown値が2つ前のdown値を下回る場合の飽食状態のシグナルです。

                          最後に必要なのは、前の3つのシグナルで述べたこと以外には何もしないことです。この取引システムを作るための設計図は以下の通りです。

                          Gator signalsの設計図



                            戦略3:Gator with MA

                              取引戦略上、ゲータ―オシレーター、終値、移動平均線から売買のタイミングを計る必要がありますが、これは戦略のところで学んだのと同じです。以下はコンピュータにそれをさせるための方法です。

                              取引システムが返すべき最初のシグナルは「良い買いポジションを探す」シグナルです。これは、ゲータ―値を確認して、現在のup値が1つ前のup値を上回り、1つ前のup値が2つ前のup値を上回ると同時に、現在のdown値が1つ前のdown値を下回り、1つ前のdown値が2つ前のdown値を下回ることがわかった場合で、緑のバーが2本になり、終値が移動平均値を上回ります。

                              2つ目のシグナルは、「良い売りを探す」シグナルです。これは、ゲーターを確認して、現在のup値が1つ前のup値を下回り、1つ前のup値が2つ前のup値を下回ると同時に、現在のdown値が1つ前のdown値を上回り、1つ前のdown値が2つ前のdown値を上回ることがわかった場合で、赤いバーが2本になり、終値が移動平均を下回ります。

                              その他の場合は、何も返しません。この取引システムを作るための設計図は以下の通りです。

                              Gator with MA戦略設計図


                              ゲータ―オシレーター取引システム

                              さて、この記事で最も興味深いトピックは、すべての戦略に対応する取引システムを作成することです。この取引システムは、効果的な取引をおこなうために役立ちます。

                              ゲータ―オシレーターの現在のup値、down値をチャート上にコメントとして返す「Simple Gator Oscillator System」を作成しました。この取引システムを作るための手順は、以下の通りです。

                              実数型の1つであるdoubleを使って、分数の値を返すupGatorとdownGatorのArrayを作成します。

                                 double upGatorArray[];
                                 double downGatorArray[];

                              これらの配列のデータをArraySetAsSeries関数で並び替えます。そのパラメータは次の通りです。

                                 ArraySetAsSeries(upGatorArray,true);
                                 ArraySetAsSeries(downGatorArray,true);

                              整数型変数gatorDefを作成し、iGator関数を使用してゲータ―オシレーターを定義して指標ハンドルを返します。そのパラメータは次の通りです。

                              • symbol_name:銘柄(現在の銘柄に適用される_Symbolを使用) 
                              • period: 期間(現在の時間枠に適用される_PERIODを使用)
                              • jaw_period:顎の計算期間(13を使用) 
                              • jaw_shift:顎の水平方向のシフト(オプション)(8を使用)
                              • teeth_period: 歯の計算期間(8を使用)
                              • teeth_shif:歯の水平方向のシフト(オプション)(5を使用)
                              • lips_period:唇の計算期間(5を使用)
                              • lips_shift:唇の水平方向のシフト(オプション)  (3を使用)
                              • ma_method:移動平均タイプの種類(MODE_SMMAを使用)
                              • applied_price:計算における適用価格の種類(PRICE_MEDIANを使用)
                              int gatorDef=iGator(_Symbol,_Period,13,8,8,5,5,3,MODE_SMMA,PRICE_MEDIAN);

                              upGatorArray、downGatorArrayともにデータを定義しCopyBuffer関数を用いて結果を格納します。そのパラメータは次の通りです。

                              • indicator_handle:指標ハンドル(gatorDefを使用)
                              • buffer_num: 指標バッファ番号(0はupGator、2はdownGator)
                              • start_pos:開始位置(0を使用)
                              • count:コピーする量(3を使用)
                              • buffer[]:コピー先配列(upGatorArray、 downGatorArrayを使用)
                                 CopyBuffer(gatorDef,0,0,3,upGatorArray);
                                 CopyBuffer(gatorDef,2,0,3,downGatorArray);

                              upGatorとdownGatorのdouble変数を作成して、その値を取得します。四捨五入のためにNormalizeDouble関数を使用します。

                              • value:現在値(upGatorArray[0]を使用)
                              • digits::小数点以下の桁(6を使用)
                                 double gatorUpValue=NormalizeDouble(upGatorArray[0],6);
                                 double gatorDownValue=NormalizeDouble(downGatorArray[0],6);

                              Comment関数を使って、現在のupGatorとdownGatorの値を表示させます。

                                 Comment("gatorUpValue = ",gatorUpValue,"\n",
                                         "gatorDownValue = ",gatorDownValue);

                              この取引システムの完全なコードは以下の通りです。

                              //+------------------------------------------------------------------+
                              //|                               Simple Gator Oscillator System.mq5 |
                              //|                                  Copyright 2022, MetaQuotes Ltd. |
                              //|                                             https://www.mql5.com |
                              //+------------------------------------------------------------------+
                              #property copyright "Copyright 2022, MetaQuotes Ltd."
                              #property link      "https://www.mql5.com"
                              #property version   "1.00"
                              //+------------------------------------------------------------------+
                              void OnTick()
                                {
                                 double upGatorArray[];
                                 double downGatorArray[];
                                 ArraySetAsSeries(upGatorArray,true);
                                 ArraySetAsSeries(downGatorArray,true);
                                 int gatorDef=iGator(_Symbol,_Period,13,8,8,5,5,3,MODE_SMMA,PRICE_MEDIAN);
                                 CopyBuffer(gatorDef,0,0,3,upGatorArray);
                                 CopyBuffer(gatorDef,2,0,3,downGatorArray);
                                 double gatorUpValue=NormalizeDouble(upGatorArray[0],6);
                                 double gatorDownValue=NormalizeDouble(downGatorArray[0],6);
                                 Comment("gatorUpValue = ",gatorUpValue,"\n",
                                         "gatorDownValue = ",gatorDownValue);
                                }
                              //+------------------------------------------------------------------+

                              前の行のコードを書いたら、それをコンパイルして、エラーがないことを確認します。次のように、MetaTrader 5取引ターミナルのナビゲータウィンドウで、Expert Advisorsフォルダの下にこのEAが見られます。

                              ゲーターナビ

                              これを目的のチャートにドラッグ&ドロップすると、次のようなウィンドウが表示されます。

                              Simple Gator Oscillator Systemウィンドウ

                              [アルゴリズム取引を許可する]の横にチェックを入れて[OK]を押すと、この取引システムのEAが以下のようにチャートに追加されます。

                               Simple Gator Oscillator Systemの接続

                              さて、次のテストからの例のように、この取引システムのシグナルを受信する準備が整いました。

                              Simple Gator Oscillator Systemシグナル


                                戦略1: Gator Status Identifier

                                  この戦略に基づいて、それを作成するためのコードの完全なブロックは次のとおりです。

                                  //+------------------------------------------------------------------+
                                  //|                                      Gator Status Identifier.mq5 |
                                  //|                                  Copyright 2022, MetaQuotes Ltd. |
                                  //|                                             https://www.mql5.com |
                                  //+------------------------------------------------------------------+
                                  #property copyright "Copyright 2022, MetaQuotes Ltd."
                                  #property link      "https://www.mql5.com"
                                  #property version   "1.00"
                                  //+------------------------------------------------------------------+
                                  void OnTick()
                                    {
                                     double upGatorArray[];
                                     double downGatorArray[];
                                     ArraySetAsSeries(upGatorArray,true);
                                     ArraySetAsSeries(downGatorArray,true);
                                     int gatorDef=iGator(_Symbol,_Period,13,8,8,5,5,3,MODE_SMMA,PRICE_MEDIAN);
                                     CopyBuffer(gatorDef,0,0,5,upGatorArray);
                                     CopyBuffer(gatorDef,2,0,5,downGatorArray);
                                     double gatorUpValue=NormalizeDouble(upGatorArray[0],6);
                                     double gatorUpPreValue1=NormalizeDouble(upGatorArray[1],6);
                                     double gatorUpPreValue2=NormalizeDouble(upGatorArray[2],6);
                                     double gatorDownValue=NormalizeDouble(downGatorArray[0],6);
                                     double gatorDownPreValue1=NormalizeDouble(downGatorArray[1],6);
                                     double gatorDownPreValue2=NormalizeDouble(downGatorArray[2],6);
                                     if(gatorUpValue<gatorUpPreValue1&&gatorDownValue>gatorDownPreValue1)
                                       {
                                        Comment("Sleeping Phase");
                                       }
                                     else
                                        if(gatorUpValue>gatorUpPreValue1&&gatorDownValue<gatorDownPreValue1)
                                          {
                                           Comment("Eating Phase");
                                          }
                                     if(gatorUpPreValue1<gatorUpPreValue2&&gatorDownPreValue1>gatorDownPreValue2&&
                                        gatorUpValue>gatorUpPreValue1&&gatorDownValue<gatorDownPreValue1)
                                       {
                                        Comment("Awakening Phase");
                                       }
                                     else
                                        if(
                                           gatorUpPreValue1>gatorUpPreValue2&&gatorDownPreValue1<gatorDownPreValue2&&
                                           gatorUpValue<gatorUpPreValue1&&gatorDownValue>gatorDownPreValue1)
                                          {
                                           Comment("Sated Phase");
                                          }
                                    }
                                  //+------------------------------------------------------------------+
                                  

                                  このコードの違いは次の通りです。

                                  upGatorの最後の3つの値を定義して取得します。

                                     double gatorUpValue=NormalizeDouble(upGatorArray[0],6);
                                     double gatorUpPreValue1=NormalizeDouble(upGatorArray[1],6);
                                     double gatorUpPreValue2=NormalizeDouble(upGatorArray[2],6);

                                  downGatorの最後の3つの値を定義して取得します。

                                     double gatorDownValue=NormalizeDouble(downGatorArray[0],6);
                                     double gatorDownPreValue1=NormalizeDouble(downGatorArray[1],6);
                                     double gatorDownPreValue2=NormalizeDouble(downGatorArray[2],6);

                                  戦略の条件は次の通りです。

                                  睡眠状態の場合

                                     if(gatorUpValue<gatorUpPreValue1&&gatorDownValue>gatorDownPreValue1)
                                       {
                                        Comment("Sleeping Phase");
                                       }

                                  捕食状態の場合

                                     else
                                        if(gatorUpValue>gatorUpPreValue1&&gatorDownValue<gatorDownPreValue1)
                                          {
                                           Comment("Eating Phase");
                                          }

                                  覚醒状態の場合

                                     if(gatorUpPreValue1<gatorUpPreValue2&&gatorDownPreValue1>gatorDownPreValue2&&
                                        gatorUpValue>gatorUpPreValue1&&gatorDownValue<gatorDownPreValue1)
                                       {
                                        Comment("Awakening Phase");
                                       }

                                  飽食状態の場合

                                     else
                                        if(
                                           gatorUpPreValue1>gatorUpPreValue2&&gatorDownPreValue1<gatorDownPreValue2&&
                                           gatorUpValue<gatorUpPreValue1&&gatorDownValue>gatorDownPreValue1)
                                          {
                                           Comment("Sated Phase");
                                          }

                                  このコードをエラーなくコンパイルし、EAを実行すると、以下のようにチャートに接続されていることがわかります。

                                   Gator Status Identifierの接続

                                  先ほどのチャートの右上に、Gator Status Identifier EAが接続されているのがわかります。

                                  以下のテストのように、この戦略に基づいたシグナルを見ることができます。

                                  睡眠シグナルの場合

                                   Gator Status Identifierの睡眠シグナル

                                  先ほどのチャートの左上にあるように、この戦略に基づく睡眠状態のシグナルがあります。

                                  捕食状態の場合

                                   Gator Status Identifierの捕食シグナル

                                  先ほどのチャートの左上にあるように、この戦略に基づく捕食状態のシグナルがあります。

                                  覚醒状態の場合

                                  Gator Status Identifierの覚醒シグナル

                                  先ほどのチャートの左上にあるように、この戦略に基づく覚醒状態のシグナルがあります。

                                  飽食状態の場合

                                  Gator Status Identifierの飽食シグナル

                                  先ほどのチャートの左上にあるように、この戦略に基づく飽食状態のシグナルがあります。


                                    戦略2:Gator signals戦略

                                      以下は、この戦略の取引システムを作成するための完全なコードです。

                                      //+------------------------------------------------------------------+
                                      //|                                                Gator signals.mq5 |
                                      //|                                  Copyright 2022, MetaQuotes Ltd. |
                                      //|                                             https://www.mql5.com |
                                      //+------------------------------------------------------------------+
                                      #property copyright "Copyright 2022, MetaQuotes Ltd."
                                      #property link      "https://www.mql5.com"
                                      #property version   "1.00"
                                      //+------------------------------------------------------------------+
                                      void OnTick()
                                        {
                                         double upGatorArray[];
                                         double downGatorArray[];
                                         ArraySetAsSeries(upGatorArray,true);
                                         ArraySetAsSeries(downGatorArray,true);
                                         int gatorDef=iGator(_Symbol,_Period,13,8,8,5,5,3,MODE_SMMA,PRICE_MEDIAN);
                                         CopyBuffer(gatorDef,0,0,3,upGatorArray);
                                         CopyBuffer(gatorDef,2,0,3,downGatorArray);
                                         double gatorUpValue=NormalizeDouble(upGatorArray[0],6);
                                         double gatorUpPreValue1=NormalizeDouble(upGatorArray[1],6);
                                         double gatorUpPreValue2=NormalizeDouble(upGatorArray[2],6);
                                         double gatorDownValue=NormalizeDouble(downGatorArray[0],6);
                                         double gatorDownPreValue1=NormalizeDouble(downGatorArray[1],6);
                                         double gatorDownPreValue2=NormalizeDouble(downGatorArray[2],6);
                                         bool awakeningPhase = gatorUpPreValue1<gatorUpPreValue2&&gatorDownPreValue1>gatorDownPreValue2&&
                                                               gatorUpValue>gatorUpPreValue1&&gatorDownValue<gatorDownPreValue1;
                                         bool eatingPhase = gatorUpValue>gatorUpPreValue1&&gatorDownValue<gatorDownPreValue1;
                                         bool satedPhase = gatorUpPreValue1>gatorUpPreValue2&&gatorDownPreValue1<gatorDownPreValue2&&
                                                           gatorUpValue<gatorUpPreValue1&&gatorDownValue>gatorDownPreValue1;
                                         if(awakeningPhase)
                                           {
                                            Comment("Find a good entry");
                                           }
                                         else
                                            if(eatingPhase)
                                              {
                                               Comment("Hold current position");
                                              }
                                            else
                                               if(satedPhase)
                                                 {
                                                  Comment("Find a good exit");
                                                 }
                                               else
                                                  Comment("");
                                        }
                                      //+------------------------------------------------------------------+

                                      この戦略コードの違いは次のとおりです。

                                      覚醒、捕食、飽食の3つの状態に対応するbool変数を作成します。

                                         bool awakeningPhase = gatorUpPreValue1<gatorUpPreValue2&&gatorDownPreValue1>gatorDownPreValue2&&
                                                               gatorUpValue>gatorUpPreValue1&&gatorDownValue<gatorDownPreValue1;
                                         bool eatingPhase = gatorUpValue>gatorUpPreValue1&&gatorDownValue<gatorDownPreValue1;
                                         bool satedPhase = gatorUpPreValue1>gatorUpPreValue2&&gatorDownPreValue1<gatorDownPreValue2&&
                                                           gatorUpValue<gatorUpPreValue1&&gatorDownValue>gatorDownPreValue1;

                                      戦略の条件は次の通りです。

                                      覚醒状態の場合

                                         if(awakeningPhase)
                                           {
                                            Comment("Find a good entry");
                                           }

                                      捕食状態の場合

                                         else
                                            if(eatingPhase)
                                              {
                                               Comment("Hold current position");
                                              }

                                      飽食状態の場合

                                            else
                                               if(satedPhase)
                                                 {
                                                  Comment("Find a good exit");
                                                 }

                                      その他

                                               else
                                                  Comment("");

                                      このコードをコンパイルして、このEAを実行すると、次のようにチャートに接続されていることがわかります。

                                      Gator signalsの接続

                                      Gator signalsのEAがチャートの右上に接続されているのがわかります。

                                      さて、この戦略に基づくシグナルを受信する準備が整ったので、以下にテスト時の例を示します。

                                      覚醒状態の場合

                                      Gator signalsのエントリシグナル

                                      先ほどのチャートでわかるように、左上に「良いエントリを探す」シグナルがあります。

                                      捕食状態の場合

                                       Gator signalsの保持シグナル

                                      先ほどの図にあるように、左上には「現在ポジションを保持する」シグナルが表示されています。

                                      飽食状態の場合

                                       Gator signalsのエグジットシグナル

                                      例としてテストの前のチャートで見ることができるように、左上隅に「良いエグジットを探す」シグナルがあります。


                                      戦略3: Gator with MA戦略

                                      以下は、この戦略の取引システムを作成するための完全なコードです。

                                      //+------------------------------------------------------------------+
                                      //|                                       Gator with MA strategy.mq5 |
                                      //|                                  Copyright 2022, MetaQuotes Ltd. |
                                      //|                                             https://www.mql5.com |
                                      //+------------------------------------------------------------------+
                                      #property copyright "Copyright 2022, MetaQuotes Ltd."
                                      #property link      "https://www.mql5.com"
                                      #property version   "1.00"
                                      //+------------------------------------------------------------------+
                                      void OnTick()
                                        {
                                         double upGatorArray[];
                                         double downGatorArray[];
                                         MqlRates pArray[];
                                         double maArray[];
                                         ArraySetAsSeries(upGatorArray,true);
                                         ArraySetAsSeries(downGatorArray,true);
                                         ArraySetAsSeries(maArray,true);
                                         int gatorDef=iGator(_Symbol,_Period,13,8,8,5,5,3,MODE_SMMA,PRICE_MEDIAN);
                                         int maDef=iMA(_Symbol,_Period,13,0,MODE_EMA,PRICE_CLOSE);
                                         int data=CopyRates(_Symbol,_Period,0,13,pArray);
                                         CopyBuffer(gatorDef,0,0,3,upGatorArray);
                                         CopyBuffer(gatorDef,2,0,3,downGatorArray);
                                         CopyBuffer(maDef,0,0,3,maArray);
                                         double gatorUpValue=NormalizeDouble(upGatorArray[0],6);
                                         double gatorUpPreValue1=NormalizeDouble(upGatorArray[1],6);
                                         double gatorUpPreValue2=NormalizeDouble(upGatorArray[2],6);
                                         double gatorDownValue=NormalizeDouble(downGatorArray[0],6);
                                         double gatorDownPreValue1=NormalizeDouble(downGatorArray[1],6);
                                         double gatorDownPreValue2=NormalizeDouble(downGatorArray[2],6);
                                         double maValue=NormalizeDouble(maArray[0],5);
                                         double closingPrice=pArray[0].close;
                                         bool douleGreen = gatorUpValue>gatorUpPreValue1&&gatorUpPreValue1>gatorUpPreValue2&&
                                                           gatorDownValue<gatorDownPreValue1&&gatorDownPreValue1<gatorDownPreValue2;
                                         bool douleRed = gatorUpValue<gatorUpPreValue1&&gatorUpPreValue1<gatorUpPreValue2&&
                                                         gatorDownValue>gatorDownPreValue1&&gatorDownPreValue1>gatorDownPreValue2;  
                                         if(douleGreen&&closingPrice>maValue)
                                           {
                                            Comment("Find a good buy position");
                                           }
                                         else
                                            if(douleRed&&closingPrice<maValue)
                                              {
                                               Comment("Find a good sell position");
                                              }
                                            else
                                               Comment("");
                                        }
                                      //+------------------------------------------------------------------+

                                      この戦略コードの違いは次のとおりです。

                                      pArrayとmaArrayの2つの配列を作成し、pArrayにはMqlRates関数、maArrayにはdoubleを使用して、価格の情報を格納することにします。

                                         MqlRates pArray[];
                                         double maArray[];

                                      ArraySetAsSeries関数を使用してデータを並び替えます。

                                      ArraySetAsSeries(maArray,true);

                                      整数型maDef変数を作成し、iMA関数で移動平均を定義し、指標ハンドルとそのパラメータを返します。

                                      • symbol:銘柄名(現在のチャートに適用される_SYMBOLを使用)
                                      • period: 期間(現在の時間枠に適用される_PERIODを使用、PERIOD_CURRENTも使用可能)
                                      • ma_period::平均化期間(13を使用) 
                                      • ma_shift:水平方向のシフト(オプション)(MAを移動させる必要がないので0を使用) 
                                      • ma_method - 移動平均の種類(EMA(指数移動平均)を使用) 
                                      • applied_price:価格の種類(終値を使用)
                                      int maDef=iMA(_Symbol,_Period,13,0,MODE_EMA,PRICE_CLOSE);

                                      CopyRatesを使用してMqlRatesの履歴データを取得します。

                                      • symbol_name:銘柄(現在の銘柄に適用される_Symbolを使用) 
                                      • timeframe:期間(現在の期間に適用される_Periodを使用) 
                                      • start_pos: 開始点またはポジション(現在のポジションから開始するために0を使用)
                                      • count:コピーする量(13を使用) 
                                      • rates_array[]: コピー先配列(pArrayを使用) 
                                      int data=CopyRates(_Symbol,_Period,0,13,pArray);

                                      maArray.に対してCopyBuffer関数を使用してデータを定義して結果を保存します。

                                      CopyBuffer(maDef,0,0,3,maArray);

                                      現在の指数移動平均の値を取得し、それを正規化します。

                                      double maValue=NormalizeDouble(maArray[0],5);

                                      終値の現在値を取得します。

                                      double closingPrice=pArray[0].close;

                                      ゲータ―オシレーター指標のバーが2本とも緑であることと赤であることを示すbool変数を作成します。

                                         bool douleGreen = gatorUpValue>gatorUpPreValue1&&gatorUpPreValue1>gatorUpPreValue2&&
                                                           gatorDownValue<gatorDownPreValue1&&gatorDownPreValue1<gatorDownPreValue2;
                                         bool douleRed = gatorUpValue<gatorUpPreValue1&&gatorUpPreValue1<gatorUpPreValue2&&
                                                         gatorDownValue>gatorDownPreValue1&&gatorDownPreValue1>gatorDownPreValue2; 

                                      戦略の条件は次の通りです。

                                      買いシグナルの場合

                                         if(douleGreen&&closingPrice>maValue)
                                           {
                                            Comment("Find a good buy position");
                                           }

                                      売りシグナルの場合

                                         else
                                            if(douleRed&&closingPrice<maValue)
                                              {
                                               Comment("Find a good sell position");
                                              }

                                      その他

                                            else
                                               Comment("");

                                      このコードをコンパイルして、目的のチャートに実行すると、以下のようにEAがチャートに接続されていることがわかります。

                                       Gator with MA戦略の接続

                                      チャートの右上で、Gator with MAがチャートに接続されているのがわかります。

                                      さて、この戦略に基づくシグナルを受信する準備が整ったので、以下にテスト時の例を示します。

                                      買いシグナルの場合

                                      Gator with MA戦略の買いシグナル

                                      前の図のように、左上に「良い買いポジションを探す」シグナルがあります。

                                      売りシグナルの場合

                                      Gator with MA戦略の売りシグナル

                                      見てわかるように、「良い売りポジションを探す」シグナルがあります。

                                      さまざまな戦略に基づいて取引システムを作成する方法を学びました。読者の目は、適用できるさまざまなアイデアに開かれるはずです。これは、この記事と連載の主な目的です。


                                      結論

                                      この記事では、ゲータ―オシレーターを使った取引システムの設計方法についてすべてのテーマをカバーしました。ゲータ―オシレーターとは何か、その計算方法、3つの簡単な取引戦略を通してその使い方を学びました。

                                      • Gator Status Identifier:ゲータ―オシレーターの状態(覚醒、睡眠、捕食、飽食)をさまざまな条件に基づいて判断する
                                      • Gator signals:ゲータ―オシレーターの異なる条件に基づいて、適切な判断(良いエントリを見つける、現在のポジションを保持する、良いエグジットを見つける)のタイミングのシグナルを取得する
                                      • Gator with MA戦略:ゲータ―オシレーターと移動平均指標に基づいて、買いまたは売りポジションのタイミングのシグナルを取得する

                                      その後、言及されたすべての戦略のための取引システムを効果的かつ容易に作成するのに役立つステップバイステップで設計図を作成する方法を学びました。そして、これらの戦略のソースコードをMQL5 IDEで作成し、MetaTrader5の取引プラットフォームで実行される取引システムを作成しました。

                                      この記事が、読者が取引でより良い結果を得るために役立つものであることを願っています。また、このアカウントが、読者の取引業務で使用できる新しいアプローチを見つけたり、この記事のトピックや関連トピックについてより多くの洞察を得るのに役立ったことを願っていますし、類似の記事を他にも読みたい場合は、本連載の他の記事を読んで、最も人気のあるテクニカル指標に基づいて取引システムを設計する方法を学んでください。

                                      MetaQuotes Ltdにより英語から翻訳されました。
                                      元の記事: https://www.mql5.com/en/articles/11928

                                      MQL5の圏論(第2回) MQL5の圏論(第2回)
                                      圏論は数学の一分野であり、多様な広がりを見せていますが、MQL5コミュニティではまだ比較的知られていません。この連載では、その概念のいくつかを紹介し、考察することで、コメントや議論を呼び起こし、トレーダーの戦略開発におけるこの注目すべき分野の利用を促進することを目的としたオープンなライブラリを確立することを目指しています。
                                      MQL5の圏論(第1回) MQL5の圏論(第1回)
                                      圏論は数学の一分野であり、多様な広がりを見せていますが、MQLコミュニティではまだ比較的知られていない分野です。この連載では、その概念のいくつかを紹介して考察することで、コメントや議論を呼び起こし、トレーダーの戦略開発におけるこの注目すべき分野の利用を促進することを目的としたオープンなライブラリを確立することを目指しています。
                                      知っておくべきMQL5ウィザードのテクニック(第05回):マルコフ連鎖 知っておくべきMQL5ウィザードのテクニック(第05回):マルコフ連鎖
                                      マルコフ連鎖は、金融をはじめとする様々な分野で、時系列データのモデル化や予測に利用できる強力な数学的ツールです。金融の時系列モデル化や予測では、株価や為替レートなど、金融資産の時間的変化をモデル化するためにマルコフ連鎖がよく使われます。マルコフ連鎖モデルの大きな利点の1つは、そのシンプルさと使いやすさにあります。
                                      DoEasy - コントロール(第29部):ScrollBar補助コントロール DoEasy - コントロール(第29部):ScrollBar補助コントロール
                                      この記事では、ScrollBar補助コントロール要素とその派生オブジェクト(垂直および水平のスクロールバー)の開発を開始します。スクロールバーは、フォームのコンテンツがコンテナを超えた場合にスクロールするために使用されます。スクロールバーは通常フォームの下部と右側にあります。下部の水平のものはコンテンツを左右にスクロールし、垂直のものは上下にスクロールします。