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

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

第 3/3 篇

「用 RSI 与布林带抓取入场参考」

这段逻辑演示了如何在一个 EA 里同时读取持仓浮盈和三大指标数值,为后续下单或移动止损提供原始参数。外汇与贵金属波动剧烈,高杠杆下指标共振也仅是概率倾向,不能直接当作胜负依据。 先判断当前持仓品种是否等于监控 symbol,若是就取出 POSITION_PROFIT 并打印。注释里留了口子,你可以在那里接平仓或改 SL/TP 的真实管理代码。 CalculateTradeParameters 函数负责采数:iRSI 取当前周期收盘价 RSI,iBands 取布林上下轨,iATR 取平均真实波幅。CopyClose 若返回 ≤0 会打印错误并 return,避免脏数据继续跑。 布林带句柄 bbHandle 为 0 时才创建,之后用 CopyBuffer 拿通道 1、2 号缓冲分别赋给 bbUpper、bbLower;ATR 同理懒加载。把这些值打出来,你开 MT5 挂上脚本就能在专家日志里看到实时数值,验证自己的参数周期是否匹配。

MQL5 / C++
if (PositionGetString(POSITION_SYMBOL) == symbol)
{
   class="type">class="kw">double currentProfit = PositionGetDouble(POSITION_PROFIT);
   Print("Current Profit for position: ", currentProfit);
   class=class="str">"cmt">// Additional management logic can be added here(e.g., close position, update SL/TP)
}
}
}
class=class="str">"cmt">// Function to calculate trade parameters such as entry point, stop loss, and take profit
class="type">void CalculateTradeParameters()
{
   class=class="str">"cmt">// Get the current RSI value
   class="type">class="kw">double rsiValue = iRSI(Symbol(), PERIOD_CURRENT, rsiPeriod, PRICE_CLOSE);
   Print("RSI Value: ", rsiValue);
   class="type">class="kw">double bbUpper = class="num">0.0;
   class="type">class="kw">double bbLower = class="num">0.0;
   class="type">class="kw">double atrValue = class="num">0.0;
   class=class="str">"cmt">// Get the latest closing prices
   class="type">class="kw">double closePrices[];
   if (CopyClose(NULL, class="num">0, class="num">0, class="num">1, closePrices) <= class="num">0)
   {
      Print("Error copying close prices: ", GetLastError());
      class="kw">return; class=class="str">"cmt">// Exit if there&class="macro">#x27;s an error
   }
   class=class="str">"cmt">// Initialize and get values for Bollinger Bands
   if (bbHandle == class="num">0)
   {
      bbHandle = iBands(NULL, class="num">0, bbPeriod, class="num">0, bbDeviation, PRICE_CLOSE);
   }
   if (bbHandle != INVALID_HANDLE)
   {
      class="type">class="kw">double bbBuffer[];
      class=class="str">"cmt">// Get the upper and lower Bollinger Bands
      if (CopyBuffer(bbHandle, class="num">1, class="num">0, class="num">1, bbBuffer) > class="num">0)
      {
         bbUpper = bbBuffer[class="num">0]; class=class="str">"cmt">// Upper band value
         Print("Bollinger Band Upper: ", bbUpper);
      }
      if (CopyBuffer(bbHandle, class="num">2, class="num">0, class="num">1, bbBuffer) > class="num">0)
      {
         bbLower = bbBuffer[class="num">0]; class=class="str">"cmt">// Lower band value
         Print("Bollinger Band Lower: ", bbLower);
      }
      class=class="str">"cmt">// Initialize and get the ATR value
      if (atrHandle == class="num">0)
      {
         atrHandle = iATR(NULL, class="num">0, atrPeriod);
      }
      if (atrHandle != INVALID_HANDLE)
      {
         class="type">class="kw">double atrBuffer[];

用 ATR 给布林带 RSI 信号定止损止盈

这段逻辑把 ATR 动态波动直接喂给止损止盈计算:多头在收盘价跌破布林下轨且 RSI 低于超卖阈值时触发,stopLoss 取入场价减 atrValue*atrMultiplier,takeProfit 取入场价加 atrValue*atrMultiplier*2,盈亏比固定为 2:1。 空单反向处理,stopLoss 在入场价上方、takeProfit 在下方,同样用 2 倍 ATR 乘数拉开空间。外汇与贵金属杠杆高,ATR 随波动率跳变,实盘中断电或点差扩大都可能让止损偏离预期,需先在 MT5 策略测试器跑历史段验证。 OnDeinit 里必须 IndicatorRelease 掉 bbHandle 与 atrHandle 并清图,否则 EA 移除后指标句柄泄漏,下次加载可能读到脏缓存。OnTick 先 ManageOpenPositions 再 CalculateTradeParameters,保证新信号不覆盖旧仓管理。

MQL5 / C++
if (CopyBuffer(atrHandle, class="num">0, class="num">0, class="num">1, atrBuffer) > class="num">0)
{
   atrValue = atrBuffer[class="num">0]; class=class="str">"cmt">// Current ATR value
   Print("ATR Value: ", atrValue);
}
}
class="type">class="kw">double entryPoint, stopLoss, takeProfit;
class=class="str">"cmt">// Generate buy or sell signals based on Bollinger Bands and RSI values
if (closePrices[class="num">0] < bbLower && rsiValue < oversoldLevel)  class=class="str">"cmt">// Buy Condition
{
   entryPoint = closePrices[class="num">0];
   stopLoss = entryPoint - (atrValue * atrMultiplier);
   takeProfit = entryPoint + (atrValue * atrMultiplier * class="num">2);
   DrawTradeLines(entryPoint, stopLoss, takeProfit, "Buy Signal");
   DrawEntryArrow(entryPoint, "BuyArrow", clrGreen); class=class="str">"cmt">// Draw Buy Arrow
   PlaySound(signalSound); class=class="str">"cmt">// Notify with sound for new entry
}
else if (closePrices[class="num">0] > bbUpper && rsiValue > overboughtLevel)  class=class="str">"cmt">// Sell Condition
{
   entryPoint = closePrices[class="num">0];
   stopLoss = entryPoint + (atrValue * atrMultiplier); class=class="str">"cmt">// Above entry for class="type">short position
   takeProfit = entryPoint - (atrValue * atrMultiplier * class="num">2); class=class="str">"cmt">// Below entry for class="type">short position
   DrawTradeLines(entryPoint, stopLoss, takeProfit, "Sell Signal");
   DrawEntryArrow(entryPoint, "SellArrow", clrRed); class=class="str">"cmt">// Draw Sell Arrow
   PlaySound(signalSound); class=class="str">"cmt">// Notify with sound for new entry
}
}
class=class="str">"cmt">// Expert initialization function
class="type">int OnInit()
{
   class=class="str">"cmt">// Initialization tasks can be done here
   class="kw">return INIT_SUCCEEDED;
}
class=class="str">"cmt">// Expert deinitialization function
class="type">void OnDeinit(const class="type">int reason)
{
   class=class="str">"cmt">// Release the indicator handles when the EA is removed
   if (bbHandle != class="num">0)
      IndicatorRelease(bbHandle);
   if (atrHandle != class="num">0)
      IndicatorRelease(atrHandle);
   ClearPreviousDrawings(); class=class="str">"cmt">// Clear drawings on removal
}
class=class="str">"cmt">// Expert tick function
class="type">void OnTick()
{
   ManageOpenPositions(Symbol()); class=class="str">"cmt">// Manage open positions before calculating new parameters
   CalculateTradeParameters(); class=class="str">"cmt">// Calculate trade parameters based on market data
}
class=class="str">"cmt">//+------------------------------------------------------------------+

◍ 把波动率导航EA拖进MT5图表跑一轮

在MT5里测EA,第一步是把文件放对位置:MQL5安装目录下的 Experts 文件夹。若左侧导航器的“EA”列表没刷出来,右键刷新或确认路径无误即可。 拖拽EA到目标图表后会弹出参数窗,手数、指标周期按策略填,随后必须点工具栏“自动交易”按钮亮起,EA才真正接管。 信号触发前需等指标条件满足。条件成立时图表画出三条线——红止损、绿入场、蓝止盈,并伴随声音警报直到精确入场价到达。 我在模拟账户跑过这套逻辑,历史回测同样可在实盘前做。下图记录的信号单目前均处盈利,但外汇/贵金属高杠杆下信号失效概率始终存在,模拟结果不等于实盘表现。

「把这条线请下神坛」

这套分析工具箱从 01/10/24 的图表展示器到 09/12/24 的波动率导航仪,半年内累计迭代出 6 个独立工具,覆盖重影比价、前日表格预测、两小时指标推送、Telegram 告警以及布林带+RSI+ATR 三线合成预警。它明确不做自动开仓,只在图表上画出止损线、获利线和入场点并配合声音警报,交易者仍需自己按键。 剥头皮可切到 M1–M15 取信号,波段单看 H1–D1 更稳;但无论哪类周期,外汇与贵金属的高杠杆属性意味着信号失效时回撤可能迅速吞噬本金,实盘前务必在策略测试器跑过历史数据。 把它当辅助眼睛而非圣杯——接进你已有的价格行为框架里验证,比单独迷信那条线更有意义。

常见问题

RSI 周期用 14、布林带周期 20 偏差 2 是常见组合;价格触碰布林下轨且 RSI 低于 30 再等一根收盘确认,能过滤部分假信号。贵金属与外汇波动大,务必先开模拟验证。
用当前 ATR 值乘 1.5~2 倍作为止损距离,止盈设为止损的 1~2 倍;这样止损随波动率伸缩,震荡市不会被扫得太冤。高风险品种建议从 2 倍 ATR 试起。
小布盯盘的 AIGC 已内置 RSI、布林带与 ATR 联合诊断,打开对应品种页即可看到信号强度和止损参考,不用自己手动算。
重点看信号标记是否吻合 RSI 超买超卖区、布林带收口或张口状态,以及 ATR 给出的止损线是否被触碰。一轮下来只调参数不调逻辑,先看胜率倾向再决定。
不是。布林中轨只是均值参考,趋势行情里价格可能贴着上轨走很久;把它当概率参考而非必回点位,避免逆势抄底被套。