以文本方式查看主题

-  金字塔客服中心 - 专业程序化交易软件提供商  (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);{退出离盈利头寸}
    ELSE
    SELL(ref(llv(low,20),1)>low,100%,,LIMIT,low);{退出亏损头寸}
    END


--  作者: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
--  
您能在股票上测试下,帮我修改下吗,