以文本方式查看主题 - 金字塔客服中心 - 专业程序化交易软件提供商 (http://222.73.7.161/bbs/index.asp) -- 公式模型编写问题提交 (http://222.73.7.161/bbs/list.asp?boardid=4) ---- 股票编写 (http://222.73.7.161/bbs/dispbbs.asp?boardid=4&id=172157) |
-- 作者:13676927691 -- 发布时间:2019/9/23 13:13:24 -- 股票编写 软件自带的多头海龟交易系统在测试股票的时候出现不止盈的情况,请帮忙修改为跌破20日最低价止盈止损平仓,报单价格为20日的最低价。以下是系统自带的平仓源码 IF SELLSIGN=TRUE THEN BEGIN
EXITPOINT:=EXITBARS+1; IF EXITPOINT=ENTANDEXITSIGN THEN BEGIN {说明卖出成功} POSITIONCOUNT:=1;{头寸计算复原} SELLSIGN:=FALSE; END IF ENTERPRICE-2*N THEN SELL(L<=SELLLLV,100%,MARKET);{退出离盈利头寸} ELSE SELL(L<=ENTERPRICE-2*N,100%,MARKET);{退出亏损头寸} END |
-- 作者:wenarm -- 发布时间:2019/9/23 13:21:09 -- ENTERPRICE-2*N改为下面的条件。ref(llv(low,20),1)>low
IF ref(llv(low,20),1)>low THEN SELL(L<=SELLLLV,100%,LIMIT,low);{退出离盈利头寸} |
-- 作者:13676927691 -- 发布时间:2019/9/23 13:30:53 -- 您好, 语法错误,ref函数在逐k线模式下不能直接在if控制语句之内引用。
|
-- 作者:FireScript -- 发布时间:2019/9/23 13:32:24 -- 平仓代码: SELL(CROSS(c,ma(c,20)),100%,LIMIT,llv(c,20));//最新价下穿20日均线 平仓。 用这个平仓代码替换吧。 IF ENTERPRICE-2*N THEN SELL(L<=SELLLLV,100%,MARKET);{退出离盈利头寸} ELSE SELL(L<=ENTERPRICE-2*N,100%,MARKET);{退出亏损头寸} 或者你修改上面代码里面的参数N的大小来调整平仓条件试试。 |
-- 作者:FireScript -- 发布时间:2019/9/23 13:43:09 -- 笔误写成均线了,改下。 或者你直接用2楼的方式吧。稍作修改。 lp:ref(llv(low,20),1);//把这个定义放在最外层 IF lp>low THEN SELL(L<=SELLLLV,100%,LIMIT,low);{退出离盈利头寸}
ELSE SELL(lp>low,100%,,LIMIT,low);{退出亏损头寸} END [此贴子已经被作者于2019/9/23 13:54:55编辑过]
|
-- 作者:13676927691 -- 发布时间:2019/9/23 13:52:19 -- limit,交易系统函数的第三个参数必须为交易控制符。 |
-- 作者:FireScript -- 发布时间:2019/9/23 13:55:34 -- SELL(lp>low,100%,,LIMIT,low);{退出亏损头寸} |
-- 作者:13676927691 -- 发布时间:2019/9/23 14:00:39 -- 和之前一样不平仓, //该模型为简单示范模型,用户需根据自己交易经验,修改完善后再实际应用!!! //变量申明 VARIABLE:DAYCOUNT=1,POSITIONCOUNT=1,SELLSIGN=0;//定义常数变量DAYCOUNT并初始化为1,定义常数变量POSITIONCOUNT并初始化为1,定义常数变量SELLSIGN并初始化为0 VARIABLE:ENTANDEXITSIGN=1,ENTPOINT=0,EXITPOINT=0;//定义常数变量ENTANDEXITSIGN并初始化为1,定义常数变量ENTPOINT并初始化为0,定义常数变量EXITPOINT并初始化为0 VARIABLE:N=0;//定义常数变量N并初始化为0 M:=MA(TR,20); //真实波幅的20周期均值 BUYHHV:=HHV(H,20);//20日最高价 SELLLLV:=LLV(L,10);//10日最低价 lp:ref(llv(low,20),1); SS:N,LINETHICK0; //交易系统 IF BARPOS>=21 THEN BEGIN //如果从上市到现在的交易日天数大于等于21天,那么 IF BARPOS=21 THEN //如果从上市到现在的交易日天数等于21,那么 N:=M; //N=M IF DAYCOUNT=6 OR BARPOS=21 THEN BEGIN{5天调整N值} N:=(19*N+TR)/20;{计算N值} DAYCOUNT:=2; END DAYCOUNT:=DAYCOUNT+1; ENTPOINT:=ENTERBARS+1; IF ENTPOINT=ENTANDEXITSIGN THEN BEGIN{说明STOP指令买进头寸成功} POSITIONCOUNT:=POSITIONCOUNT+1;{头寸计数} SELLSIGN:=TRUE;{开始以STOP卖出,如果达到指定的价格} END IF POSITIONCOUNT=1 THEN BEGIN{第一头寸} HOW:=CASH(0)*0.01/N;{波动性百分比决定头寸规模} 开1:BUY(H>=BUYHHV,HOW,limitr ,BUYHHV),IGNORECHECKPRICE;{在20日新高STOP指令买进} END IF SELLSIGN=TRUE THEN BEGIN EXITPOINT:=EXITBARS+1; IF EXITPOINT=ENTANDEXITSIGN THEN BEGIN {说明卖出成功} POSITIONCOUNT:=1;{头寸计算复原} SELLSIGN:=FALSE; END IF lp>low THEN SELL(L<=SELLLLV,100%,LIMIT,low);{退出离盈利头寸} ELSE SELL(lp>low,100%,LIMIT,low);{退出亏损头寸} END END; 当前持仓:HOLDING,COLORGRAY,LINETHICK0; 当前资产:ASSET,NOAXIS,COLORGRAY; |
-- 作者:FireScript -- 发布时间:2019/9/23 14:11:57 -- 这个条件 满足了吗? SELLSIGN=TRUE 如果是外部的if语句都没有满足,里面的平仓代码都是无法触发到的。 你可以把平仓语句放在 IF SELLSIGN=TRUE THEN BEGIN 前面。只是这样的话,相当于这个平仓脱离了原先代码的逻辑之外了。但是也没办法。
|
-- 作者:13676927691 -- 发布时间:2019/9/23 14:22:25 -- 您能在股票上测试下,帮我修改下吗, |