English Русский 中文 Español Deutsch Português 한국어 Français Italiano Türkçe
preview
勢力指数による取引システムの設計方法を学ぶ

勢力指数による取引システムの設計方法を学ぶ

MetaTrader 5トレーディング | 14 11月 2022, 10:10
233 0
Mohamed Abdelmaaboud
Mohamed Abdelmaaboud

はじめに

これは、最も人気のあるテクニカル指標に基づいて取引システムを設計する方法を学ぶための連載の新しい記事です。今回は、勢力指数指標による取引システムの作り方をご紹介します。この指標は何なのかを、以下のトピックで詳しく学んでいきます。

  1. 勢力指数の定義
  2. 勢力指数戦略
  3. 勢力指数戦略の設計図
  4. 勢力指数取引システム
  5. 結論

このテクニカル指標については、先に述べたトピックを通じて、より詳しく学んでいくことになります。勢力指数の定義というトピックを通して、それが何であるか、何を測定しているか、どのように計算できるかを学びます。この指標の基本的な考え方を理解した上で、簡単な戦略の使い方を学びますが、それを勢力指数戦略の話題を通じて学びます。どのような戦略の取引システムを作るにしても、それをスムーズにおこなうためには、自分の考えを整理する必要があることがわかります。そこで、ここでは、目的をスムーズかつ効果的に達成するために、勢力指数戦略の設計図というテーマで、それぞれの戦略の設計図を作成することにしています。ステップバイステップの設計図を通してアイデアを整理した後、「勢力指数取引システム」トピックを通して、自動的かつ正確にシグナルを生成するためにMetaTrader 5取引プラットフォームで実行される取引システムを作成します。

取引システムのコードを書くためにMQL5(MetaQuotes言語)を使用し、取引ターミナルであるMetaTrader 5に組み込まれているこのMQL5を使用する予定です。ダウンロードや使い方を知りたい方は、以前の記事から「MetaEditorでMQL5コードを書く」のトピックを読んでみてください。学んだことを実践することで、理解を深めることができますし、実際の口座で使用する前に戦略をテストする必要があります。

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

では、この勢力指数という指標について、トピックを開始します。


勢力指数の定義

このトピックでは、勢力指数指標とは何か、何を測定する指標なのか、どのように計算するのかについて、より詳しく学びます。物事の根源を知ることで、その物事を効果的に使うだけでなく、その物事に関連したアイデアをより多く開発するためのヒントを得ることができるというのが私の考え方です。勢力指数は、アレキサンダー・エルダー氏が開発したもので、彼の素晴らしい著書「Trading for a living」の中で提供されています。この指標は、運動の背後にある力を測定したり、潜在的なターニングポイントを特定したりするものです。勢力指数は、価格と出来高を計算に使用し、これにより市場のあらゆる動きの背後にある力を測定することができる指標です。

この指数の基本概念を理解するために、手動で計算する方法を知りたい場合は、次の2つの簡単な手順でおこなうことができます。

1. 1期間の勢力指数=(1期間の終値-前期の終値)×出来高

2. 13期間の勢力指数=1期間の勢力指数のEMAの13期間分

現在では、この指標はMetaTrader 5取引プラットフォームの内蔵指標になっていて、MetaTrader 5取引ターミナルの利用可能な指標からそれを選択するだけでいいため、手動で計算する必要はありません。MetaTrader 5を開き、[挿入]タブ→[インディケータ]→[オシレーター]→[Force Index]を押してみてください。

以下は、そのための画像です。

Force Index指標の挿入

Force Indexを選択すると、この指標のパラメータは以下のようになります。

Force Indexパラメータ

1. Force Index指標の望ましい期間を決定します。ここでは、13を指標の初期設定とします。

2. 使用可能な移動平均の種類を決定します。ここでは指数関数的なものを使用することにします。

3. 出来高の種類を決定します。Tickを使用します。

4. 指標の線の色を決定します。

5. 線のスタイルを決定します。

6. 線の太さを決定します。

その後、以下のようにチャートに指標が接続されていることがわかります。

Force Index指標の接続

前図の下のウィンドウにあるように、Force Index指標がチャートに接続されており、その線はゼロレベルの上下に振動していることがわかります。


勢力指数戦略

このトピックでは、勢力指数の基本的な考え方に基づいて、その使い方を学びます。この指標の基本的な使い方と、この指標を使った取引システムの作り方を理解するために、簡単な戦略を使用します。これらの戦略を実際の口座で使用する前に必ずテストし、ご自分の取引に適していることを確認してください。

  • 戦略1:Force Index - Trend Identifier

この戦略では、勢力指数指標とゼロレベルとのクロスオーバーに基づいて強気または弱気のシグナルを取得する必要があります。勢力指数がゼロを上回れば、強気な動きのシグナルとなります。逆に、勢力指数がゼロを下回ると弱気のシグナルとなります。

単純に言うと

勢力指数 > ゼロレベル → 強気の動き

勢力指数 < ゼロレベル → 弱気の動き

  • 戦略2:Force Index - Up or Divergence

この戦略では、相場が強い上昇の動きがあった時やダイバージェンスがあった時にシグナルを得る必要があります。現在の高値が前回の高値を上回り、同時に現在の勢力指数が前回の勢力指数を上回れば、強い上昇のシグナルとなります。現在の高値が前回の高値を上回り、同時に現在の勢力指数が前回の勢力指数値を下回れば、弱気ダイバージェンスのシグナルとなります。

単純に言うと

現在の高値 > 前回の高値、現在の勢力指数 >前回の勢力指数 → 強い上昇の動き

現在の高値 > 前回の高値、現在の勢力指数 < 前回の勢力指数 → 弱気ダイバージェンス

  • 戦略3:Force Index - Down or Divergence

この戦略では、戦略2の逆のシグナルを取得する必要があります。具体的な条件に基づいて、強い下降やダイバージェンスのシグナルを得ます。現在の安値が前回の安値を下回り、現在の勢力指数が前回の勢力指数を下回れば、強い下降のシグナルとなります。現在の安値が前回を下回り、現在の勢力指数が前回を上回れば、強気ダイバージェンスのシグナルとなります。

単純に言うと

現在の安値 < 前回の安値、現在の勢力指数 < 前回の勢力指数 → 強い下降

現在の安値 < 前回の安値、現在の勢力指数 > 前回の勢力指数 → 強気ダイバージェンス

  • 戦略4:Force Index signals

この戦略では、特定の条件に基づいて売買シグナルを取得する必要があります。終値が指数移動平均を上回り、前回の勢力指数値がゼロを下回り、今回の勢力指数値がゼロを上回れば、買いシグナルとなります。終値が指数移動平均線を下廻り、前回の勢力指数値がゼロを上回り、今回の勢力指数値がゼロを下回る場合、売りシグナルとなります。

単純に言うと

終値 > EMA、前回の勢力指数 < 0、現在の勢力指数 > 0 → 買いシグナル

終値 < EMA、前回の勢力指数 > 0、今回の勢力指数 < 0 → 売りシグナル


勢力指数戦略の設計図

このトピックでは、取引システムを作成するためのステップバイステップの設計図を作成します。これは、目的を達成するためのアイデアを整理し、取引システムをスムーズに構築するための重要なステップであると私は考えています。

  • 戦略1:  Force Index - Trend Identifier

この戦略では、強気または弱気の動きをチャートのコメントとして自動的にシグナルを出す取引システムを作る必要があります。エキスパートアドバイザー(EA)が1ティックごとに現在の勢力指数を確認し、ゼロレベルからその位置を決定する必要があります。現在の勢力指数がゼロを上回る場合、EAに強気な動きと現在の勢力指数値でチャートにコメントを返してもらう必要があります。一方、現在の勢力指数がゼロを下回る場合は、EAに弱気の動きと現在の勢力指数を示すチャートコメントを返してもらう必要があります。

Force Index - Trend Identifierの設計図

  • 戦略2: Force Index - Up or Divergence

この戦略では、強い上昇や弱気のダイバージェンスでシグナルを出す取引システムを作る必要があります。取引システムには4つの値を継続的に確認する必要があります。現在の高値と前回の高値とでどちらがより大きく、現在の勢力指数と前回の勢力指数の値とでどちらがより大きいかを確認します。現在の高値が以前の高値より大きく、現在の勢力指数が以前の力指数より大きい場合、EAがチャートにコメントとして次のように返す必要があります。各値は別行で表示されます。

  • 強い上昇
  • 現在の高値
  • 前回の高値
  • 現在の勢力指数値
  • 前回の勢力指数値

現在の高値が以前の高値を上回り、現在の勢力指数値が以前の勢力指数値を下回る場合、EAがチャートにコメントとして次のように返す必要があります。各値は別行で表示されます。

  • 弱気のダイバージェンス
  • 現在の高値
  • 前回の高値
  • 現在の勢力指数値
  • 前回の勢力指数値

以下は、この設計図のイメージ図です。

Force Index - Up or Divergenceの設計図

  • 戦略3: Force Index - Down or Divergence

この戦略では、強い下降や強気なダイバージェンスのシグナルを自動的に返す取引システムを作る必要があります。EAは4つの値を確認します。現在の安値と前回の安値のどちらがより大きいかを判断し、現在の勢力指数と前回の勢力指数のどちらがより大きいかを判断します。現在の安値が前回の安値を下回り、現在の勢力指数が以前の勢力指数を下回る場合、EAが次の値をチャートのコメントとして返す必要があります。

  • 強い下降の動き
  • 現在の安値
  • 前回の安値
  • 現在の勢力指数値
  • 前回の勢力指数値

現在の安値が前回の安値を下回り、現在の勢力指数が前回の勢力指数を上回る場合、EAが以下の値をチャートにコメントとして返す必要があります。

  • 強気のダイバージェンス
  • 現在の安値
  • 前回の安値
  • 現在の勢力指数値
  • 前回の勢力指数値

以下は、この設計図です。

Force Index - Down or Divergenceの設計図

  • 戦略4:Force Index signals

この戦略では、特定の条件に基づいて売買シグナルを返す取引システムを作る必要があります。終値、移動平均、現在の力指数、以前の力指数という4つの値を継続的に確認するEAが必要です。終値が現在の移動平均値より大きく、前回の力指数がゼロより小さく、現在の力指数がゼロレベルより大きい場合、EAが以下の値をチャートにコメントとして返す必要があります。

  • 買いシグナル
  • 現在の終値
  • 現在の指数移動平均
  • 現在の勢力指数値
  • 前回の勢力指数値

終値が現在の移動平均を下回り、前回の勢力指数値がゼロを宇和回り、現在の勢力指数値がゼロを下回る場合、EAが以下の値をチャートのコメントとして返す必要があります。

  • 売りシグナル
  • 現在の終値
  • 現在の指数移動平均
  • 現在の勢力指数値
  • 前回の勢力指数値

次の図は、この戦略の設計図です。

Force Index signalsの設計図

勢力指数取引システム

このトピックでは、各戦略のMQL5コードを記述した後、各戦略に基づいてMetaTrader 5上で自動シグナルを取得する取引システムの作成方法を詳細に学びます。まず、簡単な取引戦略を作成し、チャート上に現在の勢力指数の値をコメントとして生成し、言及した戦略の基礎として使用します。

  • double型のfiArray配列を作成します。
double fiArray[];
  • ArraySetAsSeries関数を使用して配列を並び替え、ブール値(trueまたはfalse)を返します。この関数のパラメータは次の通りです。
    • array[]
    • フラグ
ArraySetAsSeries(fiArray,true);
  • VolDefの変数を作成した後、iVolumesを使用して出来高を定義します。iForce関数は、勢力指数指標のハンドルを返します。この関数のパラメータは次の通りです。
    • symbol:現在の銘柄に適用される_Symbolを使用
    • period: 現在の期間または時間枠に適用される_Periodを使用
    • ma_period:使用可能な移動平均の長さ(13を使用)
    • ma_method: 使用可能な移動平均の種類(MODE_EMAを使用)
    • applied_volume: 出来高のタイプ(VOLUME_TICKを使用)
int fiDef = iForce(_Symbol,_Period,13,MODE_EMA,VOLUME_TICK);
  • CopyBuffer関数を使ってForce Index指標からデータを取得し、配列に入力します。この関数のパラメータは次の通りです。
    • indicator_handle: 指標ハンドル(fiDefを使用)     
    • buffer_num: 指標バッファの番号(0を使用)
    • start_pos: 開始位置(0を使用)         
    • count: コピーする量(13を使用)                
    • buffer[]: コピー先の配列(fiArrayを使用)
CopyBuffer(fiDef,0,0,3,fiArray);
  • fiValの変数を作成した後、NormalizeDouble関数で現在の勢力指数値を定義します。NormalizeDouble関数はdouble型の値を返す関数で、パラメータは以下の通りです。
    • value::正規化した数値(fiArray[0]を使用)
    • digit: 小数点以下の桁数(6を使用)
double fiVal = NormalizeDouble(fiArray[0],6);
  • Comment関数を使って、現在の勢力指数の値をチャートのコメントとして返します。
Comment("Force Index Value is ",fiVal);

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

//+------------------------------------------------------------------+
//|                                           Simple Force Index.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 fiArray[];

   ArraySetAsSeries(fiArray,true);

   int fiDef = iForce(_Symbol,_Period,13,MODE_EMA,VOLUME_TICK);

   CopyBuffer(fiDef,0,0,3,fiArray);

   double fiVal = NormalizeDouble(fiArray[0],6);

   Comment("Force Index Value is ",fiVal);

  }
//+------------------------------------------------------------------+

この取引システムのEAがナビゲータウィンドウで次のように表示されるようになります。

FIナビ1

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

Simple Force Indexのウィンドウ

[OK]を押すと、EAがチャートに接続されます。

Simple Force Indexの接続

先ほどの写真の右上にあるように、チャートにSimple Force Index EAが接続されているのがわかります。

この取引システムによるシグナルの生成は、以下のテストの例と同じであることがわかります。

Simple Force Indexのシグナル

前の図にあるように、左上には現在の勢力指数値のシグナルがチャート上のコメントとして表示されています。

生成されたシグナルがMetaTrader 5に内蔵されているForce Index指標と同じであることを確認したい場合、プログラムされた指標と同じ設定の指標を、EAの接続と同時に挿入すればよいのです。両シグナルは次のようになります。

Simple Force Indexの同一シグナル

左上にEA、右上にEAが生成した勢力指数のコメント、下のウィンドウにビルトインされた勢力指数とその値が表示され、両方の値が同じであることがわかります。

  • 戦略1: Force Index - Trend Identifier

以下は、この戦略に基づいた売買システムを作成するコードの書き方です。

//+------------------------------------------------------------------+
//|                               Force Index - Trend 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 fiArray[];

   ArraySetAsSeries(fiArray,true);

   int fiDef = iForce(_Symbol,_Period,100,MODE_EMA,VOLUME_TICK);

   CopyBuffer(fiDef,0,0,3,fiArray);

   double fiVal = NormalizeDouble(fiArray[0],6);

   if(fiVal>0)
     {
      Comment("Bullish Movement","\n","Force Index Value is ",fiVal);
     }

   if(fiVal<0)
     {
      Comment("Bearish Movement","\n","Force Index Value is ",fiVal);
     }

  }
//+------------------------------------------------------------------+

このコードの違いが攻略の条件となります。

強気な動きの場合

   if(fiVal>0)
     {
      Comment("Bullish Movement","\n","Force Index Value is ",fiVal);
     }

弱気な動きの場合

   if(fiVal<0)
     {
      Comment("Bearish Movement","\n","Force Index Value is ",fiVal);
     }

このコードをコンパイルすると、ナビゲータウィンドウにEAが下図のように表示されます。

FIナビ

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

Force Index - Trend Identifierのウィンドウ

[OK]を押すと、下図のようにEAがチャートに表示されます。

Force Index - Trend Identifierの接続

チャートの右上にあるように、EAがチャートに接続されていることがわかります。

この戦略に基づき、以下のテスト例と同じように生成されたシグナルを見つけることができます。

強気な動きの場合

Force Index - Trend Identifier - 強気シグナル

前のチャートの左上には強気の動きと力指数指標の現在の値がコメントされています。

弱気な動きの場合

Force Index - Trend Identifier - 弱気シグナル

前のチャートの左上には弱気の動きと力指数指標の現在の値がコメントされています。

  • 戦略2: Force Index - Up or Divergence

この戦略の取引システムをコーディングする方法は以下の通りです。

//+------------------------------------------------------------------+
//|                               Force Index - Up or Divergence.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 fiArray[];
   MqlRates pArray[];

   ArraySetAsSeries(fiArray,true);
   int Data=CopyRates(_Symbol,_Period,0,3,pArray);

   int fiDef = iForce(_Symbol,_Period,13,MODE_EMA,VOLUME_TICK);

   CopyBuffer(fiDef,0,0,3,fiArray);

   double fiCurrentVal = NormalizeDouble(fiArray[0],6);
   double fiPrevVal = NormalizeDouble(fiArray[1],6);

   double currentHighVal=NormalizeDouble(pArray[2].high,6);
   double prevHighVal=NormalizeDouble(pArray[1].high,6);

   if(currentHighVal>prevHighVal && fiCurrentVal>fiPrevVal)
     {
      Comment("Strong up move","\n",
      "Current High is ",currentHighVal,"\n",
      "Previous High is ",prevHighVal,"\n",
      "Current Force Index Value is ",fiCurrentVal,"\n",
      "Previous Force Index Value is ",fiPrevVal);
     }

   if(currentHighVal>prevHighVal && fiCurrentVal<fiPrevVal)
     {
      Comment("Bearish Divergence","\n",
      "Current High is ",currentHighVal,"\n",
      "Previous High is ",prevHighVal,"\n",
      "Current Force Index Value is ",fiCurrentVal,"\n",
      "Previous Force Index Value is ",fiPrevVal);
     }

  }
//+------------------------------------------------------------------+

このコードにおける相違点は次の通りです。

先ほどのようにdouble型のfiArrayを作成し、MqlRates関数で価格、数量、スプレッドの情報を格納したpArrayを作成します。

   double fiArray[];
   MqlRates pArray[];

作成した配列の並び替えは、fiArrayについては、前回と同様にArraySetAsSeries関数を使用します。pArrayについては、MqlRatesの履歴データを取得するCopyRates関数を使用し、そのパラメータは以下の通りです。

  • symbol name:_Symbolを使用
  • timeframe:_Period)を使用
  • 開始時間:0を使用
  • 停止時間:3を使用
  • レート配列:pArrayを使用
   ArraySetAsSeries(fiArray,true);
   int Data=CopyRates(_Symbol,_Period,0,3,pArray);

勢力指数の現在値および前回値を定義します。

   double fiCurrentVal = NormalizeDouble(fiArray[0],6);
   double fiPrevVal = NormalizeDouble(fiArray[1],6);

現在の高値と前回の高値を定義します。

   double currentHighVal=NormalizeDouble(pArray[2].high,6);
   double prevHighVal=NormalizeDouble(pArray[1].high,6);

戦略の条件

強い上昇の場合

   if(currentHighVal>prevHighVal && fiCurrentVal>fiPrevVal)
     {
      Comment("Strong up move","\n",
      "Current High is ",currentHighVal,"\n",
      "Previous High is ",prevHighVal,"\n",
      "Current Force Index Value is ",fiCurrentVal,"\n",
      "Previous Force Index Value is ",fiPrevVal);
     }

弱気ダイバージェンスの場合

 
   if(currentHighVal>prevHighVal && fiCurrentVal<fiPrevVal)
     {
      Comment("Bearish Divergence","\n",
      "Current High is ",currentHighVal,"\n",
      "Previous High is ",prevHighVal,"\n",
      "Current Force Index Value is ",fiCurrentVal,"\n",
      "Previous Force Index Value is ",fiPrevVal);
     }

このコードをコンパイルすると、ナビゲータウィンドウに下図のように表示されます。

FIナビ

これをチャート上にドラッグ&ドロップすると、このEAのウィンドウは次のようになります。

Force Index - Up or Divergenceのウィンドウ

[OK]を押すと、下図のようにEAがチャートに表示されます。

Force Index - Up or Divergenceの接続

前のチャートで分かるように、右上にEAが接続されています。

その後、相場の状況に応じて、この戦略の条件と一致するシグナルを得ることができます。以下は、テストからのシグナルの例です。

現在のデータウィンドウで強い上昇をした場合

Force Index - Up or Divergence - 強い上昇シグナル - 現在のデータ

前回のデータウィンドウ:

Force Index - Up or Divergence - 強い上昇シグナル - 以前のデータ

現在のデータウィンドウでの弱気ダイバージェンス

Force Index - Up or Divergence - ダイバージェンスシグナル - 現在のデータ

前回のデータウィンドウ:

Force Index - Up or Divergence - ダイバージェンスシグナル - 以前のデータ

  • 戦略3: Force Index - Down or Divergence

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

//+------------------------------------------------------------------+
//|                             Force Index - Down or Divergence.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 fiArray[];
   MqlRates pArray[];

   ArraySetAsSeries(fiArray,true);
   int Data=CopyRates(_Symbol,_Period,0,3,pArray);

   int fiDef = iForce(_Symbol,_Period,13,MODE_EMA,VOLUME_TICK);

   CopyBuffer(fiDef,0,0,3,fiArray);

   double fiCurrentVal = NormalizeDouble(fiArray[0],6);
   double fiPrevVal = NormalizeDouble(fiArray[1],6);

   double currentLowVal=NormalizeDouble(pArray[2].low,6);
   double prevLowVal=NormalizeDouble(pArray[1].low,6);

   if(currentLowVal<prevLowVal && fiCurrentVal<fiPrevVal)
     {
      Comment("Strong down move","\n",
      "Current Low is ",currentLowVal,"\n",
      "Previous Low is ",prevLowVal,"\n",
      "Current Force Index Value is ",fiCurrentVal,"\n",
      "Previous Force Index Value is ",fiPrevVal);
     }

   if(currentLowVal<prevLowVal && fiCurrentVal>fiPrevVal)
     {
      Comment("Bullish Divergence","\n",
      "Current Low is ",currentLowVal,"\n",
      "Previous Low is ",prevLowVal,"\n",
      "Current Force Index Value is ",fiCurrentVal,"\n",
      "Previous Force Index Value is ",fiPrevVal);
     }

  }
//+------------------------------------------------------------------+

このコードにおける相違点は次の通りです。

現在の安値と前回の安値を定義します。

   double currentLowVal=NormalizeDouble(pArray[2].low,6);
   double prevLowVal=NormalizeDouble(pArray[1].low,6);

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

強い下降の場合

   if(currentLowVal<prevLowVal && fiCurrentVal<fiPrevVal)
     {
      Comment("Strong down move","\n",
      "Current Low is ",currentLowVal,"\n",
      "Previous Low is ",prevLowVal,"\n",
      "Current Force Index Value is ",fiCurrentVal,"\n",
      "Previous Force Index Value is ",fiPrevVal);
     }

強気ダイバージェンスの場合

   if(currentLowVal<prevLowVal && fiCurrentVal>fiPrevVal)
     {
      Comment("Bullish Divergence","\n",
      "Current Low is ",currentLowVal,"\n",
      "Previous Low is ",prevLowVal,"\n",
      "Current Force Index Value is ",fiCurrentVal,"\n",
      "Previous Force Index Value is ",fiPrevVal);
     }

この取引システムのEAがナビゲータウィンドウで次のように表示されるようになります。

FIナビ

チャート上にドラッグ&ドロップすると、このEAのウィンドウが以下のように表示されます。

Force Index - Down or Divergenceのウィンドウ

[OK]を押すと、下図のようにEAがチャートに表示されます。

Force Index - Down or Divergenceの接続

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

さて、この戦略に基づいて生成されたシグナルは、以下のテストの例と同じものであることがわかります。

現在のデータでの強い下降の場合

Force Index - Down or Divergence - 強い下降シグナル - 現在のデータ

前回のデータ:

Force Index - Down or Divergence - 強い下降シグナル - 以前のデータ

現在のデータでの強気ダイバージェンス

Force Index - Down or Divergence - ダイバージェンスシグナル - 現在のデータ

前回のデータ:

Force Index - Down or Divergence - ダイバージェンスシグナル - 以前のデータ

  • 戦略4: Force Index signals

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

//+------------------------------------------------------------------+
//|                                          Force Index 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"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
void OnTick()
  {
   double fiArray[];
   double maArray[];
   MqlRates pArray[];



   ArraySetAsSeries(fiArray,true);
   ArraySetAsSeries(maArray,true);


   int fiDef = iForce(_Symbol,_Period,13,MODE_EMA,VOLUME_TICK);
   int maDef = iMA(_Symbol,_Period,50,0,MODE_EMA,PRICE_CLOSE);
   int Data=CopyRates(_Symbol,_Period,0,3,pArray);

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

   double fiCurrentVal = NormalizeDouble(fiArray[0],6);
   double fiPrevVal = NormalizeDouble(fiArray[1],6);

   double maCurrentVal = NormalizeDouble(maArray[0],6);
   double closePrice = NormalizeDouble(pArray[2].close,6);


   if(closePrice>maCurrentVal && fiPrevVal<0 && fiCurrentVal>0)
     {
      Comment("Buy Signal","\n",
              "Current Closing Price ",closePrice,"\n",
              "EMA is ",maCurrentVal,"\n",
              "Current Force Index Value is ",fiCurrentVal,"\n",
              "Previous Force Index Value is ",fiPrevVal);
     }

   if(closePrice<maCurrentVal && fiPrevVal>0 && fiCurrentVal<0)
     {
      Comment("Sell Signal","\n",
              "Current Closing Price ",closePrice,"\n",
              "EMA is ",maCurrentVal,"\n",
              "Current Force Index Value is ",fiCurrentVal,"\n",
              "Previous Force Index Value is ",fiPrevVal);
     }

  }
//+------------------------------------------------------------------+

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

fiArray、maArray、MqlRatesの3つの配列を作成します。

   double fiArray[];
   double maArray[];
   MqlRates pArray[];

fiArrayとmaArrayの配列を並べ替えます。

   ArraySetAsSeries(fiArray,true);
   ArraySetAsSeries(maArray,true);

力指数を表すfiDef、移動平均を表すmaDefを定義します。

   int fiDef = iForce(_Symbol,_Period,13,MODE_EMA,VOLUME_TICK);
   int maDef = iMA(_Symbol,_Period,50,0,MODE_EMA,PRICE_CLOSE);

学習したようにCopyRates関数でpArrayを並び替えます。

int Data=CopyRates(_Symbol,_Period,0,3,pArray);

配列に入力します。

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

現在の勢力指数、前回の勢力指数、現在の移動平均線、終値の4つの値を定義します。

   double fiCurrentVal = NormalizeDouble(fiArray[0],6);
   double fiPrevVal = NormalizeDouble(fiArray[1],6);

   double maCurrentVal = NormalizeDouble(maArray[0],6);
   double closePrice = NormalizeDouble(pArray[2].close,6);

戦略条件は以下の通りです。

買いシグナルの場合

   if(closePrice>maCurrentVal && fiPrevVal<0 && fiCurrentVal>0)
     {
      Comment("Buy Signal","\n",
              "Current Closing Price ",closePrice,"\n",
              "EMA is ",maCurrentVal,"\n",
              "Current Force Index Value is ",fiCurrentVal,"\n",
              "Previous Force Index Value is ",fiPrevVal);
     }

売りシグナルの場合

   if(closePrice<maCurrentVal && fiPrevVal>0 && fiCurrentVal<0)
     {
      Comment("Sell Signal","\n",
              "Current Closing Price ",closePrice,"\n",
              "EMA is ",maCurrentVal,"\n",
              "Current Force Index Value is ",fiCurrentVal,"\n",
              "Previous Force Index Value is ",fiPrevVal);
     }

このコードをコンパイルすると、ナビゲータウィンドウに下図のように表示されます。

FIナビ

これをチャート上にドラッグ&ドロップすると、このEAのウィンドウは次のようになります。

Force Index signalsのウィンドウ

[OK]を押すと、下図のようにEAがチャートに表示されます。

Force Index signalsの接続

その後、以下のようなテストから生成されたシグナルの例を見つけることができます。

現在のデータで買いシグナルが発生した場合。

Force Index signals - 買いシグナル - 現在のデータ

前回のデータ:

Force Index signals - 買いシグナル-前回のデータ

現在のデータでの売りシグナルの場合

Force Index signals - 売りシグナル - 現在のデータ

前回のデータ:

Force Index signals - 売りシグナル - 前回のデータ


結論

勢力指数は、適切な判断を下すための優れたテクニカルツールです。この記事を通して、この指標を詳しく取り上げ、その内容、測定方法、手動での計算方法などを学び、その概念を理解しました。また、その使い方を、シンプルな戦略で学ぶことができました。

  • Force Index - Trend Identifier:強気と弱気の動きのシグナルを取得
  • Force Index - Up or Divergence:強い上昇の動きや弱気のダイバージェンスのシグナルを取得
  • Force Index - Down or Divergence:強い下降の動きや強気のダイバージェンスのシグナルを取得
  • Force Index signals:終値、勢力指数値、指数移動平均を評価し、売買シグナルを取得

その後、各戦略の取引システムを構築するためのステップバイステップの設計図を作成しました。このステップが重要なのは、アイデアを整理した後、この取引システムを円滑かつ効果的に構築するのに役立つからです。MetaTrader 5で実行され、自動シグナルを得るために、言及された各戦略の取引システムを作成しました。

ここでもう一度確認しておきたいのは、どんな戦略でも、実際の口座で使う前に必ずテストして、自分に合っているかどうかを確認することです。誰にでも合うということはありません。学習する上で実践することはとても大切な要素なので、学んだことを自分で実践してほしいと思います。また、この指標を他のテクニカルツールと組み合わせて使用することで、私たちの判断や取引結果を向上させることができることも、テクニカル分析手法の最も素晴らしい特徴の1つです。

プログラミングは、様々な分野で日々重要性が増しているため、学ぶこと、少なくとも関心を持つことが重要だと私は考えています。プログラミングは、私たちの代わりに取引をしてくれるプログラム、あるいは少なくとも私たちが効果的に取引するのを助けてくれるプログラムを使って、私たちの時間を節約してくれるのと同じように、取引に関して言えば、プログラミングには多くの機能があり、それに注意を向けるように仕向けることができます。さらに、プログラミングは、私たちがコーディングした内容に基づいて正確なシグナルを得るのに役立ちます。最も有益なのは、有害な感情を減らし、避けることです。

この記事が、読者の取引結果を向上させ、このトピックや関連するトピックに関する新しいアイデアを得るために役立つことを望みます。この記事が役に立った、もっと同じような記事を読みたいと思われた方は、本連載の他の記事もご覧になってみてください。

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

一からの取引エキスパートアドバイザーの開発(第27部):未来に向かって(II) 一からの取引エキスパートアドバイザーの開発(第27部):未来に向かって(II)
チャート上直接の発注システムをより完全にしましょう。この記事では、発注システムを修正する方法、またはより直感的にする方法を示します。
オブジェクトを使用して複雑な指標を簡単に オブジェクトを使用して複雑な指標を簡単に
この記事では、複数のプロットやバッファを扱ったり複数のソースからのデータを組み合わせたりするときに発生する問題を回避しながら、複雑な指標を作成する方法を紹介します。
ニューラルネットワークが簡単に(第23部):転移学習用ツールの構築 ニューラルネットワークが簡単に(第23部):転移学習用ツールの構築
転移学習については当連載ですでに何度も言及していますが、これはただの言及でした。この記事では、このギャップを埋めて、転移学習の詳しい調査を提案します。
一からの取引エキスパートアドバイザーの開発(第26部):未来に向かって(I) 一からの取引エキスパートアドバイザーの開発(第26部):未来に向かって(I)
今日は、発注システムを次のレベルに引き上げます。ただしその前に、いくつかの問題を解決する必要があります。ここで、どのように働きたいか、取引日に何をするかに関連するいくつかの質問があります。