  
等级: 管理员
- 注册:
- 2021-5-18
- 曾用名:
|
// 定义全局变量(用于跨K线保存数据)
VARIABLE:
DLIQPOINT:=0, // 多头止损点(动态计算的出场线)
KLIQPOINT:=0, // 空头止损点(动态计算的出场线)
LIQKA:=0, // 止损幅度乘数(随持仓时间动态调整)
VARIABLE:
HIGHAFTERENTRY:=0, // 空头持仓后记录的"最低最高价"(跟踪空头止损的上限)
LOWAFTERENTRY:=0; // 多头持仓后记录的"最高最低价"(跟踪多头止损的下限)
// 策略参数设置
PERIODS:=50; // 计算ATR(平均真实波幅)的周期数
MULTIPLIE:=20; // 趋势通道的放大倍数(控制通道宽度)
N:=3; // 开仓触发价的ATR倍数(控制开仓阈值)
TRS:=30; // 动态止损的基础系数(影响止损幅度)
LOTS:=1; // 每次开仓的手数
// 记录开仓后的高低点(用于后续计算止损线)
IF BARPOS =1 THEN BEGIN // 第一根K线时初始化高低点记录
HIGHAFTERENTRY:= HIGH; // 初始化为第一根K线的最高价
LOWAFTERENTRY:= LOW; // 初始化为第一根K线的最低价
END
IF BARPOS <>1 THEN BEGIN // 非第一根K线时更新高低点
// 空头持仓时,跟踪"最低的最高价"(避免价格过高触发止损)
HIGHAFTERENTRY:= MIN(HIGHAFTERENTRY,HIGH);
// 多头持仓时,跟踪"最高的最低价"(避免价格过低触发止损)
LOWAFTERENTRY:= MAX(LOWAFTERENTRY,LOW);
END
// 计算当日开盘价(用于开仓阈值计算)
NN:=BARSLAST(DATE<>REF(DATE,1))+1; // 计算当前K线距离上一交易日的间隔(定位当日第一根K线)
OPEND:=VALUEWHEN(NN=1,O); // 取当日第一根K线的开盘价作为"今开"
// 计算ATR(平均真实波幅,反映价格波动强度)
ATR:=MA(TR,PERIODS); // TR为真实波幅,MA(TR,PERIODS)即PERIODS周期的平均真实波幅
HL2:=(HIGH+LOW)/2; // 计算(最高价+最低价)/2作为中间价,用于构建趋势通道
// 趋势状态切换逻辑(KG控制趋势方向)
// 当当前为空头趋势(KG=-1)且收盘价突破上轨(DN),切换为多头趋势(KG=1)
If KG=-1 and Close>DN THEN BEGIN
KG:=1;
END;
// 当当前为多头趋势(KG=1)且收盘价跌破下轨(UP),切换为空头趋势(KG=-1)
If KG=1 and Close<UP THEN BEGIN
KG:=-1;
END;
// 多头开仓条件
// 当趋势为多头(KG=1)且无持仓(HOLDING=0)时
IF KG=1 AND HOLDING=0 THEN BEGIN
// 若最高价突破多头开仓阈值(HH),触发多头开仓
IF H>=HH THEN BEGIN
// 以限价单买入:价格取HH与开盘价的最大值(确保成交价格不低于阈值)
BUY(1,LOTS,LIMITR,MAX(HH,OPEN));
// 开仓后,将多头止损跟踪的"最高最低价"重置为入场价(从入场后开始记录)
LOWAFTERENTRY:=ENTERPRICE;
END
END
// 空头开仓条件
// 当趋势为空头(KG=-1)且无持仓(HOLDING=0)时
IF KG=-1 AND HOLDING=0 THEN BEGIN
// 若最低价突破空头开仓阈值(LL),触发空头开仓
IF L<=LL THEN BEGIN
// 以限价单卖空:价格取LL与开盘价的最小值(确保成交价格不高于阈值)
BUYSHORT(1,LOTS,LIMITR,MIN(LL,OPEN));
// 开仓后,将空头止损跟踪的"最低最高价"重置为入场价(从入场后开始记录)
HIGHAFTERENTRY:=ENTERPRICE;
END
END
// 动态调整止损幅度乘数(LIQKA)
// 无持仓时,LIQKA初始化为1(最大止损幅度)
IF HOLDING=0 THEN BEGIN
LIQKA:= 1;
END
// 有持仓时,LIQKA随时间递减(每根K线减0.1,最低0.5)
// 目的:持仓越久,止损幅度越小(止损线越敏感,更容易触发平仓)
IF HOLDING<>0 THEN BEGIN
LIQKA:=LIQKA - 0.1;
LIQKA:=MAX(LIQKA,0.5); // 限制最小值为0.5,避免止损过于严格
END
// 计算动态止损线(随LIQKA变化,持仓越久越敏感)
// 多头持仓时,计算多头止损线DLIQPOINT
IF HOLDING>0 THEN BEGIN
// 公式:入场后最高最低价 - (开盘价*TRS/1000)*LIQKA
// LIQKA减小→止损线向上移(多头止损条件变宽松,更容易触发)
DLIQPOINT:=LOWAFTERENTRY - (OPEN*TRS/1000)*LIQKA;
END
// 空头持仓时,计算空头止损线KLIQPOINT
IF HOLDING<0 THEN BEGIN
// 公式:入场后最低最高价 + (开盘价*TRS/1000)*LIQKA
// LIQKA减小→止损线向下移(空头止损条件变宽松,更容易触发)
KLIQPOINT:=HIGHAFTERENTRY + (OPEN*TRS/1000)*LIQKA;
END
//------------------------------------------------------------------------------------------------
// 跟踪止损平仓逻辑
//------------------------------------------------------------------------------------------------
AA:=REF(DLIQPOINT,1); // 取前一根K线的多头止损线(用于当前K线判断)
BB:=REF(KLIQPOINT,1); // 取前一根K线的空头止损线(用于当前K线判断)
// 多头平仓条件:价格有效跌破多头止损线
// 条件:1.持有多单(HOLDING>0);2.入场后至少经历1根K线(ENTERBARS>0)
// 3.当前最低价≤前一根止损线(AA);4.前收盘价≥前止损线(确保是有效下破)
// 5.止损线有效(DLIQPOINT>0)
IF HOLDING > 0 AND ENTERBARS >0 AND L <= AA AND REF(C,1) >= REF(DLIQPOINT,1) AND DLIQPOINT>0 THEN BEGIN
// 以限价单平仓:价格取AA与开盘价的最小值(确保成交价格不高于止损线)
多损:sell(1,HOLDING,LIMITR,MIN(AA,OPEN));
END
// 空头平仓条件:价格有效突破空头止损线
// 条件:1.持有空单(HOLDING<0);2.入场后至少经历1根K线(ENTERBARS>0)
// 3.当前最高价≥前一根止损线(BB);4.前收盘价≤前止损线(确保是有效上破)
// 5.止损线有效(KLIQPOINT>0)
IF HOLDING < 0 AND ENTERBARS >0 AND H >= BB AND REF(C,1) <= REF(KLIQPOINT,1) AND KLIQPOINT>0 THEN BEGIN
// 以限价单平仓:价格取BB与开盘价的最大值(确保成交价格不低于止损线)
空损:SellSHORT(1,HOLDING,LIMITR,MAX(BB,OPEN));
END |
|