English Русский 中文 Español Deutsch Português
preview
フィボナッチによる取引システムの設計方法を学ぶ

フィボナッチによる取引システムの設計方法を学ぶ

MetaTrader 5トレーディング | 18 5月 2023, 10:08
1 187 0
Mohamed Abdelmaaboud
Mohamed Abdelmaaboud

はじめに

最も人気のあるテクニカル分析ツールと指標に基づいて取引システムを設計する方法を学習する連載でのこの新記事では、取引において最も人気があって広く使われているテクニカルツールの1つであるフィボナッチリトレースメントに基づいて取引システムを作成する方法を学びます。その後、MetaTrader 5取引ターミナルでこの取引システムを使用することができます。MetaTrader 5に組み込まれているMQL5(MetaQuotes言語5)を使用します。MetaTrader 5とMQL5 IDEのダウンロード方法や使用方法がわからない場合は、以前の記事から「MetaEditorでMQL5コードを書く」をお読みください。

カバーするトピックは次のようになります。

フィボナッチはトレンド分析、支持/抵抗などの他のテクニカルツールと一緒に使用することをお勧めします。その方がより良い洞察と結果が得られるからです。また、この記事または他の場所で学んだ戦略やツールを実際に使用する前には、テストして、取引に有用で有益であることを確認してください。プログラミングスキルを開発するには、読んだことを適用してコードしてみることをお勧めします。このステップは非常に有益です。

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


フィボナッチの定義

このセクションでは、フィボナッチリトレースメントツールを特定し、それをチャートで使用する方法を学びます。FIBOは、チャート上で支持または抵抗の領域を見つけるために使用できるテクニカルツールであり、これらの領域からの反発が予想されます。これは、数学的な数列であるフィボナッチ数列に基づいています。フィボナッチ数列の各数値は、前の2つの数値の合計です。チャートでは、23.6%、38.2%、50%、61.8%(これらは最も人気のあるレベルです)などの特定のレベルで水平線として描かれています。

チャート上でそれを見つける方法をお尋ねの場合、答えは「MetaTrader5で利用可能なテクニカルツールから挿入するだけ」になります。その手順は次のとおりです。

MetaTrader 5を開いた状態で、[挿入]タブ-->[オブジェクト]-->[フィボナッチリトレースメント]に移動します。

FIBOの挿入

その後、上昇トレンドの後にリトレースメントがある場合は、それを安値から高値に引きます。その逆も同様で、下降トレンドの後にリトレースメントがある場合は、高値から安値に引きます。次が例です。

上昇トレンド後のFIBO

FIBO挿入強気

下降トレンド後のFIBO

FIBO挿入弱気

前の例でわかるように、特定のレベル23.6、38.2、50、61.8(これらは最も人気のあるレベルです)の水平線に加えて、最高値と最低値の2点の間にトレンドラインが引かれます。これらのレベル付近および上昇トレンドまたは下降トレンドの後、修正またはリトレースメントが発生し、修正後にこれらのレベルからの反発が予想される場合があります。したがって、FIBOレベルは支持または抵抗のレベルとして機能する可能性があります。

これらのレベルは、描画ツールまたはチャートで右クリックして、メニューからオブジェクトリストを選択し、次にFIBOオブジェクトを選択して、そのツールのウィンドウから制御することもできます。次のウィンドが開きます。

FIBO1

[一般]タブでは、オブジェクトの名前と、線の種類、スタイル、太さなどのスタイルを制御できます。

FIBO2

前の図でわかるように、必要なレベル設定とスタイルも制御および特定できます。

FIBO3

[パラメータ]タブでは、フィボナッチオブジェクトを開始/終了する日付、時刻、値を特定できます。


フィボナッチ戦略

この部分では、2つの異なる方法に基づく簡単な戦略を通じて、フィボナッチリトレースメントの使用方法を学びます。そのうちの1つでは、1日の最後のローソク足に基づいてFIBOレベルを特定します。2つ目では、任意の時間枠のローソク足の数を特定し、それらに基づいてFIBOレベルを特定します。次に、別の戦略を使用して、各方法の特定の事前定義されたFIBOレベルに基づいて特定の売買シグナルを取得します。以下は、これらの戦略の詳細です。

最初の方法:日次データの使用

Simple FIBO System

この戦略では、日足データとステータスに基づいてFIBOリトレースメント価格レベルを取得します。最後の日足が強気の場合、ローソク足の安値から高値までの強気のFIBOと各レベルの価格レベルを取得します。最後の日足が弱気の場合、このローソク足の高値から安値までの赤の弱気FIBOとそのフィボの価格レベルを取得します。

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

最終日の終値>始値==>強気のローソク足

緑のFIBOレベルとこれらのレベルの価格を取得します。  

最終日の終値<始値==>弱気のローソク足

赤のFIBOレベルとこれらのレベルの価格を取得します。

FIBO Signals

この戦略では、強気または弱気のFIBOレベルとして特定したものに基づいて売買エントリを取得します。38.2レベルの強気FIBOを特定した場合、このレベルの価格を買いエントリとして取得し、同じレベルの弱気FIBOを特定した場合、このレベルの価格を売りエントリとして取得します。

2番目の方法:特定のローソクの配列を使用

Simple FIBO System 2

この戦略では、ローソク足の配列に基づいてFIBO価格レベルを取得します。配列の方向に基づいて強気のFIBOがある場合は、そのFIBO価格レベルを取得し、配列の方向に基づいて弱気のFIBOがある場合は、その価格FIBOレベルを取得します。

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

配列の最初のローソク足の始値<同じ配列の最後のローソク足の終値==>強気FIBOの場合、この強気FIBOの価格レベルを取得

配列の最初のローソク足の始値>同じ配列の最後のローソク足の終値==>弱気FIBOの場合、この弱気FIBOの価格レベルを取得

FIBO Signals 2 

この戦略では、ユーザーが入力した希望FIBOレベルに基づいて売買エントリを取得し、エントリレベルにします。前に説明したことに基づいて、強気FIBOがある場合、特定のFIBOレベルの買いエントリレベルを取得します。弱気のFIBOがある場合、特定のFIBOレベルの売りエントリレベルを取得します。


フィボナッチ戦略の設計図

この部分では、視覚的に何をする必要があるかを理解するために、言及された2つの方法のすべての言及された戦略の設計図を見ていきます。

最初の方法:日次データの使用

先に述べたように、1日の最後のローソク足を使用して、始値、終値、高値、安値を特定します。始値と終値を比較することで、ローソク足が強気か弱気かを検出できます。この最後のローソク足の動きのタイプに基づいて、フィボナッチオブジェクトを描画し、目的のシグナルを取得します。

Simple FIBO System

Simple Fibo Systemの設計図

FIBO Signals

FIBO Signalの設計図

2番目の方法:特定のローソク足の配列を使用

前に述べたように、配列で特定の数のローソク足を使用し、最初のローソク足の始値、最後のローソク足の終値、最高値、最低値を特定します。始値と終値を比較することで、ローソク足が強気か弱気かを検出できます。この配列の動きのタイプに基づいて、フィボナッチオブジェクトを描画し、目的のシグナルを取得します。

Simple FIBO System 2

Simple Fibo System 2

FIBO Signals 2

FIBO Signals 2の設計図

フィボナッチ取引システム

この部分では、前述した戦略に基づいて取引システムを作成する方法を学びます。チャート上のフィボナッチレベルをコメントとして返すプログラムを作成します。2つの方法を使用します。最初の方法では、最後の日次データを使用し、それに基づいてフィボナッチレベルを描画します。もう1つの方法では、所定の数のローソク足を使用して配列として使用します。また、これら2つの方法を使用して、フィボナッチに基づいて売買のシグナルを返す方法も学びます。詳細を見てみましょう。

最初の方法:日次データの使用

Simple FIBO System

この戦略では、フィボナッチシステムに日次データを使用します。そのための手順は次のとおりです。

マクロ置換(#define)を使用して必要なオブジェクト名を定義し、コンパイル前にソースコードを前処理します。

#define FIB_OBJ "Fibonacci Retracement"

barTotalの整数変数を作成します。

int barsTotal;

その後、onTickで、iBar関数を割り当ててバーの整数変数を作成し、銘柄の利用可能な履歴バーの数を返します。パラメータは次の通りです。

  • symbol:銘柄(現在の銘柄に適用される_Symbolを使用)
  • timeframe:期間(日次チャートのD1を使用)
int bars = iBars(_Symbol, PERIOD_D1);

barsTotalがバーと等しくない必要があるため、(!=)演算子を使用して、フィボナッチに使用する日足を検出する条件を定めます。同時に、現在の時刻がこの日足の終了時間よりも大きい必要があるため、TimeCurrent関数とStringToTime関数を使用して、時間を含む文字列を日時型の数値に変換します。

if(barsTotal != bars  && TimeCurrent() > StringToTime("00:05"))

条件がtrueの場合、プログラムで次のことをおこないます。

バーをbarTotalに割り当てます。

barsTotal=bars;

ObjectDelete関数を使用してチャート上のFIB_OBJを削除します。パラメータは次のとおりです。

  • chart_id:チャートID(現在のチャートを意味する0を使用) 
  • name:オブジェクト名(FIB_OBJ)
ObjectDelete(0,FIB_OBJ);

iOpen、iClose、iHigh、iLow関数を使用して4つの価格変数(open、 close、high、low)を作成し、日足の価格を返します。パラメータは次のとおりです。

  • symbol:銘柄(現在の銘柄に適用される_Symbolを使用)
  • timeframe:時間枠(日時時間枠のPERIOD_D1)を使用)
  • shift:時系列から受け取った値のインデックス(不使用)
      double open = iOpen(_Symbol,PERIOD_D1,1);
      double close = iClose(_Symbol,PERIOD_D1,1);
      double high = iHigh(_Symbol,PERIOD_D1,1);
      double low = iLow(_Symbol,PERIOD_D1,1);

後でフィボナッチオブジェクトを描画するために使用する開始時刻と終了時刻を特定します。バーの開いた時間を返すiTime関数を使用します。パラメータは次の通りです。

  • symbol:銘柄(現在の銘柄に適用される_Symbolを使用)
  • timeframe:時間枠(日時時間枠のPERIOD_D1を使用)
  • shift:時系列から受け取った値のインデックス(開始時刻に1、終了時刻に0を使用)

終了時刻については戻り値から1を減算します。この計算の時点で現在の日足は新しい日のものであるが、前の日足を検出するためです。

      datetime startingTime = iTime(_Symbol,PERIOD_D1,1);
      datetime endingTime = iTime(_Symbol,PERIOD_D1,0)-1;

その後、if-else条件演算子を使用して2つの条件を設定し、フィボナッチオブジェクトを描画します。

終値が始値よりも大きい場合は、強気のローソク足であり、次を実行します。

ObjectCreate関数を使用してオブジェクトを作成し、指定された文字でオブジェクトを描画します。パラメータは次の通りです。

  • chart_id:チャート(0で現在のチャートを指定)
  • name:オブジェクトの名前(FIB_OBJを使用)
  • type:オブジェクトタイプ(フィボナッチリトレースメントのOBJ_FIBOを使用)
  • nwin:ウィンドウインデックス(メインウィンドウの0を使用)
  • time1:最初のポイントの時間(開始時間を使用)
  • price1:最初のポイントの価格(安値を使用)
  • timeN=0:最後のポイントの時間(終了時間を使用)
  • priceN=0:最後のポイントの価格(高値を使用)

ObjectSetIntegerとforループ演算子を使用して、バーの方向に合わせてオブジェクトの色を更新します。ObjectSetIntegerのパラメータは次のとおりです。

  • chart_id:チャート(0で現在のチャートを指定)
  • name:オブジェクトの名前(FIB_OBJを使用)
  • prop_id:プロパティID。(色のOBJPROP_COLORを使用)
  • prop_value:プロパティ値(clrGreenを使用)
  • forループを使用して、オブジェクトの色を継続的に更新。
フィボナッチレベルの定義、23.6-38.2-50-61.8-100。最終日、始値と終値をチャートにコメントします。
      if(close>open)
        {
         ObjectCreate(0,FIB_OBJ,OBJ_FIBO,0,startingTime,low,endingTime,high);
         ObjectSetInteger(0,FIB_OBJ,OBJPROP_COLOR,clrGreen);
         for(int i = 0; i < ObjectGetInteger(0,FIB_OBJ,OBJPROP_LEVELS); i++)
           {
            ObjectSetInteger(0,FIB_OBJ,OBJPROP_LEVELCOLOR,i,clrGreen);
           }
         double fibRetracLvl1 = NormalizeDouble(high - (high-low) * 23.6 / 100,_Digits);
         double fibRetracLvl2 = NormalizeDouble(high - (high-low) * 38.2 / 100,_Digits);
         double fibRetracLvl3 = NormalizeDouble(high - (high-low) * 50 / 100,_Digits);
         double fibRetracLvl4 = NormalizeDouble(high - (high-low) * 61.8 / 100,_Digits);
         double fibRetracLvl5 = NormalizeDouble(high - (high-low) * 100 / 100,_Digits);
         Comment("Last Day Open = ",open,"\n",
                 "Last Day Close = ",close,"\n",
                 "Fib lvl 0% = ",high,"\n",
                 "Fib lvl 23.6% = ",fibRetracLvl1,"\n",
                 "Fib lvl 38.2% = ",fibRetracLvl2,"\n",
                 "Fib lvl 50% = ",fibRetracLvl3,"\n",
                 "Fib lvl 61.8% = ",fibRetracLvl4,"\n",
                 "Fib lvl 100% = ",fibRetracLvl5);
        }

弱気の場合もほぼ同じですが、違いは次のようになります。

  • 高値から安値にオブジェクトを作成する
  • オブジェクトの色は赤
      else
        {
         ObjectCreate(0,FIB_OBJ,OBJ_FIBO,0,startingTime,high,endingTime,low);
         ObjectSetInteger(0,FIB_OBJ,OBJPROP_COLOR,clrRed);
         for(int i = 0; i < ObjectGetInteger(0,FIB_OBJ,OBJPROP_LEVELS); i++)
           {
            ObjectSetInteger(0,FIB_OBJ,OBJPROP_LEVELCOLOR,i,clrRed);
           }
         double fibRetracLvl1 = NormalizeDouble(low + (high-low) * 23.6 / 100,_Digits);
         double fibRetracLvl2 = NormalizeDouble(low + (high-low) * 38.2 / 100,_Digits);
         double fibRetracLvl3 = NormalizeDouble(low + (high-low) * 50 / 100,_Digits);
         double fibRetracLvl4 = NormalizeDouble(low + (high-low) * 61.8 / 100,_Digits);
         double fibRetracLvl5 = NormalizeDouble(low + (high-low) * 100 / 100,_Digits);
         Comment("Last Day Open = ",open,"\n",
                 "Last Day Close = ",close,"\n",
                 "Fib lvl 0% = ",low,"\n",
                 "Fib lvl 23.6% = ",fibRetracLvl1,"\n",
                 "Fib lvl 38.2% = ",fibRetracLvl2,"\n",
                 "Fib lvl 50% = ",fibRetracLvl3,"\n",
                 "Fib lvl 61.8% = ",fibRetracLvl4,"\n",
                 "Fib lvl 100% = ",fibRetracLvl5);
        }

この戦略の完全なコードは以下の通りです。

//+------------------------------------------------------------------+
//|                                         Simple Fibo System#2.mq5 |
//|                                  Copyright 2023, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#define FIB_OBJ "Fibonacci Retracement"
#property script_show_inputs
input double fibRetracLvl = 38.2;
int barsTotal;
//+------------------------------------------------------------------+
void OnTick()
  {

   int bars = iBars(_Symbol, PERIOD_D1);
   if(barsTotal != bars  && TimeCurrent() > StringToTime("00:05"))
     {
      barsTotal=bars;
      ObjectDelete(0,FIB_OBJ);
      double open = iOpen(_Symbol,PERIOD_D1,1);
      double close = iClose(_Symbol,PERIOD_D1,1);
      double closeCandle = iClose(_Symbol,_Period,1);
      double high = iHigh(_Symbol,PERIOD_D1,1);
      double low = iLow(_Symbol,PERIOD_D1,1);
      datetime startingTime = iTime(_Symbol,PERIOD_D1,1);
      datetime endingTime = iTime(_Symbol,PERIOD_D1,0)-1;
      if(close>open)
        {
         ObjectCreate(0,FIB_OBJ,OBJ_FIBO,0,startingTime,low,endingTime,high);
         ObjectSetInteger(0,FIB_OBJ,OBJPROP_COLOR,clrGreen);
         for(int i = 0; i < ObjectGetInteger(0,FIB_OBJ,OBJPROP_LEVELS); i++)
           {
            ObjectSetInteger(0,FIB_OBJ,OBJPROP_LEVELCOLOR,i,clrGreen);
           }
         double fibRetracLvl1 = NormalizeDouble(high - (high-low) * 23.6 / 100,_Digits);
         double fibRetracLvl2 = NormalizeDouble(high - (high-low) * 38.2 / 100,_Digits);
         double fibRetracLvl3 = NormalizeDouble(high - (high-low) * 50 / 100,_Digits);
         double fibRetracLvl4 = NormalizeDouble(high - (high-low) * 61.8 / 100,_Digits);
         double fibRetracLvl5 = NormalizeDouble(high - (high-low) * 100 / 100,_Digits);
         double entryLvl = NormalizeDouble(high - (high-low) * fibRetracLvl /100,_Digits);
         Comment("Last Day Open = ",open,"\n",
                 "Last Day Close = ",close,"\n",
                 "Buy Entry Price: ",entryLvl,"\n",
                 "Close: ",closeCandle,"\n");
        }
      else
        {
         ObjectCreate(0,FIB_OBJ,OBJ_FIBO,0,startingTime,high,endingTime,low);
         ObjectSetInteger(0,FIB_OBJ,OBJPROP_COLOR,clrRed);
         for(int i = 0; i < ObjectGetInteger(0,FIB_OBJ,OBJPROP_LEVELS); i++)
           {
            ObjectSetInteger(0,FIB_OBJ,OBJPROP_LEVELCOLOR,i,clrRed);
           }
         double fibRetracLvl1 = NormalizeDouble(low + (high-low) * 23.6 / 100,_Digits);
         double fibRetracLvl2 = NormalizeDouble(low + (high-low) * 38.2 / 100,_Digits);
         double fibRetracLvl3 = NormalizeDouble(low + (high-low) * 50 / 100,_Digits);
         double fibRetracLvl4 = NormalizeDouble(low + (high-low) * 61.8 / 100,_Digits);
         double fibRetracLvl5 = NormalizeDouble(low + (high-low) * 100 / 100,_Digits);
         double entryLvl = NormalizeDouble(low + (high-low) * fibRetracLvl /100,_Digits);
           {
            Comment("Last Day Open = ",open,"\n",
                    "Last Day Close = ",close,"\n",
                    "Sell Entry Price: ",entryLvl,"\n",
                    "Close: ",closeCandle);
           }
        }
     }
  }
//+------------------------------------------------------------------+

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

//+------------------------------------------------------------------+
//|                                         Simple Fibo System#1.mq5 |
//|                                  Copyright 2023, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#define FIB_OBJ "Fibonacci Retracement"
int barsTotal;
//+------------------------------------------------------------------+
void OnTick()
  {
   int bars = iBars(_Symbol, PERIOD_D1);
   if(barsTotal != bars  && TimeCurrent() > StringToTime("00:05"))
     {
      barsTotal=bars;
      ObjectDelete(0,FIB_OBJ);
      double open = iOpen(_Symbol,PERIOD_D1,1);
      double close = iClose(_Symbol,PERIOD_D1,1);
      double high = iHigh(_Symbol,PERIOD_D1,1);
      double low = iLow(_Symbol,PERIOD_D1,1);
      datetime startingTime = iTime(_Symbol,PERIOD_D1,1);
      datetime endingTime = iTime(_Symbol,PERIOD_D1,0)-1;
      if(close>open)
        {
         ObjectCreate(0,FIB_OBJ,OBJ_FIBO,0,startingTime,low,endingTime,high);
         ObjectSetInteger(0,FIB_OBJ,OBJPROP_COLOR,clrGreen);
         for(int i = 0; i < ObjectGetInteger(0,FIB_OBJ,OBJPROP_LEVELS); i++)
           {
            ObjectSetInteger(0,FIB_OBJ,OBJPROP_LEVELCOLOR,i,clrGreen);
           }
         double fibRetracLvl1 = NormalizeDouble(high - (high-low) * 23.6 / 100,_Digits);
         double fibRetracLvl2 = NormalizeDouble(high - (high-low) * 38.2 / 100,_Digits);
         double fibRetracLvl3 = NormalizeDouble(high - (high-low) * 50 / 100,_Digits);
         double fibRetracLvl4 = NormalizeDouble(high - (high-low) * 61.8 / 100,_Digits);
         double fibRetracLvl5 = NormalizeDouble(high - (high-low) * 100 / 100,_Digits);
         Comment("Last Day Open = ",open,"\n",
                 "Last Day Close = ",close,"\n",
                 "Fib lvl 0% = ",high,"\n",
                 "Fib lvl 23.6% = ",fibRetracLvl1,"\n",
                 "Fib lvl 38.2% = ",fibRetracLvl2,"\n",
                 "Fib lvl 50% = ",fibRetracLvl3,"\n",
                 "Fib lvl 61.8% = ",fibRetracLvl4,"\n",
                 "Fib lvl 100% = ",fibRetracLvl5);
        }
      else
        {
         ObjectCreate(0,FIB_OBJ,OBJ_FIBO,0,startingTime,high,endingTime,low);
         ObjectSetInteger(0,FIB_OBJ,OBJPROP_COLOR,clrRed);
         for(int i = 0; i < ObjectGetInteger(0,FIB_OBJ,OBJPROP_LEVELS); i++)
           {
            ObjectSetInteger(0,FIB_OBJ,OBJPROP_LEVELCOLOR,i,clrRed);
           }
         double fibRetracLvl1 = NormalizeDouble(low + (high-low) * 23.6 / 100,_Digits);
         double fibRetracLvl2 = NormalizeDouble(low + (high-low) * 38.2 / 100,_Digits);
         double fibRetracLvl3 = NormalizeDouble(low + (high-low) * 50 / 100,_Digits);
         double fibRetracLvl4 = NormalizeDouble(low + (high-low) * 61.8 / 100,_Digits);
         double fibRetracLvl5 = NormalizeDouble(low + (high-low) * 100 / 100,_Digits);
         Comment("Last Day Open = ",open,"\n",
                 "Last Day Close = ",close,"\n",
                 "Fib lvl 0% = ",low,"\n",
                 "Fib lvl 23.6% = ",fibRetracLvl1,"\n",
                 "Fib lvl 38.2% = ",fibRetracLvl2,"\n",
                 "Fib lvl 50% = ",fibRetracLvl3,"\n",
                 "Fib lvl 61.8% = ",fibRetracLvl4,"\n",
                 "Fib lvl 100% = ",fibRetracLvl5);
        }
     }
  }
//+------------------------------------------------------------------+

このコードをエラーなしでコンパイルして実行した後、強気と弱気のケースのテストから、次の例と同じシグナルを見つけることができます。

日足が強気

Simple Fibo System - 強気 - 日次

FIBOは安値から高値に描かれ、色は緑色で、FIBOレベルとその日の開閉は、日次で見つけたものと同じであることがわかります。次の図はそのためのものです。

Simple Fibo System - 強気

前の図と強気の日足からわかるように、FIBOは安値から高値へと描かれ、その色は緑色です。さらに次の値でチャートにコメントします。

  • Last day open ==>日足チャートデータウィンドウと同じ
  • Last day close ==>日足チャートと同じ
  • 5つのフィボナッチリトレースメントの価格レベル

日足が弱気

Simple FIBO System - 弱気 - 日次

FIBOは高値から安値に描かれ、色は赤で、FIBOレベルとその日の開閉は、日次で見つけたものと同じであることがわかります。次の図はそのためのものです。

Simple FIBO System - 弱気

前の図と毎日の弱気バーからわかるように、FIBOは高値から安値に描画され、その色は赤です。さらにチャートには次の値のコメントがあります。

  • Last day open ==>日足チャートデータウィンドウと同じ
  • Last day close ==>日足チャートと同じ
  • 5つのフィボナッチリトレースメントの価格レベル

FIBO Signals

この方法では、FIBOレベルに基づいてエントリレベルのユーザー入力に基づいて売買シグナルを返すことができる取引システムを作成します。以下は、それをおこなうための完全なコードです。

//+------------------------------------------------------------------+
//|                                         Simple Fibo System#2.mq5 |
//|                                  Copyright 2023, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#define FIB_OBJ "Fibonacci Retracement"
#property script_show_inputs
input double fibRetracLvl = 38.2;
int barsTotal;
//+------------------------------------------------------------------+
void OnTick()
  {

   int bars = iBars(_Symbol, PERIOD_D1);
   if(barsTotal != bars  && TimeCurrent() > StringToTime("00:05"))
     {
      barsTotal=bars;
      ObjectDelete(0,FIB_OBJ);
      double open = iOpen(_Symbol,PERIOD_D1,1);
      double close = iClose(_Symbol,PERIOD_D1,1);
      double closeCandle = iClose(_Symbol,_Period,1);
      double high = iHigh(_Symbol,PERIOD_D1,1);
      double low = iLow(_Symbol,PERIOD_D1,1);
      datetime startingTime = iTime(_Symbol,PERIOD_D1,1);
      datetime endingTime = iTime(_Symbol,PERIOD_D1,0)-1;
      if(close>open)
        {
         ObjectCreate(0,FIB_OBJ,OBJ_FIBO,0,startingTime,low,endingTime,high);
         ObjectSetInteger(0,FIB_OBJ,OBJPROP_COLOR,clrGreen);
         for(int i = 0; i < ObjectGetInteger(0,FIB_OBJ,OBJPROP_LEVELS); i++)
           {
            ObjectSetInteger(0,FIB_OBJ,OBJPROP_LEVELCOLOR,i,clrGreen);
           }
         double fibRetracLvl1 = NormalizeDouble(high - (high-low) * 23.6 / 100,_Digits);
         double fibRetracLvl2 = NormalizeDouble(high - (high-low) * 38.2 / 100,_Digits);
         double fibRetracLvl3 = NormalizeDouble(high - (high-low) * 50 / 100,_Digits);
         double fibRetracLvl4 = NormalizeDouble(high - (high-low) * 61.8 / 100,_Digits);
         double fibRetracLvl5 = NormalizeDouble(high - (high-low) * 100 / 100,_Digits);
         double entryLvl = NormalizeDouble(high - (high-low) * fibRetracLvl /100,_Digits);
         Comment("Last Day Open = ",open,"\n",
                 "Last Day Close = ",close,"\n",
                 "Buy Entry Price: ",entryLvl);
        }
      else
        {
         ObjectCreate(0,FIB_OBJ,OBJ_FIBO,0,startingTime,high,endingTime,low);
         ObjectSetInteger(0,FIB_OBJ,OBJPROP_COLOR,clrRed);
         for(int i = 0; i < ObjectGetInteger(0,FIB_OBJ,OBJPROP_LEVELS); i++)
           {
            ObjectSetInteger(0,FIB_OBJ,OBJPROP_LEVELCOLOR,i,clrRed);
           }
         double fibRetracLvl1 = NormalizeDouble(low + (high-low) * 23.6 / 100,_Digits);
         double fibRetracLvl2 = NormalizeDouble(low + (high-low) * 38.2 / 100,_Digits);
         double fibRetracLvl3 = NormalizeDouble(low + (high-low) * 50 / 100,_Digits);
         double fibRetracLvl4 = NormalizeDouble(low + (high-low) * 61.8 / 100,_Digits);
         double fibRetracLvl5 = NormalizeDouble(low + (high-low) * 100 / 100,_Digits);
         double entryLvl = NormalizeDouble(low + (high-low) * fibRetracLvl /100,_Digits);
           {
            Comment("Last Day Open = ",open,"\n",
                    "Last Day Close = ",close,"\n",
                    "Sell Entry Price: ",entryLvl);
           }
        }
     }
  }
//+------------------------------------------------------------------+

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

プロパティを含むウィンドウを表示する#propertyscript_show_inputsを使用して、ユーザー入力ウィンドウを表示するプロパティを追加します。

#property script_show_inputs

入力変数を使用して、デフォルト値38.2でfibRetracLvlのdoubleデータ型を作成します。

input double fibRetracLvl = 38.2;

ユーザー入力に基づいてエントリレベルを定義します(強気)。

double entryLvl = NormalizeDouble(high - (high-low) * fibRetracLvl /100,_Digits);

ユーザー入力に基づいてエントリレベルを定義します(弱気)。

double entryLvl = NormalizeDouble(low + (high-low) * fibRetracLvl /100,_Digits);

チャートにコメントします(強気)。

         Comment("Last Day Open = ",open,"\n",
                 "Last Day Close = ",close,"\n",
                 "Buy Entry Price: ",entryLvl,"\n",
                 "Close: ",closeCandle,"\n");

チャートにコメントします(弱気)。

            Comment("Last Day Open = ",open,"\n",
                    "Last Day Close = ",close,"\n",
                    "Sell Entry Price: ",entryLvl,"\n",
                    "Close: ",closeCandle);

このコードをコンパイルして実行すると、シグナルを受信する準備が整い、強気と弱気のケースのテストの例が表示されます。

日足が強気

FIBO Signal - 強気 - 日次

描画された緑色のフィボが15分で低値から高値に変化し、最終日の始値と終値は日足チャートと同じであり、エントリレベルは38.2の隣の同じ価格レベルであると想定されます。15分足チャートの場合は次のとおりです。

FIBO Signal - 強気

前の15分間のチャートでわかるように、次の値は、特定したものと同じです。

  • Last day open ==> 日足チャートと同じ
  • Last day closed ==> 日足チャートと同じ
  • Buy entry price ==> 38.2FIBOレベルの隣と同じ価格レベル

日足が弱気

FIBO Signal - 弱気 - 日次

15分足チャートをチェックして、取引戦略に基づいたシグナルを取得します。これは、FIBOレベル38.2に基づく売りエントリレベルを示すはずです。次の図で確認してみましょう。

FIBO Signal - 弱気

ご覧のとおり、15分足チャートのシグナルとして次の値があります。

  • Last day open ==> 日足チャートと同じ
  • Last day closed ==> 日足チャートと同じ
  • Sell entry price ==>38.2FIBOレベルの隣の同じレベル

2番目の方法:特定のローソクの配列を使用

Simple FIBO System 2

この方法では、フィボナッチの作成に使用する所定の数のローソク足を使用します。以下は、それを別の方法でおこなう手順です。

#defineを使用してFIB_OBJを定義します。

#define FIB_OBJ "Fibonacci Retracement"

最高ローソク足と最低ローソク足の2つの整数変数を作成します。

int highestCandle, lowestCandle;

highとlowの2つの配列を作成します。

double high[],low[];

ArraySetAsSeries関数を使用して、high配列とlow配列のデータを並べ替えます。そのパラメータは次の通りです。

  • array[]:作成されたhigh配列とlow配列
  • flag:配列のインデックス方向(true)
ArraySetAsSeries(high,true);
ArraySetAsSeries(low,true);

CopyHighとCopyLowを使用して、履歴データの最高値と最低値を取得します。CopyHighパラメータは次のとおりです。

  • symbol_name:現在の銘柄(_Symbolを使用)
  • timeframe:時間枠(_Periodを使用) 
  • start_pos:開始位置(現在のローソク足に0を使用)
  • count:コピーするデータカウント(100を使用)
  • high_array[]:ターゲット配列を特定(作成されたhigh配列を使用)

CopyLowパラメータは同じですが、ターゲット配列はlow配列で作成されます。

CopyHigh(_Symbol,_Period,0,100,high);
CopyLow(_Symbol,_Period,0,100,low);

iOpen関数とiClose関数を使用して、配列内の最初のローソク足の始値と配列内の最後のローソク足の終値を定義します。

double openCandle = iOpen(_Symbol,_Period,100);
double closeCandle = iClose(_Symbol,_Period,1);

ArrayMaximumおよびArrayMinimumローソク足を使用して、作成された高値配列と安値配列の最高値と最低値を定義します。 そのパラメータは次の通りです。

  • array[]:最大値にhighを使用し、最小値にlowを使用
  • start=0:チェックを開始するインデックス(0を使用)
  • count:チェックする要素の数(100またはWHOLE_ARRAYを使用)
highestCandle=ArrayMaximum(high,0,100);
lowestCandle=ArrayMinimum(low,0,100);

MqlRates関数を使用して価格の配列を作成し、価格に関する情報を格納し、ArraySetAsSeries関数を使用してこの配列にデータを並べ替えます。

MqlRates pArray[];
ArraySetAsSeries(pArray,true);

CopyRatesの関数によってMqlRatesから履歴データを取得します。パラメータは次の通りです。

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

ObjectGetIntegerとObjectGetDoubleを使用してdateTimeと0レベルと100レベルの価格を定義します。

datetime dTlvl0 = ObjectGetInteger(0,"Fibonacci Retracement",OBJPROP_TIME,0);
double PriceFibLvl00 = ObjectGetDouble(0,"Fibonacci Retracement",OBJPROP_PRICE,0);
datetime dTlvl1 = ObjectGetInteger(0,"Fibonacci Retracement",OBJPROP_TIME,1);
double PriceFibLvl0 = ObjectGetDouble(0,"Fibonacci Retracement",OBJPROP_PRICE,1);

if-else演算子を使用して、強気と弱気のケースの条件を設定します。

強気の場合(CloseCandleがopenCandleより大きい)、次の手順を実行します。

  • ObjectDeleteを使用して、以前に描画されたFIBOオブジェクトを削除
  • ObjectCreateを使用して、配列の低い方から高い方へ新しいFIBOオブジェクトを作成
  • ObjectSetIntegerを使用してFIBOオブジェクトの色を緑色に更新し、場合によっては継続更新用のforループを使用
  • 高値と安値の差をとって価格帯を定義
  • FIBOレベルを定義(23.6-38.2-50-61.8)
  • ArrayOpen、ArrayClose、FIBOレベルをチャートにコメント
   if(closeCandle>openCandle)
     {
      ObjectDelete(_Symbol, "Fibonacci Retracement");
      ObjectCreate(_Symbol, "Fibonacci Retracement",OBJ_FIBO,0,pArray[100].time,
                   pArray[lowestCandle].low,pArray[0].time,pArray[highestCandle].high);
      ObjectSetInteger(0,FIB_OBJ,OBJPROP_COLOR,clrGreen);
      for(int i = 0; i < ObjectGetInteger(0,FIB_OBJ,OBJPROP_LEVELS); i++)
        {
         ObjectSetInteger(0,FIB_OBJ,OBJPROP_LEVELCOLOR,i,clrGreen);
        }
      double pRange =  PriceFibLvl0 - PriceFibLvl00;
      double PriceFibLvl1 = NormalizeDouble (PriceFibLvl0 - pRange * 23.6/100,_Digits);
      double PriceFibLvl2 = NormalizeDouble (PriceFibLvl0 - pRange * 38.2/100,_Digits);
      double PriceFibLvl3 = NormalizeDouble (PriceFibLvl0 - pRange * 50/100,_Digits);
      double PriceFibLvl4 = NormalizeDouble(PriceFibLvl0 - pRange * 61.8/100,_Digits);
      Comment("Array Open: ",openCandle,"\n",
              "Array Close: ",closeCandle,"\n",
              "Fib lvl 0% = ",PriceFibLvl0,"\n",
              "Fib lvl 23.6% = ",PriceFibLvl1,"\n",
              "Fib lvl 38.2% = ",PriceFibLvl2,"\n",
              "Fib lvl 50% = ",PriceFibLvl3,"\n",
              "Fib lvl 61.8% = ",PriceFibLvl4,"\n",
              "Fib lvl 100% = ",PriceFibLvl00);
     }

弱気(CloseCandleがopenCandleよりも低い)の場合、次の手順を実行します。

  • ObjectDeleteを使用して、以前に描画されたFIBOオブジェクトを削除
  • ObjectCreateを使用して、配列の高いほうから低いほうまで新しいFIBOオブジェクトを作成
  • ObjectSetIntegerを使用してFIBOオブジェクトの色を赤色に更新し、場合によっては継続更新用のforループを使用
  • 安値と高値の差をとって価格帯を定義
  • FIBOレベルを定義(23.6-38.2-50-61.8)
  • ArrayOpen、ArrayClose、FIBOレベルをチャートにコメント
   else
     {
      ObjectDelete(_Symbol, "Fibonacci Retracement");
      ObjectCreate(_Symbol, "Fibonacci Retracement",OBJ_FIBO,0,pArray[100].time,
                   pArray[highestCandle].high,pArray[0].time,pArray[lowestCandle].low);
      ObjectSetInteger(0,FIB_OBJ,OBJPROP_COLOR,clrRed);
      for(int i = 0; i < ObjectGetInteger(0,FIB_OBJ,OBJPROP_LEVELS); i++)
        {
         ObjectSetInteger(0,FIB_OBJ,OBJPROP_LEVELCOLOR,i,clrRed);
        }
      double pRange =  PriceFibLvl00 - PriceFibLvl0;
      double PriceFibLvl1 = NormalizeDouble (PriceFibLvl0 + pRange * 23.6/100,_Digits);
      double PriceFibLvl2 = NormalizeDouble (PriceFibLvl0 + pRange * 38.2/100,_Digits);
      double PriceFibLvl3 = NormalizeDouble(PriceFibLvl0 + pRange * 50/100,_Digits);
      double PriceFibLvl4 = NormalizeDouble (PriceFibLvl0 + pRange * 61.8/100,_Digits);
      Comment("Array Open: ",openCandle,"\n",
              "Array Close: ",closeCandle,"\n",
              "Fib lvl 0% = ",PriceFibLvl0,"\n",
              "Fib lvl 23.6% = ",PriceFibLvl1,"\n",
              "Fib lvl 38.2% = ",PriceFibLvl2,"\n",
              "Fib lvl 50% = ",PriceFibLvl3,"\n",
              "Fib lvl 61.8% = ",PriceFibLvl4,"\n",
              "Fib lvl 100% = ",PriceFibLvl00);
     }

完全なコードは次のとおりです。

//+------------------------------------------------------------------+
//|                                         Simple Fibo System 2.mq5 |
//|                                  Copyright 2023, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#define FIB_OBJ "Fibonacci Retracement"
//+------------------------------------------------------------------+
void OnTick()
  {
   int highestCandle, lowestCandle;
   double high[],low[];
   ArraySetAsSeries(high,true);
   ArraySetAsSeries(low,true);
   CopyHigh(_Symbol,_Period,0,100,high);
   CopyLow(_Symbol,_Period,0,100,low);
   double openCandle = iOpen(_Symbol,_Period,100);
   double closeCandle = iClose(_Symbol,_Period,1);
   highestCandle=ArrayMaximum(high,0,100);
   lowestCandle=ArrayMinimum(low,0,100);
   MqlRates pArray[];
   ArraySetAsSeries(pArray,true);
   int pData=CopyRates(_Symbol,_Period,0,Bars(_Symbol,_Period),pArray);
   datetime dTlvl0 = ObjectGetInteger(0,"Fibonacci Retracement",OBJPROP_TIME,0);
   double PriceFibLvl00 = ObjectGetDouble(0,"Fibonacci Retracement",OBJPROP_PRICE,0);
   datetime dTlvl1 = ObjectGetInteger(0,"Fibonacci Retracement",OBJPROP_TIME,1);
   double PriceFibLvl0 = ObjectGetDouble(0,"Fibonacci Retracement",OBJPROP_PRICE,1);
   if(closeCandle>openCandle)
     {
      ObjectDelete(_Symbol, "Fibonacci Retracement");
      ObjectCreate(_Symbol, "Fibonacci Retracement",OBJ_FIBO,0,pArray[100].time,
                   pArray[lowestCandle].low,pArray[0].time,pArray[highestCandle].high);
      ObjectSetInteger(0,FIB_OBJ,OBJPROP_COLOR,clrGreen);
      for(int i = 0; i < ObjectGetInteger(0,FIB_OBJ,OBJPROP_LEVELS); i++)
        {
         ObjectSetInteger(0,FIB_OBJ,OBJPROP_LEVELCOLOR,i,clrGreen);
        }
      double pRange =  PriceFibLvl0 - PriceFibLvl00;
      double PriceFibLvl1 = NormalizeDouble (PriceFibLvl0 - pRange * 23.6/100,_Digits);
      double PriceFibLvl2 = NormalizeDouble (PriceFibLvl0 - pRange * 38.2/100,_Digits);
      double PriceFibLvl3 = NormalizeDouble (PriceFibLvl0 - pRange * 50/100,_Digits);
      double PriceFibLvl4 = NormalizeDouble(PriceFibLvl0 - pRange * 61.8/100,_Digits);
      Comment("Array Open: ",openCandle,"\n",
              "Array Close: ",closeCandle,"\n",
              "Fib lvl 0% = ",PriceFibLvl0,"\n",
              "Fib lvl 23.6% = ",PriceFibLvl1,"\n",
              "Fib lvl 38.2% = ",PriceFibLvl2,"\n",
              "Fib lvl 50% = ",PriceFibLvl3,"\n",
              "Fib lvl 61.8% = ",PriceFibLvl4,"\n",
              "Fib lvl 100% = ",PriceFibLvl00);
     }
   else
     {
      ObjectDelete(_Symbol, "Fibonacci Retracement");
      ObjectCreate(_Symbol, "Fibonacci Retracement",OBJ_FIBO,0,pArray[100].time,
                   pArray[highestCandle].high,pArray[0].time,pArray[lowestCandle].low);
      ObjectSetInteger(0,FIB_OBJ,OBJPROP_COLOR,clrRed);
      for(int i = 0; i < ObjectGetInteger(0,FIB_OBJ,OBJPROP_LEVELS); i++)
        {
         ObjectSetInteger(0,FIB_OBJ,OBJPROP_LEVELCOLOR,i,clrRed);
        }
      double pRange =  PriceFibLvl00 - PriceFibLvl0;
      double PriceFibLvl1 = NormalizeDouble (PriceFibLvl0 + pRange * 23.6/100,_Digits);
      double PriceFibLvl2 = NormalizeDouble (PriceFibLvl0 + pRange * 38.2/100,_Digits);
      double PriceFibLvl3 = NormalizeDouble(PriceFibLvl0 + pRange * 50/100,_Digits);
      double PriceFibLvl4 = NormalizeDouble (PriceFibLvl0 + pRange * 61.8/100,_Digits);
      Comment("Array Open: ",openCandle,"\n",
              "Array Close: ",closeCandle,"\n",
              "Fib lvl 0% = ",PriceFibLvl0,"\n",
              "Fib lvl 23.6% = ",PriceFibLvl1,"\n",
              "Fib lvl 38.2% = ",PriceFibLvl2,"\n",
              "Fib lvl 50% = ",PriceFibLvl3,"\n",
              "Fib lvl 61.8% = ",PriceFibLvl4,"\n",
              "Fib lvl 100% = ",PriceFibLvl00);
     }
  }
//+------------------------------------------------------------------+

このコードをコンパイルして実行すると、EAに従って次のシグナルを見つけることができます。以下は、テストからのシグナルの例です。

配列が強気の場合

Simple Fibo System 2 - 強気

チャートに緑色のFIBOオブジェクトがあり、このEAに従って次の値でチャートの左上にコメントがあることがわかります。

  • Array open ==>配列の最初のローソク足の始値
  • Array close ==>配列の最後のローソク足の終値
  • FIBOレベル0、23.6、38.2、50、61.8、100

配列が弱気の場合

Simple Fibo System 2 - 弱気

チャートに赤いFIBOオブジェクトがあり、このEAに従って次の値でチャートの左上にコメントがあることがわかります。

  • Array open ==>配列の最初のローソク足の始値
  • Array close ==>配列の最後のローソク足の終値
  • FIBOレベル0、23.6、38.2、50、61.8、100

FIBO Signals 2

次に、2番目の方法に基づき、ユーザーが入力したFIBOレベルに基づいて売買シグナルを返す取引システムを作成します。この取引システムを作るための設計図は以下の通りです。

//+------------------------------------------------------------------+
//|                                               Fibo Signals 2.mq5 |
//|                                  Copyright 2023, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#define FIB_OBJ "Fibonacci Retracement"
#property script_show_inputs
input double fibRetracLvl = 38.2;
//+------------------------------------------------------------------+
void OnTick()
  {
   int highestCandle, lowestCandle;
   double high[],low[];
   ArraySetAsSeries(high,true);
   ArraySetAsSeries(low,true);
   CopyHigh(_Symbol,_Period,0,100,high);
   CopyLow(_Symbol,_Period,0,100,low);
   double openCandle = iOpen(_Symbol,_Period,100);
   double closeCandle = iClose(_Symbol,_Period,1);
   highestCandle=ArrayMaximum(high,0,100);
   lowestCandle=ArrayMinimum(low,0,100);
   MqlRates pArray[];
   ArraySetAsSeries(pArray,true);
   int pData=CopyRates(_Symbol,_Period,0,Bars(_Symbol,_Period),pArray);
   datetime dTlvl0 = ObjectGetInteger(0,"Fibonacci Retracement",OBJPROP_TIME,0);
   double PriceFibLvl00 = ObjectGetDouble(0,"Fibonacci Retracement",OBJPROP_PRICE,0);
   datetime dTlvl1 = ObjectGetInteger(0,"Fibonacci Retracement",OBJPROP_TIME,1);
   double PriceFibLvl0 = ObjectGetDouble(0,"Fibonacci Retracement",OBJPROP_PRICE,1);
   if
   (closeCandle>openCandle)
     {
      ObjectDelete(_Symbol, "Fibonacci Retracement");
      ObjectCreate(_Symbol, "Fibonacci Retracement",OBJ_FIBO,0,pArray[100].time,
                   pArray[lowestCandle].low,pArray[0].time,pArray[highestCandle].high);
      ObjectSetInteger(0,FIB_OBJ,OBJPROP_COLOR,clrGreen);
      for(int i = 0; i < ObjectGetInteger(0,FIB_OBJ,OBJPROP_LEVELS); i++)
        {
         ObjectSetInteger(0,FIB_OBJ,OBJPROP_LEVELCOLOR,i,clrGreen);
        }
      double pRange =  PriceFibLvl0 - PriceFibLvl00;
      double PriceFibLvl1 = NormalizeDouble(PriceFibLvl0 - pRange * 23.6/100,_Digits);
      double PriceFibLvl2 = NormalizeDouble(PriceFibLvl0 - pRange * 38.2/100,_Digits);
      double PriceFibLvl3 = NormalizeDouble(PriceFibLvl0 - pRange * 50/100,_Digits);
      double PriceFibLvl4 = NormalizeDouble(PriceFibLvl0 - pRange * 61.8/100,_Digits);
      double entryLvl = NormalizeDouble(PriceFibLvl0 - pRange * fibRetracLvl/100,_Digits);
      Comment("Array Open: ",openCandle,"\n",
              "Array Close: ",closeCandle,"\n",
              "Buy Entry Price: ",entryLvl);
     }
   else
     {
      ObjectDelete(_Symbol, "Fibonacci Retracement");
      ObjectCreate(_Symbol, "Fibonacci Retracement",OBJ_FIBO,0,pArray[100].time,
                   pArray[highestCandle].high,pArray[0].time,pArray[lowestCandle].low);
      ObjectSetInteger(0,FIB_OBJ,OBJPROP_COLOR,clrRed);
      for(int i = 0; i < ObjectGetInteger(0,FIB_OBJ,OBJPROP_LEVELS); i++)
        {
         ObjectSetInteger(0,FIB_OBJ,OBJPROP_LEVELCOLOR,i,clrRed);
        }
      double pRange =  PriceFibLvl00 - PriceFibLvl0;
      double PriceFibLvl1 = NormalizeDouble(PriceFibLvl0 + pRange * 23.6/100,_Digits);
      double PriceFibLvl2 = NormalizeDouble(PriceFibLvl0 + pRange * 38.2/100,_Digits);
      double PriceFibLvl3 = NormalizeDouble(PriceFibLvl0 + pRange * 50/100,_Digits);
      double PriceFibLvl4 = NormalizeDouble(PriceFibLvl0 + pRange * 61.8/100,_Digits);
      double entryLvl = NormalizeDouble(PriceFibLvl0 + pRange * fibRetracLvl/100,_Digits);
      Comment("Array Open: ",openCandle,"\n",
              "Array Close: ",closeCandle,"\n",
              "Sell Entry Price: ",entryLvl);
     }
  }
//+------------------------------------------------------------------+

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

プロパティを含むウィンドウを表示する#propertyscript_show_inputsを使用してプロパティを追加し、入力変数を使用して、デフォルト値が38.2のdoubleデータ型fibRetracLvlを作成します。

#property script_show_inputs
input double fibRetracLvl = 38.2;

ユーザー入力に基づいてエントリレベルを定義します(強気)。

double entryLvl = NormalizeDouble(PriceFibLvl0 - pRange * fibRetracLvl/100,_Digits);

ユーザー入力に基づいてエントリレベルを定義します(弱気)。

double entryLvl = NormalizeDouble(PriceFibLvl0 + pRange * fibRetracLvl/100,_Digits);

強気のケースに基づいてコメントします。

      Comment("Array Open: ",openCandle,"\n",
              "Array Close: ",closeCandle,"\n",
              "Buy Entry Price: ",entryLvl);

弱気のケースに基づいてコメントします。

      Comment("Array Open: ",openCandle,"\n",
              "Array Close: ",closeCandle,"\n",
              "Sell Entry Price: ",entryLvl);

このコードをコンパイルして実行すると、次のテストからの強気と弱気の配列の例と同じシグナルを取得できます。

配列が強気

FIBO Signals 2 - 強気

ご覧のとおり、配列の最小値から最大値まで緑色のFIBOオブジェクトが描画され、チャートのコメントとして次の値があります。

  • Array open ==> 配列内の最初のローソク足の始値と同じ値
  • Array close ==> 配列内の最後のローソク足の終値と同じ値
  • Buy entry price ==> 38.2FIBOレベルと同じ値

配列が弱気

FIBO Signals 2 - 弱気

ご覧のとおり、配列の最高値から最低値まで描かれた赤いFIBOオブジェクトと、チャートのコメントとして次の値があります。

  • Array open ==> 配列内の最初のローソク足の始値と同じ値
  • Array close ==> 配列内の最後のローソク足の終値と同じ値
  • Sell entry price ==> 38.2FIBOレベルと同じ値


結論

フィボナッチ定義のトピックを通じてフィボナッチテクニカルツールを詳細に学び、その後使用方法を学んだ後、MetaTrader 5取引ターミナルで使用するためのMQL5による単純なフィボナッチ取引システムの作成方法を学びました。MetaTrader5に挿入する方法も学びました。

また、フィボナッチを作成する2つの方法を共有しました。1つは日次のデータを使用する方法で、もう1つは任意の時間枠で特定のローソク足の配列を使用してフィボナッチレベルを返し、これらのレベルに基づいて売買のエントリレベルを取得する方法です。繰り返しになりますが、より良い結果を得るためには、このツールを他の技術ツールと組み合わせてください。実際の口座で言及された戦略または概念を使用する前には、テストして、それらが取引に利益をもたらすことを確認してください。すべての人に適したものはありません。それに加えて、ここでの主な目的は教育のみであり、言及された戦略の改良または最適化を見つけることができます。

新しいことを学んだり、取引結果を改善できる新しいアイデアに目を向けたりすることで、この記事が読者にとって有用で洞察力のあるものになることを願っています。最も人気のあるテクニカル指標とツールに基づく取引システムの設計に関する同様の記事をもっと読む必要がある場合は、移動平均、MACD、ボリンジャーバンド、ストキャスティクスなどの人気のあるもののほとんどを共有しているため、この連載の他の記事をご覧ください。それらもまた役立つことを願っています。

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

添付されたファイル |
Fibo_Signals.mq5 (3.37 KB)
Fibo_Signals_2.mq5 (3.79 KB)
母集団最適化アルゴリズム:SSG(Saplings Sowing and Growing up、苗木の播種と育成) 母集団最適化アルゴリズム:SSG(Saplings Sowing and Growing up、苗木の播種と育成)
SSG(Saplings Sowing and Growing up、苗木の播種と育成)アルゴリズムは、様々な条件下で優れた生存能力を発揮する、地球上で最も回復力のある生物の1つからインスピレーションを得ています。
MQL5の圏論(第3回) MQL5の圏論(第3回)
圏論は数学の一分野であり、多様な広がりを見せていますが、MQL5コミュニティでは今のところ比較的知られていません。この連載では、その概念のいくつかを紹介して考察することで、トレーダーの戦略開発におけるこの注目すべき分野の利用を促進することを目的としたオープンなライブラリを確立することを目指しています。
キャンバスベースのインジケーター:チャネル内を透明にする キャンバスベースのインジケーター:チャネル内を透明にする
この記事では、標準ライブラリのCCanvasクラスを使用して描画されるカスタムインジケーターを作成して、座標変換のチャートプロパティを確認する方法を紹介します。特に、2本の線の間の領域を透明にする必要があるインジケーターに取り組みます。
MQL5行列を使用した誤差逆伝播法によるニューラルネットワーク MQL5行列を使用した誤差逆伝播法によるニューラルネットワーク
この記事では、行列を使用してMQL5で誤差逆伝播法(バックプロパゲーション)アルゴリズムを適用する理論と実践について説明します。スクリプト、インジケータ、エキスパートアドバイザー(EA)の例とともに、既製のクラスが提示されます。