MQL5中OnTick内isNewBar()获取Stochastic指标值异常问题
解决isNewBar()触发时Stochastic指标值不符预期的问题
我来帮你排查这个问题,你的代码里有几个关键问题导致Stochastic数值不符合预期:
1. 重复创建指标句柄的隐患
你在OnTick()里每次调用iStochastic(),这会重复创建指标句柄——不仅浪费系统资源,还可能导致获取的数据出现不稳定的异常。正确的做法是把指标句柄定义为全局变量,在OnInit()中初始化一次,在OnDeinit()中释放。
2. 新K线触发时获取的是未闭合K线的数据
当isNewBar()检测到新K线时,当前的K线是刚生成的、还未闭合的状态,此时iStochastic()计算的是包含这个未完成K线的数值,而你预期的大概率是上一根已闭合K线的Stochastic值,这就直接导致了数值和预期不符。
修正后的完整代码
#include <Lib CisNewBar.mqh> CisNewBar current_chart; int stoch_handle; // 全局指标句柄 //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { // 初始化Stochastic指标句柄 stoch_handle = iStochastic(_Symbol, PERIOD_M1, 5, 3, 3, MODE_SMA, STO_LOWHIGH); if(stoch_handle == INVALID_HANDLE) { Print("Failed to create Stochastic handle! Error code: ", GetLastError()); return(INIT_FAILED); } return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { // 释放指标句柄,避免资源泄漏 if(stoch_handle != INVALID_HANDLE) { IndicatorRelease(stoch_handle); } } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { if(current_chart.isNewBar() == 1) // 根据你的类返回值调整,通常1代表新K线触发 { double K[], D[]; // 设置数组为序列模式(最新数据在索引0位置) ArraySetAsSeries(K, true); ArraySetAsSeries(D, true); // 复制上一根已闭合K线开始的5个值(从索引1开始,跳过当前未闭合的K线) if(CopyBuffer(stoch_handle, 0, 1, 5, K) != 5 || CopyBuffer(stoch_handle, 1, 1, 5, D) !=5) { Print("Failed to copy buffers! Error code: ", GetLastError()); return; } ArrayPrint(K); } }
额外说明
- 如果你的
isNewBar()实现返回值大于0就表示新K线,那判断条件可以保留>0,但通常这类检测函数会返回1明确表示新K线,用==1会更严谨。 - 如果你确实需要当前未闭合K线的Stochastic值,那只需要修正指标句柄的创建方式,不需要调整CopyBuffer的起始索引。
内容的提问来源于stack exchange,提问作者Jaffer Wilson
相关产品推荐
相关产品推荐

