MT4每5分钟获取全市场所有K线

要实现每5分钟自动更新一次K线数据,可以通过在MQL4中使用 OnTimer() 函数来定时执行代码逻辑。以下是实现方法的详细步骤和代码示例。


步骤 1:启用定时器

MQL4 提供了 EventSetTimer() 函数,可以设置一个定时器,定期触发 OnTimer() 函数。例如,设置为每5分钟触发一次。

  • EventSetTimer(seconds):设置定时器,单位是秒。
  • EventKillTimer():关闭定时器。

步骤 2:在定时器中获取K线数据

OnTimer() 函数中编写获取K线数据的逻辑,每次触发时都会自动运行该逻辑。


完整代码示例

以下是一个完整的代码示例,定时每5分钟获取所有交易对的最新K线数据:

// 定义时间周期数组
int timeframes[] = {PERIOD_M1, PERIOD_M5, PERIOD_M15, PERIOD_M30, PERIOD_H1, PERIOD_H4, PERIOD_D1, PERIOD_W1, PERIOD_MN1};

// 初始化函数(脚本启动时执行一次)
void OnInit()
{
    // 设置定时器,每5分钟触发一次
    EventSetTimer(300); // 300秒 = 5分钟
    Print("Timer set to update every 5 minutes.");
}

// 定时器触发函数(每次定时器触发时执行)
void OnTimer()
{
    Print("Updating K-line data at time: ", TimeToString(TimeCurrent(), TIME_DATE | TIME_MINUTES));

    // 获取所有交易对的总数
    int totalSymbols = SymbolsTotal(false);

    // 遍历所有交易对
    for (int i = 0; i < totalSymbols; i++)
    {
        // 获取交易对名称
        string symbol = SymbolName(i, false);

        // 检查交易对是否有效
        if (symbol == "" || StringLen(symbol) == 0)
            continue;

        // 遍历所有时间周期
        for (int j = 0; j < ArraySize(timeframes); j++)
        {
            int timeframe = timeframes[j];

            // 获取最近一根K线数据(索引1,上一根已完成的K线)
            double open = iOpen(symbol, timeframe, 1);     // 开盘价
            double close = iClose(symbol, timeframe, 1);   // 收盘价
            double high = iHigh(symbol, timeframe, 1);     // 最高价
            double low = iLow(symbol, timeframe, 1);       // 最低价
            double volume = iVolume(symbol, timeframe, 1); // 成交量
            datetime time = iTime(symbol, timeframe, 1);   // 时间戳

            // 打印K线数据
            PrintFormat("Symbol: %s | Timeframe: %d | Time: %s | Open: %.5f | High: %.5f | Low: %.5f | Close: %.5f | Volume: %.2f",
                        symbol, timeframe, TimeToString(time, TIME_DATE | TIME_MINUTES), open, high, low, close, volume);
        }
    }
}

// 清理函数(脚本终止时执行一次)
void OnDeinit(const int reason)
{
    // 关闭定时器
    EventKillTimer();
    Print("Timer stopped.");
}

代码说明

  1. 设置定时器

    EventSetTimer(300);
    
    • 定时器设置为300秒(即5分钟)。
    • 每300秒触发一次 OnTimer() 函数。
  2. 获取K线数据

    • OnTimer() 中,每次触发时都会获取所有交易对的最新K线数据。
    • 使用 iOpen()iClose() 等函数获取上一根已完成的K线数据(索引为 1)。
  3. 清理定时器

    EventKillTimer();
    
    • OnDeinit() 中关闭定时器,确保脚本终止时不会继续运行定时器。
  4. 输出数据

    • 使用 PrintFormat() 打印每个交易对、每个时间周期的最新K线数据。

如何运行

  1. 代码保存为一个脚本或EA(专家顾问)。
  2. 加载到MT4平台的图表中。
  3. 每5分钟会自动触发 OnTimer() 函数,获取最新的K线数据并打印到日志中。

注意事项

  1. 定时器触发间隔

    • 定时器的触发间隔是以秒为单位,例如:
      • 每1分钟:EventSetTimer(60)
      • 每10分钟:EventSetTimer(600)
    • 如果需要更高频率(如每秒),可以设置更短的间隔,但可能会增加系统负载。
  2. 处理当前K线

    • 如果需要获取正在形成的当前K线数据,可以将索引改为 0
      double open = iOpen(symbol, timeframe, 0); // 当前K线的开盘价
      
  3. 性能优化

    • 如果交易对和时间周期较多,获取数据可能会耗费一定时间。
    • 可以限制交易对数量或时间周期,或者只获取某些特定交易对和时间周期的数据。
  4. 数据存储

    • 如果需要将数据保存到文件或发送到外部系统,可以在 OnTimer() 中添加文件写入或 WebRequest() 逻辑。

输出示例

假设当前有以下交易对:EURUSD、GBPUSD,输出可能如下:

Updating K-line data at time: 2025.03.04 18:35
Symbol: EURUSD | Timeframe: 1 | Time: 2025.03.04 18:30 | Open: 1.12345 | High: 1.12400 | Low: 1.12300 | Close: 1.12350 | Volume: 100.00
Symbol: GBPUSD | Timeframe: 5 | Time: 2025.03.04 18:30 | Open: 1.23456 | High: 1.23500 | Low: 1.23450 | Close: 1.23470 | Volume: 120.00

每5分钟会自动更新一次。


总结

通过使用 OnTimer() 函数,结合 EventSetTimer(),可以实现每5分钟自动更新一次所有交易对的K线数据。这种方法可以适应动态更新需求,同时具有较高的灵活性,能够根据需要调整更新频率和数据范围。

版权声明:
作者:ht
链接:https://www.techfm.club/p/196946.html
来源:TechFM
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>