手工制图表和交易工具箱(第三部分)。 优化和全新工具·综合运用
趋势线未来端随价格自动校正
在 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,每小时重校一次图形端点。
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 结构能少走弯路,但任何策略都只是概率优势,不是必然。