MQL5ウィザードを利用すれば、プログラミングなしで自動的にエキスパートアドバイザー(EA)を作成できます(詳細はMQL5ウィザード:プログラミングなしでエキスパートアドバイザーを作成する方法を参照)。
この中で、CSignalCandlesクラスはリバーサルキャンドルパターンに基づくトレードシグナルを提供します。この戦略は、「リバーサルキャンドルパターンに基づくシグナル」としてMQL5ウィザードでEAを自動作成する際に利用されます。
システムのアイデアは、複合キャンドルの計算を通じてリバーサルパターンを特定することです。このリバーサルパターンは、日本のキャンドル分析における「ハンマー」や「ハンギングマン」と似ていますが、単一のキャンドルではなく複合キャンドルを使用し、小さいボディのキャンドルを確認する必要はありません。
入力パラメーターは以下の通りです:
- Range - 複合キャンドルの計算に使用される最大バー数。
- Minimum - 複合キャンドルの最小サイズ(通常のポイント単位)。
- ShadowBigおよびShadowSmall - 複合キャンドルのシャドウ(複合キャンドル単位)。
- Limit、StopLossおよびTakeProfit - 開始価格、SLおよびTPレベルを複合キャンドルの終値に対して定義した値。
- Expiration - 保留注文でのトレードに使用される注文の有効期限(バー単位)。
リバーサルキャンドルパターンは以下のように判断されます。
最近完了したバー(インデックス1)からRange入力パラメーターで定義されたバー数まで複合キャンドルのパラメーターを計算します。複合キャンドルのサイズがMinimum入力パラメーターで指定された値よりも大きい場合、シャドウの分析によって複合キャンドルのリバーサル条件を確認します。
弱気の力は複合キャンドルの上部シャドウのサイズで表され、強気の力は下部シャドウのサイズで表されます。
- 弱気トレンドのリバーサルを確認するためには、以下が必要です:下部シャドウのサイズ(強気の力)がShadowBig入力パラメーターで定義された値よりも大きく、上部シャドウのサイズ(弱気の力)がShadowSmall入力パラメーターで定義された値よりも小さいこと。
- 強気トレンドのリバーサルを確認するためには、以下が必要です:上部シャドウのサイズ(弱気の力)がShadowBig入力パラメーターで定義された値よりも大きく、下部シャドウのサイズ(強気の力)がShadowSmall入力パラメーターで定義された値よりも小さいこと。
リバーサル戦略に加えて、Limit入力パラメーターの負の値を指定することでブレイクダウン戦略を使用することも可能です(詳細はMQL5ウィザード - 2つのEMAのクロスオーバーに基づくトレードシグナルと日中時間フィルターを参照)。
Limitに応じて、3つの異なるマーケットエントリー方法が使用されます:
- Limit>0の場合:価格が戻った時に、マーケット価格よりも良い価格でエントリーします(トレードシグナルに応じてBuy LimitまたはSell Limitの保留注文が出されます)。
- Limit<0の場合:価格の動きに沿ってエントリーします(トレードシグナルに応じてBuy StopまたはSell Stopの保留注文が出されます)。
- Limit=0の場合:マーケット価格を使用してトレードします。
この戦略はCSignalCandlesクラスに実装されています。

図1. リバーサルキャンドルパターンに基づくトレードシグナル
トレードシグナル
トレードシグナルはCSignalCandlesクラスに実装されており、分析に使用されるCandle()関数があります:
int Candle(int ind); // 複合キャンドルのタイプに応じて正の数または負の数を返します // 戻り値は複合キャンドル内のバー(キャンドル)の数です(indから始まる)
複合キャンドルを構築するために、複数のキャンドル(バー)を使用できます。最小バー数はRangeパラメーターで定義されています。場合によっては、サイズ/シャドウ条件が満たされている場合、Range未満のキャンドルで複合キャンドルが形成されることもあります。Candle関数は、複合キャンドルが形成できない場合、0を返します。
1. ロングポジションを開く
ロングポジションを開くには、強気の複合キャンドルが必要です。関数はそれを確認し、複合キャンドルがまだ形成されていないか、または複合キャンドルが弱気であれば返します。それ以外の場合、複合キャンドルのサイズを計算し(価格、SL、TPレベルの計算に必要)、保留注文の価格レベルを計算します。
なお、保留注文のタイプ(Buy LimitまたはBuy Stop)はLimit入力パラメーターの符号によって異なります(Limit=0の場合、|価格-ask| 2. ロングポジションをクローズする 弱気の複合キャンドルが形成された場合、ロングポジションはクローズされます。 3. ショートポジションを開く ショートポジションを開くには、弱気の複合キャンドルが形成される必要があります。複合キャンドルが形成されていない場合、またはそれが弱気でない場合は返します。それ以外の場合、サイズを特定し、保留注文の価格レベルを計算します(注文タイプはLimit入力パラメーターの符号に依存します)。 4. ショートポジションをクローズする 強気の複合キャンドルが形成された場合、ショートポジションはクローズされます。 エキスパートアドバイザーをMQL5ウィザードで作成する方法 戦略に基づくトレーディングロボットを作成するには、「リバーサルキャンドルパターンに基づくシグナル」を選択します。これはMQL5ウィザードの「既製のエキスパートアドバイザーの作成」オプションにあります。 図2. MQL5ウィザードでリバーサルキャンドルパターンに基づくシグナルを選択 次に、必要なトレーリングストップアルゴリズムと資金とリスク管理システムを指定します。エキスパートアドバイザーのコードは自動的に生成されますので、コンパイルしてMetaTrader 5クライアントターミナルのストラテジーテスターでテストできます。 テスト結果 リバーサルキャンドルパターンに基づくエキスパートアドバイザーのバックテストを考慮してみましょう(EURUSD M15、テスト期間:2010年1月1日から2011年5月1日、Range=3、Minimum=50、ShadowBig=0.5、ShadowSmall=0.2、Limit=0、StopLoss=2.0、TakeProfit=1.0、Expiration=4)。 エキスパートアドバイザーの作成には固定ボリュームを使用しました(固定ロット取引、0.1)、トレーリングストップアルゴリズムは使用しませんでした(トレーリングなし)。 図3. リバーサルキャンドルパターンに基づくエキスパートアドバイザーのテスト結果 添付ファイル: CSignalCandlesクラスを含むSignalCandles.mqhはterminal_data_folder\MQL5\Include\Expert\Signalフォルダに配置する必要があります。 expert_candles.mq5はMQL5ウィザードを使用して作成されたエキスパートアドバイザーのコードを含んでいます。//+------------------------------------------------------------------+ //| ロングポジション(買い)を開く条件をチェック| //+------------------------------------------------------------------+ bool CSignalCandles::CheckOpenLong(double& price,double& sl,double& tp,datetime& expiration)
{
//--- 強気の複合キャンドル形成の事実をチェック
if(Candle(1)<=0) return(false);
//--- 複合キャンドルのサイズを取得
double size=m_high_composite-m_low_composite;
//--- 保留注文の価格を計算
price=m_symbol.NormalizePrice(m_symbol.Ask()-m_limit*size);
//--- ストップロス価格を計算
sl =m_symbol.NormalizePrice(price-m_stop_loss*size);
//--- テイクプロフィット価格を計算
tp =m_symbol.NormalizePrice(price+m_take_profit*size);
//--- 注文の有効期限を設定
expiration+=m_expiration*PeriodSeconds(m_period);
//--- 条件が満たされていれば、trueを返す
return(true);
}
//+------------------------------------------------------------------+ //| ロングポジションをクローズする条件をチェック |//+------------------------------------------------------------------+ bool CSignalCandles::CheckCloseLong(double& price)
{
//--- 弱気の複合キャンドル形成の事実をチェック
if(Candle(1)>=0) return(false);
//---
price=0.0;
//--- 条件が満たされていれば、trueを返す
return(true);
}//+------------------------------------------------------------------+ //| ショートポジション(売り)を開く条件をチェック |//+------------------------------------------------------------------+ bool CSignalCandles::CheckOpenShort(double& price,double& sl,double& tp,datetime& expiration)
{
//--- 弱気の複合キャンドル形成の事実をチェック
if(Candle(1)>=0) return(false);
//--- 複合キャンドルのサイズを取得
double size=m_high_composite-m_low_composite;
//--- 保留注文の価格を計算
price=m_symbol.NormalizePrice(m_symbol.Bid()+m_limit*size);
//--- ストップロス価格を計算
sl =m_symbol.NormalizePrice(price+m_stop_loss*size);
//--- テイクプロフィット価格を計算
tp =m_symbol.NormalizePrice(price-m_take_profit*size);
//--- 注文の有効期限を設定
expiration+=m_expiration*PeriodSeconds(m_period);
//--- 条件が満たされていれば、trueを返す
return(true);
}//+------------------------------------------------------------------+ //| ショートポジションをクローズする条件をチェック |//+------------------------------------------------------------------+ bool CSignalCandles::CheckCloseShort(double& price)
{
//--- 強気の複合キャンドル形成の事実をチェック
if(Candle(1)<=0) return(false);
//---
price=0.0;
//--- 条件が満たされていれば、trueを返す
return(true);
}


関連記事