English Русский Español Deutsch 日本語 Português
preview
价格行为分析工具包开发(第五部分):波动率导航智能交易系统(Volatility Navigator EA)

价格行为分析工具包开发(第五部分):波动率导航智能交易系统(Volatility Navigator EA)

MetaTrader 5示例 |
583 6
Christian Benjamin
Christian Benjamin

概述

交易中的复杂情况远不止于识别潜在的市场方向,还要求精准的执行。许多交易者遭遇挫折,并非因为交易执行不力,而是因为入场点、止损设置或止盈目标不准确。

为应对这一挑战,我使用MQL5编程语言开发了一款名为波动率导航(Volatility Navigator)的新工具,该工具专为优化交易中的这些关键环节而设计。与我之前开发的那些主要聚焦于预测市场趋势的工具不同,波动率导航能够独立识别最优入场点、止损水平和止盈目标。

通过将先进的技术指标融入价格行为分析中,我们旨在提升交易体验,并改进策略制定。

请参阅以下章节。



技术指标

技术指标可分为多种类型,包括趋势指标、动量指标、波动率指标和成交量指标,每种指标在金融市场分析中都有其独特的作用。一些广泛使用的例子包括移动平均线(Moving Average)、相对强弱指数(Relative Strength Index,RSI)、布林带(Bollinger Bands)和移动平均线收敛发散指标(Moving Average Convergence Divergence,MACD)。

让我们来仔细看一下将与价格行为一起使用的三个指标:布林带、相对强弱指数(RSI)和平均真实波幅(ATR)。

  • 布林带

布林带是约翰·布林(John Bollinger)在20世纪80年代初开发的一种技术分析工具,旨在帮助交易者识别市场趋势和潜在的价格反转点。这一概念源于布林希望提供一种比传统技术指标更动态的方式来衡量价格波动性。约翰·布林希望创造一种能够适应不断变化的市场条件的交易工具。

他想要一个能够根据市场波动性进行调整的指标,这促使他想到了结合移动平均线和价格变化度量指标的方法。布林带由三条线组成:

  1. 中轨通常是特定时间段(通常为20天)内收盘价的简单移动平均线(SMA)。
  2. 上轨是中轨加上特定数量的标准差(通常为两个)。
  3. 下轨是中轨减去相同数量的标准差。 

布林带

图例1. 布林带

使用标准差是布林带的关键所在,因为它提供了衡量波动性的统计指标。通过纳入这一衡量标准,布林带能够有效地将价格波动限定在一个范围内,帮助交易者识别潜在的突破或反转行情。 

交易者经常利用布林带来判断超买或超卖状况、潜在的趋势反转,并评估价格走势的强度。例如,价格触及上轨可能表明处于超买状态,而价格触及下轨则可能意味着处于超卖状态。

  • 相对强弱指数(RSI)

相对强弱指数(RSI)由小J·韦尔斯·怀尔德(J. Welles Wilder Jr.)发明。在其1978年出版的《技术交易系统新概念》一书中首次提出。怀尔德旨在创造一种动量振荡指标,帮助交易者识别金融市场的超买和超卖状况。以下是RSI的计算公式。

RSI计算方法

图例2. RSI公式

RSI用于衡量价格变动的速度和幅度,有助于在特定时间段(通常为14天)内识别市场的超买或超卖状况。RSI的取值范围在0到100之间,RSI高于70通常表明资产可能处于超买状态,而RSI低于30则表明资产可能处于超卖状态。

交易者利用RSI来发出潜在反转信号或确认趋势。此外,RSI与价格走势之间的背离可能表明动量减弱,从而带来更多交易机会。

RSI

图例3. RSI图表

  • 平均真实波幅(ATR)

平均真实波幅(ATR)指标由小J·韦尔斯·怀尔德(J. Welles Wilder Jr.)发明。在其1978年出版的《技术交易系统新概念》一书中首次提出。怀尔德设计ATR是为了通过计算真实波幅(TR)来衡量市场波动性,真实波幅会考虑特定时间段内价格波动的最大范围。

此后,ATR已成为技术分析中广泛使用的工具,帮助交易者评估各种金融市场的波动性并管理风险。ATR是一种波动性指标,用于衡量特定时间段内的价格波动幅度,提供市场波动性的洞察,而不指示价格波动的方向。

ATR值越高,表明波动性越大;ATR值越低,则表明波动性越小。交易者利用ATR来制定风险管理策略,例如根据市场状况设置止损水平和仓位规模。这有助于根据不同的市场波动性调整交易策略,从而在不同情境下实现更有效的交易。下面让我们来看一下ATR的计算公式。

ATR计算

图例4. ATR计算

在交易策略中使用平均真实波幅(ATR)的目的是根据当前市场波动性动态调整止损和止盈水平。ATR作为衡量价格波动的指标,使EA能够在市场波动性较高时设置更宽的止损止盈水平,而在市场较为平静时则设置更紧的水平。这种方法通过确保在波动条件下交易不会过早被止损,同时在市场波动较为平缓时抓住潜在利润,从而增强了风险管理效果。通过纳入ATR,EA能够适应不断变化的市场条件,实现更有效的交易执行,并提高成功的几率。



该EA的结构概览

波动率导航EA采用符合MQL5编程标准的结构化布局设计。了解此布局对于有效设置EA并根据市场条件变化进行调整至关重要。在MQL5中,指标句柄是简化EA内技术指标使用过程的关键工具。EA无需在每次价格变动时重新计算指标,而是可以快速引用这些句柄以获取最新值。 

例如,每当OnTick()函数运行时,EA都可以高效地访问相关指标值,这在快速变化的市场条件下尤为有利。这种即时访问功能使得能够根据当前市场动态采取更好的行动。

EA的核心功能

MQL5 EA的主要组成部分包括三个关键函数:OnInit()、OnTick()和OnDeinit()。

  • OnInit()函数

该函数在EA附加到图表时执行一次。其主要作用是初始化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)、布林带(Bollinger Bands)和平均真实波幅(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显示超买状态且价格超过布林带上轨时,EA会执行卖出操作。 

  • OnDeinit()函数:

当EA从图表中移除时,会调用OnDeinit()函数。该函数通过释放指标句柄,在清理资源方面发挥着至关重要的作用。

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

输入参数

波动率导航 EA的突出特点之一是其通过可自定义的输入参数所实现的灵活性。这些参数使交易者能够根据自身独特策略调整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. 信号生成条件

  • 信号计算流程

波动率导航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

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将触发买入信号。反之,若满足相反条件则会生成卖出信号。
  • 图表上的可视化反馈

为提升用户体验,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);
    }
}

综上所述,波动率导航EA的核心逻辑在于通过多指标系统化评估当前市场数据。通过综合RSI、布林带和ATR的信息,该EA能够生成稳健的交易信号,同时在图表上提供有价值的可视化反馈。这种多维度的分析方法有助于交易者更全面地评估市场状况,最终有效应对波动剧烈的市场环境。


在波动率导航EA中实现警报与通知功能

波动率导航EA配备了一套集成化的警报与通知系统,可显著提升交易者对市场动态的响应能力。该系统基于EA核心指标(RSI、布林带和ATR)生成的特定交易信号,为交易者提供实时分析与预警。

  • EA中的警报类型

音频警报:当触发重要交易信号时,EA将自动播放音频提示。例如,当RSI上穿70(超买状态)或下破30(超卖状态)时,系统会立即发出声音警报。此类警报使交易者能够即时响应,基于明确的市场机会快速做出决策。

视觉警报:除音频提示外,EA还直接在交易图表上提供可视化警报。例如,当生成交易信号时,EA可通过改变价格线颜色或显示屏幕消息的方式,明确标注信号类型(买入或卖出)。此功能使交易者无需依赖音频提示,即可通过快速浏览图表评估当前市场状况。

  • 警报功能与EA逻辑的集成

波动率导航EA的警报与通知功能与其核心交易逻辑无缝衔接:

在每次OnTick函数执行期间,EA持续监控各指标以识别潜在交易信号。当检测到特定阈值被触发(如RSI突破预设水平)时,系统将启动警报序列。一旦交易信号得到确认,EA将激活相应的警报机制。

该激活流程可能包括播放提示音或在图表上生成视觉标记。警报功能可即时反馈市场动态,帮助交易者快速做出明智决策。这种交互设计促进了交易过程的主动参与,显著提升了捕捉盈利市场机会的可能性。 

// 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
}

以下代码段旨在为波动率导航 EA实现基于RSI行为的音频与视觉警报功能。首先,代码通过iRSI函数计算当前RSI值,该函数以当前图表品种、时间周期、周期参数(14)和收盘价为输入。随后,代码检查RSI值是否超过70阈值,若超过则表明市场处于超买状态。若满足此条件,系统将调用PlaySound函数播放音频警报,以立即吸引交易者注意。

视觉警报

图例6. 视觉警报

此外,系统会在交易图表上创建视觉警报:在当前最高价位置放置一个文本对象,以红色字体标注超买信号,确保其醒目可见。反之,若RSI值跌破30阈值,表明市场处于超卖状态,系统将执行相同流程:播放音频警报,并在当前最低价位置生成一个文本对象,此次以绿色字体显示信号。

这种融合音频与视觉元素的双重警报系统,显著提升了交易者及时获取关键市场动态并快速响应的能力,从而全面优化交易效率。

波动率导航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/en/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
}

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


测试

在MetaTrader 5中添加波动率导航EA至图表进行测试。首先,确保您的EA文件已正确安装到MetaTrader 5平台。在左侧的“导航器”面板中,找到“EA”部分,并定位您的EA。若未显示,可通过右键单击并选择“刷新”来更新列表,或确认EA文件已放置在正确的目录中(具体为MetaTrader安装目录下的MQL5 > Experts文件夹)。

找到EA后,只需将其拖拽至目标图表,或双击以打开设置窗口。在此,您可根据策略配置参数,如手数大小和指标设置。配置完成后,务必通过点击工具栏中的“自动交易”按钮来启用自动化交易。最后,点击“确定”应用EA,它将根据预设策略开始执行交易。测试期间,请始终查看“交易”选项卡以监控其活动。在我开发的此项目中,我已在模拟账户上对EA进行了测试。不过,您也可以在使用真实资金前,利用历史数据进行回测。

将EA拖拽至图表后,需耐心等待指标满足特定条件以生成信号,如前所述。当这些条件满足时,EA将在图表上显示三条线:止损线、止盈线和入场点。同时,将发出声音警报以提醒交易者,该警报将持续至最精确的入场点到达。

以下是我们测试结果的展示,以供您参考

测试结果

图例7. 测试结果

在上图中,我们可以看到我根据收到的信号执行的所有订单,目前这些订单均处于盈利状态。图中还以水平线的形式标示了信号所指示的各个价位:蓝色线代表止盈位,绿色线代表入场点,红色线代表止损位。此外,我们还可以通过下方GIF图获取更全面的信息。

测试结果

图例8. 测试结果



结论

该工具主要致力于提供具有盈利潜力的入场点、止盈位以及止损位设置。它可应用于不同图表,并支持所有的时间周期。对于超短线(剥头皮)交易入场,建议使用较短时间周期;而较长线交易则可从更长时间周期中受益。此外,将此工具与您自身的交易策略结合使用,有助于提升交易效果。

在使用真实资金前,请务必对该工具进行测试和试验。请注意,本工具不会自动开仓;我在本系列中的唯一目标是开发市场分析工具。

日期工具名 描述版本 更新 备注
01/10/24图表展示器以重影效果覆盖前一日价格走势的脚本1.0初始版本Lynnchris工具箱的第一个工具
18/11/24分析评论以表格形式提供前一日的信息,并预测市场的未来方向1.0初始版本Lynnchris工具箱的第二个工具
27/11/24分析大师每两小时定期更新市场指标 1.01第二个版本Lynnchris工具箱的第三个工具
02/12/2024分析预测 集成Telegram通知功能,每两小时定时更新市场指标1.1第三个版本工具数5
 09/12/24波动率导航仪该EA通过布林带、RSI和ATR三大指标综合分析市场状况1.0初始版本工具数6

本文由MetaQuotes Ltd译自英文
原文地址: https://www.mql5.com/en/articles/16560

附加的文件 |
最近评论 | 前往讨论 (6)
Fernando Carreiro
Fernando Carreiro | 31 1月 2025 在 14:59
@Qhumanani #: 本杰明先生或任何看到这篇文章的人能否告诉我在哪里可以找到这篇文章的第 1-3 部分?

只需进入作者简介,然后点击 "出版物"...克里斯蒂安-本杰明(出版物)

Christian Benjamin
Christian Benjamin | 31 1月 2025 在 14:59
Qhumanani #:
本杰明先生或任何读到这篇文章的人能否告诉我在哪里可以找到这篇文章的第 1-3 部分?

先生您好,请点击下面提供的链接。

https://www.mql5.com/zh/articles/16434

https://www.mql5.com/zh/articles/15927

https://www.mql5.com/zh/articles/16014

Christian Benjamin
Christian Benjamin | 31 1月 2025 在 15:00
Fernando Carreiro #:

只需进入作者简介,然后点击 "出版物"...克里斯蒂安-本杰明(出版物)

谢谢您,先生!

13691228031
13691228031 | 10 9月 2025 在 05:57
请问,这个EA的交易品种是什么呢?没看出来
Mustafa Nail Sertoglu
Mustafa Nail Sertoglu | 15 10月 2025 在 08:30
13691228031 #:
请问这个 EA 在交易什么?我没看到。

(C.Benjamin) 作者在标题 "测试 "中说

"将 EA 拖到图表上后,必须耐心等待指标满足特定条件后产生信号,如上所述。满足这些条件后,EA 将在图表上显示三条线:止损线、获利线和进入点。此外,还会发出声音警报,向交易者发出信号,该警报将一直持续到达到最精确的入市点为止"。

EA 代码仅以图形方式显示建议交易,同时发出警报

您应当知道的 MQL5 向导技术(第 49 部分):搭配近端政策优化的强化学习 您应当知道的 MQL5 向导技术(第 49 部分):搭配近端政策优化的强化学习
近端政策优化是强化学习中的另一种算法,通常以网络形式以非常小的增量步幅更新政策,以便确保模型的稳定性。我们以向导汇编的智能系统来试验其作用,如同我们之前的文章一样。
在 MQL5 中提升数值预测的集成方法 在 MQL5 中提升数值预测的集成方法
在本文中,我们展示了在 MQL5 中实现多种集成学习方法,并检验了它们在不同场景下的有效性。
开发多币种 EA 交易(第 19 部分):创建用 Python 实现的阶段 开发多币种 EA 交易(第 19 部分):创建用 Python 实现的阶段
到目前为止,我们已经探讨了仅在标准策略测试器中启动顺序程序以优化 EA 的自动化。但是,如果我们想在两次启动之间使用其他方法对获得的数据进行一些处理呢?我们将尝试添加创建由用 Python 编写的程序执行的新优化阶段的功能。
数据科学和机器学习(第 32 部分):保持您的 AI 模型更新,在线学习 数据科学和机器学习(第 32 部分):保持您的 AI 模型更新,在线学习
在瞬息万变的交易世界中,适应市场变化不仅是一种选择 — 而且是一种必要。每天都有新的形态和趋势出现,即使是最先进的机器学习模型,也难以面对不断变化的条件保持有效。在本文中,我们将探讨如何通过自动重训练,令您的模型保持相关性、及对新市场数据的响应能力。