优化版海龟策略

//周期:30分钟
//品种参数参考文件内EXCEL文档
//策略思想:去掉原版海龟的加仓模块和止损模块,因为会降低性能。
		  增加趋势判断和过滤的模块,将原有长周期突破开仓调整为出场条件参数调节的模块。
//------------------------------------------------------------------------
Params
	//默认螺纹参数
	Numeric XX(0.4);					// 收敛系数
	Numeric boLength(25);					// 短周期 BreakOut Length
	Numeric fsLength(65);					// 长周期 FailSafe Length
	Numeric TRS(15);						//移动幅度
	Numeric Lots(1);					//投入保证金手数
Vars

	Numeric TurtleUnits;					// 交易单位
	Series<Numeric> DonchianHi;				// 唐奇安通道上轨,延后1个Bar
	Series<Numeric> DonchianLo;				// 唐奇安通道下轨,延后1个Bar
	Series<Numeric> fsDonchianHi;			// 唐奇安通道上轨,延后1个Bar,长周期
	Series<Numeric> fsDonchianLo;			// 唐奇安通道下轨,延后1个Bar,长周期
	Series<Bool> SendOrderThisBar(False);			// 是否开仓交易
	Series<Numeric> Myprice2;
	Series<Numeric> Myprice3;
	Series<Numeric> liQKA;
	Series<Numeric> DliqPoint;
	Series<Numeric> KliqPoint;
	Series<Numeric> HighAfterEntry;
	Series<Numeric> LowAfterEntry;
	Series<Numeric> barcoutN;
	Series<Numeric> out_range;
	Series<Bool> Dcond_outTrs;
	Series<Bool> Kcond_outTrs;
	Series<Numeric> HL;
	Series<Numeric> HLAverage;
	Series<Numeric> X;
	Series<Numeric> sumAG;
	Bool condRHL;
	Series<Bool> A_condD;
	Series<Bool> A_condK;
	Series<Bool> condRHLAverage;
	Series<Numeric> RHLAverage;
Events
	OnBar(ArrayRef<Integer> indexs)
	{
    	
		If(BarStatus == 0)
		{
			out_range=TRS;
		}
		//记录开仓后高低点
    	If(BarsSinceentry == 0)
    	{
    		HighAfterEntry = High;
    		LowAfterEntry = Low;
    	}else
    	{
    		HighAfterEntry = Min(HighAfterEntry,High); // 空头止损,更新最低的最高价
    		LowAfterEntry = Max(LowAfterEntry,Low);    // 多头止损,更新最高的最低价
    	}
		TurtleUnits = IntPart(Lots); // 对小数取整
		DonchianHi = HighestFC(C[1],boLength);
		DonchianLo = LowestFC(C[1],boLength);
		fsDonchianHi = HighestFC(C[1],fsLength);
		fsDonchianLo = LowestFC(C[1],fsLength);
		
		HL=(DonchianHi+DonchianHi)/2;
    	condRHL=HL<>HL[1];
    	If(condRHL)
    	{
    		X=X+1;
    		sumAG=sumAG+HL[1];
    		If(X>2)
    		{
    			HLAverage=sumAG/X;
    			sumAG=0;
    			X=0;
    		}
    	}
		condRHLAverage=HLAverage[1]<>HLAverage;
		if(condRHLAverage)
		{
			RHLAverage=HLAverage[1];
		}
		
       	A_condD=HLAverage>RHLAverage and RHLAverage>0 and HLAverage>0;
    	A_condK=HLAverage<RHLAverage and RHLAverage>0 and HLAverage>0;
    	
    	PlotNumeric("HLAverage",HLAverage);
    	PlotNumeric("RHLAverage",RHLAverage);
		Commentary("SendOrderThisBar="+IIFString(SendOrderThisBar,"True","False"));
		PlotNumeric("DonchianHi",DonchianHi);
		PlotNumeric("DonchianLo",DonchianLo);
		PlotNumeric("fsDonchianHi",fsDonchianHi);
		PlotNumeric("fsDonchianLo",fsDonchianLo);
		Commentary("TurtleUnits"+text(TurtleUnits));
		
		If(MarketPosition == 0) 
		{
			// 突破开仓
			If(C[1] > DonchianHi[1] && TurtleUnits >= 1 and A_condD)
			{
				Buy(TurtleUnits,open);
				SendOrderThisBar = True;
				out_range=TRS;
				LowAfterEntry = EntryPrice;//保存多头开仓价格;

			}
			If(C[1]  < DonchianLo[1] && TurtleUnits >= 1 and A_condK)
			{
				SellShort(TurtleUnits,open);
				SendOrderThisBar = True;
				out_range=TRS;
				HighAfterEntry = EntryPrice;//保存空头开仓价格;
			}
		}
		// 长周期突破调节出场参数,变化幅度收敛,保住更多利润
		If(MarketPosition <> 0)
		{
			Dcond_outTrs=CrossOver(C[1],fsDonchianHi[1]);
			Commentary("fsDonchianHi="+Text(fsDonchianHi));
			If(Dcond_outTrs and SendOrderThisBar==True)
			{
				out_range=TRS*XX;
				SendOrderThisBar=False;
			}
			Kcond_outTrs=CrossUnder(C[1],fsDonchianLo[1]);
			Commentary("fsDonchianLo="+Text(fsDonchianLo));
			If(Kcond_outTrs and SendOrderThisBar==True)
			{
				out_range=TRS*XX;
				SendOrderThisBar=False;
			}
		}

		Commentary("CurrentEntries = " + Text(CurrentEntries));
		    	//移动出场
    	If(MarketPosition == 0)   // 自适应参数默认值;
    	{
    		liQKA = 1;
    		barcoutN=0;
    	}Else if(BarsSinceEntry>barcoutN)					 //当有持仓的情况下,liQKA会随着持仓时间的增加而逐渐减小,即止损止盈幅度乘数的减少。
    	{
    		liQKA = liQKA - 0.1; 
    		liQKA = Max(liQKA,0.3);
    		barcoutN=BarsSinceEntry;
    	}
    	if(MarketPosition>0)
    	{
    	DliqPoint = LowAfterEntry - (Open*out_range/1000)*liQKA; //经过计算,这根吊灯出场线会随着持仓时间的增加变的越来越敏感;
    	}
    	if(MarketPosition<0)
    	{
    	KliqPoint = HighAfterEntry + (Open*out_range/1000)*liQKA; //经过计算,这根吊灯出场线会随着持仓时间的增加变的越来越敏感;
    	}
    	// 画线
    	Commentary("(Open*out_range/1000)*liQKA"+text((Open*out_range/1000)*liQKA));
    	Commentary("(Open*TRS/1000)*liQKA"+text((Open*TRS/1000)*liQKA));
    	If(DliqPoint[1]>0)PlotNumeric("DliqPoint[1]",DliqPoint[1]);
    	If(KliqPoint[1]>0)PlotNumeric("KliqPoint[1]",KliqPoint[1]);
    	
    	// 持有多单时
    	If(MarketPosition >0 And BarsSinceEntry >0  And Low <= DliqPoint[1] and DliqPoint[1]>0 and DliqPoint>0 and BarsSinceEntry>0) 
    	{
    		
    			Sell(0,Min(Open,DliqPoint[1]));
    			barcoutN=0;
    			DliqPoint=0;
    	}
    		// 持有空单时
    	If(MarketPosition <0 And BarsSinceEntry >0  And High >= KliqPoint[1] and KliqPoint[1]>0 and KliqPoint>0 and BarsSinceEntry>0)
    	{		
    			BuyToCover(0,Max(Open,KliqPoint[1]));
    			KliqPoint=0;
    			barcoutN=0;
    	}	
	}
//------------------------------------------------------------------------
// 编译版本 GS2010.12.08
// 版权所有	TradeBlazer Software 2003-2025
// 更改声明 TradeBlazer Software保留对TradeBlazer平
//          台每一版本的TradeBlazer公式修改和重写的权利
//------------------------------------------------------------------------
  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值