以文本方式查看主题

-  金字塔客服中心 - 专业程序化交易软件提供商  (http://weistock.com/bbs/index.asp)
--  金字塔软件问题提交  (http://weistock.com/bbs/list.asp?boardid=2)
----  双向海龟的源码可否调整一下  (http://weistock.com/bbs/dispbbs.asp?boardid=2&id=157227)

--  作者:代人发贴
--  发布时间:2017/8/24 9:36:34
--  双向海龟的源码可否调整一下
 1、在标准版里有个自动交易信号,双向海龟的源码都是软件自带 
可否调整一下,就是买卖开仓,还有平仓,都是限价单,造成很多都是在未成交委托挂单,但不能成交,能否修改成,发出信号后市价成交?

2、能否在这个系统里加一条,就是总资金权益大于或小于,某个数值时,实行清仓,15:00收盘前不再开新仓


--  作者:gxx978
--  发布时间:2017/8/24 10:14:19
--  

1、可以直接把limitr限价指令改成market市价指令。

2、variable:a=0;

    if ISLASTBAR and TACCOUNT(6)<某个数值 then
      begin
      sell(1,0,MARKET);
      sellshort(1,0,MARKET);
     a:1;
     end

  if time>190000 then a:=0;

 

在开仓条件中加入a=0作为条件。

 


--  作者:tradersniper
--  发布时间:2017/8/24 10:37:16
--  

//该模型为简单示范模型,用户需根据自己交易经验,修改完善后再实际应用!!!
//《定制的海龟交易系统V1.0图表版本》 
// 适用于多时间框架图表
// 这个版本可以用于在图表上显示信号,也可以做自动交易
// 同一根K线多次发出指令。
// DESIGNED BY LIKAI
// 2010.07.16

//声明参数
INPUT : T20(20,15,60,1) ;
INPUT : T10(10,10,30,1);
INPUT : ATRLEN(20,15,30,1) ;
INPUT : POSNUM(1,1,20,1) ;

//声明变量
NT := 1 ;     //调试信息带时间戳
BUYORDERTHISBAR := 0 ;  //当前BAR有过交易

VARIABLE : _DEBUG = 1 ;     //是否输出前台交易指令
VARIABLE : _TDEBUG = 1 ;    //是否输出后台交易指令
VARIABLE : _DEBUGOUT = 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周期的低点

//准备需要计算的变量
T20HI := REF(HHV(H,T20),1) ;
T20LO := REF(LLV(L,T20),1) ;

T10HI := REF(HHV(H,T10),1) ;
T10LO := REF(LLV(L,T10),1) ;

AVGTR :=  REF(MA(TR,ATRLEN),1) ;

//开始执行时 初始化数据
IF BARPOS=1 THEN BEGIN
 //POSITION := 0 ;

END //IF

//如果当前是没有持仓的状态
IF POSITION=0 AND BARPOS>T20 AND H>L THEN BEGIN

 //建立多头进场条件
 LONG := H > T20HI ;
 
 //多头进场
 IF LONG THEN BEGIN
  MYENTRYPRICE := IF(OPEN>T20HI+MINDIFF ,OPEN ,T20HI+MINDIFF ) ;   
  BUY( _DEBUG,POSNUM,market,MYENTRYPRICE);
  POSITION := 1 ;
  TURTLEUNITS := 1 ;
  N := AVGTR ;
  BUYORDERTHISBAR := 1;

 END //IF


 //建立空头进场条件
 SHORT := L < T20LO ;
 
 //空头进场
 IF SHORT AND POSITION=0 THEN BEGIN   
  MYENTRYPRICE := IF(OPEN<T20LO-MINDIFF ,OPEN ,T20LO-MINDIFF ) ;   
  BUYSHORT( _DEBUG,POSNUM,market,MYENTRYPRICE);
  POSITION := -1 ;
  TURTLEUNITS := 1 ;
  N := AVGTR ;
  BUYORDERTHISBAR := 1;

 END
 
 //不要跳转,让程序检查同一根K线是否可以加仓
 //GOTO CONTINUELINE ;
 
END  //IF


//如果当前持有多头仓位的状态

IF POSITION=1 AND BARPOS>T20 AND H>L THEN BEGIN

 //多头加仓条件
 
 WHILE (HIGH>MYENTRYPRICE+0.5*N) AND TURTLEUNITS<4 DO BEGIN
  MYENTRYPRICE := IF(OPEN>MYENTRYPRICE+0.5*N ,OPEN ,MYENTRYPRICE+0.5*N ) ;
  MYENTRYPRICE := CEILING(MYENTRYPRICE/MINDIFF)*MINDIFF ; 
  BUY( _DEBUG, POSNUM, market, MYENTRYPRICE);
  TURTLEUNITS := TURTLEUNITS+1 ;
  BUYORDERTHISBAR := 1;

 END //WHILE 
 
 //建立多头离场条件
 LONGX1 := (LOW < T10LO)  ;
 
 IF LONGX1 AND BUYORDERTHISBAR=0 THEN BEGIN
  MYEXITPRICE := IF(OPEN<T10LO-MINDIFF ,OPEN ,T10LO-MINDIFF ) ;   
  SELL( _DEBUG ,0,market,MYEXITPRICE);
  POSITION := 0 ;
  TURTLEUNITS := 0 ;
 END

 //建立多头止损条件
 LONGX2 := (LOW<MYENTRYPRICE-2*N)  ;

 IF LONGX2 AND POSITION=1 AND BUYORDERTHISBAR=0 THEN BEGIN
  MYEXITPRICE := IF(OPEN<MYENTRYPRICE-2*N ,OPEN ,MYENTRYPRICE-2*N ) ;  
  MYEXITPRICE := FLOOR(MYEXITPRICE/MINDIFF)*MINDIFF ; 
  SELL( _DEBUG ,0,market,MYEXITPRICE);
  POSITION := 0 ;
  TURTLEUNITS := 0 ;
 END

 GOTO CONTINUELINE ;

END  //IF


//如果当前持有空头仓位的状态

IF POSITION = -1 AND BARPOS>T20 AND H>L THEN BEGIN

 //空头加仓条件
 
 WHILE (LOW<MYENTRYPRICE-0.5*N) AND TURTLEUNITS<4 DO BEGIN
  MYENTRYPRICE := IF(OPEN<MYENTRYPRICE-0.5*N ,OPEN ,MYENTRYPRICE-0.5*N ) ;   
  MYENTRYPRICE := FLOOR(MYENTRYPRICE/MINDIFF)*MINDIFF ; 
  BUYSHORT( _DEBUG,POSNUM, market, MYENTRYPRICE);
  TURTLEUNITS := TURTLEUNITS+1 ;
  BUYORDERTHISBAR := 1;
 END //IF 


 //建立空头离场条件
 SHORTX1 := H > T10HI  ;

 IF SHORTX1 AND BUYORDERTHISBAR=0 THEN BEGIN
  MYEXITPRICE := IF(OPEN>T10HI+MINDIFF ,OPEN ,T10HI+MINDIFF ) ;   
  SELLSHORT( _DEBUG,0,market,MYEXITPRICE);
  POSITION := 0 ;
  TURTLEUNITS := 0 ;
 END

 //建立空头止损条件
 SHORTX2 := HIGH > MYENTRYPRICE + 2*N  ;

 IF SHORTX2 AND POSITION = -1 AND BUYORDERTHISBAR=0  THEN BEGIN
  MYEXITPRICE := IF(OPEN>MYENTRYPRICE+2*N ,OPEN ,MYENTRYPRICE+2*N ) ;   
  MYEXITPRICE := CEILING(MYEXITPRICE/MINDIFF)*MINDIFF ; 
  SELLSHORT( _DEBUG,0,market,MYEXITPRICE);
  POSITION := 0 ;
  TURTLEUNITS := 0 ;
 END

END  //IF


//显示账户状态
CONTINUELINE@ 资产:ASSET,LINETHICK0;
可用现金:CASH(0),LINETHICK0;
POS:HOLDING,LINETHICK0;
交易次数:TOTALDAYTRADE, LINETHICK0 ;

IF _DEBUGOUT>0 THEN BEGIN

 DEBUGFILE2(\'C:\\DEBUGFILE.TXT\',\'BARPOS=%.0F\' ,BARPOS,NT ) ;
 DEBUGFILE2(\'C:\\DEBUGFILE.TXT\',\'T20HI=%.2F\' ,T20HI ,NT) ;
 DEBUGFILE2(\'C:\\DEBUGFILE.TXT\',\'N=%.2F\' ,N ,NT) ;
 DEBUGFILE2(\'C:\\DEBUGFILE.TXT\',\'CLOSE=%.2F\' ,C ,NT) ;
 DEBUGFILE2(\'C:\\DEBUGFILE.TXT\',\'POSITION=%.0F\' ,POSITION,NT ) ;
 DEBUGFILE2(\'C:\\DEBUGFILE.TXT\',\'TURTLEUNITS=%.0F\' ,TURTLEUNITS,NT ) ;
 DEBUGFILE2(\'C:\\DEBUGFILE.TXT\',\'MYENTRYPRICE=%.0F\' ,MYENTRYPRICE ,NT) ;
 DEBUGFILE2(\'C:\\DEBUGFILE.TXT\',\'MYEXITPRICE=%.0F\' ,MYEXITPRICE ,NT) ;
 
END //IF

当前持仓:HOLDING,COLORGRAY,LINETHICK0;
当前资产:ASSET,NOAXIS,COLORGRAY;

 

-----------------------------------------------------------------------------

variable:a=10000000;

    if ISLASTBAR and TACCOUNT(6)<980000 then
      begin
      sell(1,0,MARKET);
      sellshort(1,0,MARKET);
     a:1;
     end

  if time>145500 then a:=0;

--------------------------------------------------------

你好:

1,我把系统信号中limitr限价指令改成market。测试也正常,就是以上代码,你看下是否正确。

 

2.你后面给的那段代码是放在什么位置?

如果是以100万资金权益为列,当动态权益大于1020000万时清仓,当动态权益小于980000万时清仓,且在下午收盘14:55分前不再开仓,

以这个实例,代码怎么修改,可作为范例来应用,然后这段代码是放在哪个语句里。

能完整的把代码组织好?谢谢!

 


--  作者:gxx978
--  发布时间:2017/8/24 11:06:12
--  

1、market为市价指令,不需要指定价格。另外你代码中计算限价的语句就没必要用了。例如:BUY( _DEBUG,POSNUM,market,MYENTRYPRICE);修改为BUY( _DEBUG,POSNUM,market);

2、动态权益小于980000清仓可以用系统自带的风控设置,在交易--下单设置--止盈止损中(如下图)。用taccount会引起历史上的信号变化,在图表中不建议用,这里修正下。在14:55分不再开仓直接用time函数控制就可以。在开仓条件中加入time<185500作为条件。(以金字塔时间为例)。


图片点击可在新窗口打开查看此主题相关图片如下:qq截图20170824110211.png
图片点击可在新窗口打开查看
[此贴子已经被作者于2017/8/24 11:06:33编辑过]

--  作者:tradersniper
--  发布时间:2017/8/24 11:17:02
--  

问题还是没解决呢!

那大于动态权益的怎么设置?

能完整的在上述代码中修改下贴出来?

 


--  作者:wenarm
--  发布时间:2017/8/24 13:45:14
--  

大于这个没法设置,另外动态权益一把都是作为风控使用的,你这个需求,仓位中有加仓等操作,如果仓位开仓数量达到一定值时,就会造成可用资金减少,造成动态权益低于预设值。

动态权益这类的控制建议你在后台上处理,在图表上回造成历史信号闪烁。影响图表历史仓位的计算。

下面给你的方式,是通过图表的虚拟资金进行计算的动态权益。并不是实际账户中的动态权益。

 

 

 

//该模型为简单示范模型,用户需根据自己交易经验,修改完善后再实际应用!!!
//《定制的海龟交易系统V1.0图表版本》
// 适用于多时间框架图表
// 这个版本可以用于在图表上显示信号,也可以做自动交易
// 同一根K线多次发出指令。
// DESIGNED BY LIKAI
// 2010.07.16

//声明参数
INPUT : T20(20,15,60,1) ;
INPUT : T10(10,10,30,1);
INPUT : ATRLEN(20,15,30,1) ;
INPUT : POSNUM(1,1,20,1) ;

//声明变量
NT := 1 ;     //调试信息带时间戳
BUYORDERTHISBAR := 0 ;  //当前BAR有过交易

VARIABLE : _DEBUG = 1 ;     //是否输出前台交易指令
VARIABLE : _TDEBUG = 1 ;    //是否输出后台交易指令
VARIABLE : _DEBUGOUT = 0 ;    //是否输出后台交易的调试信息

VARIABLE : MYENTRYPRICE =0 ;   //开仓价格
VARIABLE : MYEXITPRICE =0 ;   //平仓价格

VARIABLE : TURTLEUNITS=0 ;   //交易单位
VARIABLE : POSITION=0 ;   //仓位状态
//0表示没有仓位,1表示持有多头, -1表示持有空头
VARIABLE : flag=0 ;   //开仓开关

VARIABLE : T20HI=CLOSE ;   //20周期的高点
VARIABLE : T20LO=CLOSE ;   //20周期的低点

VARIABLE : T10HI=CLOSE ;   //10周期的高点
VARIABLE : T10LO=CLOSE ;   //10周期的低点

//准备需要计算的变量
T20HI := REF(HHV(H,T20),1) ;
T20LO := REF(LLV(L,T20),1) ;

T10HI := REF(HHV(H,T10),1) ;
T10LO := REF(LLV(L,T10),1) ;

AVGTR :=  REF(MA(TR,ATRLEN),1) ;

//开始执行时 初始化数据
IF BARPOS=1 THEN BEGIN
 //POSITION := 0 ;

END //IF
if TODAYBAR=1 then flag:=0;
//如果当前是没有持仓的状态
IF POSITION=0 AND BARPOS>T20 AND H>L THEN BEGIN

 //建立多头进场条件
 LONG := H > T20HI and time<=185500 and flag=0 ;
 
 //多头进场
 IF LONG THEN BEGIN
  MYENTRYPRICE := IF(OPEN>T20HI+MINDIFF ,OPEN ,T20HI+MINDIFF ) ;  
  BUY( _DEBUG,POSNUM,market);
  POSITION := 1 ;
  TURTLEUNITS := 1 ;
  N := AVGTR ;
  BUYORDERTHISBAR := 1;

 END //IF


 //建立空头进场条件
 SHORT := L < T20LO  and time<=185500 and flag=0 ;
 
 //空头进场
 IF SHORT AND POSITION=0 THEN BEGIN  
  MYENTRYPRICE := IF(OPEN<T20LO-MINDIFF ,OPEN ,T20LO-MINDIFF ) ;  
  BUYSHORT( _DEBUG,POSNUM,market);
  POSITION := -1 ;
  TURTLEUNITS := 1 ;
  N := AVGTR ;
  BUYORDERTHISBAR := 1;

 END
 
 //不要跳转,让程序检查同一根K线是否可以加仓
 //GOTO CONTINUELINE ;
 
END  //IF


//如果当前持有多头仓位的状态

IF POSITION=1 AND BARPOS>T20 AND H>L  and time<=185500 and flag=0 THEN BEGIN

 //多头加仓条件
 
 WHILE (HIGH>MYENTRYPRICE+0.5*N) AND TURTLEUNITS<4 DO BEGIN
  MYENTRYPRICE := IF(OPEN>MYENTRYPRICE+0.5*N ,OPEN ,MYENTRYPRICE+0.5*N ) ;
  MYENTRYPRICE := CEILING(MYENTRYPRICE/MINDIFF)*MINDIFF ;
  BUY( _DEBUG, POSNUM, market);
  TURTLEUNITS := TURTLEUNITS+1 ;
  BUYORDERTHISBAR := 1;

 END //WHILE
 
 //建立多头离场条件
 LONGX1 := (LOW < T10LO)  ;
 
 IF LONGX1 AND BUYORDERTHISBAR=0 THEN BEGIN
  MYEXITPRICE := IF(OPEN<T10LO-MINDIFF ,OPEN ,T10LO-MINDIFF ) ;  
  SELL( _DEBUG ,0,market);
  POSITION := 0 ;
  TURTLEUNITS := 0 ;
 END

 //建立多头止损条件
 LONGX2 := (LOW<MYENTRYPRICE-2*N)  ;

 IF LONGX2 AND POSITION=1 AND BUYORDERTHISBAR=0 THEN BEGIN
  MYEXITPRICE := IF(OPEN<MYENTRYPRICE-2*N ,OPEN ,MYENTRYPRICE-2*N ) ; 
  MYEXITPRICE := FLOOR(MYEXITPRICE/MINDIFF)*MINDIFF ;
  SELL( _DEBUG ,0,market);
  POSITION := 0 ;
  TURTLEUNITS := 0 ;
 END

 GOTO CONTINUELINE ;

END  //IF


//如果当前持有空头仓位的状态

IF POSITION = -1 AND BARPOS>T20 AND H>L   and time<=185500  and flag=0 THEN BEGIN

 //空头加仓条件
 
 WHILE (LOW<MYENTRYPRICE-0.5*N) AND TURTLEUNITS<4 DO BEGIN
  MYENTRYPRICE := IF(OPEN<MYENTRYPRICE-0.5*N ,OPEN ,MYENTRYPRICE-0.5*N ) ;  
  MYENTRYPRICE := FLOOR(MYENTRYPRICE/MINDIFF)*MINDIFF ;
  BUYSHORT( _DEBUG,POSNUM, market);
  TURTLEUNITS := TURTLEUNITS+1 ;
  BUYORDERTHISBAR := 1;
 END //IF


 //建立空头离场条件
 SHORTX1 := H > T10HI  ;

 IF SHORTX1 AND BUYORDERTHISBAR=0 THEN BEGIN
  MYEXITPRICE := IF(OPEN>T10HI+MINDIFF ,OPEN ,T10HI+MINDIFF ) ;  
  SELLSHORT( _DEBUG,0,market);
  POSITION := 0 ;
  TURTLEUNITS := 0 ;
 END

 //建立空头止损条件
 SHORTX2 := HIGH > MYENTRYPRICE + 2*N  ;

 IF SHORTX2 AND POSITION = -1 AND BUYORDERTHISBAR=0  THEN BEGIN
  MYEXITPRICE := IF(OPEN>MYENTRYPRICE+2*N ,OPEN ,MYENTRYPRICE+2*N ) ;  
  MYEXITPRICE := CEILING(MYEXITPRICE/MINDIFF)*MINDIFF ;
  SELLSHORT( _DEBUG,0,market);
  POSITION := 0 ;
  TURTLEUNITS := 0 ;
 END

END  //IF


//图表动态权益的计算
tubiao_quanyi:CASH(0)+OPENPROFIT;
if tubiao_quanyi >1020000 or tubiao_quanyi<980000 then begin
 动态权益平多:sell(1,holding,MARKET);
 动态权益平空:sellshort(1,holding,MARKET);
 flag:=1;
end
//


//后台函数处理方法,操作的是实际账户资金仓位控制
//  if ISLASTBAR and (TACCOUNT(6)>1020000 or TACCOUNT(6)<980000) then
//      begin
//      sell(1,0,MARKET);
//      sellshort(1,0,MARKET);
//     flag:=1;
//     end
//

 

//显示账户状态
CONTINUELINE@ 资产:ASSET,LINETHICK0;
可用现金:CASH(0),LINETHICK0;
POS:HOLDING,LINETHICK0;
交易次数:TOTALDAYTRADE, LINETHICK0 ;

IF _DEBUGOUT>0 THEN BEGIN

 DEBUGFILE2(\'C:\\DEBUGFILE.TXT\',\'BARPOS=%.0F\' ,BARPOS,NT ) ;
 DEBUGFILE2(\'C:\\DEBUGFILE.TXT\',\'T20HI=%.2F\' ,T20HI ,NT) ;
 DEBUGFILE2(\'C:\\DEBUGFILE.TXT\',\'N=%.2F\' ,N ,NT) ;
 DEBUGFILE2(\'C:\\DEBUGFILE.TXT\',\'CLOSE=%.2F\' ,C ,NT) ;
 DEBUGFILE2(\'C:\\DEBUGFILE.TXT\',\'POSITION=%.0F\' ,POSITION,NT ) ;
 DEBUGFILE2(\'C:\\DEBUGFILE.TXT\',\'TURTLEUNITS=%.0F\' ,TURTLEUNITS,NT ) ;
 DEBUGFILE2(\'C:\\DEBUGFILE.TXT\',\'MYENTRYPRICE=%.0F\' ,MYENTRYPRICE ,NT) ;
 DEBUGFILE2(\'C:\\DEBUGFILE.TXT\',\'MYEXITPRICE=%.0F\' ,MYEXITPRICE ,NT) ;
 
END //IF

当前持仓:HOLDING,COLORGRAY,LINETHICK0;
当前资产:ASSET,NOAXIS,COLORGRAY;

 

[此贴子已经被作者于2017/8/24 14:05:57编辑过]

--  作者:tradersniper
--  发布时间:2017/8/24 22:51:21
--  

我指把原来的limitr限价指令改成market市价指令。

可今晚交易的DCE大连交易所品种提示:

 已撤单报单被拒绝DCE:不被支持的报单类型 量:1


--  作者:wenarm
--  发布时间:2017/8/25 8:29:17
--  
提供你的下单日志
交易---下单设置---程序化交易里 之前勾选下单日志的会有记录, 日志在金字塔安装目录的weisoftstock/ setting / orderlog中

--  作者:tradersniper
--  发布时间:2017/8/25 10:04:46
--  

哪里没有勾选,没有日子记录。

今早郑州的也出现这类情况,截图委托记录

图片点击可在新窗口打开查看
 
图片点击可在新窗口打开查看

--  作者:gxx978
--  发布时间:2017/8/25 10:12:12
--  

参考8楼,先勾选日志,再出现问题,将日志中的记录上传至论坛。论坛贴图使用IE浏览器,贴图教程如下:http://www.weistock.com/bbs/dispbbs.asp?BoardID=2&ID=31614&skin=0