You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在MQL自定义指标中调用另一个自定义指标?

在自定义指标中调用其他自定义指标的可行性与解决方案

当然可以在一个自定义指标中调用另一个自定义指标!你遇到的编译器无报错但功能未实现的情况,通常是调用细节没处理到位,下面给你梳理正确的实现方法和常见坑点:

一、前提准备:确保被调用指标可用

  • 首先要确认你要调用的目标自定义指标已经成功编译为.ex4(MT4)或.ex5(MT5)文件,并且放在MT安装目录的MQL4/Indicators(MT4)或MQL5/Indicators(MT5)文件夹下。如果文件缺失或未编译,调用会静默失败,编译器不会抛出错误。

二、使用正确的调用函数

MT4 环境

使用iCustom()函数来调用其他自定义指标,标准语法如下:

double iCustom(string symbol, int timeframe, string name, ..., int mode, int shift);

参数说明:

  • symbol:目标品种,用_Symbol表示当前图表品种
  • timeframe:时间周期,用_Period表示当前图表周期
  • name:被调用指标的文件名(不含后缀,大小写敏感!)
  • ...:被调用指标需要的所有输入参数(比如周期、价格类型等,要和目标指标的参数顺序完全匹配)
  • mode:目标指标的输出缓冲区索引(从0开始计数)
  • shift:要获取的K线偏移量(0表示当前最新K线)

MT5 环境

MT5中可以继续使用兼容的iCustom(),也可以用更灵活的IndicatorCreate()+数据获取函数,这里给出iCustom()的用法:

double iCustom(string symbol, ENUM_TIMEFRAMES timeframe, string name, ..., int buffer_num, int shift);

参数逻辑和MT4类似,buffer_num对应输出缓冲区索引,timeframe需要传入ENUM_TIMEFRAMES枚举值(比如PERIOD_H1),或者用_Period

三、常见问题排查(为什么调用后没效果)

  • 参数不匹配:如果目标指标需要3个输入参数,你在iCustom()里只传了2个,或者参数顺序、类型不对,调用会失败但编译器不会报错。一定要严格对应目标指标的参数列表。
  • 缓冲区索引错误:填错了mode/buffer_num的值,会拿到错误的缓冲区数据,看起来像是调用没生效。可以打开目标指标的代码,查看SetIndexBuffer()的顺序,第一个缓冲区是0,第二个是1,以此类推。
  • 文件名大小写错误:MT的文件系统对大小写敏感,比如目标指标文件是MyMA.ex4,你写myma就会调用失败。
  • 初始化时机问题:如果在自定义指标的OnInit()函数里调用其他指标,可能因为目标指标还未完成加载导致失败。建议在OnCalculate()函数里按需调用,或者在OnInit()里添加延迟加载逻辑。

示例代码(MT4)

假设你有一个名为SimpleMA.ex4的指标,它的输入参数是int PeriodENUM_MA_METHOD MethodENUM_APPLIED_PRICE Price,输出缓冲区只有1个(索引0),调用代码如下:

// 在你的自定义指标的OnCalculate中调用SimpleMA
void OnCalculate(const int rates_total,
                 const int prev_calculated,
                 const datetime &time[],
                 const double &open[],
                 const double &high[],
                 const double &low[],
                 const double &close[],
                 const long &tick_volume[],
                 const long &volume[],
                 const int &spread[])
{
    // 获取当前K线的SimpleMA值
    double maValue = iCustom(_Symbol, _Period, "SimpleMA", 20, MODE_SMA, PRICE_CLOSE, 0, 0);
    // 后续可以使用maValue进行计算
    Print("当前K线的SimpleMA值:", maValue);
}

内容的提问来源于stack exchange,提问作者Jean

火山引擎 最新活动