价格行为分析工具包开发(第一部分):图表投影仪·进阶篇
📘

价格行为分析工具包开发(第一部分):图表投影仪·进阶篇

第 2/2 篇

「把昨天的 K 线投影到今天盘面」

做日内价格行为分析时,把前一交易日的高低开收按时间轴平移到当天,能直观看出「幽灵区间」与实时价格的重叠区。下面这段 MT5 逻辑先用 iTime 拿昨天和今天 0 点,再用 iBarShift 定位昨天首末根 bar,缺失数据直接退出。 循环里按 todayStart + i*PeriodSeconds() 推算投影时间,把昨天同序号 bar 的 OHLC 交给 DrawGhostBar 画成纵向线段;一旦 projectedTime 越过今天结束就 break。若 ShowHighLow 开启,还会拉出昨日的日线最高、最低水平线。 外汇与贵金属波动受杠杆与消息驱动,这类投影只反映历史形态重复概率,不预示方向;开 MT5 把代码贴进脚本,调 ShiftBars 参数就能验证不同偏移下的重叠效果。

MQL5 / C++
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参分别是时间轴左右点与价格上下点,少了任一都会画歪。

MQL5 / C++
   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,作用是叠加前一天价格并带“幽灵”效果。等下一个工具出来,再接着拆。

常见问题

用图表投影仪把前日影线、开盘收盘框画到当前图,当作今日多空参照镜,先别用来预测,只看价格是否触碰或脱离该区间。
把它当静态基准线:价格站上投影收盘框偏多,跌破投影开盘框偏空,仅作概率倾向,不视作战术信号。
小布盯盘已内置该投影与触碰诊断,打开对应品种页即可看到前日基准框及实时位置关系,不用自己写工具。
大概率是把镜子当预言用了;先连续三天只记录价格与投影框的关系,不下单,等规律清晰再参与。
重叠区是前日博弈密集带,当前价格在其上沿外倾向延续,在其内震荡概率大,贵金属外汇需警惕假突破高风险。