English Deutsch
preview
初心者のためのMQL5におけるファンダメンタル分析とテクニカル分析戦略の組み合わせ

初心者のためのMQL5におけるファンダメンタル分析とテクニカル分析戦略の組み合わせ

MetaTrader 5 | 5 9月 2024, 10:32
31 0
Gamuchirai Zororo Ndawana
Gamuchirai Zororo Ndawana

はじめに

ファンダメンタル分析とトレンドフォロー戦略は、しばしば対立するアプローチと見なされがちです。ファンダメンタル分析を重視するトレーダーの多くは、必要な情報がすでに価格に織り込まれているため、テクニカル分析は無駄だと考えがちです。一方で、テクニカルアナリストは、例えばヘッドアンドショルダーのようなパターンが異なる市場環境で異なる結果をもたらすことがあるため、ファンダメンタル分析に疑念を抱くことが多いです。

初心者のトレーダーは、多くの選択肢に圧倒されるかもしれません。不利な市場条件でも利益を出し続けられる戦略はどれなのか、悩むこともあるでしょう。

筆者は、真実はその中間にあると信じています。この記事の目的は、ファンダメンタル分析とテクニカル分析の両方の利点を融合させた安定した取引戦略を構築し、その戦略が時間を投資する価値があるかどうかを検証することです。

ネイティブのMQL5を使用して一からEAを構築し、どのような市場でも柔軟に戦略をテストできるようにします。この記事を読み終える頃には、以下の内容を理解できるでしょう。

  1. MQL5で独自のEAを構築する方法
  2. テクニカル指標を組み合わせる方法
  3. ファンダメンタルとテクニカルのデータを概念化するためのフレームワーク 


取引戦略の概要

私たちの取引戦略は2つの要素で構成されています。

  1. ファンダメンタル分析
  2. テクニカル分析

それぞれのアプローチを単独で評価するのではなく、どのように互いを補完し合うかを理解することが重要です。まずは、戦略の核心となる基本原則を把握することから始めましょう。

金融チャートは一見、非常にランダムで予測不可能に見えることがあります。金融データセットはノイズが多く、時には不安定であることもあります。しかし、ファンダメンタル分析の観点からこれらのチャートを解析すると、市場の動きに対するまったく異なる結論が得られることがあります。


ファンダメンタル分析

ファンダメンタル分析は、市場の動向を理解するための基盤となります。このセクションでは、通貨ペアに焦点を当て、外国為替市場とその主要な参加者に関する理解を活用して取引アルゴリズムを構築する方法について説明します。

財務データ

図1:AUDJPYペアのファンダメンタル分析例



ファンダメンタルトレーダーはしばしば「支持線」と「抵抗線」について議論しますが、これらの概念には明確な定義が存在しません。ここでは、ファンダメンタルな観点からこれらの概念を一つの解釈として提示したいと思います。

通貨ペアの為替レートを考えるとき、現実世界での意味を見失いがちです。たとえば、USDJPYのチャートが上昇している場合、日本円がドルに対して下落していることを意味します。世界の商品の約90%はドル建てで取引されているため、USDJPYの上昇は、日本の輸出品が海外市場でより低い価格で取引されていることを示しています。

為替レートが無制限に上昇し続けると、日本政府は深刻な困難に直面するでしょう。輸出の価値が減少し、経済の歪みや生活水準の低下を招く可能性があります。家庭は必需品の購入に苦しみ、国はハイパーインフレと厳しい経済状況に直面するかもしれません。

こうした事態を防ぐためには、円と米ドルの為替レートが許容範囲内にあることが日本の経済にとって非常に重要です。為替レートが高すぎると、日本政府は経済を守るために外国為替市場に介入するインセンティブを持ちます。逆に、為替レートが低すぎると、米国政府が均衡を保つために支援を行う可能性があります。これが、ファンダメンタルズの観点からの支持線と抵抗線の解釈です。

通常、外国為替レートはリテールバンク、投資銀行、ヘッジファンドなどの大手金融機関の意思決定の結果として決まります。  これらの金融機関は大量の資金を動かし、その集団的な意思決定が市場に影響を与えます。

したがって、ファンダメンタルズの観点からは、大企業に逆らうような取引は避けたいと考えます。むしろ、市場の支配的なプレーヤーと同じ方向で取引する機会を見つけたいのです。

週足や月足といった長期的な時間枠で価格変動を分析することで、大口の機関投資家がどの価格水準を適正と見なしているかを理解できるかもしれません。そのため、長期的な価格変動に沿った取引機会を模索することになります。

つまり、私たちの基本戦略は以下のステップで構成されます。まず、上位時間枠を分析し、機関投資家がどの価格帯で取引しているかを把握します。次に、前週の最高値と最安値を調べて支持線と抵抗線を特定します。高確率の取引設定を目指し、価格が抵抗レベルを上回った場合には買いポジションを取り、支持レベルを下回った場合には売りポジションを取ります。


テクニカル分析

ここでは、取引戦略におけるテクニカル分析の定義と、その実施方法について説明します。私たちのテクニカル分析は、指標とファンダメンタル分析のシグナルが一致する取引設定を特定することに重点を置いています。具体的には、上位時間枠でのトレンドが強気であれば、テクニカル指標がロングポジションのシグナルを発している場合のみ取引を検討します。逆に、上位時間枠でのトレンドが弱気であれば、指標がショートポジションのシグナルを発している場合にのみ取引をおこないます。

最初に使用する指標はマネーフロー指数(MFI: Money Flow Index)です。MFIは出来高に基づく指標であり、当戦略において重要な役割を果たします。ここでは、十分な出来高を伴う取引のみを考慮し、出来高の少ない取引や反対売買は対象外とします。MFIは従来の方法とは異なる方法で解釈します。50を中心にして解釈し、50以下は弱気の出来高、50以上は強気の出来高を示します。

次に、移動平均収束発散(MACD: Moving Average Convergence Divergence)指標を利用します。MFIと同様に、MACDも従来の使い方とは異なり、0を中心として解釈します。MACDのシグナルラインが0を下回ると弱気トレンド、0を上回ると強気トレンドを示します。

さらに、移動平均線を用いた古典的なトレンドフォローのアプローチも取り入れています。他指標の場合と異なり、移動平均線は従来の方法で解釈し、価格が移動平均線より下にある場合は売りの機会、価格が移動平均線より上にある場合は買いの機会を示します。

また、ストキャスティックスオシレーターの従来の解釈も戦略に組み込んでいます。ストキャスティックスオシレーターが20を上回ると買いシグナル、80を下回ると売りシグナルと解釈します。

したがって、次の条件が満たされた場合に証券を買います。

  1. 価格が移動平均線より上で引ける
  2. MACDシグナルが0より上
  3. MFI値が50より上
  4. ストキャスティックスオシレーターが20より上
  5. 過去3ヶ月間に価格が上昇している
  6. 価格レベルが支持線より上

逆に、次の条件が満たされた場合に証券を売ります。

  1. 価格が移動平均線より下で引ける
  2. MACDシグナルが0より下
  3. MFI値が50より下
  4. ストキャスティックスオシレーターが80より下
  5. 過去3ヶ月間に価格が下落している
  6. 価格レベルが抵抗レベルの下

では始めていきましょう。

まず、必要なライブラリをインポートします。この場合、取引注文を実行するために取引ライブラリをインポートします。

//+------------------------------------------------------------------+
//|                           Price Action & Trend Following.mq5     |
//|                        Copyright 2024, MetaQuotes Ltd.           |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Gamuchirai Zororo Ndawana"
#property link      "https://www.mql5.com"
#property version   "1.00"

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
/*
   This Expert Advisor will help us implement a combination of fundamental analysis
   and trend following principles to trade financial securities with precision
   thanks to the easy to learn MQL5 Language that gives us a blend of creative
   flexibility and technical control at the same time.

   Our Fundamental strategy follows the principles outlined below:
   1)Respect price movements on higher order time frames
   2)Enter at support levels and exit on resistance levels

   Our Trend following strategy follows principles that have been proven over time:
   1)Only enter trades backed by volume
   2)Do not trade against the dominant trend, rather wait for setups to go with the bigger trend.
   3)Use an ensemble of good confirmation indicators

   Gamuchirai Zororo Ndawana
   Selebi Phikwe
   Botswana
   11:06 Thursday 11 July 2024
*/

//+------------------------------------------------------------------+
//| Include necessary libraries                                      |
//+------------------------------------------------------------------+
#include <Trade/Trade.mqh>
CTrade Trade;

次に、プログラムの入力を定義する必要があります。これらの入力は、テクニカル指標の期間、希望する取引ロットサイズ、その性質の他の変数を制御します。

//+------------------------------------------------------------------+
//| Input parameters for technical indicators                        |
//+------------------------------------------------------------------+
input int stoch_percent_k = 5; // Stochastic %K
input int stoch_percent_d = 3; // Stochastic %D
input int stoch_slowing   = 3; // Stochastic Slowing

input int macd_fast_ema = 12; // MACD Fast EMA
input int macd_slow_ema = 26; // MACD Slow EMA
input int macd_sma = 9;       // MACD SMA

input int ma_period = 60; // Moving Average Period
input int mfi_period = 14; // MFI Period

input int lot_multiple = 10; // Lot size multiplier

ここで、アプリケーション全体で使用するグローバル変数を作成しましょう。これらの変数には、支持レベルと抵抗レベル、テクニカル指標のバッファ、売値と買値、およびその他の情報が格納されます。

//+------------------------------------------------------------------+
//| Global variables                                                 |
//+------------------------------------------------------------------+
double ask, bid;               // Ask and Bid prices
double min_distance = 0.2;     // Minimum distance for stoploss
double min_lot_size = 0;       // Minimum lot size
double position_size;          // Actual position size

double last_week_high = 0;     // High of the previous week
double last_week_low = 0;      // Low of the previous week

string last_week_high_name = "last week high"; // Name for high level object
string last_week_low_name = "last week low";   // Name for low level object

double higher_time_frame_change = 0.0; // Change on higher time frame
string zone_location = "";             // Current zone location

int zone = 0;                // Zone indicator
string higher_time_frame_trend = ""; // Higher time frame trend
int trend = 0;               // Trend indicator

int ma_handler, stoch_handler, macd_handler, mfi_handler; // Handlers for indicators
double ma_reading[], stoch_signal_reading[], macd_signal_reading[], mfi_reading[]; // Buffers for indicator readings

OnInit()ハンドラを定義することが目的です。この関数では、テクニカル指標を初期化し、取引ロットサイズを適切に調整します。

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- Set up handlers for technical indicators
   ma_handler = iMA(_Symbol, PERIOD_CURRENT, ma_period, 0, MODE_EMA, PRICE_CLOSE);
   macd_handler = iMACD(_Symbol, PERIOD_CURRENT, macd_fast_ema, macd_slow_ema, macd_sma, PRICE_CLOSE);
   stoch_handler = iStochastic(_Symbol, PERIOD_CURRENT, stoch_percent_k, stoch_percent_d, stoch_slowing, MODE_EMA, STO_CLOSECLOSE);
   mfi_handler = iMFI(_Symbol, PERIOD_CURRENT, mfi_period, VOLUME_TICK);

//--- Adjust lot size
   min_lot_size = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MIN);
   position_size = min_lot_size * lot_multiple;

//--- Initialization done
   return(INIT_SUCCEEDED);
  }

ここで、先週の取引履歴で定義された支持レベルと抵抗レベルを取得する関数を定義します。

//+------------------------------------------------------------------+
//| Function to get the previous week's high and low prices          |
//+------------------------------------------------------------------+
bool get_last_week_high_low(void)
  {
//--- Reset values
   last_week_high = 0;
   last_week_low = 0;

//--- Remove old levels if any
   ObjectDelete(0, last_week_high_name);
   ObjectDelete(0, last_week_low_name);

//--- Update high and low values
   last_week_high = iHigh(_Symbol, PERIOD_W1, 1);
   last_week_low = iLow(_Symbol, PERIOD_W1, 1);

//--- Mark current levels of support and resistance
   ObjectCreate(0, last_week_high_name, OBJ_HLINE, 0, 0, last_week_high);
   ObjectCreate(0, last_week_low_name, OBJ_HLINE, 0, 0, last_week_low);

//--- Check for valid values
   return((last_week_high * last_week_low) != 0);
  }

次に、上位時間枠で起きている値動きを理解する必要があります。機関投資家が市場でどのような動きをしてきたかを推測するために、過去のビジネスサイクルを3ヶ月ほど振り返ることを覚えておいてください。

//+------------------------------------------------------------------+
//| Function to determine higher time frame price movement           |
//+------------------------------------------------------------------+
bool get_higher_time_frame_move(void)
  {
//--- Analyze weekly time frame
   higher_time_frame_change = iClose(_Symbol, PERIOD_CURRENT, 1) - iClose(_Symbol, PERIOD_W1, 12);

//--- Check for valid values
   return((iClose(_Symbol, PERIOD_W1, 12) * iClose(_Symbol, PERIOD_W1, 1)) != 0);
  }

次の課題は、収集した値動きのシグナルを解釈することです。特に、先週の高値を上回ればゾーン1、下回ればゾーン3、その中間であればゾーン2であることを理解する必要があります。次に、上位時間枠で特定したトレンドにラベルを付けます。もし価格が上位時間枠で上昇していれば、トレンド1に、そうでなければトレンド-1にします。

//+------------------------------------------------------------------+
//| Function to interpret price action data                          |
//+------------------------------------------------------------------+
void interpet_price_action(void)
  {
//--- Determine zone location based on last week's high and low
   if(iClose(_Symbol, PERIOD_CURRENT, 0) > last_week_high)
     {
      zone = 1;
      zone_location = "We are above last week's high";
     }
   else if(iClose(_Symbol, PERIOD_CURRENT, 0) < last_week_low)
     {
      zone = 3;
      zone_location = "We are below last week's low";
     }
   else
     {
      zone = 2;
      zone_location = "We are stuck inside last week's range";
     }

//--- Determine higher time frame trend
   if(higher_time_frame_change > 0)
     {
      higher_time_frame_trend = "Higher time frames are in an up trend";
      trend = 1;
     }
   else if(higher_time_frame_change < 0)
     {
      higher_time_frame_trend = "Higher time frames are in a down trend";
      trend = -1;
     }
  }

テクニカル指標の値を更新し、現在の市場データを取得する関数が必要です。

//+------------------------------------------------------------------+
//| Function to update technical indicators and fetch market data    |
//+------------------------------------------------------------------+
void update_technical_indicators(void)
  {
//--- Update market prices
   ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
   bid = SymbolInfoDouble(_Symbol, SYMBOL_BID);

//--- Copy indicator buffers
   CopyBuffer(ma_handler, 0, 1, 1, ma_reading);
   CopyBuffer(stoch_handler, 1, 1, 1, stoch_signal_reading);
   CopyBuffer(macd_handler, 1, 1, 1, macd_signal_reading);
   CopyBuffer(mfi_handler, 0, 1, 1, mfi_reading);
  }

この関数は取引エントリを実行し、弱気センチメント関数から許可があれば売り取引を開始します。逆に、強気のセンチメント関数から許可を得た場合のみ、買いポジションを建てることができます。

//+------------------------------------------------------------------+
//| Function to find entry points for trades                         |
//+------------------------------------------------------------------+
void find_entry(void)
  {
//--- Check for bullish sentiment
   if(bullish_sentiment())
     {
      Trade.Buy(position_size, _Symbol, ask, (last_week_low - min_distance), (last_week_high + min_distance));
     }
//--- Check for bearish sentiment
   else if(bearish_sentiment())
     {
      Trade.Sell(position_size, _Symbol, bid, (last_week_high + min_distance), (last_week_low - min_distance));
     }
  }

ここで、2つの取引システムが買いのセットアップのために一直線に並ぶとはどういうことか、注意深く定義してみましょう。先ほどの説明で定義した条件を思い出してください。価格が移動平均線を上回って終値を付け、MFI指標が50を超え、MACD値が0を超え、ストキャスティクスオシレーターが20を超え、上位時間枠でのトレンドが強気で、支持レベルを超えている必要があります。

//+------------------------------------------------------------------+
//| Function to analyze bullish signals                              |
//+------------------------------------------------------------------+
bool bullish_sentiment(void)
  {
//--- Analyze conditions for bullish sentiment
   return((mfi_reading[0] > 50) &&
          (iClose(_Symbol, PERIOD_CURRENT, 1) > ma_reading[0]) &&
          (macd_signal_reading[0] > 0) &&
          (stoch_signal_reading[0] > 20) &&
          (trend == 1) &&
          (zone < 3));
  }

その逆は売り仕掛けにも当てはまります。

//+------------------------------------------------------------------+
//| Function to analyze bearish signals                              |
//+------------------------------------------------------------------+
bool bearish_sentiment(void)
  {
//--- Analyze conditions for bearish sentiment
   return((mfi_reading[0] < 50) &&
          (iClose(_Symbol, PERIOD_CURRENT, 1) < ma_reading[0]) &&
          (macd_signal_reading[0] > 0) &&
          (stoch_signal_reading[0] < 80) &&
          (trend == -1) &&
          (zone > 1));
  }

最後に、OnTick() イベントハンドラが必要です。これにより、アプリケーションが意図した通りにイベントのフローを実行できるようにします。特に、タイムスタンプの確認から始めることが重要です。これは、アプリケーションが支持線と抵抗線を週に一度だけ確認することを保証するためです。新しい週足ローソク足が生成されない限り、毎ティックごとに同じ情報を何度もチェックする意味がありません。すべてがうまくいけば、EAはプライスアクションを解釈し、テクニカル指標を更新し、取引エントリを探します。

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- Check for new candle on higher time frame
   static datetime time_stamp;
   datetime current_time = iTime(_Symbol, PERIOD_W1, 0);

   if(time_stamp != current_time)
     {
      time_stamp = current_time;

      if(!get_last_week_high_low())
        {
         Print("Failed to get historical performance of ", _Symbol);
         Print("[ERROR]: ", GetLastError());
        }
      else if(!get_higher_time_frame_move())
        {
         Print("Failed to analyze historical performance of ", _Symbol);
         Print("[ERROR]: ", GetLastError());
        }
     }
   else
     {
      interpet_price_action();
      update_technical_indicators();
      if(PositionsTotal() == 0)
        {
         find_entry();
        }
      Comment("Last week high: ", last_week_high, "\nLast week low: ", last_week_low, "\nZone: ", zone_location, "\nTrend: ", higher_time_frame_trend);
     }
  }


私たちのシステム

図2:H1時間枠でAUDJPYを取引しているEA

私たちのシステム

図3:AUDJPY銘柄のH1データを1ヶ月間使用し、取引アルゴリズムをバックテストした結果


結論

この記事では、取引戦略におけるファンダメンタル分析とテクニカル分析の統合について説明しました。MQL5を活用することで、これらの異なる視点から得られる洞察をシームレスに組み合わせ、実行可能な取引指示書を作成する方法を示しました。ファンダメンタルデータとテクニカルデータが対立するのではなく、互いに補完し合う枠組みを提供することで、読者が両方のアプローチを効果的に活用できる力を授けます。


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

添付されたファイル |
EAのサンプル EAのサンプル
一般的なMACDを使ったEAを例として、MQL4開発の原則を紹介します。
PythonとMQL5によるポートフォリオ最適化 PythonとMQL5によるポートフォリオ最適化
この記事では、MetaTrader 5を使ったPythonとMQL5による高度なポートフォリオ最適化技術を紹介します。データ分析、資産配分、売買シグナル生成のためのアルゴリズム開発方法を示し、現代の金融管理やリスク軽減におけるデータ主導の意思決定の重要性を強調します。
エラー 146 (「トレードコンテキスト ビジー」) と、その対処方法 エラー 146 (「トレードコンテキスト ビジー」) と、その対処方法
この記事では、MT4において複数のEAの衝突をさける方法を扱います。ターミナルの操作、MQL4の基本的な使い方がわかる人にとって、役に立つでしょう。
MQL5でインタラクティブなグラフィカルユーザーインターフェイスを作成する(第2回):コントロールと応答性の追加 MQL5でインタラクティブなグラフィカルユーザーインターフェイスを作成する(第2回):コントロールと応答性の追加
ダイナミックな機能でMQL5のGUIパネルを強化することで、ユーザーの取引体験を大幅に向上させることができます。インタラクティブな要素、ホバー効果、リアルタイムのデータ更新を取り入れることで、パネルは現代のトレーダーにとって強力なツールとなるでしょう。