以文本方式查看主题 - 金字塔客服中心 - 专业程序化交易软件提供商 (http://weistock.com/bbs/index.asp) -- 公式模型编写问题提交 (http://weistock.com/bbs/list.asp?boardid=4) ---- 只会做一边 (http://weistock.com/bbs/dispbbs.asp?boardid=4&id=89550) |
-- 作者:xiaosa2003 -- 发布时间:2016/1/7 17:37:49 -- 只会做一边 //声明参数 INPUT : T20(20,15,50,1) ; INPUT : T10(15,5,50,1); INPUT : x(1,1,5,0.1); //声明变量 NT := 1 ; //调试信息带时间戳 BUYORDERTHISBAR := 0 ; //当前BAR有过交易 VARIABLE : _DEBUG = 1 ; //是否输出前台交易指令 VARIABLE : _TDEBUG = 1 ; //是否输出后台交易指令 VARIABLE : _DEBUGOUT = 0 ; //是否输出后台交易的调试信息 VARIABLE : A:=0; //多头控制 VARIABLE :B:=0; //空头控制函数 VARIABLE : MYENTRYPRICE =0 ; //开仓价格 VARIABLE : MYEXITPRICE =0 ; //平仓价格 VARIABLE : TURTLEUNITS=0 ; //交易单位 VARIABLE : POSITION=0 ; //仓位状态 //0表示没有仓位,1表示持有多头, -1表示持有空头 VARIABLE : T20HI=CLOSE ; //20周期的高点 VARIABLE : T20LO=CLOSE ; //20周期的低点 VARIABLE : T10HI=CLOSE ; //10周期的高点 VARIABLE : T10LO=CLOSE ; //10周期的低点 VARIABLE : POSNUM=0 ; //仓位 VARIABLE: multi=1; VARIABLE: maxset=0; VARIABLE: minset=0; h1:callstock(stklabel,vthigh,6,-1); l1:callstock(stklabel,vtlow,6,-1); marginratio:=10/100;//保证金比例 //准备需要计算的变量 T20HI := REF(HHV(H,T20),1) ; T20LO := REF(LLV(L,T20),1) ; T10HI := REF(HHV(H,T10),1) ; T10LO := REF(LLV(L,T10),1) ; //开始执行时 初始化数据 IF BARPOS=1 THEN BEGIN maxset:=ASSET; minset:=asset; multi:=1; END //IF AVGTR := REF(MA(TR,ATRLEN),1) ; A:=ceiling(AVGTR*X)* MULTIPLIER ; //POSNUM:=if(FLOOR (ASSET*multi*0.02/A)=0,1,FLOOR (ASSET*multi*0.02/A));//仓位 //POSNUM:=min(FLOOR (ASSET/(C*multiplier*marginratio*4)),POSNUM);//仓位 if BARPOS<ATRLEN+5 then exit; WARNING_DISABLE:2; //POSNUM: if(FLOOR (ASSET*0.02/A)=0,1,FLOOR (ASSET*0.02/A)),noaxis;//仓位 //POSNUM:1,noaxis; if holding=0 then BEGIN
//最大资产
if asset>maxset then BEGIN
maxset:=asset;
minset:=asset;
multi:=1;
end POSNUM:=1; //开仓手数
//仓位 end //此处作为临时输出结果 {仓位:posnum,NOAXIS; 最大资金: maxset,NOAXIS; 当前资金: minset,NOAXIS; 比例: MULTI,NOAXIS;} //如果当前是没有持仓的状态 IF POSITION=0 AND BARPOS>T20 AND H>L THEN BEGIN //建立多头进场条件 LONG := h >h1 and time<=185000 and a=0; //多头进场 IF LONG THEN BEGIN MYENTRYPRICE := IF(OPEN>h1+MINDIFF ,OPEN ,h1+MINDIFF ) ; h>h1:BUY( _DEBUG,POSNUM,LIMITR,MYENTRYPRICE); POSITION := 1 ; TURTLEUNITS := 1 ; N := AVGTR ; BUYORDERTHISBAR := 1; a:=1; b:=0; END //IF if TYPE(1)=2 and time<=185000 and h>t20hi then begin MYENTRYPRICE := IF(OPEN>t20hi+MINDIFF ,OPEN ,t20hi+MINDIFF ) ; h>t20hi: BUY( _DEBUG,POSNUM,LIMITR,MYENTRYPRICE); POSITION := 1 ; TURTLEUNITS := 1 ; N := AVGTR ; BUYORDERTHISBAR := 1; a:=1; b:=0; end //建立空头进场条件 SHORT:=l<l1 and time<=185000 and b=0 ; //空头进场 IF SHORT THEN BEGIN MYENTRYPRICE := IF(OPEN<l1-MINDIFF ,OPEN ,l1-MINDIFF ) ; l<l1: BUYSHORT( _DEBUG,POSNUM,LIMITR,MYENTRYPRICE); POSITION := -1 ; TURTLEUNITS :=1 ; N := AVGTR ; BUYORDERTHISBAR := 1; a:=0; b:=1; END if type(1)=4 and time<=185000 and l<t20lo then begin MYENTRYPRICE := IF(OPEN<T20LO-MINDIFF ,OPEN ,T20LO-MINDIFF ) ; l<t20lo: BUYSHORT( _DEBUG,POSNUM,LIMITR,MYENTRYPRICE); POSITION := -1 ; TURTLEUNITS := 1 ; N := AVGTR ; BUYORDERTHISBAR := 1; a:=0; b:=1; END //不要跳转,让程序检查同一根K线是否可以加仓 //GOTO CONTINUELINE ; END //IF //如果当前持有多头仓位的状态 IF POSITION=1 AND BARPOS>T20 AND H>L THEN BEGIN //建立多头止损条件 LONGX2 := (LOW<=MYENTRYPRICE-ceiling(x*N)) ; PP:MYENTRYPRICE-ceiling(x*N); IF LONGX2 AND POSITION=1 AND BUYORDERTHISBAR=0 THEN BEGIN MYEXITPRICE := IF(OPEN<MYENTRYPRICE-ceiling(x*N) ,OPEN ,MYENTRYPRICE-ceiling(x*N) ) ; MYEXITPRICE := FLOOR(MYEXITPRICE/MINDIFF)*MINDIFF ; SELL( _DEBUG ,0,LIMITR,MYEXITPRICE); POSITION := 0 ; TURTLEUNITS := 0 ; BUYORDERTHISBAR := 1; a:=1; b:=0; END //建立多头离场条件 LONGX1 := (LOW < T10LO) ; IF LONGX1 AND BUYORDERTHISBAR=0 THEN BEGIN MYEXITPRICE := IF(OPEN<T10LO-MINDIFF ,OPEN ,T10LO-MINDIFF) ; SELL( _DEBUG ,0,LIMITR,MYEXITPRICE); POSITION := 0 ; TURTLEUNITS := 0 ; BUYORDERTHISBAR := 1; a:=1; b:=0; END if time>=185900 then begin 收盘平多:sell(1,0,LIMITR,c); POSITION := 0 ; TURTLEUNITS := 0 ; a:=1; b:=0; end GOTO CONTINUELINE ; END //IF //如果当前持有空头仓位的状态 IF POSITION = -1 AND BARPOS>T20 THEN BEGIN //建立空头止损条件 SHORTX2 := HIGH >= MYENTRYPRICE +ceiling(x*N) ; pp1: MYENTRYPRICE +ceiling(x*N); IF SHORTX2 AND POSITION = -1 AND BUYORDERTHISBAR=0 THEN BEGIN MYEXITPRICE := IF(OPEN>MYENTRYPRICE+ceiling(x*N) ,OPEN ,MYENTRYPRICE+ceiling(x*N) ) ; MYEXITPRICE := CEILING(MYEXITPRICE/MINDIFF)*MINDIFF ; SELLSHORT( _DEBUG,0,LIMITR,MYEXITPRICE); POSITION := 0 ; TURTLEUNITS := 0 ; BUYORDERTHISBAR := 1; a:=0; b:=1; END //建立空头离场条件 SHORTX1 := H > T10HI ; IF SHORTX1 AND BUYORDERTHISBAR=0 THEN BEGIN MYEXITPRICE := IF(OPEN>T10HI+MINDIFF ,OPEN ,T10HI+MINDIFF) ; SELLSHORT( _DEBUG,0,LIMITR,MYEXITPRICE); POSITION := 0 ; TURTLEUNITS := 0 ; BUYORDERTHISBAR := 1; a:=0; b:=1; END if time>=185900 then begin 收盘平空:sellshort(1,0,LIMITR,c); POSITION := 0 ; TURTLEUNITS := 0 ; a:=0; b:=1; end END //IF //显示账户状态 CONTINUELINE@ 资产:ASSET,NODRAW; 可用现金:CASH(0),NODRAW; POS:HOLDING,NODRAW; 交易次数:TOTALDAYTRADE,NODRAW ;
|
-- 作者:xiaosa2003 -- 发布时间:2016/1/7 17:39:01 -- 问题:如果第一笔交易是做空,那么就一直是做空,如果第一笔是做多,那么后面就一直做多。 怎么修改,想不通了。测试的是白糖5分钟周期,2014/1/1到现在
[此贴子已经被作者于2016/1/7 17:39:38编辑过]
|
-- 作者:xiaosa2003 -- 发布时间:2016/1/7 17:45:02 -- INPUT : ATRLEN(20,1,50,1); |
-- 作者:netfox -- 发布时间:2016/1/7 20:06:51 -- 以下是引用xiaosa2003在2016/1/7 17:39:01的发言:
问题:如果第一笔交易是做空,那么就一直是做空,如果第一笔是做多,那么后面就一直做多。 怎么修改,想不通了。测试的是白糖5分钟周期,2014/1/1到现在
[此贴子已经被作者于2016/1/7 17:39:38编辑过]
做个计数器 第一笔交易完成后 I:=1; 后面开仓时候确定I=1 则可以开多
相反空头第一笔就是 I:=-1 后续第二笔时候检测。
具体在开盘时候赋值=0 ,然后等交易一次后你就得到了。 多头应该是 IF I=0 OR I=1 then ... 空头用 IF I=0 OR I=-1 then |
-- 作者:xiaosa2003 -- 发布时间:2016/1/7 20:48:06 -- 不好意思,我说得不清,现在的情况就是一直只做一个方向,我是想两个方向都做的。所以用了A和B来分别控制多空,但不行,现在只会做空 [此贴子已经被作者于2016/1/7 20:49:21编辑过]
|
-- 作者:netfox -- 发布时间:2016/1/7 21:02:59 -- 以下是引用xiaosa2003在2016/1/7 20:48:06的发言:
不好意思,我说得不清,现在的情况就是一直只做一个方向,我是想两个方向都做的。所以用了A和B来分别控制多空,但不行,现在只会做空 [此贴子已经被作者于2016/1/7 20:49:21编辑过]
这个是海龟吧, 海龟就是那种趋势确立直接加仓加仓加仓到顶做法。 所以你仓位是多时候,肯定不会出现做空,因此你只会加仓做多,一直到平仓。 小级别做是要把程序拆开来的。 |
-- 作者:xiaosa2003 -- 发布时间:2016/1/7 22:51:22 -- 不是的,这个只是用了海龟的唐迁通道,没有加仓,是日内策略。测试从14年1月1日到现在,两年时间,都只交易一个方向,肯定是编写的问题了 |
-- 作者:jinzhe -- 发布时间:2016/1/8 8:48:10 -- atrlen值是多少? |