[PEL] 复制代码
//声明参数
INPUT : SCALE(0.01,0.01,0.02,0.005) ;//资金比例
//INPUT : POSNUM(1,1,20,1) ; //交易手数
//声明变量
POSNUM : =1; //交易手数,当ATR值无效时为默认值1
NT := 1 ; //调试信息带时间戳
BUYORDERTHISBAR := 0 ; //当前BAR有过交易
VARIABLE : _DEBUG = 1 ; //是否输出前台交易指令
VARIABLE : _TDEBUG = 1 ; //是否输出后台交易指令
VARIABLE : _DEBUGOUT = 0 ; //是否输出后台交易的调试信息
VARIABLE : MYENTRYPRICE =0 ; //开仓价格
VARIABLE : MYEXITPRICE =0 ; //平仓价格
VARIABLE : LO_lOSS_PRICE =0 ; //平多止损价格
VARIABLE : LO_lOSS_FLAG =0 ; //平多止损价格标记
VARIABLE : SHCLOPRICE =0 ; //平空止损价格
VARIABLE : SHCLOPRICE_FLAG =0 ; //平空止损价格标记
VARIABLE : TURTLEUNITS=0 ; //交易单位
VARIABLE : POSITION=0 ; //仓位状态,0表示没有仓位,1表示持有多头, -1表示持有空头
VARIABLE : FIRST_H =0; //开多最高点,全局变量
VARIABLE : FIRST_L =0; //开空最低点,全局变量
VARIABLE : FLAG_UP =0; //是否开多标志,0否,1是
VARIABLE : FLAG_DOWN =0; //是否开空标志,0否,1是
VARIABLE : IS_OPERATE =0; //是否进场,0否,1是
VARIABLE : CLOANDOPN =0; //先平后开标志
VARIABLE : N =0; //ATR全局变量,用来保存标记当天的ATR值
//准备需要计算的变量
TR1:=MAX(MAX((HIGH-LOW),ABS(REF(CLOSE,1)-HIGH)),ABS(REF(CLOSE,1)-LOW));
ATR:MA(TR1,21); //ATR
DF:(REF(CLOSE,1)-CLOSE)/REF(CLOSE,1)*100; //跌幅
//短期、长期指数平滑移动平均线间的差
DIFF: EMA(CLOSE,18) - EMA(CLOSE,39);
//DIFF的9日指数平滑移动平均线
DEA:= EMA(DIFF,13);
//使用COLORSTICK函数的作用是将指标线转换为柱状线显示。
MACD : 2*(DIFF-DEA),COLORSTICK;
ENTERDAY : enterbars+1;//上次开仓到当前的周期数
ALL_UP:=DIFF>REF(DIFF,1) AND MACD>REF(MACD,1);//开多条件.MACD向上,DIFF向上
LAST_ALL_UP:=REF(DIFF,1)>REF(DIFF,2) AND REF(MACD,1)>REF(MACD,2);//上一日.MACD向上,DIFF向上
ALL_DOWN:=DIFF<REF(DIFF,1) AND MACD<REF(MACD,1);//开空条件.MACD向下,DIFF向下
LAST_ALL_DOWN:=REF(DIFF,1)<REF(DIFF,2) AND REF(MACD,1)<REF(MACD,2);//上一日.MACD向下,DIFF向下
//如果当前是没有持仓的状态/
IF POSITION=0 THEN BEGIN
//记录第一次满足条件的最高和最低价位
IF ALL_UP THEN BEGIN
FLAG_DOWN :=0;
IF FLAG_UP =0 THEN BEGIN
FIRST_H :=H;
FLAG_UP :=1;
N := ATR ;
END
ELSE BEGIN
IS_OPERATE :=1;
END
END
IF ALL_DOWN THEN BEGIN
FLAG_UP :=0;
IF FLAG_DOWN =0 THEN BEGIN
FIRST_L :=L;
FLAG_DOWN :=-1;
N := ATR ;
END
ELSE BEGIN
IS_OPERATE :=1;
END
END
IF NOT(ALL_UP) AND NOT(ALL_DOWN) THEN BEGIN
IF
(H>FIRST_H+MINDIFF AND FLAG_UP)
OR
(L<FIRST_L-MINDIFF AND FLAG_DOWN)
THEN BEGIN
IS_OPERATE := 1;
END
ELSE BEGIN
FIRST_H :=0;
FIRST_L :=0;
FLAG_UP :=0;
FLAG_DOWN :=0;
N := 0;
END
END
//建立多头进场
IF FLAG_UP AND IS_OPERATE = 1 AND H>FIRST_H+MINDIFF THEN BEGIN
TRANPRICE := IF(OPEN>FIRST_H+MINDIFF ,OPEN ,FIRST_H+MINDIFF) ;
MYENTRYPRICE := FIRST_H+MINDIFF;
//根据资金比例来决定交易手数
IF VALID(N) THEN POSNUM : =FLOOR((ASSET*SCALE)/(1.2*N*MULTIPLIER));
BUY( _DEBUG,max(POSNUM,1),LIMITR,TRANPRICE),ignorecheckprice;
POSITION := 1 ; //持仓状态为1(多头)
TURTLEUNITS := 1 ; //交易单位为1
BUYORDERTHISBAR := 1;
CLOANDOPN : = 0;
//N := ATR ;
END
//建立空头进场
IF FLAG_DOWN AND IS_OPERATE = 1 AND L<FIRST_L-MINDIFF THEN BEGIN
TRANPRICE := IF(OPEN<FIRST_L-MINDIFF ,OPEN ,FIRST_L-MINDIFF);
MYENTRYPRICE :=FIRST_L-MINDIFF;
//根据资金比例来决定交易手数
IF VALID(N) THEN POSNUM : =FLOOR((ASSET*SCALE)/(1.2*N*MULTIPLIER));
BUYSHORT( _DEBUG,max(POSNUM,1),LIMITR,TRANPRICE),ignorecheckprice;
POSITION := -1 ;//持仓状态为-1(空头)
TURTLEUNITS := 1 ;
BUYORDERTHISBAR := 1;
//N := ATR ;
CLOANDOPN : = 0;
END
END
//先平后开状态
IF CLOANDOPN = 1 AND BUYORDERTHISBAR = 0 THEN BEGIN
//建立多头进场
IF FLAG_UP AND H>FIRST_H+MINDIFF THEN BEGIN
TRANPRICE := IF(OPEN>FIRST_H+MINDIFF ,OPEN ,FIRST_H+MINDIFF) ;
MYENTRYPRICE := FIRST_H+MINDIFF;
SELLSHORT( _DEBUG,0,LIMITR,TRANPRICE),ignorecheckprice; //先平再开
CLOANDOPN :=0;
//根据资金比例来决定交易手数
IF VALID(N) THEN POSNUM : =FLOOR((ASSET*SCALE)/(1.2*N*MULTIPLIER));
BUY( _DEBUG,max(POSNUM,1),LIMITR,TRANPRICE);
POSITION := 1 ; //持仓状态为1(多头)
TURTLEUNITS := 1 ; //交易单位为1
BUYORDERTHISBAR := 1;
//N := ATR ;
END
//建立空头进场
IF FLAG_DOWN AND L<FIRST_L-MINDIFF THEN BEGIN
TRANPRICE := IF(OPEN<FIRST_L-MINDIFF ,OPEN ,FIRST_L-MINDIFF);
MYENTRYPRICE :=FIRST_L-MINDIFF;
SELL( _DEBUG ,0,LIMITR,TRANPRICE); //先平再开
CLOANDOPN :=0;
//根据资金比例来决定交易手数
IF VALID(N) THEN POSNUM : =FLOOR((ASSET*SCALE)/(1.2*N*MULTIPLIER));
BUYSHORT( _DEBUG,max(POSNUM,1),LIMITR,TRANPRICE),ignorecheckprice;
POSITION := -1 ;//持仓状态为-1(空头)
TURTLEUNITS := 1 ;
BUYORDERTHISBAR := 1;
//N := ATR ;
END
END
//如果当前持有多头仓位的状态
IF POSITION=1 THEN BEGIN
//建立多头止损条件
IF NOT(LO_lOSS_FLAG) THEN BEGIN
//①价格跌到P-1.2*N
LO_lOSS_PRICE :=MYENTRYPRICE - 1.2*N;
//②价格涨幅达到P+N,止损价格P-0.2*N
IF HIGH>MYENTRYPRICE + N THEN BEGIN
LO_lOSS_PRICE :=MYENTRYPRICE - 0.2*N;
LO_lOSS_FLAG :=1;
LONGX1 := C < LO_lOSS_PRICE;
END
END
//满足①时用最低价<1.2N止损,满足②时用收盘价<0.2N止损,注意用最低价小于止损价会存在经过止损价时就平仓
LONGX2 := LOW < LO_lOSS_PRICE;
IF (LONGX1 OR LONGX2) AND POSITION=1 AND BUYORDERTHISBAR=0 THEN BEGIN
MYEXITPRICE := IF(OPEN<LO_lOSS_PRICE ,OPEN ,LO_lOSS_PRICE) ;
MYEXITPRICE := FLOOR(MYEXITPRICE/MINDIFF)*MINDIFF ;
SELL( _DEBUG ,0,LIMITR,MYEXITPRICE),ignorecheckprice;
POSITION := 0 ;
TURTLEUNITS := 0 ;
IS_OPERATE := 0;
//止损后如果满足开空条件,则要作为标记
FLAG_DOWN := IFELSE(ALL_DOWN,1,0);
FLAG_UP :=IFELSE(ALL_UP,1,0);;
FIRST_L := IFELSE(ALL_DOWN,L,0);
FIRST_H := IFELSE(ALL_UP,H,0);
N := IFELSE(ALL_UP OR ALL_DOWN,ATR,0);
LO_lOSS_PRICE :=0 ;
LO_lOSS_FLAG :=0;
SHCLOPRICE : =0 ;
SHCLOPRICE_FLAG :=0;
END
//③MACD↓ AND DIFF ↓ AND 跌幅大于0.9%
LONGX1 :=ALL_DOWN AND ABS(DF)>0.9;
IF LONGX1 AND POSITION=1 AND BUYORDERTHISBAR=0 THEN BEGIN
SELL( _DEBUG ,0,LIMITR,CLOSE),ignorecheckprice;
POSITION := 0 ;
TURTLEUNITS := 0 ;
FLAG_DOWN :=1;//当天也要作为标记
FLAG_UP :=0;
FIRST_L :=L;
N := ATR ;
IS_OPERATE := 0;
LO_lOSS_PRICE :=0 ;
LO_lOSS_FLAG :=0;
SHCLOPRICE : =0 ;
SHCLOPRICE_FLAG :=0;
END
dddd: ALL_DOWN;
//④MACD↓ AND DIFF ↓ AND 跌幅小于0.9%,第二天的最低点加一个最小单位平多并开空
IF ALL_DOWN AND ABS(DF)<0.9 AND POSITION=1 AND BUYORDERTHISBAR=0 THEN BEGIN
CLOANDOPN :=1; //一平一开标记
// POSITION := 0;
TURTLEUNITS := 0 ;
FLAG_DOWN :=1;//当天要作为标记
FLAG_UP :=0;
FIRST_L :=L;
N := ATR ;
LO_lOSS_PRICE :=0 ;
LO_lOSS_FLAG :=0;
SHCLOPRICE : =0 ;
SHCLOPRICE_FLAG :=0;
END
//④6个交易日后按P-0.2N止损(包含突破当天)
IF ENTERDAY>=6 AND C<MYENTRYPRICE-0.2*N AND POSITION=1 AND BUYORDERTHISBAR=0 THEN BEGIN
SELL( _DEBUG ,0,LIMITR,CLOSE),ignorecheckprice;
POSITION := 0 ;
TURTLEUNITS := 0 ;
IS_OPERATE := 0;
//止损后如果满足开空条件,则要作为标记
FLAG_DOWN := IFELSE(ALL_DOWN,1,0);
FLAG_UP :=IFELSE(ALL_UP,1,0);;
FIRST_L := IFELSE(ALL_DOWN,L,0);
FIRST_H := IFELSE(ALL_UP,H,0);
N := IFELSE(ALL_UP OR ALL_DOWN,ATR,0);
LO_lOSS_PRICE :=0 ;
LO_lOSS_FLAG :=0;
SHCLOPRICE : =0 ;
SHCLOPRICE_FLAG :=0;
END
END
//如果当前持有空头仓位的状态
IF POSITION=-1 THEN BEGIN
//建立空头止损条件
IF NOT(SHCLOPRICE_FLAG) THEN BEGIN
//①价格涨到P+1.2*N
SHCLOPRICE :=MYENTRYPRICE + 1.2*N;
//②价格跌幅达到P-N,止损价格为P+0.2*N
IF LOW<MYENTRYPRICE - N THEN BEGIN
SHORTX1 := C > MYENTRYPRICE + 0.2*N;
SHCLOPRICE :=MYENTRYPRICE + 0.2*N;
SHCLOPRICE_FLAG :=1;
END
END
//满足①时用最高价>1.2N止损,满足②时用收盘价>0.2N止损,注意用最高价大于止损价会存在经过止损价时就平仓
SHORTX2 := HIGH > SHCLOPRICE ;
IF (SHORTX1 OR SHORTX2) AND POSITION=-1 AND BUYORDERTHISBAR=0 THEN BEGIN
MYEXITPRICE := IF(OPEN>SHCLOPRICE ,OPEN ,SHCLOPRICE ) ;
MYEXITPRICE := FLOOR(MYEXITPRICE/MINDIFF)*MINDIFF ;
SELLSHORT( _DEBUG,0,LIMITR,MYEXITPRICE),ignorecheckprice;
POSITION := 0 ;
TURTLEUNITS := 0 ;
IS_OPERATE := 0;
//止损后如果满足开空条件,则要作为标记
FLAG_UP := IFELSE(ALL_UP,1,0);
FLAG_DOWN :=IFELSE(ALL_DOWN,1,0);
FIRST_H := IFELSE(ALL_UP,H,0);
FIRST_L := IFELSE(ALL_DOWN,L,0);
N := IFELSE(ALL_UP OR ALL_DOWN,ATR,0);
LO_lOSS_PRICE :=0 ;
LO_lOSS_FLAG :=0;
SHCLOPRICE : =0 ;
SHCLOPRICE_FLAG :=0;
END
//③MACD↑ AND DIFF ↑ AND 涨幅大于0.9%
SHORTX1 :=ALL_UP AND ABS(DF)>0.9;
IF SHORTX1 AND POSITION=-1 AND BUYORDERTHISBAR=0 THEN BEGIN
SELLSHORT( _DEBUG,0,LIMITR,CLOSE),ignorecheckprice;
POSITION := 0 ;
TURTLEUNITS := 0 ;
FLAG_UP :=1;//当天也要作为标记
FLAG_DOWN :=0;
FIRST_H :=H;
N := ATR ;
IS_OPERATE := 0;
LO_lOSS_PRICE :=0 ;
LO_lOSS_FLAG :=0;
SHCLOPRICE : =0 ;
SHCLOPRICE_FLAG :=0;
END
//③MACD↑ AND DIFF ↑ AND 涨幅小于0.9%,第二天的最高点加一个最小单位平空并开多
IF ALL_UP AND ABS(DF)<0.9 AND POSITION=-1 AND BUYORDERTHISBAR= 0 THEN BEGIN
CLOANDOPN := 1; //一平一开标记
// POSITION := 0 ; 不允许重置为0,为导致开多单
TURTLEUNITS := 0 ;
FLAG_UP :=1; //当天也要作为标记
FLAG_DOWN :=0;
FIRST_H :=H;
N := ATR ;
LO_lOSS_PRICE :=0 ;
LO_lOSS_FLAG :=0;
SHCLOPRICE : =0 ;
SHCLOPRICE_FLAG :=0;
END
//④6个交易日后按P+0.2N止损(包含突破当天)
IF ENTERDAY>=6 AND C>MYENTRYPRICE+0.2*N AND POSITION=-1 AND BUYORDERTHISBAR=0 THEN BEGIN
SELLSHORT( _DEBUG ,0,LIMITR,CLOSE),ignorecheckprice;
POSITION := 0 ;
TURTLEUNITS := 0 ;
IS_OPERATE := 0;
//止损后如果满足开空条件,则要作为标记
FLAG_UP := IFELSE(ALL_UP,1,0);
FLAG_DOWN :=IFELSE(ALL_DOWN,1,0);
FIRST_H := IFELSE(ALL_UP,H,0);
FIRST_L := IFELSE(ALL_DOWN,L,0);
N := IFELSE(ALL_UP OR ALL_DOWN,ATR,0);
LO_lOSS_PRICE :=0 ;
LO_lOSS_FLAG :=0;
SHCLOPRICE : =0 ;
SHCLOPRICE_FLAG :=0;
END
END
//显示账户状态
{CONTINUELINE@ 资产:ASSET,LINETHICK0;
可用现金:CASH(0),LINETHICK0;
POS:HOLDING,LINETHICK0;
交易次数:TOTALDAYTRADE, LINETHICK0 ;
当前持仓:HOLDING,COLORGRAY,LINETHICK0;
当前资产:ASSET,NOAXIS,COLORGRAY;}