手搓三线突破图表指标实战
📈

手搓三线突破图表指标实战

从原理到MQL5代码实现与交易策略

技术分析基础 难度 · 进阶 2026-07-04 8 分钟阅读
#三线突破#MQL5指标#图表构建#交易策略

三线突破图表的起源与基本概念

三线突破图表(Three Line Break)是一种起源于日本的传统技术分析图表,由Steve Nison在1994年著作《Beyond Candlesticks》中系统引入西方。与蜡烛图、点数图、Kagi、Renko不同,它不按固定时间轴排列,而是根据价格相对前序极值的变化来绘制反转或延续的阴阳线。其核心目的是过滤小幅噪音波动,突出主要趋势。图表基于选定时间帧内的收盘价(或可选价格类型)来判定新线生成,当价格超过先前极值一定步长时绘出同方向线;若反向突破由参数line_to_back_f(经典为3)指定的连续线数所确立的极值,则绘出反转线。

在经典定义中,Steve Nison描述了11条绘制原理,本文作者将其归纳为三条:原理一,选定初始价,依涨跌绘阴阳线并标记新最低或最高;原理二,当价格跌破最低或突破最高,绘对应阴或阳线;原理三,反向线必须穿过之前若干同方向线的最低或最高,若连续同色线多于两根,则计算基准取最后两根或三根。这种机制使得三线突破图在趋势市中信号清晰,但在震荡市中可能出现较多盈亏平衡信号。

✦ 学习价值
理解三线突破有助于你脱离时间框架束缚,从纯粹价格行为角度识别趋势,尤其适合与均线、形态学结合做中长线分析。

经典构造与现代改良特性对比

经典三线突破仅使用单一价格类型(如收盘价)绘制无影线方块。而本文指标ABCTB实现了现代改良型:支持四种价格类型(开盘、最高、最低、收盘)同时计算,并将输出绘制为带影线的彩色蜡烛状(DRAW_COLOR_CANDLES),提升视觉信息量。改良型通过参数chart_type=modified开启。

另一项创新是数据同步机制。由于MT5中不同价格类型可能因跳空、非交易时段导致缺失,指标提供完整同步(chart_synchronization=true,仅保留四价齐全的柱)与局部同步(以优先级参数chart_priority_close等填补缺失)。周期分隔符可随time_frame变化以变色垂直线标记,便于切分信号。内置iMA均线可依据主图数据同步过滤,辅助判断支撑阻力。

⚠ 常见坑
若history数据不全,完整同步可能使图表起始点大幅偏移;局部同步若优先级设错,会造成价格序列失真,回测前务必用Sample数据验证。

指标输入参数详解与规划

ABCTB指标在序言声明了2个 plots:ABCTB(彩色蜡烛,6缓冲器中的前5个)与LINE_TLB(均线)。输入参数通过enum与input暴露:magic_numb为唯一标识;time_frame是计算周期;time_redraw是重绘触发周期(如M1);first_date_start为数据起点;chart_price在经典型生效;step_min_f为新线最小跳跃点数;line_to_back_f为反转所需线数;chart_type切换构造;chart_color_period控制新周期变色;chart_synchronization控制同步模式;chart_priority_*设局部同步优先权;ma_draw及ma_*控制均线。

//--- input parameters
input long               magic_numb=65758473787389;                // Magic number
input ENUM_TIMEFRAMES    time_frame=PERIOD_CURRENT;                // Calculation time range
input ENUM_TIMEFRAMES    time_redraw=PERIOD_M1;                    // Period of chart updates
input datetime           first_date_start=D'2013.03.13 00:00:00';  // Start date
input type_price         chart_price=close;                        // Price type for calculation (0-Close, 1-Open, 2-High, 3-Low)
input int                step_min_f=4;                             // Minimum step for a new column (>0)
input int                line_to_back_f=3;                         // Number of lines to display a reversal(>0)
input type_build         chart_type=classic;                       // Type of chart construction (0-classic, 1-modified)

核心代码模块:数据复制与初始化

OnInit中映射缓冲器并设为时间序列,隐藏实时值避免图表过载,创建iMA句柄,并强制step_min_f与line_to_back_f至少为1,否则报警修正。func_all_copy利用MqlRates结构与CopyRates增量复制,静态变量bars_copied保证只取新数据,适合实时追加。

int OnInit()
  {
   SetIndexBuffer(0,ABCTBBuffer1,INDICATOR_DATA);
   ArraySetAsSeries(ABCTBBuffer1,true);
   SetIndexBuffer(5,LINE_TLBBuffer,INDICATOR_DATA);
   ArraySetAsSeries(LINE_TLBBuffer,true);
   handle=iMA(_Symbol,time_frame,ma_period,0,ma_method,ma_price);
   if(step_min_f<1) { step_min=1; Alert("Minimum step for a new column must be greater than zero"); }
   else step_min=step_min_f;
   return(INIT_SUCCEEDED);
  }
bool func_all_copy(MqlRates &result_array[], ENUM_TIMEFRAMES period, datetime data_start, datetime data_stop)
  {
   static MqlRates interim_array[];
   static int bars_copied;
   int bars_to_copy=Bars(_Symbol,period,data_start,data_stop)-bars_copied;
   if(bars_copied>0) { bars_copied--; bars_to_copy++; }
   ArrayResize(interim_array,bars_to_copy);
   int result_copy=CopyRates(_Symbol,period,0,bars_to_copy,interim_array);
   if(result_copy!=-1) { ArrayCopy(result_array,interim_array,bars_copied,0,WHOLE_ARRAY); bars_copied+=result_copy; return true; }
   return false;
  }

计算引擎:重组、插入与三线突破算法

func_build_three_line_break是核心。它先将MqlRates按price_type提取到interim_array,再用line_price结构passed_line记录最近line_back+1条线的上下沿。func_regrouping在每次新价时把历史线下移,将新价插入0号位;func_insert将判定后的线写入line_info返回数组。逻辑上,无线时首价成基;突破上限+步长则阳线,跌破下限-步长则阴线;反转需穿透line_back条同色线的极值。

void func_regrouping(line_price &input_array[], double new_price, char type)
  {
   int x=ArraySize(input_array);
   for(x--; x>0; x--) { input_array[x].up=input_array[x-1].up; input_array[x].down=input_array[x-1].down; }
   if(type==1) { input_array[0].up=new_price; input_array[0].down=input_array[1].up; }
   if(type==-1) { input_array[0].down=new_price; input_array[0].up=input_array[1].down; }
  }
void func_build_three_line_break(MqlRates &input_array[], char price_type, int min_step, int line_back, line_info &line_main_array[])
  {
   int array_size=ArraySize(input_array);
   double interim_array[]; ArrayResize(interim_array,array_size);
   switch(price_type) { case 0: for(int x=0;x<array_size;x++) interim_array[x]=input_array[x].close; break;
     case 3: for(int x=0;x<array_size;x++) interim_array[x]=input_array[x].low; break; }
   line_price passed_line[]; ArrayResize(passed_line,line_back+1);
   passed_line[0].up=interim_array[0]; passed_line[0].down=interim_array[0];
   for(int x=0; x<array_size; x++) { /* 判定突破与反转并调用regrouping/insert */ }
  }

图表构造:颜色、同步与均线函数

func_date_color依据time_frame返回是否新周期(日/周/月/年),用于变色。func_synchronization处理完整(删缺)或局部(按priority填缺)同步,局部中将四价转二维数组并按优先级排序填补0值。func_ma简单CopyBuffer取均线值。func_chart_build清除缓冲后分经典/改良:改良调用四次build分别算四价,收集时间排序去重,填充彩色缓冲;经典仅算选定价。

bool func_date_color(datetime date_time)
  {
   int seconds=PeriodSeconds(time_frame); MqlDateTime date; TimeToStruct(date_time,date);
   if(seconds<=7200) { if(time_array[0]!=date.day) { time_array[0]=date.day; return true; } }
   if(seconds>86400) { if(time_array[2]!=date.year) { time_array[2]=date.year; return true; } }
   return false;
  }
void func_synchronization(buffer_info &info[], bool synchronization, char close, char open, char high, char low)
  {
   if(synchronization==true) { int calc=0; for(int x=0;x<ArraySize(info);x++) if(info[x].close!=0&&info[x].high!=0&&info[x].low!=0&&info[x].open!=0) calc++;
     buffer_info i_info[]; ArrayResize(i_info,calc); /* 复制齐全者 */ }
   if(synchronization==false) { /* 二维缓冲+优先级排序填补 */ }
  }

集成、事件与自动重绘控制

func_consolidation整合复制与构建并ChartRedraw。OnCalculate用func_new_bar检测time_redraw新柱触发重算;OnChartEvent监听键'R'(lparam==82)手动刷新。func_new_bar通过比较CopyTime最后柱时间实现轻量新柱检测。

int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[])
  { if(func_new_bar(time_redraw)==true) func_consolidation(); return(rates_total); }
void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam)
  { if(id==CHARTEVENT_KEYDOWN && lparam==82) func_consolidation(); }

基于指标的交易策略与实战案例

策略一(经典信号):买当三根连续阳线,卖当三根连续阴线(趋势确认);卖当反转阴线跌破三阳极值,买当反转阳线突破三阴极值。EURUSD H1自2013年实测可捕获超200点波段,最坏盈亏平衡。策略二:用线图绘制等距通道与支撑阻力,GBPUSD H1中红蓝通道交叉预示反转。策略三:改良两线突破M30上识别吞噬、锤、陀螺、孕育线等蜡烛形态。策略四:加载MA,价格双图均低于MA作空,高于作多,适合长线。

⚠ 使用注意
信号稀少且回撤可能较大,作者建议仅用于长线趋势,短线慎用。指标不处理tick级,依赖H1及以上周期较稳。

部署步骤与常见疑问排查

在MT5中新建指标,粘贴ABCTB.mq5全部代码(含未详列的结构定义),编译至MQL5/Indicators。拖入图表,设first_date_start确保历史充足。按R或等M1重绘。若图表空白,检查step_min_f是否过大、历史数据是否下载。原文ZIP含完整文件,地址 https://www.mql5.com/zh/articles/902 。指标为第三方编写,MetaQuotes不对准确性担保。

✦ 优化方向
可扩展添加警报、多周期共振,或将line_back动态化。注意MQL5版本升级后若报错,检查DRAW_COLOR_CANDLES等宏是否仍支持。

常见问题

参考ABCTB.mq5:声明DRAW_COLOR_CANDLES缓冲,用MqlRates复制数据,编写func_build_three_line_break按极值与step_min_f、line_to_back_f判定阴阳线,并在OnCalculate中按重绘周期调用构建函数。完整代码见 https://www.mql5.com/zh/articles/902 。
经典仅用单一价格(如收盘)画无影线方块,三线反转;改良(chart_type=modified)同时算四价画彩色蜡烛,支持数据同步与周期分隔,需更多计算但信息更丰富。
line_to_back_f是反转所需连续线数,经典取3;step_min_f是新线最小跳跃点数(整数点),过小会噪音多,过大信号迟,建议4点起根据品种波动率调。
原文EURUSD H1实测顺势三阳/三阴策略可capture超200点,最坏盈亏平衡;但信号少、回撤大,仅推荐长线趋势,不用于短线。
先按R重绘;检查first_date_start是否有足够历史、step_min_f>0、chart_synchronization=true时数据是否四价齐全;从MT5历史中心下载对应周期数据后再编译加载。