手搓三线突破图表指标实战
从原理到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均线可依据主图数据同步过滤,辅助判断支撑阻力。
- 经典型:单价格、无影线、三线反转判定,计算轻量
- 改良型:四价同算、蜡烛外观、同步与周期分隔、内置MA
- 共同点:均含最小步长step_min_f与反转线数line_to_back_f作为滤波器
指标输入参数详解与规划
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作空,高于作多,适合长线。
- 规则一:三同色线顺势入场
- 规则二:反转线穿透三同色极值反手
- 形态法:改良图辨识日式蜡烛信号
- 均线法:双图MA方向过滤
部署步骤与常见疑问排查
在MT5中新建指标,粘贴ABCTB.mq5全部代码(含未详列的结构定义),编译至MQL5/Indicators。拖入图表,设first_date_start确保历史充足。按R或等M1重绘。若图表空白,检查step_min_f是否过大、历史数据是否下载。原文ZIP含完整文件,地址 https://www.mql5.com/zh/articles/902 。指标为第三方编写,MetaQuotes不对准确性担保。