学习如何基于鳄鱼(Alligator)设计交易系统·进阶篇
📘

学习如何基于鳄鱼(Alligator)设计交易系统·进阶篇

第 2/3 篇

◍ 用三条线给鳄鱼策略画蓝图

把上一节的鳄鱼思路落进交易系统,核心就是让程序持续盯住 Lips(嘴唇)、Teeth(牙齿)、Jaws(下颌)三条线的相对位置,必要时再拉进收盘价做过滤。 最基础的识别逻辑只判方向:当 Lips > Teeth 且 Lips > Jaws 且 Teeth > Jaws,图表注释返回「看涨」并打出三线数值;反过来 Lips < Teeth 且 Lips < Jaws 且 Teeth < Jaws,则返回「看跌」加数值。这一步不下单,只帮你确认趋势倾向。 第二层直接出交易触发:Lips 同时高于 Teeth 和 Jaws 时标「买入」,Lips 同时低于 Teeth 和 Jaws 时标「卖出」。注意这里没有价格确认,假突破概率偏高,外汇与贵金属品种尤其容易被毛刺扫掉。 第三层加了一道收盘价过滤来降噪:空头排列(Lips<Teeth 且 Lips<Jaws)后收盘价站上 Teeth,给「买入」;多头排列(Lips>Teeth 但 Lips<Jaws)后收盘价跌破 Teeth,给「卖出」。把收盘价写进注释,你回看时会知道信号到底卡在哪一刻。

把鳄鱼三线搬进EA里跑信号

想在 MT5 里让鳄鱼指标自己吐信号,第一步是先把下颌、牙齿、嘴唇三条线的值抓出来。标准参数是下颌 13 周期偏移 8、牙齿 8 周期偏移 5、嘴唇 5 周期偏移 3,均线类型用平滑移动平均(SMMA),价格取中位数。 下面这段是取数核心。先开三个 double 数组装分量,再用 ArraySetAsSeries 把序列倒排,这样 [0] 永远是最新一根 K。iAlligator 拿指标句柄,CopyBuffer 分别把 0/1/2 号缓冲区拷进 jaws、teeth、lips 数组,最后 NormalizeDouble 到 5 位小数并用 Comment 打印。 double jawsArray[]; double teethArray[]; double lipsArray[]; ArraySetAsSeries(jawsArray,true); ArraySetAsSeries(teethArray,true); ArraySetAsSeries(lipsArray,true); int alligatorDef=iAlligator(_Symbol,_Period,13,8,8,5,5,3,MODE_SMMA,PRICE_MEDIAN); CopyBuffer(alligatorDef,0,0,3,jawsArray); CopyBuffer(alligatorDef,1,0,3,teethArray); CopyBuffer(alligatorDef,2,0,3,lipsArray); double jawsValue=NormalizeDouble(jawsArray[0],5); double teethValue=NormalizeDouble(teethArray[0],5); double lipsValue=NormalizeDouble(lipsArray[0],5); Comment("jawsValue = ",jawsValue,"\n", "teethValue = ",teethValue,"\n", "lipsValue = ",lipsValue); 编译后把 EA 拖到图表,勾选“允许算法交易”,右上角出现加载标记就说明三线值已经在实时刷新。若三条线全在价格下方,倾向视为看涨排列;全在上方则倾向看跌排列——但这只是状态显示,不是下单指令。 增强版会再调 CopyRates 抓 1 根 MqlRates 数据,把收盘价拉来和牙齿线比:收盘价站上齿线且三线在价下方,买入信号概率更高;反之下破且三线在价上方,卖出信号概率更高。外汇和贵金属杠杆高,这类信号失效也常见,实盘前先用策略测试器跑历史数据核对。

MQL5 / C++
class="type">class="kw">double jawsArray[];
class="type">class="kw">double teethArray[];
class="type">class="kw">double lipsArray[];
ArraySetAsSeries(jawsArray,true);
ArraySetAsSeries(teethArray,true);
ArraySetAsSeries(lipsArray,true);
class="type">int alligatorDef=iAlligator(_Symbol,_Period,class="num">13,class="num">8,class="num">8,class="num">5,class="num">5,class="num">3,MODE_SMMA,PRICE_MEDIAN);
CopyBuffer(alligatorDef,class="num">0,class="num">0,class="num">3,jawsArray);
CopyBuffer(alligatorDef,class="num">1,class="num">0,class="num">3,teethArray);
CopyBuffer(alligatorDef,class="num">2,class="num">0,class="num">3,lipsArray);
class="type">class="kw">double jawsValue=NormalizeDouble(jawsArray[class="num">0],class="num">5);
class="type">class="kw">double teethValue=NormalizeDouble(teethArray[class="num">0],class="num">5);
class="type">class="kw">double lipsValue=NormalizeDouble(lipsArray[class="num">0],class="num">5);
Comment("jawsValue = ",jawsValue,"\n",
"teethValue = ",teethValue,"\n",
"lipsValue = ",lipsValue);

「用 OnTick 把鳄鱼三线拆出来」

想在 MT5 里实时盯鳄鱼指标(Alligator)的三条线,最直接的方式就是在 Expert Advisor 的 OnTick 里取缓冲区。下面这段脚本把颌、齿、唇三线各拉一个数组,并设为时间序列方便按 [0] 取当前值。 iAlligator 的默认参数是 13/8/8/5/5/3,分别对应颌线周期偏移 13、齿线 8、唇线 5,平滑用 SMMA、价格用中位数。CopyBuffer 每次只取最近 3 根(0~2),足够做当前与前两根的对比。 取出来的值用 NormalizeDouble(...,5) 压到 5 位小数,再 Comment 打到图表左上角。你开 EURUSD 的 M15 挂上这段,就能看到三线数值随 tick 刷新;当 lips > teeth > jaws 时,价格倾向处于多头排列,但外汇和贵金属杠杆高,这只是一个概率信号,不是进场保证。 别把正态当圣经:三线数值接近时往往是盘整,此时 Comment 显示的差值可能小于 0.00010,这种压缩区比张口更值得警惕。

MQL5 / C++
class="macro">#class="kw">property version   "class="num">1.00"
class=class="str">"cmt">//--------------------------------------------------------------------
class="type">void OnTick()
  {
   class=class="str">"cmt">//creating price array
   class="type">class="kw">double jawsArray[];
   class="type">class="kw">double teethArray[];
   class="type">class="kw">double lipsArray[];   
   class=class="str">"cmt">//Sorting data
   ArraySetAsSeries(jawsArray,true);
   ArraySetAsSeries(teethArray,true);
   ArraySetAsSeries(lipsArray,true);
   class=class="str">"cmt">//define Alligator
   class="type">int alligatorDef=iAlligator(_Symbol,_Period,class="num">13,class="num">8,class="num">8,class="num">5,class="num">5,class="num">3,MODE_SMMA,PRICE_MEDIAN);       
   class=class="str">"cmt">//define data and store result
   CopyBuffer(alligatorDef,class="num">0,class="num">0,class="num">3,jawsArray);
   CopyBuffer(alligatorDef,class="num">1,class="num">0,class="num">3,teethArray);
   CopyBuffer(alligatorDef,class="num">2,class="num">0,class="num">3,lipsArray);
   class=class="str">"cmt">//get value of current data
   class="type">class="kw">double jawsValue=NormalizeDouble(jawsArray[class="num">0],class="num">5);
   class="type">class="kw">double teethValue=NormalizeDouble(teethArray[class="num">0],class="num">5);
   class="type">class="kw">double lipsValue=NormalizeDouble(lipsArray[class="num">0],class="num">5);
   class=class="str">"cmt">//comment on the chart
   Comment("jawsValue = ",jawsValue,"\n",
   "teethValue = ",teethValue,"\n",
   "lipsValue = ",lipsValue);
  }

◍ 把鳄鱼三线状态直接打印到图表上

把鳄鱼指标的三个缓冲拉进数组后,用 NormalizeDouble 统一保留 5 位小数,是为了在黄金、外汇这类小数点密集品种上避免浮点显示抖动。下面这段取的是当前柱(索引 0)的颌、齿、唇数值。 判断逻辑很直白:唇线同时高于齿线和颌线、且齿线也高于颌线,视为多头排列,倾向看涨;三线反序则倾向看跌。用 Comment 把字符串和数值拼到左上角,省去画图对象,调试时一眼能看。 CopyBuffer(alligatorDef,0,0,13,jawsArray); // 取颌线缓冲,从0号柱起13根 CopyBuffer(alligatorDef,1,0,13,teethArray); // 取齿线缓冲 CopyBuffer(alligatorDef,2,0,13,lipsArray); // 取唇线缓冲 实盘里外汇和贵金属杠杆高、滑点突兀,这种裸信号只作状态观测,真下单前最好叠加波动率过滤。开 MT5 把这段代码塞进 OnCalculate 末尾,切换 EURUSD 与 XAUUSD 各跑一轮,能直接比对三线乖离在不同品种上的松紧差异。

MQL5 / C++
CopyBuffer(alligatorDef,class="num">0,class="num">0,class="num">13,jawsArray);
CopyBuffer(alligatorDef,class="num">1,class="num">0,class="num">13,teethArray);
CopyBuffer(alligatorDef,class="num">2,class="num">0,class="num">13,lipsArray);
class=class="str">"cmt">//get value of current data
class="type">class="kw">double jawsValue=NormalizeDouble(jawsArray[class="num">0],class="num">5);
class="type">class="kw">double teethValue=NormalizeDouble(teethArray[class="num">0],class="num">5);
class="type">class="kw">double lipsValue=NormalizeDouble(lipsArray[class="num">0],class="num">5);
class=class="str">"cmt">//conditions of strategy
if(lipsValue>teethValue && lipsValue>jawsValue && teethValue>jawsValue)
  {
   Comment("Bullish","\n",
            "jawsValue = ",jawsValue,"\n",
            "teethValue = ",teethValue,"\n",
            "lipsValue = ",lipsValue);
  }
if(lipsValue<teethValue && lipsValue<jawsValue && teethValue<jawsValue)
  {
   Comment("Bearish","\n",
            "jawsValue = ",jawsValue,"\n",
            "teethValue = ",teethValue,"\n",
            "lipsValue = ",lipsValue);
  }

常见问题

看绿线在红线和蓝线之间来回穿且三线纠缠就是闭嘴,此时不进场,等三线张口再考虑。
可以,用脚本或指标把三线高低关系每tick打印成文字对象,肉眼扫一眼就知道当前排列。
能,小布盯盘已内置鳄鱼三线诊断,打开对应品种页即可看到实时排列与张口提醒。
贵金属建议按经纪商常规设3~5点滑点,过高会过度悲观,过低则实盘容易跑不出回测收益。
因为三线基于不同平滑周期,新tick未凑满周期就不重算,属正常延迟,不是代码错。