English Deutsch
preview
プライスアクション分析ツールキットの開発(第5回):Volatility Navigator EA

プライスアクション分析ツールキットの開発(第5回):Volatility Navigator EA

MetaTrader 5 | 15 4月 2025, 07:33
131 0
Christian Benjamin
Christian Benjamin

はじめに

取引の複雑さに対処するには、単に潜在的な市場の方向性を特定するだけでなく、正確な実行も求められます。多くのトレーダーが挫折するのは、取引の実行が不十分なためではなく、エントリーポイント、ストップロスの設定、またはテイクプロフィット目標の不正確さのためです。

この課題に対処するために、MQL5プログラミング言語を使用して、取引のこれらの重要な側面を最適化するように特別に設計されたVolatility Navigatorという新しいツールを開発しました。市場動向の予測に主に焦点を当てた以前のツールとは異なり、Volatility Navigatorは最適なエントリーポイント、ストップロスレベル、およびテイクプロフィットターゲットを独自に特定します。

高度なテクニカル指標をプライスアクション分析に組み込むことで、取引体験を向上させ、戦略策定を改善することを目指しています。

以下のセクションを参照してください。



テクニカル指標

テクニカル指標は、トレンド指標、モメンタム指標、ボラティリティ指標、出来高指標など、いくつかの種類に分類されます。それぞれが金融市場の分析において異なる目的を担っており、代表的なものとしては、移動平均線、RSI(相対力指数)、ボリンジャーバンド、MACD(移動平均収束拡散法)などが挙げられます。

ここでは、プライスアクションと組み合わせて使用する3つの主要な指標、すなわちボリンジャーバンド、RSI、ATR(Average True Range) を詳しく見ていきましょう。

  • ボリンジャーバンド

ボリンジャーバンドは、1980年代初頭にジョン・ボリンジャーによって開発されたテクニカル分析ツールで、市場のトレンドや潜在的な価格の反転ポイントを識別するのに役立つ指標です。このコンセプトは、従来のテクニカル指標よりも価格変動(ボラティリティ)をより動的に測定する手法を提供したいというボリンジャー氏の考えから誕生しました。彼は、変化する市場環境に適応できる柔軟なツールを目指して設計を行いました。

市場のボラティリティに応じて変化する指標を模索していた彼は、移動平均と価格の変動幅(標準偏差)を組み合わせるというアイデアにたどり着きました。ボリンジャーバンドは、以下の3本のラインで構成されます。

  1. 中間バンド:一般的に、指定した期間(通常は20日間)の終値の単純移動平均(SMA)です。
  2. 上部バンド:中間バンドに、標準偏差×n(通常は2)を加えたものです。
  3. 下部バンド:中間バンドから、標準偏差×n(通常は2)を引いたものです。 

ボリンジャーバンド

図1:ボリンジャーバンド

ボリンジャーバンドでは、ボラティリティを統計的に捉えるために標準偏差が用いられており、これが非常に重要な要素となっています。この標準偏差を取り入れることで、価格の変動を一定のレンジ内に収めることができ、トレーダーがブレイクアウトや反転の兆候を見極めやすくなります。 

トレーダーはボリンジャーバンドを活用して、買われすぎや売られすぎの状態、トレンド反転の可能性、また価格変動の勢い(モメンタム)を判断します。例えば、価格が上限に達すると買われすぎ、下限に達すると売られすぎとされることが多いです。

  • RSI(相対力指数)

RSI (Relative Strength Index)は、J・ウェルズ・ワイルダー・ジュニアによって開発され、1978年に出版された著書『New Concepts in Technical Trading Systems』で紹介されました。ワイルダー氏は、金融市場における買われすぎや売られすぎの状況を特定するためのモメンタム系オシレーターを作りたいと考えていました。 以下は、RSIの計算式です。

RSI計算

図2:RSIの式

RSIは、価格変動の速度と変化の度合いを測定することで、特定の期間(通常は14日間)における市場の「買われすぎ」や「売られすぎ」の状態を判断するために用いられます。RSIの値は0から100の範囲で示され、70を超えると一般的に買われすぎ、30を下回ると売られすぎの可能性があると見なされます。

トレーダーは、RSIを活用してトレンドの反転シグナルを探したり、既存トレンドの継続を確認したりします。また、RSIと価格の動きに乖離(ダイバージェンス)が見られる場合は、モメンタムの弱まりを示唆し、新たな取引チャンスが生まれることもあります。

RSI

図3:RSIチャート

  • ATR (Average True Range)

ATR(Average True Range、平均真の値幅)は、J・ウェルズ・ワイルダー・ジュニアによって開発され、1978年の著書『New Concepts in Technical Trading Systems』で紹介されました。ワイルダー氏は、一定期間における価格変動の最大範囲を考慮するTrue Range (TR)を計算して市場のボラティリティを測定するためにATRを作成しました。

以来、ATRはテクニカル分析において広く使用されており、トレーダーがさまざまな金融市場におけるボラティリティを評価し、リスク管理に活用するための有用なツールとなっています。ATRは、指定した期間における価格変動の大きさを測定するボラティリティ指標であり、価格の方向性を示さずに、市場の不安定さや活発さを可視化します。

ATRの値が高いほど市場の変動が大きく、低いほど変動が小さいことを意味します。トレーダーはATRを基に、ストップロスの設定やポジションサイズの調整など、ボラティリティに応じたリスク管理戦略を構築します。これにより、市場の状況に応じて取引スタイルを柔軟に適応させ、さまざまな相場環境でも効果的な取引が可能となります。 それでは、次にATRの計算方法を見ていきましょう。

ATR計算

図4:ATRの計算

取引戦略でATRを使用する目的は、現在の市場のボラティリティに基づいてストップロスとテイクプロフィットのレベルを動的に調整することです。ATRは価格変動の度合いを示す指標であり、ボラティリティが高い局面ではより広い値幅を、相場が落ち着いている局面ではより狭い値幅をエキスパートアドバイザー(EA)が自動的に設定できるようにします。このアプローチにより、ボラティリティの高い状況下でもポジションが早期に損切りされるリスクを抑える一方で、比較的静かな相場では利益を確実に狙うことが可能となります。ATRを活用することで、EAは常に変化する市場環境に柔軟に対応でき、より効率的な取引の執行と成功率の向上が期待されます。



EAの構造の概要

Volatility Navigator EAは、MQL5プログラミング標準に準拠した構造化レイアウトで設計されています。このレイアウトを理解することは、EAを効果的に設定し、市場の状況の変化に応じて調整をおこなうために重要です。MQL5では、インジケーターハンドルは、EA内でテクニカルインジケーターを使用するプロセスを合理化する重要なツールです。EAは、価格が変化するたびにインジケーターを再計算するのではなく、これらのハンドルをすばやく参照して最新の値を取得できます。 

たとえば、OnTick()関数が実行されるたびに、EAは関連するインジケーター値に効率的にアクセスできます。これは、急速に変化する市場状況で特に有益です。この即時アクセスにより、現在の市場動向に基づいたより適切なアクションが可能になります。

EAのコア関数

MQL5 EAの主要コンポーネントは、OnInit()、OnTick()、およびOnDeinit()の3つの主要関数で構成されています。

  • OnInit()関数

この関数は、EAがチャートにアタッチされたときに1回実行されます。その主な役割は、必要なインジケーターの設定など、EAを初期化することです。
int OnInit() {
    // Initialize RSI
    rsiHandle = iRSI(NULL, 0, rsiPeriod, PRICE_CLOSE);
    // Initialize Bollinger Bands
    bbHandle = iBands(NULL, 0, bbPeriod, 2, 0, PRICE_CLOSE);
    // Initialize ATR
    atrHandle = iATR(NULL, 0, atrPeriod);
    return INIT_SUCCEEDED;
}

上記のコードスニペットでは、RSI、ボリンジャーバンド、およびATRインジケーターのハンドルを作成しています。これらはすべて、EAが取引の決定を下すのに役立ちます。

  • OnTick()関数

OnTick()関数は、市場で価格変動があるたびに呼び出されるため重要です。ここで、EAは現在のインジケーターの値を評価し、適切な取引アクションを決定します。

void OnTick() {
    double rsiValue = iRSI(NULL, 0, rsiPeriod, PRICE_CLOSE);
    double upperBand, middleBand, lowerBand;
    iBands(NULL, 0, bbPeriod, 2, 0, PRICE_CLOSE, upperBand, middleBand, lowerBand);
    double atrValue = iATR(NULL, 0, atrPeriod);

    // Trading logic
    if (rsiValue > 70 && Close[0] > upperBand) {
        // Logic to place a sell order
    } 
    else if (rsiValue < 30 && Close[0] < lowerBand) {
        // Logic to place a buy order
    }
}

ここで、EAはRSI値、ボリンジャーバンド、ATRをチェックして、情報に基づいた取引決定をおこないます。たとえば、RSIが買われすぎの状態を示し、価格がボリンジャーバンドの上限を超えたときに売ります。 

  • OnDeinit()関数

EAがチャートから削除されると、OnDeinit()関数が呼び出されます。この関数は、インジケーターハンドルを解放してリソースをクリーンアップする上で重要な役割を果たします。

void OnDeinit(const int reason) {
    // Release resources for indicators
    IndicatorRelease(rsiHandle);
    IndicatorRelease(bbHandle);
    IndicatorRelease(atrHandle);
}

入力パラメータ

Volatility Navigator EAの際立った機能の1つは、カスタマイズ可能な入力パラメータによる柔軟性です。これらのパラメータにより、トレーダーは独自の戦略に合わせてEAの動作をカスタマイズできます。重要な入力パラメータには次のようなものがあります。

  • RSI期間

input int rsiPeriod = 14; // Standard period for RSI calculation

  • ボリンジャーバンド期間

input int bbPeriod = 20; // Standard period for Bollinger Bands

  • ATR期間

input int atrPeriod = 14; // Period for ATR



EAの主なロジック

まず、以下の図を見てみましょう。この図は、買い注文のシグナルがどのように生成されるかを示しており、売り注文のプロセスはその逆になっています。

シグナル生成

図5:シグナル生成条件

  • シグナル計算処理

Volatility Navigator EAの主な機能は、市場の状況を分析して取引シグナルを生成することです。このプロセスの一環として、EAはOnTick関数で関連するインジケーターの現在の値を取得します。以下は、EA内でRSI、ボリンジャーバンド、ATRを計算する方法を示したスニペットです。

// Declare indicator handles
int rsiHandle;
int bbHandle;
int atrHandle;

// OnInit function
int OnInit() {
    // Create indicator handles
    rsiHandle = iRSI(NULL, 0, rsiPeriod, PRICE_CLOSE);
    bbHandle = iBands(NULL, 0, bbPeriod, bbDevUp, bbDevDown, PRICE_CLOSE);
    atrHandle = iATR(NULL, 0, atrPeriod);
    
    return(INIT_SUCCEEDED);
}

この設定では、OnInit関数はRSI、ボリンジャーバンド、およびATRのハンドルを初期化し、EAが進行中の計算のためにそれらの値にアクセスできるようにします。

  • RSI状態の評価

RSIインジケーターは、買われすぎと売られすぎの状態を示すことで、エントリーとエグジットの潜在的なポイントを特定するのに役立ちます。RSI値を分析することで、EAは戦略的な取引の選択をおこなうことができます。次のスニペットは、RSI値を確認する方法を示しています。

double rsiValue = iCustom(NULL, 0, "RSI", rsiPeriod, 0);
if (rsiValue > 70) {
    // Market is overbought - potentially signal to sell
} else if (rsiValue < 30) {
    // Market is oversold - potentially signal to buy
}

このコードでは、EAは現在のRSI値を取得し、それを事前定義された閾値70と30と比較して、潜在的な取引シグナルを決定します。

  • ボリンジャーバンドの分析

ボリンジャーバンドは、移動平均からの価格の偏差を視覚化することで市場のボラティリティを表します。バンドの幅は、潜在的なボラティリティの急上昇または平穏期間を示している可能性があります。次のコードは、EAがボリンジャーバンドを評価する方法を示しています。
double upperBand = iBands(NULL, 0, bbPeriod, bbDevUp, 0, PRICE_CLOSE);
double lowerBand = iBands(NULL, 0, bbPeriod, -bbDevDown, 0, PRICE_CLOSE);
double price = Close[0];

if (price < lowerBand) {
    // Price is touching the lower band - potential buy signal
} else if (price > upperBand) {
    // Price is touching the upper band - potential sell signal
}

このスニペットは、EAが現在の価格がボリンジャーバンドの上部バンドまたは下限に近いかどうかをチェックするために使用するロジックを示しています。これにより、買いまたは売りのシグナルがトリガーされる可能性があります。

  • ATR (Average True Range)の組み込み

ATRは市場のボラティリティに関する洞察を提供し、ストップロスとテイクプロフィットの設定を通じてリスク管理を支援します。次のコードはATR値を取得します。

double atrValue = iATR(NULL, 0, atrPeriod);

if (atrValue > atrThreshold) {
    // High volatility - consider entering trades
} else {
    // Low volatility - potentially stay out of the market
}

この例では、EAはATRをチェックして、ボラティリティが取引の開始を正当化するのに十分かどうかを判断します。トレーダーは、意味のある価格変動が予想されることを示す、高いATR値を好みます。

  • 取引シグナルの生成

RSI、ボリンジャーバンド、ATRからの洞察を組み合わせることで、EAはより信頼性の高い取引シグナルを生成します。次のスニペットは、EAがこれらのシグナルをどのように定式化するかを示しています。

if (rsiValue < 30 && price < lowerBand && atrValue > atrThreshold) {
    // Generate buy signal
} else if (rsiValue > 70 && price > upperBand && atrValue > atrThreshold) {
    // Generate sell signal
}
この複合的な分析において、買いシグナルが発生するのは、RSIが示すように市場が売られすぎの状態にあり、価格がボリンジャーバンドの下限に接触しており、かつATRが十分なボラティリティを示している場合です。逆に、反対の条件下では売りシグナルが生成されます。
  • チャート上の視覚的なフィードバック

ユーザーエクスペリエンスを向上させるために、EAはシグナルを生成するときに視覚的なフィードバックを提供します。次のコードは、明確なチャート上のマークを使用してこれを実装する方法を示しています。

void DrawTradeSignals() {
    if (buySignal) {
        // Draw buy signal on the chart
        ObjectCreate(0, "BuySignal" + IntegerToString(TimeCurrent()), OBJ_ARROW, 0, Time[0], price);
    } else if (sellSignal) {
        // Draw sell signal on the chart
        ObjectCreate(0, "SellSignal" + IntegerToString(TimeCurrent()), OBJ_ARROW, 0, Time[0], price);
    }
}

要約すると、Volatility Navigator EAの主なロジックは、複数の指標を介して現在の市場データを体系的に評価することを中心に展開されます。RSI、ボリンジャーバンド、ATRからの洞察を組み合わせることで、強力な取引シグナルを生成すると同時に、チャート上に貴重な視覚的なフィードバックを提供することができます。この多面的なアプローチにより、トレーダーの分析が強化され、最終的には変動の激しい市場を効果的に乗り切る助けとなります。


Volatility Navigator EAでのアラートと通知の実装

Volatility Navigator EAには、トレーダーが市場の状況に迅速かつ効果的に対応できるよう、統合されたアラートおよび通知システムが搭載されています。このシステムは、EAの主要インジケーターであるRSI、ボリンジャーバンド、ATRから生成される特定の取引シグナルに基づいて、タイムリーな洞察と警告を提供するために欠かせない要素です。

  • EAのアラートの種類

音声アラート:EAは、重要な取引シグナルが検出された際に音声通知を発するように設定されています。たとえば、RSIが70を上回って買われすぎの状態を示したり、30を下回って売られすぎの状態を示したりする場面で、音声アラートが鳴るようになっています。これにより、トレーダーは瞬時に反応し、市場機会に基づいた素早い判断が可能になります。

視覚アラート:音声通知に加え、EAはチャート上に直接表示される視覚的なアラート機能も備えています。たとえば、取引シグナルが発生した際には、価格ラインの色を変更したり、「買い」または「売り」といったシグナル内容を示すメッセージを画面に表示することが可能です。この機能により、音声に頼らず視覚的に現在の市場状況をすばやく把握できます。

  • EAロジックへのアラートの統合

Volatility Navigator EA内におけるアラートと通知は、メインの取引ロジックにシームレスに統合されています。

EAは各OnTickイベントで、インジケーターを継続的に監視し、取引シグナルの発生を確認します。たとえば、RSIが設定された閾値を超えるなど、特定の条件が満たされた場合にはアラートシーケンスが開始されます。シグナルが確認されると、該当するアラートが実行されます。

このアクティブ化プロセスには、サウンドの再生やチャート上の視覚的なマーカーの生成が含まれる場合があります。これらのアラートは、市場の状況に関する即時のフィードバックを提供し、トレーダーがすぐに対応できるようサポートします。こうした仕組みにより、取引への積極的な関与が促進され、利益を生む可能性のある市場の動きを効果的に捉えることが可能になります。 

// Example of defining thresholds
double rsiValue = iRSI(NULL, 0, 14, PRICE_CLOSE);

// Check for overbought and oversold conditions
if (rsiValue > 70) {
    // Audio Alert
    PlaySound("alert.wav");
    // Visual Alert on Chart
    ObjectCreate("OverboughtAlert", OBJ_TEXT, 0, Time[0], High[0]);
    ObjectSetText("OverboughtAlert", "Overbought Signal!", 12, "Arial", clrRed);
    // Additional actions like placing an order can be added here
} else if (rsiValue < 30) {
    // Audio Alert
    PlaySound("alert.wav");
    // Visual Alert on Chart
    ObjectCreate("OversoldAlert", OBJ_TEXT, 0, Time[0], Low[0]);
    ObjectSetText("OversoldAlert", "Oversold Signal!", 12, "Arial", clrGreen);
    // Additional actions like placing an order can be added here
}

上のコードスニペットは、RSIの動作に基づいて、Volatility Navigator EA内に音声および視覚アラートを実装するように設計されています。まず、コードはiRSI関数を使用して現在のRSI値を計算します。iRSI関数は、現在のチャート銘柄、時間枠、期間(14)、終値を入力として受け取ります。次に、RSI値が70の閾値を超えているかどうかをチェックし、買われすぎの状態を示します。この条件が満たされると、PlaySound関数が呼び出され、音声アラートが再生され、トレーダーに即時の注意を促します。

視覚アラート

図6:視覚アラート

さらに、現在の高価格レベルにテキストオブジェクトを配置することで、取引チャート上に視覚的なアラートが作成され、この買われすぎのシグナルが赤いテキストで強調表示されます。逆に、RSI値が30を下回り、売られすぎの状態を示す場合、同様の手順が実行されます。音声アラートが鳴り、現在の低価格レベルにテキストオブジェクトが生成され、シグナルが今度は緑色で表示されます。

このデュアルアラートシステムは、音声と視覚の両方の要素で構成されており、トレーダーが情報を入手このデュアルアラートシステムは、音声と視覚の両方の要素を組み合わせており、トレーダーが市場の重要な動きに迅速に反応できるようにし、全体的な取引効率を向上させます。

Volatility Navigator EAの音声および視覚アラートシステムは、変化する市場状況にタイムリーに対応できるように設計されています。これらのアラートを実装することで、EAはトレーダーが情報を把握し、即座に行動できるようにサポートし、最終的に取引効率と成功の向上に貢献します。 

以下はEAの完全なコードです。このコードには、取引操作を管理するために必要なすべての指示とロジックが含まれています。

//+------------------------------------------------------------------+
//|                                         Volatility Navigator.mq5 |
//|                               Copyright 2024, Christian Benjamin |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright   "2024, MetaQuotes Software Corp."
#property link        "https://www.mql5.com/ja/users/lynnchris"
#property description "The EA analyzes market conditions using the Bollinger Bands, RSI and ATR indicators"
#property version     "1.1"
#property strict

// Input parameters for trading strategy
input int rsiPeriod = 14;                  // Period for RSI calculation
input double overboughtLevel = 70.0;       // RSI level for overbought condition
input double oversoldLevel = 30.0;         // RSI level for oversold condition
input int bbPeriod = 20;                    // Period for Bollinger Bands
input double bbDeviation = 2.0;             // Deviation for Bollinger Bands
input int atrPeriod = 14;                   // ATR period for stop loss and take profit calculations
input double atrMultiplier = 1.5;           // Multiplier for ATR in calculating stop loss and take profit
input string signalSound = "alert.wav";     // Sound file for alert notifications

// Indicator handles for Bollinger Bands and ATR
int bbHandle = 0;
int atrHandle = 0;

// Function to clear previous drawings from the chart
void ClearPreviousDrawings()
{
    // Delete any previously created trade lines and signal text
    if (ObjectFind(0, "EntryPoint") != -1)
        ObjectDelete(0, "EntryPoint");
    if (ObjectFind(0, "StopLoss") != -1)
        ObjectDelete(0, "StopLoss");
    if (ObjectFind(0, "TakeProfit") != -1)
        ObjectDelete(0, "TakeProfit");
    if (ObjectFind(0, "SignalText") != -1)
        ObjectDelete(0, "SignalText");
    if (ObjectFind(0, "BuyArrow") != -1)
        ObjectDelete(0, "BuyArrow");
    if (ObjectFind(0, "SellArrow") != -1)
        ObjectDelete(0, "SellArrow");
}

// Function to draw entry points, stop loss, and take profit on the chart
void DrawTradeLines(double entryPoint, double stopLoss, double takeProfit, string signalText)
{
    // Clear previous drawings before drawing new ones
    ClearPreviousDrawings();

    // Draw the entry point line
    if (!ObjectCreate(0, "EntryPoint", OBJ_HLINE, 0, TimeCurrent(), entryPoint))
        Print("Failed to create EntryPoint line. Error: ", GetLastError());
    ObjectSetInteger(0, "EntryPoint", OBJPROP_COLOR, clrGreen);
    ObjectSetInteger(0, "EntryPoint", OBJPROP_WIDTH, 2);

    // Draw the stop loss line
    if (!ObjectCreate(0, "StopLoss", OBJ_HLINE, 0, TimeCurrent(), stopLoss))
        Print("Failed to create StopLoss line. Error: ", GetLastError());
    ObjectSetInteger(0, "StopLoss", OBJPROP_COLOR, clrRed);
    ObjectSetInteger(0, "StopLoss", OBJPROP_WIDTH, 2);

    // Draw the take profit line
    if (!ObjectCreate(0, "TakeProfit", OBJ_HLINE, 0, TimeCurrent(), takeProfit))
        Print("Failed to create TakeProfit line. Error: ", GetLastError());
    ObjectSetInteger(0, "TakeProfit", OBJPROP_COLOR, clrBlue);
    ObjectSetInteger(0, "TakeProfit", OBJPROP_WIDTH, 2);

    // Draw a label with the signal text to provide information at a glance
    if (!ObjectCreate(0, "SignalText", OBJ_LABEL, 0, TimeCurrent(), entryPoint + 10))
        Print("Failed to create SignalText label. Error: ", GetLastError());
    ObjectSetInteger(0, "SignalText", OBJPROP_XDISTANCE, 10);
    ObjectSetInteger(0, "SignalText", OBJPROP_YDISTANCE, 30);
    ObjectSetInteger(0, "SignalText", OBJPROP_COLOR, clrWhite);
    ObjectSetInteger(0, "SignalText", OBJPROP_FONTSIZE, 12);
    ObjectSetString(0, "SignalText", OBJPROP_TEXT, signalText);
}

// Function to draw arrows on the chart at entry points
void DrawEntryArrow(double price, string label, color arrowColor)
{
    if (!ObjectCreate(0, label, OBJ_ARROW, 0, TimeCurrent(), price))
    {
        Print("Failed to create arrow object. Error: ", GetLastError());
        return;
    }
    ObjectSetInteger(0, label, OBJPROP_ARROWCODE, 233); // Arrow code for upward direction
    ObjectSetInteger(0, label, OBJPROP_COLOR, arrowColor);
    ObjectSetInteger(0, label, OBJPROP_WIDTH, 2);       // Set the width of the arrow
}

// Function to manage open positions for efficient trade execution
void ManageOpenPositions(string symbol)
{
    // Loop through all open positions
    for (int i = PositionsTotal() - 1; i >= 0; i--)
    {
        ulong ticket = PositionGetTicket(i);
        if (PositionSelectByTicket(ticket))
        {
            // Check if the position is for the current symbol
            if (PositionGetString(POSITION_SYMBOL) == symbol)
            {
                double currentProfit = PositionGetDouble(POSITION_PROFIT);
                Print("Current Profit for position: ", currentProfit);
                // Additional management logic can be added here (e.g., close position, update SL/TP)
            }
        }
    }
}

// Function to calculate trade parameters such as entry point, stop loss, and take profit
void CalculateTradeParameters()
{
    // Get the current RSI value
    double rsiValue = iRSI(Symbol(), PERIOD_CURRENT, rsiPeriod, PRICE_CLOSE);
    Print("RSI Value: ", rsiValue);

    double bbUpper = 0.0;
    double bbLower = 0.0;
    double atrValue = 0.0;

    // Get the latest closing prices
    double closePrices[];
    if (CopyClose(NULL, 0, 0, 1, closePrices) <= 0)
    {
        Print("Error copying close prices: ", GetLastError());
        return; // Exit if there's an error
    }

    // Initialize and get values for Bollinger Bands
    if (bbHandle == 0)
    {
        bbHandle = iBands(NULL, 0, bbPeriod, 0, bbDeviation, PRICE_CLOSE);
    }

    if (bbHandle != INVALID_HANDLE)
    {
        double bbBuffer[];
        // Get the upper and lower Bollinger Bands
        if (CopyBuffer(bbHandle, 1, 0, 1, bbBuffer) > 0)
        {
            bbUpper = bbBuffer[0]; // Upper band value
            Print("Bollinger Band Upper: ", bbUpper);
        }

        if (CopyBuffer(bbHandle, 2, 0, 1, bbBuffer) > 0)
        {
            bbLower = bbBuffer[0]; // Lower band value
            Print("Bollinger Band Lower: ", bbLower);
        }

        // Initialize and get the ATR value
        if (atrHandle == 0)
        {
            atrHandle = iATR(NULL, 0, atrPeriod);
        }

        if (atrHandle != INVALID_HANDLE)
        {
            double atrBuffer[];
            if (CopyBuffer(atrHandle, 0, 0, 1, atrBuffer) > 0)
            {
                atrValue = atrBuffer[0]; // Current ATR value
                Print("ATR Value: ", atrValue);
            }
        }

        double entryPoint, stopLoss, takeProfit;

        // Generate buy or sell signals based on Bollinger Bands and RSI values
        if (closePrices[0] < bbLower && rsiValue < oversoldLevel)  // Buy Condition
        {
            entryPoint = closePrices[0];
            stopLoss = entryPoint - (atrValue * atrMultiplier);
            takeProfit = entryPoint + (atrValue * atrMultiplier * 2);
            DrawTradeLines(entryPoint, stopLoss, takeProfit, "Buy Signal");
            DrawEntryArrow(entryPoint, "BuyArrow", clrGreen); // Draw Buy Arrow
            PlaySound(signalSound); // Notify with sound for new entry
        }
        else if (closePrices[0] > bbUpper && rsiValue > overboughtLevel)  // Sell Condition
        {
            entryPoint = closePrices[0];
            stopLoss = entryPoint + (atrValue * atrMultiplier); // Above entry for short position
            takeProfit = entryPoint - (atrValue * atrMultiplier * 2); // Below entry for short position
            DrawTradeLines(entryPoint, stopLoss, takeProfit, "Sell Signal");
            DrawEntryArrow(entryPoint, "SellArrow", clrRed); // Draw Sell Arrow
            PlaySound(signalSound); // Notify with sound for new entry
        }
    }
}

// Expert initialization function
int OnInit()
{
    // Initialization tasks can be done here
    return INIT_SUCCEEDED;
}

// Expert deinitialization function
void OnDeinit(const int reason)
{
    // Release the indicator handles when the EA is removed
    if (bbHandle != 0)
        IndicatorRelease(bbHandle);
    if (atrHandle != 0)
        IndicatorRelease(atrHandle);
    ClearPreviousDrawings(); // Clear drawings on removal
}

// Expert tick function
void OnTick()
{
    ManageOpenPositions(Symbol()); // Manage open positions before calculating new parameters
    CalculateTradeParameters(); // Calculate trade parameters based on market data
}

//+------------------------------------------------------------------+


テスト

Volatility Navigator EAをテスト用にMetaTrader 5のチャートに追加するには、まずEAファイルがMetaTrader 5プラットフォームに適切にインストールされていることを確認します。左側の[ナビゲータ]パネルに移動し、[エキスパートアドバイザ(EA)]セクションでEAを見つけます。表示されていない場合は、[エキスパートアドバイザ(EA)]を右クリックし、[更新]を選択してリストを更新するか、EAファイルが正しいディレクトリ(具体的には、MetaTraderインストール内のMQL5>Expertsフォルダ)に配置されていることを確認する必要があります。

見つけたら、EAを目的のチャートにドラッグするか、ダブルクリックして設定ウィンドウを開きます。そこで、戦略に基づいてロットサイズやインジケーターなどのパラメータを設定できます。設定が完了したら、ツールバーの[アルゴリズム取引]ボタンをクリックして、自動取引を有効にします。最後に、[OK]をクリックしてEAを適用すると、事前定義された戦略に基づいて取引の実行が開始されます。テスト中のアクティビティを監視するには、常に[取引]タブを確認してください。私が開発したこのプロジェクトでは、デモ口座でEAをテストしましたが、実際の資金を投入する前に、履歴データを使用してバックテストをおこなうこともできます。

EAをチャートにドラッグした後、上で説明したように、インジケーターが特定の条件を満たしてシグナルが生成されるのを辛抱強く待つことが重要です。これらの条件が満たされると、EAはチャート上にストップロス、テイクプロフィット、エントリポイントの3つの線を表示します。また、トレーダーにシグナルを送る音声アラートが鳴り、この最も正確なエントリーポイントに到達するまで続きます。

以下に、テストの結果を示します。

テスト結果

図7:テスト結果

上の図では、シグナルを受け取った後に実行した注文が現在すべて利益を上げていることが確認できます。この図には、シグナルで示されたレベルが水平線として表示されています。テイクプロフィットのレベルは青、エントリーポイントは緑、ストップロスは赤で示されています。 より広い視点を得るために、下のGIFもご覧ください。

テスト結果

図8:テスト結果



結論

このツールは主に、有望で収益性の高いエントリーポイント、テイクプロフィットレベル、およびストップロスの配置を提供することに重点を置いています。さまざまなチャートに適用でき、すべての時間枠に対応しています。スキャルピングエントリーの場合は短い時間枠を使用することをお勧めしますが、長期間の取引では、より長い時間枠を活用することが有効です。さらに、このツールは独自の戦略と併用することで、結果をさらに向上させることができます。

実際の資金を使う前に、必ずツールをテストし、実験してみてください。なお、このツールは取引を自動的に開始することはありません。本連載の目的は、市場分析用のツールを開発することにあります。

日付ツール名 詳細バージョン アップデート 備考
01/10/24ChartProjector前日のプライスアクションをゴースト効果でオーバーレイするスクリプト1.0初回リリースLynnchris Tool Chestの最初のツール
18/11/24Analytical Comment前日の情報を表形式で提供し、市場の将来の方向性を予測する1.0初回リリースLynnchris Tool Chestの2番目のツール
27/11/24Analytics Master2時間ごとに市場指標を定期的に更新 1.01v.2Lynnchris Tool Chestの3番目のツール
02/12/2024Analytics Forecaster Telegram統合により、2時間ごとに市場指標を定期的に更新1.1v.3ツール番号5
 09/12/24Volatility Navigatorボリンジャーバンド、RSI、ATR指標を使用して市場の状況を分析するEA1.0初回リリースツール番号6

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

添付されたファイル |
MQL5で自己最適化エキスパートアドバイザーを構築する(第2回):USDJPYスキャルピング戦略 MQL5で自己最適化エキスパートアドバイザーを構築する(第2回):USDJPYスキャルピング戦略
今日は私たちと一緒にUSDJPYペアを中心とした取引戦略の構築に挑戦するしましょう。日足のローソク足パターンは、潜在的により強い動きがあるため、日足パターンで形成されるローソク足パターンを取引します。私たちの当初の戦略は利益を生み、これにより獲得した資本を保護するために、戦略を継続的に改良し、安全性をさらに高める努力を続けることができました。
MQL5における数値予測を強化するアンサンブル法 MQL5における数値予測を強化するアンサンブル法
この記事では、MQL5における複数のアンサンブル学習手法の実装を紹介し、それらの手法がさまざまな状況下でどの程度有効かを検証します。
MQL5での取引戦略の自動化(第2回):一目均衡表とオーサムオシレーターを備えた雲抜けシステム MQL5での取引戦略の自動化(第2回):一目均衡表とオーサムオシレーターを備えた雲抜けシステム
この記事では、一目均衡表とオーサムオシレーター(Awesome Oscillator)を活用し、「雲抜け戦略」を自動化するエキスパートアドバイザー(EA)を作成します。インジケーターハンドルの初期化、ブレイクアウト条件の検出、自動売買におけるエントリーおよびエグジットの実装手順について、段階的に解説します。さらに、トレーリングストップやポジション管理ロジックを組み込むことで、EAのパフォーマンスと市場適応力を高める方法にも触れます。
古典的な戦略を再構築する(第12回):EURUSDブレイクアウト戦略 古典的な戦略を再構築する(第12回):EURUSDブレイクアウト戦略
MQL5で収益性の高いブレイクアウト取引戦略を構築する挑戦に、ぜひご参加ください。EURUSDペアを選択し、時間枠で価格ブレイクアウトを取引しましたが、私たちのシステムでは偽のブレイクアウトと真のトレンドの始まりを区別するのが難しかったです。そこで、損失を最小限に抑えながら利益を増やすことを目的としたフィルターをシステムに組み込みました。最終的にはシステムを収益性の高いものにし、誤ったブレイクアウトに対する耐性を高めることに成功しました。