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

MT4技术问询:如何在当前时间框架获取当日首根K线的HIGH、LOW值

解决MT4获取印度股市当日首根交易K线高低值的问题

嘿,作为MT4 MQL4开发者,我来帮你搞定这个需求!针对印度股市(IST时区,交易时段9:15 AM - 3:30 PM),我写了一段简易代码,能精准获取当前时间框架下当日首根有效K线的HIGH和LOW值(比如M15图表的9:15-9:30那根)。

核心思路

  1. 先构造当日交易起始时间(9:15 AM IST)的时间戳
  2. 遍历历史K线,找到开盘时间刚好落在首根K线时段内的那根(比如M15的话就是9:15到9:30之间的开盘时间)
  3. 提取该K线的HIGH和LOW值

完整MQL4代码

//+------------------------------------------------------------------+
//| 获取当日首根交易K线的高低值                                       |
//+------------------------------------------------------------------+
void GetFirstSessionHighLow(double &firstHigh, double &firstLow)
{
    // 初始化默认值,未找到时保持0
    firstHigh = 0.0;
    firstLow = 0.0;

    // 印度股市交易起始时间:9:15 AM IST
    const int TRADE_START_HOUR = 9;
    const int TRADE_START_MINUTE = 15;

    // 获取服务器端的当前日期(年/月/日)
    datetime currentDate = TimeCurrent();
    int year = TimeYear(currentDate);
    int month = TimeMonth(currentDate);
    int day = TimeDay(currentDate);

    // 构造当日交易开始的时间戳
    datetime sessionStartTime = TimeMake(year, month, day, TRADE_START_HOUR, TRADE_START_MINUTE, 0);

    // 获取当前品种当前时间框架的总K线数
    int totalBars = Bars(_Symbol, _Period);
    
    // 从最新K线往前遍历,找到当日首根交易K线
    for(int i = totalBars - 1; i >= 0; i--)
    {
        datetime barOpenTime = iTime(_Symbol, _Period, i);

        // 判断当前K线是否是当日首根交易K线
        // 首根K线的开盘时间 >= 交易起始时间,且小于起始时间+当前时间框架的秒数
        if(barOpenTime >= sessionStartTime && barOpenTime < sessionStartTime + PeriodSeconds(_Period))
        {
            firstHigh = iHigh(_Symbol, _Period, i);
            firstLow = iLow(_Symbol, _Period, i);
            break; // 找到后立即退出循环,提升效率
        }

        // 如果遇到非当日的K线,直接停止遍历
        if(TimeDay(barOpenTime) != day)
        {
            break;
        }
    }
}

//+------------------------------------------------------------------+
//| 脚本主函数(可直接运行测试)                                       |
//+------------------------------------------------------------------+
void OnStart()
{
    double sessionFirstHigh, sessionFirstLow;
    GetFirstSessionHighLow(sessionFirstHigh, sessionFirstLow);

    if(sessionFirstHigh != 0.0 && sessionFirstLow != 0.0)
    {
        // 输出到MT4日志
        Print("当日首根K线 HIGH值: ", DoubleToString(sessionFirstHigh, _Digits));
        Print("当日首根K线 LOW值: ", DoubleToString(sessionFirstLow, _Digits));
        // 弹出提示框
        Alert("当日首根K线 HIGH: ", DoubleToString(sessionFirstHigh, _Digits), "\nLOW: ", DoubleToString(sessionFirstLow, _Digits));
    }
    else
    {
        Print("提示:未找到当日首根交易K线,请检查当前时间是否在交易时段内,或K线数据是否完整");
        Alert("提示:未找到当日首根交易K线,请检查当前时间是否在交易时段内,或K线数据是否完整");
    }
}

代码说明

  • 时区适配:代码默认使用MT4服务器时间,如果你交易印度股市,服务器应该是IST(UTC+5:30),所以直接用9:15即可;如果服务器是UTC时间,需要把TRADE_START_HOUR改成3,TRADE_START_MINUTE改成45(因为9:15 IST = 3:45 UTC)。
  • 通用性:不管你选的是PERIOD_M15、PERIOD_M30还是其他时间框架,代码都会自动匹配首根交易时段的K线(比如M30的话就是9:15-9:45那根)。
  • 效率优化:遍历到非当日K线时立即停止,避免无效循环;找到目标K线后也会直接退出循环。
  • 错误处理:如果未找到目标K线(比如当前时间还没到9:15,或者K线数据缺失),会给出明确提示。

使用方法

  1. 打开MT4的MetaEditor
  2. 新建一个脚本(Script),把上面的代码粘贴进去
  3. 保存并编译,然后在MT4图表上运行这个脚本,就能看到结果啦

你也可以把GetFirstSessionHighLow函数复制到你的EA或者指标里,直接调用获取高低值,非常方便!

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

火山引擎 最新活动