MT4蜡烛图整体上移1点重绘的MQL实现技术问询
当然可以用MQL4实现蜡烛图整体偏移重绘
你的问题核心是因为价格服务器和经纪商的点差差异,导致图表显示的买价偏低于实际交易价,需要把所有蜡烛整体上移1点。直接用平台默认蜡烛图没法调整,但我们可以写一个自定义指标,绘制偏移后的蜡烛图来解决这个问题。
核心思路
MT4允许通过自定义指标绘制自己的蜡烛图,我们只需要获取每根K线的开、高、低、收盘价,给每个价格加上1点的偏移量,然后用蜡烛图样式重新绘制即可。这样就能覆盖(或者替代)默认的蜡烛图,实现整体上移的效果。
完整代码示例
#property indicator_chart_window #property indicator_buffers 4 #property indicator_color1 Red #property indicator_color2 Green #property indicator_style1 STYLE_SOLID #property indicator_style2 STYLE_SOLID #property indicator_width1 1 #property indicator_width2 1 double OpenBuffer[]; double HighBuffer[]; double LowBuffer[]; double CloseBuffer[]; int OnInit() { // 绑定四个缓冲区对应蜡烛的开、高、低、收 SetIndexBuffer(0, OpenBuffer); SetIndexBuffer(1, HighBuffer); SetIndexBuffer(2, LowBuffer); SetIndexBuffer(3, CloseBuffer); // 设置绘图样式为蜡烛图,并区分涨跌颜色 PlotIndexSetStyle(0, STYLE_CANDLE); PlotIndexSetInteger(0, PLOT_CANDLE_COLOR, PLOT_CANDLE_COLOR_BODY); PlotIndexSetInteger(0, PLOT_CANDLE_BODY_COLOR_UP, Green); PlotIndexSetInteger(0, PLOT_CANDLE_BODY_COLOR_DOWN, Red); return(INIT_SUCCEEDED); } int 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线起始位置,避免重复计算 int start = prev_calculated > 0 ? prev_calculated - 1 : 0; // 定义偏移量:1点,这里的Point会自动适配当前品种的点值(比如EURUSD是0.0001,JPY是0.01) double offset = Point * 1; for(int i = start; i < rates_total; i++) { // 给每个价格加上偏移量 OpenBuffer[i] = open[i] + offset; HighBuffer[i] = high[i] + offset; LowBuffer[i] = low[i] + offset; CloseBuffer[i] = close[i] + offset; } return(rates_total); }
使用步骤
- 把上面的代码复制到MT4的MetaEditor中,保存为
.mq4文件(比如命名为ShiftedCandles.mq4),编译通过。 - 回到MT4图表,右键点击图表 → 「插入」→ 「指标」→ 「自定义」,找到你刚编译的指标加载到图表上。
- 隐藏原始的默认蜡烛图:右键图表 → 「品种」→ 取消勾选「显示」,这样就只显示我们偏移后的蜡烛图了。
注意事项
- 代码里的
offset = Point * 1表示上移1点,如果需要调整偏移点数,直接修改数字即可(比如上移2点就改成Point * 2)。 Point变量是MT4内置的,会自动识别当前交易品种的1点对应的数值,不用手动修改,兼容性很好。- 你之前尝试的直方图方法确实不适用,因为直方图只能绘制单值数据,而蜡烛图需要同时处理开、高、低、收四个价格维度,这个自定义蜡烛指标才是正确的解决方案。
内容的提问来源于stack exchange,提问作者Jean
相关产品推荐
相关产品推荐

