//+------------------------------------------------------------------+//| BarCountdown.mq4 |//| MT4倒计时指标 - 支持自定义位置、字体大小、跟随买价 |//+------------------------------------------------------------------+#property indicator_chart_window#property indicator_buffers 0//--- 外部参数input bool ShowSeconds = true; // 是否显示秒数input string DisplayMode = "跟随买价线"; // 显示模式: 左上角/右上角/左下角/右下角/跟随买价线input int FontSize = 14; // 字体大小input color FontColor = Red; // 字体颜色input int XOffset = 10; // 水平偏移(像素)input int YOffset = 30; // 垂直偏移(像素) - 仅角落模式有效//--- 全局变量string objName = "BarCountdownTimer";int periodSeconds; // 当前周期秒数datetime lastTime; // 上次更新时间,用于减少不必要的刷新//+------------------------------------------------------------------+//| 初始化函数 |//+------------------------------------------------------------------+intinit(){ // 计算周期秒数 periodSeconds = Period() * 60; lastTime = 0; // 创建对象(若不存在) if(ObjectFind(0, objName) == -1) { ObjectCreate(0, objName, OBJ_LABEL, 0, 0, 0); ObjectSetInteger(0, objName, OBJPROP_COLOR, FontColor); ObjectSetInteger(0, objName, OBJPROP_FONTSIZE, FontSize); ObjectSetString(0, objName, OBJPROP_FONT, "Arial"); } return(0);}//+------------------------------------------------------------------+//| 反初始化函数 |//+------------------------------------------------------------------+intdeinit(){ ObjectDelete(0, objName); return(0);}//+------------------------------------------------------------------+//| 将模式和文本转换为角标代码 |//+------------------------------------------------------------------+intGetCorner(string mode){ if(mode == "右上角") return 1; if(mode == "左下角") return 2; if(mode == "右下角") return 3; return 0; // 默认左上角}//+------------------------------------------------------------------+//| 主循环 |//+------------------------------------------------------------------+intstart(){ datetime curTime = TimeCurrent(); // 计算剩余秒数 datetime barOpen = Time[0]; datetime barEnd = barOpen + periodSeconds; int remaining = barEnd - curTime; if(remaining < 0) remaining = 0; // 格式化文本 int minutes = remaining / 60; int seconds = remaining % 60; string text; if(ShowSeconds) text = StringFormat("距K线结束: %02d:%02d", minutes, seconds); else text = StringFormat("距K线结束: %d分钟", minutes); // 更新对象属性 ObjectSetString(0, objName, OBJPROP_TEXT, text); ObjectSetInteger(0, objName, OBJPROP_COLOR, FontColor); ObjectSetInteger(0, objName, OBJPROP_FONTSIZE, FontSize); // 根据模式设置位置 if(DisplayMode == "跟随买价线") { // 跟随买价线模式:使用OBJ_LABEL并动态计算屏幕坐标 double price = Bid; // 当前买价 datetime time = TimeCurrent(); // 当前时间(也可以偏移几根K线) // 将价格和时间转换为屏幕像素坐标 int x = 0, y = 0; if(ChartTimePriceToXY(0, 0, time, price, x, y)) { // 设置坐标为相对于窗口左上角的像素位置 ObjectSetInteger(0, objName, OBJPROP_CORNER, 0); // 左上角为参考 ObjectSetInteger(0, objName, OBJPROP_XDISTANCE, x + XOffset); ObjectSetInteger(0, objName, OBJPROP_YDISTANCE, y + YOffset); } else { // 转换失败时,回退到左上角 ObjectSetInteger(0, objName, OBJPROP_CORNER, 0); ObjectSetInteger(0, objName, OBJPROP_XDISTANCE, XOffset); ObjectSetInteger(0, objName, OBJPROP_YDISTANCE, YOffset); } } else { // 角落模式 int corner = GetCorner(DisplayMode); ObjectSetInteger(0, objName, OBJPROP_CORNER, corner); ObjectSetInteger(0, objName, OBJPROP_XDISTANCE, XOffset); ObjectSetInteger(0, objName, OBJPROP_YDISTANCE, YOffset); } // 可选:每秒钟强制刷新一次(MT4会在每个tick自动调用start,无需额外操作) return(0);}//+------------------------------------------------------------------+