海龟交易系统公式.docx
《海龟交易系统公式.docx》由会员分享,可在线阅读,更多相关《海龟交易系统公式.docx(7页珍藏版)》请在冰点文库上搜索。
这里找到了已经实现的海龟交易系统的公式完全版.虽说是著名的海龟,但不等于说用了就100%能赚钱的.该系统是比较适合于趋势型的商品行情,如大豆等期货商品.当然要是把这个系统放在振荡型的行情商品中,估计会亏得血本无归吧。
其实现如今海龟已经不如当初那么神奇了,可以说是过了保质期吧。
哈哈。
whoknows.
不过要是把这个海龟系统理解透了,我相信对于提高交易者自身对系统交易的理解也能上一个台阶了。
以下就是海龟系统于"tradeblazer--交易开拓者"软件下的实现代码,大家可慢慢琢磨一下。
(每一行//后的中文字都是对每一步骤的解释,这样有助于大家慢慢地消化理解.)
复制内容到剪贴板
代码:
Params
NumericRiskRatio
(1);//%RiskPerN(0-100)
NumericATRLength(20);//平均波动周期ATRLength
NumericboLength(20);//短周期BreakOutLength
NumericfsLength(55);//长周期FailSafeLength
NumericteLength(10);//离市周期TrailingExitLength
BoolLastProfitableTradeFilter(True);//使用入市过滤条件
Vars
NumericN;//N值
NumericTotalEquity;//按最新收盘价计算出的总资产
NumericTurtleUnits;//交易单位
NumericSeriesDonchianHi;//唐奇安通道上轨,延后1个Bar
NumericSeriesDonchianLo;//唐奇安通道下轨,延后1个Bar
NumericSeriesfsDonchianHi;//唐奇安通道上轨,延后1个Bar,长周期
NumericSeriesfsDonchianLo;//唐奇安通道下轨,延后1个Bar,长周期
NumericExitHighestPrice;//离市时判断需要的N周期最高价
NumericExitLowestPrice;//离市时判断需要的N周期最低价
NumericmyEntryPrice;//开仓价格
NumericmyExitPrice;//平仓价格
BoolIsEntryThisBar(False);//当前Bar开过仓
BoolIsAddThisBar(False);//当前Bar有过增仓
BoolLastBreakoutWin(False);//最后一次突破是否盈利
NumericpreEntryPrice;//前一次开仓的价格,存放到全局变量0号位置
NumericpreBreakoutType(0);//前一次突破的方向,1-LONG,-1-SHORT初始值为0,存放到全局变量1号位置
NumericpreBreakOutPrice;//前一次突破的价格,存放到全局变量2号位置
Begin
If(BarStatus==0)
{
SetGlobalVar(0,InvalidNumeric);
SetGlobalVar(1,0);
SetGlobalVar(2,InvalidNumeric);
}Else
{
preBreakoutType=GetGlobalVar
(1);
preBreakOutPrice=GetGlobalVar
(2);
}
N=AverageFC(TrueRange,ATRLength);
TotalEquity=CurrentCapital()+Abs(CurrentContracts()*Close*ContractUnit()*BigPointValue()*MarginRatio());
TurtleUnits=(TotalEquity*RiskRatio/100)/(N*ContractUnit()*BigPointValue());
TurtleUnits=IntPart(TurtleUnits);//对小数取整
DonchianHi=HighestFC(Close[1],boLength);
DonchianLo=LowestFC(Close[1],boLength);
//判断最后一次突破是否盈利
If(preBreakoutType==1)
{
If(Close>PreBreakOutPrice)
{
LastBreakoutWin=True;
}
}ElseIf(preBreakoutType==-1)
{
If(Close{
LastBreakoutWin=True;
}
}
//当不使用过滤条件,或者使用过滤条件并且条件为False进行后续操作
If((NotLastProfitableTradeFilter)Or(NOTLastBreakoutWin))
{
//突破开仓
If(CrossOver(High,DonchianHi)&&TurtleUnits>=1)
{
//开仓价格取突破上轨+一个价位和最高价之间的较小值,这样能更接近真实情况,并能尽量保证成交
preBreakoutType=1;
preBreakOutPrice=Donchianhi;
SetGlobalVar(1,preBreakoutType);
SetGlobalVar(2,preBreakOutPrice);
myEntryPrice=min(high,DonchianHi+PriceScale*MinMove);
myEntryPrice=IIF(myEntryPriceIf(Buy(TurtleUnits,myEntryPrice))
{
IsEntryThisBar=True;
SetGlobalVar(0,myEntryPrice);//保存第一次开仓的价格
}
}
If(CrossUnder(Low,DonchianLo)&&TurtleUnits>=1)
{
//开仓价格取突破下轨-一个价位和最低价之间的较大值,这样能更接近真实情况,并能尽量保证成交
preBreakoutType=-1;
preBreakOutPrice=DonchianLo;
SetGlobalVar(1,preBreakoutType);
SetGlobalVar(2,preBreakOutPrice);
myEntryPrice=max(low,DonchianLo-PriceScale*MinMove);
myEntryPrice=IIF(myEntryPrice>Open,Open,myEntryPrice);//大跳空的时候用开盘价代替
If(SellShort(TurtleUnits,myEntryPrice))
{
IsEntryThisBar=True;
SetGlobalVar(0,myEntryPrice);//保存第一次开仓的价格
}
}
}
//长周期突破开仓FailsafeBreakoutpoint
If(MarketPosition==0)
{
fsDonchianHi=HighestFC(Close[1],fsLength);
fsDonchianLo=LowestFC(Close[1],fsLength);
If(CrossOver(High,fsDonchianHi)&&TurtleUnits>=1)
{
//开仓价格取突破上轨+一个价位和最高价之间的较小值,这样能更接近真实情况,并能尽量保证成交
myEntryPrice=min(high,fsDonchianHi+PriceScale*MinMove);
myEntryPrice=IIF(myEntryPriceIf(Buy(TurtleUnits,myEntryPrice))
{
IsEntryThisBar=True;
}
}
If(CrossUnder(Low,fsDonchianLo)&&TurtleUnits>=1)
{
//开仓价格取突破下轨-一个价位和最低价之间的较大值,这样能更接近真实情况,并能尽量保证成交
myEntryPrice=max(low,fsDonchianLo-PriceScale*MinMove);
myEntryPrice=IIF(myEntryPrice>Open,Open,myEntryPrice);//大跳空的时候用开盘价代替
If(SellShort(TurtleUnits,myEntryPrice))
{
IsEntryThisBar=True;
}
}
}
If(MarketPosition==1)//有多仓的情况
{
//求出持多仓时离市的条件比较值
ExitLowestPrice=LowestFC(Low[1],teLength);
If(Low{
myExitPrice=max(Low,ExitLowestPrice-PriceScale()*MinMove());
Sell(0,myExitPrice);//数量用0的情况下将全部平仓
}ElseIf(IsEntryThisBar)
{
//当前Bar开过仓的情况,如果Close比myEntryPrice大于1/2N.用收盘价加仓。
If(Close>=myEntryPrice+0.5*N&&TurtleUnits>=1)
{
myEntryPrice=myEntryPrice+0.5*N;
If(Buy(TurtleUnits,myEntryPrice))
{
SetGlobalVar(0,myEntryPrice);//保存最后一次开仓的价格
}
}
//加上止损指令
If(Close<=MyEntryPrice-2*N)
{
myExitPrice=MyEntryPrice-2*N;
Sell(0,myExitPrice);//数量用0的情况下将全部平仓
}
}Else
{
preEntryPrice=GetGlobalVar(0);//取出上一次开仓的价格
If(preEntryPrice!
=InvalidNumeric&&TurtleUnits>=1)
{
If(Open>=preEntryPrice+0.5*N)//如果开盘就超过设定的1/2N,则直接用开盘价增仓。
{
myEntryPrice=Open;
If(Buy(TurtleUnits,myEntryPrice))
{
preEntryPrice=myEntryPrice;
IsAddThisBar=True;
SetGlobalVar(0,preEntryPrice);//保存最后一次开仓的价格
}
}
while(High>=preEntryPrice+0.5*N)//以最高价为标准,判断能进行几次增仓
{
myEntryPrice=preEntryPrice+0.5*N;
preEntryPrice=myEntryPrice;
If(Buy(TurtleUnits,myEntryPrice))
{
IsAddThisBar=True;
SetGlobalVar(0,preEntryPrice);//保存最后一次开仓的价格
}
}
}
//止损指令
If(IsAddThisBar)
{
//当前Bar有过增仓,此时不能直接按Low来判断是否止损,因为不能确定Bar的价格的走势,只按收盘价进行止损判断。
If(Close<=preEntryPrice-2*N)
{
myExitPrice=preEntryPrice-2*N;
Sell(0,myExitPrice);//数量用0的情况下将全部平仓
}
}Else
{
If(Low<=preEntryPrice-2*N)
{
myExitPrice=preEntryPrice-2*N;
Sell(0,myExitPrice);//数量用0的情况下将全部平仓
}
}
}
}ElseIf(MarketPosition==-1)//有空仓的情况
{
//求出持空仓时离市的条件比较值
ExitHighestPrice=HighestFC(High[1],teLength);
If(High>ExitHighestPrice)
{
myExitPrice=Min(High,ExitHighestPrice+PriceScale()*MinMove());
BuyToCover(0,ExitHighestPrice);//数量用0的情况下将全部平仓
}ElseIf(IsEntryThisBar)
{
//当前Bar开过仓的情况,如果Close比myEntryPrice小于1/2N.用收盘价加仓。
If(Close<=myEntryPrice-0.5*N&&TurtleUnits>=1)
{
myEntryPrice=myEntryPrice-0.5*N;
If(SellShort(TurtleUnits,myEntryPrice))
{
SetGlobalVar(0,myEntryPrice);//保存最后一次开仓的价格
}
}
//加上止损指令
If(Close>=MyEntryPrice+2*N)
{
myExitPrice=MyEntryPrice+2*N;
BuyToCover(0,myExitPrice);//数量用0的情况下将全部平仓
}
}Else
{
preEntryPrice=GetGlobalVar(0);//取出上一次开仓的价格
If(preEntryPrice!
=InvalidNumeric&&TurtleUnits>=1)
{
If(Open<=preEntryPrice-0.5*N)//如果开盘就超过设定的1/2N,则直接用开盘价增仓。
{
myEntryPrice=Open;
If(SellShort(TurtleUnits,myEntryPrice))
{
preEntryPrice=myEntryPrice;
IsAddThisBar=True;
SetGlobalVar(0,preEntryPrice);//保存最后一次开仓的价格
}
}
while(Low<=preEntryPrice-0.5*N)//以最低价为标准,判断能进行几次增仓
{
myEntryPrice=preEntryPrice-0.5*N;
preEntryPrice=myEntryPrice;
If(SellShort(TurtleUnits,myEntryPrice))
{
IsAddThisBar=True;
SetGlobalVar(0,preEntryPrice);//保存最后一次开仓的价格
}
}
}
//止损指令
If(IsAddThisBar)
{
//当前Bar有过增仓,此时不能直接按High来判断是否止损,因为不能确定Bar的价格的走势,只按收盘价进行止损判断。
If(Close>=preEntryPrice+2*N)
{
myExitPrice=preEntryPrice+2*N;
BuyToCover(0,myExitPrice);//数量用0的情况下将全部平仓
}
}Else
{
If(High>=preEntryPrice+2*N)
{
myExitPrice=preEntryPrice+2*N;
BuyToCover(0,myExitPrice);//数量用0的情况下将全部平仓
}
}