价格行为分析工具包开发(第一部分):图表投影仪·进阶篇
「把昨天的 K 线投影到今天盘面」
做日内价格行为分析时,把前一交易日的高低开收按时间轴平移到当天,能直观看出「幽灵区间」与实时价格的重叠区。下面这段 MT5 逻辑先用 iTime 拿昨天和今天 0 点,再用 iBarShift 定位昨天首末根 bar,缺失数据直接退出。 循环里按 todayStart + i*PeriodSeconds() 推算投影时间,把昨天同序号 bar 的 OHLC 交给 DrawGhostBar 画成纵向线段;一旦 projectedTime 越过今天结束就 break。若 ShowHighLow 开启,还会拉出昨日的日线最高、最低水平线。 外汇与贵金属波动受杠杆与消息驱动,这类投影只反映历史形态重复概率,不预示方向;开 MT5 把代码贴进脚本,调 ShiftBars 参数就能验证不同偏移下的重叠效果。
class="type">class="kw">datetime yesterdayStart = iTime(_Symbol, PERIOD_D1, class="num">1); class=class="str">"cmt">// Start of yesterday class="type">class="kw">datetime todayStart = iTime(_Symbol, PERIOD_D1, class="num">0); class=class="str">"cmt">// Start of today class="type">class="kw">datetime todayEnd = todayStart + PeriodSeconds(PERIOD_D1); class=class="str">"cmt">// Expected end of today(class="num">24 hours) class="type">int startBarYesterday = iBarShift(_Symbol, timeFrame, yesterdayStart); class=class="str">"cmt">// Yesterday&class="macro">#x27;s first bar class="type">int endBarYesterday = iBarShift(_Symbol, timeFrame, todayStart) - class="num">1; class=class="str">"cmt">// Yesterday&class="macro">#x27;s last bar if (startBarYesterday == -class="num">1 || endBarYesterday == -class="num">1) { Print("No data for yesterday."); class="kw">return; } class="type">int barsToday = Bars(_Symbol, timeFrame, todayStart, todayEnd); class=class="str">"cmt">// Total number of bars today for (class="type">int i = class="num">0; i < barsToday; i++) class=class="str">"cmt">// Loop through yesterday&class="macro">#x27;s bars { class="type">int yesterdayIndex = startBarYesterday - i % (endBarYesterday - startBarYesterday + class="num">1); class="type">class="kw">datetime timeYesterday = iTime(_Symbol, timeFrame, yesterdayIndex); class="type">class="kw">double openYesterday = iOpen(_Symbol, timeFrame, yesterdayIndex); class="type">class="kw">double highYesterday = iHigh(_Symbol, timeFrame, yesterdayIndex); class="type">class="kw">double lowYesterday = iLow(_Symbol, timeFrame, yesterdayIndex); class="type">class="kw">double closeYesterday = iClose(_Symbol, timeFrame, yesterdayIndex); class="type">class="kw">datetime projectedTime = todayStart + i * PeriodSeconds() + ShiftBars * PeriodSeconds(); if (projectedTime >= todayEnd) class="kw">break; class=class="str">"cmt">// Stop projection if today&class="macro">#x27;s end is reached DrawGhostBar(projectedTime, openYesterday, highYesterday, lowYesterday, closeYesterday); class=class="str">"cmt">// Draw ghost bar } if (ShowHighLow) { class="type">class="kw">double yesterdayHigh = iHigh(_Symbol, PERIOD_D1, class="num">1); class=class="str">"cmt">// Yesterday&class="macro">#x27;s high class="type">class="kw">double yesterdayLow = iLow(_Symbol, PERIOD_D1, class="num">1); class=class="str">"cmt">// Yesterday&class="macro">#x27;s low DrawHorizontalLine("YesterdayHigh", yesterdayHigh); class=class="str">"cmt">// Draw high DrawHorizontalLine("YesterdayLow", yesterdayLow); class=class="str">"cmt">// Draw low } } class="type">void DrawGhostBar(class="type">class="kw">datetime time, class="type">class="kw">double open, class="type">class="kw">double high, class="type">class="kw">double low, class="type">class="kw">double close) { class="type">class="kw">string lineName = "GhostLine" + IntegerToString(time); class=class="str">"cmt">// Line name for high-low ObjectCreate(class="num">0, lineName, OBJ_TREND, class="num">0, time, low, time, high); class=class="str">"cmt">// Create the line
用代码把影线和开盘收盘框画到图上
在 MT5 自定义指标里,把“幽灵K线”的视觉元素落到图表,靠的是 ObjectCreate 配合 ObjectSetInteger 调属性。下面这段截取自一个绘制函数,分别处理了竖直辅助线、开盘-收盘矩形、以及水平线三种对象。 竖直虚线用 OBJ_VLINE 的同类逻辑(前文已建),颜色、线型、线宽统一由 GhostColor、LineStyle、LineWidth 三个变量控制;矩形则用 OBJ_RECTANGLE,以当前Bar时间 time 为左边界,time + PeriodSeconds() 为右边界,上下沿取 open 与 close,把单根K线的实体区间框出来。 水平线函数 DrawHorizontalLine 单独封装:若 ObjectCreate 返回 false,用 Print 抛“Failed to create horizontal line.”便于排查。外汇与贵金属品种波动大,这类叠加层仅作价格行为参考,实际信号需结合多周期验证,存在错判风险。 逐行看这段核心代码:ObjectSetInteger 改线色、线型、线宽三次调用一目了然;ocName 用时间戳拼字符串避免重名;ObjectCreate 建矩形时第5~8参分别是时间轴左右点与价格上下点,少了任一都会画歪。
ObjectSetInteger(class="num">0, lineName, OBJPROP_COLOR, GhostColor); class=class="str">"cmt">// Set class="type">color ObjectSetInteger(class="num">0, lineName, OBJPROP_STYLE, LineStyle); class=class="str">"cmt">// Set style ObjectSetInteger(class="num">0, lineName, OBJPROP_WIDTH, LineWidth); class=class="str">"cmt">// Set width class="type">class="kw">string ocName = "GhostOC" + IntegerToString(time); class=class="str">"cmt">// Rectangle name for open-close ObjectCreate(class="num">0, ocName, OBJ_RECTANGLE, class="num">0, time, open, time + PeriodSeconds(), close); class=class="str">"cmt">// Create rectangle ObjectSetInteger(class="num">0, ocName, OBJPROP_COLOR, GhostColor); class=class="str">"cmt">// Set class="type">color ObjectSetInteger(class="num">0, ocName, OBJPROP_STYLE, LineStyle); class=class="str">"cmt">// Set style ObjectSetInteger(class="num">0, ocName, OBJPROP_WIDTH, LineWidth); class=class="str">"cmt">// Set width } class="type">void DrawHorizontalLine(class="type">class="kw">string name, class="type">class="kw">double price) { if (!ObjectCreate(class="num">0, name, OBJ_HLINE, class="num">0, TimeCurrent(), price)) { Print("Failed to create horizontal line."); class=class="str">"cmt">// Error handling } ObjectSetInteger(class="num">0, name, OBJPROP_COLOR, GhostColor); class=class="str">"cmt">// Set class="type">color ObjectSetInteger(class="num">0, name, OBJPROP_STYLE, LineStyle); class=class="str">"cmt">// Set style ObjectSetInteger(class="num">0, name, OBJPROP_WIDTH, LineWidth); class=class="str">"cmt">// Set width }
◍ 幽灵蜡烛投射出的前日基准
图表投影仪脚本把前一天的走势做成半透明“幽灵”K线,直接叠在当下图表里。开盘、最高、最低、收盘四个价位一并可视化,你一眼就能看出今天是在重复昨天节奏,还是已经脱钩。 脚本还能选绘前日最高/最低水平线,这两条线在当天常充当隐形支撑阻力。MT5 实测里,价格先跌破前日最低线,随后反弹却没翻回,继续走空——这种对历史基准的触碰与拒绝,比堆指标更干净。 可自定义项包括颜色、线型、线宽,以及把幽灵层向前或向后平移。往前移能预览假设移位下的参照系,往后移则用于复盘。少看杂波、多盯前日轮廓,是这套工具唯一的用意。
「先把工具当镜子用」
把前一天的走势直接叠到当前图表上,相当于给市场拍了一张“昨天的底片”。它不靠均线、不堆指标,只留下裸价格与关键位,你能更快看出支撑阻力是否还在原位。 这种投影反映的是群体行为痕迹,不是预测器。它让你看见市场参与者昨天的集体选择,今天有没有被推翻,仅此而已。 外汇与贵金属波动剧烈、杠杆风险极高,这类脚本只建议用在 MT5 策略测试器或模拟账户里练眼力。真金白银上阵前,先跑通一遍再说。 作者把这系列称作 Lynnchris 工具箱,首个脚本 Chart_Projector 1.0 发布于 01/10/24,作用是叠加前一天价格并带“幽灵”效果。等下一个工具出来,再接着拆。