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.");
}
代码说明
-
设置定时器:
EventSetTimer(300);
- 定时器设置为300秒(即5分钟)。
- 每300秒触发一次
OnTimer()
函数。
-
获取K线数据:
- 在
OnTimer()
中,每次触发时都会获取所有交易对的最新K线数据。 - 使用
iOpen()
、iClose()
等函数获取上一根已完成的K线数据(索引为1
)。
- 在
-
清理定时器:
EventKillTimer();
- 在
OnDeinit()
中关闭定时器,确保脚本终止时不会继续运行定时器。
- 在
-
输出数据:
- 使用
PrintFormat()
打印每个交易对、每个时间周期的最新K线数据。
- 使用
如何运行
- 将代码保存为一个脚本或EA(专家顾问)。
- 加载到MT4平台的图表中。
- 每5分钟会自动触发
OnTimer()
函数,获取最新的K线数据并打印到日志中。
注意事项
-
定时器触发间隔:
- 定时器的触发间隔是以秒为单位,例如:
- 每1分钟:
EventSetTimer(60)
- 每10分钟:
EventSetTimer(600)
- 每1分钟:
- 如果需要更高频率(如每秒),可以设置更短的间隔,但可能会增加系统负载。
- 定时器的触发间隔是以秒为单位,例如:
-
处理当前K线:
- 如果需要获取正在形成的当前K线数据,可以将索引改为
0
:double open = iOpen(symbol, timeframe, 0); // 当前K线的开盘价
- 如果需要获取正在形成的当前K线数据,可以将索引改为
-
性能优化:
- 如果交易对和时间周期较多,获取数据可能会耗费一定时间。
- 可以限制交易对数量或时间周期,或者只获取某些特定交易对和时间周期的数据。
-
数据存储:
- 如果需要将数据保存到文件或发送到外部系统,可以在
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线数据。这种方法可以适应动态更新需求,同时具有较高的灵活性,能够根据需要调整更新频率和数据范围。
共有 0 条评论