手工制图表和交易工具箱(第三部分)。 优化和全新工具·综合运用
📘

手工制图表和交易工具箱(第三部分)。 优化和全新工具·综合运用

第 3/3 篇

趋势线未来端随价格自动校正

在 MT5 里手画的趋势线,如果第二端点时间写得太远,价格后续变动后线就会悬空失真。下面这段逻辑用一条辅助线算出理想时间点,再把自由端和对应竖线一起挪过去。 核心是先取趋势线两个端点的时间与价格:time_first_point / price_first_point 为起点,time_second_point / price_second_point 为自由端。再用 MakeHelpfulLine 拉一条从起点到基准点的临时线,通过 ObjectGetTimeByValue 按第二端价格反查应落的时间 time_far_ideal。 若 time_second_point 与 time_far_ideal 不一致,就 ObjectMove 改趋势线自由端,并遍历 OBJ_VLINE 找同名前缀竖线同步移动,最后 RemoveHelpfulLine 清掉辅助线。实盘外汇与贵金属波动大、滑点频,这类自动校正只解决图形错位,不预示方向,高风险依旧。 触发放在 H1 新棒判断里:IsNewBar 为真才对图上全部 OBJ_TREND 跑一遍 CorrectTrendFutureEnd,随后 ChartRedraw。你可以直接把循环贴进自己的 EA,每小时重校一次图形端点。

MQL5 / C++
  price_of_base_point=StringToDouble(point_components[class="num">2]);
  if(time_of_base_point==class="num">0 || price_of_base_point==class="num">0)
   {
     PrintDebugMessage(__FUNCTION__+" Error: Unusable description");
     class="kw">return;
   }
class=class="str">"cmt">//--- Get the real coordinates of the line
   time_first_point = (class="type">class="kw">datetime)ObjectGetInteger(class="num">0,_line_name,OBJPROP_TIME,class="num">0);
   time_second_point = (class="type">class="kw">datetime)ObjectGetInteger(class="num">0,_line_name,OBJPROP_TIME,class="num">1);
   price_first_point = ObjectGetDouble(class="num">0,_line_name,OBJPROP_PRICE,class="num">0);
   price_second_point = ObjectGetDouble(class="num">0,_line_name,OBJPROP_PRICE,class="num">1);
class=class="str">"cmt">//--- Create an auxiliary line(from the starting point to the base one)
   MakeHelpfulLine(
     time_first_point,
     price_first_point,
     time_of_base_point,
     price_of_base_point
   );
class=class="str">"cmt">//--- Calculate the correct time for the current situation
   time_far_ideal=ObjectGetTimeByValue(class="num">0,helpful_name,price_second_point);
class=class="str">"cmt">//---
   if(time_second_point != time_far_ideal)
    {
      class=class="str">"cmt">//--- move the free end of the trend line
      ObjectMove(class="num">0,_line_name,class="num">1,time_far_ideal,price_second_point);
      class=class="str">"cmt">//--- and the corresponding vertical
      StringSplit(_line_name,StringGetCharacter("_",class="num">0),name_components);
      for(i=class="num">0; i<ObjectsTotal(class="num">0,-class="num">1,OBJ_VLINE); i++)
       {
         vertical_name = ObjectName(class="num">0,i,-class="num">1,OBJ_VLINE);
         if(name_components[class="num">0]==StringSubstr(vertical_name,class="num">0,StringFind(vertical_name,"_",class="num">0)))
          {
            if((class="type">class="kw">datetime)ObjectGetInteger(class="num">0,vertical_name,OBJPROP_TIME,class="num">0)==time_second_point)
             {
               ObjectMove(class="num">0,vertical_name,class="num">0,time_far_ideal,price_second_point);
               break;
             }
          }
       }
    }
  class=class="str">"cmt">// Delete the auxiliary line
  RemoveHelpfulLine();
}
class=class="str">"cmt">/* Shortcuts.mq5 */
class="type">int OnCalculate(class=class="str">"cmt">/*...*/)
{
   class=class="str">"cmt">//...
   if(CUtilites::IsNewBar(First_Start_True,PERIOD_H1))
    {
      for(i=class="num">0; i<all_lines_count; i++)
       {
         line_name=ObjectName(class="num">0,i,-class="num">1,OBJ_TREND);
         CUtilites::CorrectTrendFutureEnd(line_name);
         ChartRedraw();
       }
    }
   class=class="str">"cmt">//...
}

◍ 键盘映射决定了你能多快画线

这套函数库把常用图形动作直接绑到了单键上,而不是层层菜单点选。交易者在 MT5 图表上按一下就能落一条线,省掉的是反复右键的延迟——在价格刚破位的那两三秒里,这种差距可能就是能不能记上关键位。 具体绑定里,U 和 D 负责在时间帧面板里上下切主周期;Z 切换图表层级,避免指标线被对象挡死。T 依据离鼠标最近的两个单向极值拉倾斜趋势线,R 切射线模式,I 只画可见垂直线,H 是水平线,P 调安德鲁草叉,F 出斐波那契扇形。 短价位线按 S、扩展长价位线按 L、带标记垂直线按 V,X 画交叉线(仅交叉线可视),Q 按任意极值画线,B 拉矩形组。外汇与贵金属波动快、杠杆高,快捷键只是提高效率,不代表信号更准,任何画线都只是概率参考。 实盘里建议先把 U/D/Z/T/R 这六个键练成肌肉记忆,其余等遇到对应形态再补。MT5 里载进该库后,开一个 XAUUSD 的 M15 图,按 T 在最近两个峰谷间拉线,立刻能验证绑定是否生效。

「后续路线与编译坑位」

作者透露下一步不会只锁死在严格极值点上画线,计划把曲线切点也纳入锚定逻辑,同时准备碰一碰通道类对象——当前仅动过等距通道,若有人提其他通道需求也会纳入考量。 设置持久化是另一个落点:后续倾向把参数存进文件而非依赖指标输入变量,并补一个图表内图形界面直接改设置,不用每次进属性框。 英文版编译有个实打实的雷:Utilites.mqh 里翻译方把空格换成了异常符号,MT5 会报“Declaration without type”。双击报错行,Ctrl+H 把顶栏那个怪符号替换成普通空格,全部替换后 Ctrl+F7 即可过编译——2024 年 6 月仍有用户反馈 Graphics.mqh 累计 101 个错误,根因同此。 多周期同步对象是社区高频诉求,例如 5 分钟画的横线希望自动映到 1 分钟窗口;作者给的权宜解是做模板,或找 kodobase 上现成的指标/脚本顶替,MQL5 原生暂未内置该机制。

最后一句大实话

Utilities.mqh 不能单独编译,必须先在文件里或调用代码里 include GlobalVariables.mqh 与 Mouse.mqh;输入变量定义在 GlobalVariables.mqh 中,若不想在 EA 参数界面暴露,去掉 input 保留变量即可。 自动判定经纪商时移和 GMT 不必求人,让程序扫描时变周的价格计算逻辑更稳,手工核对极耗时且易错,外汇和贵金属杠杆高,时区错配可能直接吃掉止损。 前文提到的财经日历类、CFTC 非商业净持仓指标、9 个编码习惯、EA 构造函数,都可在 MT5 里新建 mqh 逐一验证;复制原文 include 结构能少走弯路,但任何策略都只是概率优势,不是必然。

常见问题

用未来端随价格自动校正的逻辑,让线的终点绑定最新价或通道边界,价格一动端点就重算,不用手动拖。
键盘映射决定了画线速度,把常用线型、删除、吸附绑到单键,练熟后比鼠标菜单快数倍。
小布可以加载你标的趋势线并实时扫描刺穿与靠近,异动直接推提醒,你只管看信号不用反复翻图。
先核对对象指针释放和事件订阅顺序,多数崩在重复绑定;留好日志段,编译不过就注释掉新增块二分排查。
只留每天真用得上、能改变开平仓动作的两三个;其余藏进二级菜单,画面干净才看得清价格本身。