价格行为分析工具箱开发(第三部分):分析大师 EA·综合运用
(3/3)·从一次性脚本到常驻 EA,解决指标只能手写一次的局限,让盘面诊断自己跑起来
很多交易者把分析评论脚本当终极方案,却没意识到它只在手动运行那一下写死指标,两小时后市场早已变脸。EA 不是简单升级,而是把「持续更新 + 事件响应」塞进同一套价格行为逻辑里。接上篇,我们收尾这套工具箱,直接拆一个能常驻运行的实战样本。
把前日高低与账户状态画进图表
这段逻辑跑在 EA 的刷新分支里:先把拼好的信息串用 Print 丢进日志、用 Comment 钉在图表左上角,方便你盯盘时一眼看到支撑阻力、余额权益、点差和 ATR。 紧接着 ObjectsDeleteAll(0) 清掉旧物件,再调用 DrawContinuousTrendLine 画两条横线——PrevDayHigh 和 PrevDayLow,把前一日高低位直接拉成贯穿视窗的参考带。外汇与贵金属波动受杠杆放大,画线只是定位,不代表方向确认。 DrawContinuousTrendLine 里 startTime 取当前时间减 24*3600 秒,也就是往回拉一天;OBJPROP_XSIZE 设 0 让趋势线向左无限延伸,High 字样命中则染红、否则染蓝,线宽固定 2。 AnalyzeMarketDirection 用 close 对 open 判定 Bullish / Bearish / Neutral,再比 high、low 与开收价补一句压力描述;返回串仅供上下文参考,不触发下单。开 MT5 把这几段塞进脚本,能立刻在图上验证前日区间带。
support, resistance, accountBalance, accountEquity, marketSpread,
minLotSize, maxLotSize, atrValue, lastUpdateStr, lotSize);
class=class="str">"cmt">// Log the information
Print(infoStr);
class=class="str">"cmt">// Display information on the chart
Comment(infoStr);
class=class="str">"cmt">// Remove old trend lines and create new ones for previous day&class="macro">#x27;s high/low
ObjectsDeleteAll(class="num">0);
class=class="str">"cmt">// Draw continuous trend lines
DrawContinuousTrendLine("PrevDayHigh", previousDayHigh);
DrawContinuousTrendLine("PrevDayLow", previousDayLow);
class=class="str">"cmt">// Update last update time
lastUpdateTime = TimeCurrent();
}
}
class="type">class="kw">string AnalyzeMarketDirection(class="type">class="kw">double open, class="type">class="kw">double close, class="type">class="kw">double high, class="type">class="kw">double low)
{
class="type">class="kw">string direction;
if (close > open)
{
direction = "Bullish";
}
else if (close < open)
{
direction = "Bearish";
}
else
{
direction = "Neutral";
}
class=class="str">"cmt">// Include current trends or patterns based on high and low for further analysis
if (high > open && high > close)
{
direction += " with bullish pressure"; class=class="str">"cmt">// Example addition for context
}
else if (low < open && low < close)
{
direction += " with bearish pressure"; class=class="str">"cmt">// Example addition for context
}
class="kw">return direction;
}
class="type">void DrawContinuousTrendLine(class="type">class="kw">string name, class="type">class="kw">double price)
{
class="type">class="kw">datetime startTime = TimeCurrent() - class="num">24 * class="num">3600; class=class="str">"cmt">// Extend class="num">24 hours into the past
ObjectCreate(class="num">0, name, OBJ_TREND, class="num">0, startTime, price, TimeCurrent(), price);
ObjectSetInteger(class="num">0, name, OBJPROP_COLOR, (StringFind(name, "High") >= class="num">0) ? clrRed : clrBlue);
ObjectSetInteger(class="num">0, name, OBJPROP_WIDTH, class="num">2); class=class="str">"cmt">// Set thickness of the line
ObjectSetInteger(class="num">0, name, OBJPROP_XSIZE, class="num">0); class=class="str">"cmt">// Set this class="kw">property to extend the line infinitely to the left
}
class="type">class="kw">double CalculateLotSize(class="type">class="kw">double support, class="type">class="kw">double resistance)
{◍ 用支撑阻力距反推手数
基于支撑与阻力区间计算止损距离是仓位控制的第一步:取两者差值的绝对值再乘上自定义倍数,就得到止损跨度。账户风险金额则直接用结余乘以百分比,例如 1% 风险在 10000 余额账户上对应 100 单位货币,外汇与贵金属杠杆高,实际亏损可能远超本金,须谨慎。 下面的片段演示了如何把风险金额换算成手数,并强制对齐券商最小交易量。注意 tick size 参与分母,避免跨品种直接用点值造成的偏差。 别把 normalize 当保险箱 NormalizeDouble 到两位小数只是显示约定, brokers 端最小步长可能是 0.01 也可能 0.1,回测通过的 lot 在实盘可能因 SYMBOL_VOLUME_MIN 被截断,下单前一定要用代码里的 minLotSize 兜底。
class="type">class="kw">double stopLossDistance = MathAbs((support - resistance) * StopLossMultiplier); class="type">class="kw">double riskAmount = AccountInfoDouble(ACCOUNT_BALANCE) * (RiskPercentage / class="num">100.0); class=class="str">"cmt">// Get the tick size for the current symbol class="type">class="kw">double tickSize = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_SIZE); class=class="str">"cmt">// Calculate the lot size based on the stop loss and tick size class="type">class="kw">double lotSize = riskAmount / (stopLossDistance / tickSize); lotSize = NormalizeDouble(lotSize, class="num">2); class=class="str">"cmt">// Normalize the lot size to two decimal places class=class="str">"cmt">// Ensure lot size is above minimum lot size allowed by broker class="type">class="kw">double minLotSize = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MIN); if (lotSize < minLotSize) lotSize = minLotSize; class="kw">return lotSize;
「把 EA 跑进 MT5 的完整路径」
打开 MT5 后按 F4 进 MetaEditor,选「文件 > 新建 > EA」起一个 .mq5 文件,或载入已有工程。代码写完按 F7 编译,零错误才会生成 ex5 可执行文件;有报错就卡在这步,不会进导航器。 回到 MT5 用 Ctrl+N 调出导航器,在「智能交易系统」里找到刚编译的 EA,拖到目标图表。弹窗里先把「允许自动交易」勾上,再点工具栏绿色按钮开启全局自动交易,否则 EA 只加载不干活。 图5、图6 显示这套 EA 的行为:依据前一日支撑阻力画趋势线,每 2 小时刷新一次市场数据,图表角落带最新更新时间戳。外汇与贵金属杠杆高、滑点大,自动刷新节奏和实际成交可能脱节,上机后先用策略测试器回测再实盘。 参数不用写死在代码里,右键图表改 EA 属性就能调。建议先只挂一个品种观察 3~5 个交易日,确认时间戳刷新正常、趋势线贴合前日区间,再考虑复制到其他图表。
别急着下结论
把 Analytics Master 这类 EA 丢进 MT5 之前,先拿历史数据跑回测。Lynnchris 工具箱的三款独立工具时间线很清晰:图表投影仪 1.0 发布于 01/10/24,分析评论 1.0 发布于 18/11/24,分析大师 1.01 第二版发布于 27/11/24,后者才是分析评论的扩展而非升级。回测能暴露它在震荡与单边市里的信号滞后,大约每两小时更新一次的特性意味着日内突变来不及反应。 外汇与贵金属杠杆高、滑点凶,EA 只给分析不给下单,仓位百分比必须按账户规模和承受力手调。跑完回测再上模拟盘观察几天,比直接实盘盲信信号稳妥得多。 工具不替你做决策,它把前日信息和两小时级情绪摆上桌,真正该盯的是你自己有没有偏离风控线。市场状态翻脸快,留好余地去复核比追着信号跑更重要。