1、可实现的自动交易-海龟交易系统公式 这里找到了已经实现的海龟交易系统的公式完全版.虽说是著名的海龟, 但不等于说用了就100%能赚钱的. 该系统是比较适合于趋势型的商品行情,如大豆等期货商品. 当然要是把这个系统放在振荡型的行情商品中,估计会亏得血本无归吧。其实现如今海龟已经不如当初那么神奇了,可以说是过了保质期吧。哈哈。who knows.不过要是把这个海龟系统理解透了,我相信对于提高交易者自身对系统交易的理解也能上一个台阶了。以下就是海龟系统于“tradeblazer- 交易开拓者“ 软件下的实现代码,大家可慢慢琢磨一下。(每一行/ 后的中文字都是对每一步骤的解释 ,这样有助于大家慢慢地消
2、化理解.)复制内容到剪贴板代码:ParamsNumeric RiskRatio(1); / % Risk Per N ( 0 - 100)Numeric ATRLength(20); / 平均波动周期 ATR LengthNumeric boLength(20); / 短周期 BreakOut LengthNumeric fsLength(55); / 长周期 FailSafe LengthNumeric teLength(10); / 离市周期 Trailing Exit LengthBool LastProfitableTradeFilter(True); / 使用入市过滤条件VarsNu
3、meric N; / N 值Numeric TotalEquity; / 按最新收盘价计算出的总资产Numeric TurtleUnits; / 交易单位NumericSeries DonchianHi; / 唐奇安通道上轨,延后1个 BarNumericSeries DonchianLo; / 唐奇安通道下轨,延后1个 BarNumericSeries fsDonchianHi; / 唐奇安通道上轨,延后 1个 Bar,长周期NumericSeries fsDonchianLo; / 唐奇安通道下轨,延后1个 Bar,长周期Numeric ExitHighestPrice; / 离市时判断需
4、要的 N 周期最高价Numeric ExitLowestPrice; / 离市时判断需要的 N 周期最低价Numeric myEntryPrice; / 开仓价格Numeric myExitPrice; / 平仓价格Bool IsEntryThisBar(False); / 当前 Bar 开过仓Bool IsAddThisBar(False); / 当前 Bar 有过增仓Bool LastBreakoutWin(False); / 最后一次突破是否盈利Numeric preEntryPrice; / 前一次开仓的价格,存放到全局变量0 号位置Numeric preBreakoutType(0)
5、; / 前一次突破的方向,1 - LONG , -1 - SHORT 初始值为0,存放到全局变量 1号位置Numeric preBreakOutPrice; / 前一次突破的价格,存放到全局变量2 号位置BeginIf(BarStatus = 0)SetGlobalVar(0,InvalidNumeric);SetGlobalVar(1,0);SetGlobalVar(2,InvalidNumeric);ElsepreBreakoutType = GetGlobalVar(1);preBreakOutPrice = GetGlobalVar(2);N = AverageFC(TrueRange
6、,ATRLength);TotalEquity = CurrentCapital()+ Abs(CurrentContracts()*Close*ContractUnit()*BigPointValue()*MarginRatio();TurtleUnits = (TotalEquity*RiskRatio/100) /(N * ContractUnit()*BigPointValue();TurtleUnits = IntPart(TurtleUnits); / 对小数取整DonchianHi = HighestFC(Close1,boLength);DonchianLo = LowestF
7、C(Close1,boLength);/ 判断最后一次突破是否盈利If(preBreakoutType = 1)If(Close PreBreakOutPrice)LastBreakoutWin = True;Else If(preBreakoutType = -1)If(Close = 1)/ 开仓价格取突破上轨 +一个价位和最高价之间的较小值,这样能更接近真实情况,并能尽量保证成交preBreakoutType = 1;preBreakOutPrice = Donchianhi;SetGlobalVar(1,preBreakoutType);SetGlobalVar(2,preBreakO
8、utPrice);myEntryPrice = min(high,DonchianHi + PriceScale*MinMove);myEntryPrice = IIF(myEntryPrice = 1)/ 开仓价格取突破下轨 -一个价位和最低价之间的较大值,这样能更接近真实情况,并能尽量保证成交preBreakoutType = -1;preBreakOutPrice = DonchianLo;SetGlobalVar(1,preBreakoutType);SetGlobalVar(2,preBreakOutPrice);myEntryPrice = max(low,DonchianLo -
9、 PriceScale*MinMove);myEntryPrice = IIF(myEntryPrice Open, Open,myEntryPrice); / 大跳空的时候用开盘价代替If(SellShort(TurtleUnits,myEntryPrice)IsEntryThisBar = True;SetGlobalVar(0,myEntryPrice);/ 保存第一次开仓的价格/ 长周期突破开仓 Failsafe Breakout pointIf(MarketPosition = 0)fsDonchianHi = HighestFC(Close1,fsLength);fsDonchia
10、nLo = LowestFC(Close1,fsLength);If(CrossOver(High,fsDonchianHi) myEntryPrice = IIF(myEntryPrice = 1)/ 开仓价格取突破下轨 -一个价位和最低价之间的较大值,这样能更接近真实情况,并能尽量保证成交myEntryPrice = max(low,fsDonchianLo - PriceScale*MinMove);myEntryPrice = IIF(myEntryPrice Open, Open,myEntryPrice); / 大跳空的时候用开盘价代替If(SellShort(TurtleUnit
11、s,myEntryPrice)IsEntryThisBar = True;If(MarketPosition = 1) / 有多仓的情况/ 求出持多仓时离市的条件比较值ExitLowestPrice = LowestFC(Low1,teLength);If(Low = myEntryPrice + 0.5 * N If(Buy(TurtleUnits,myEntryPrice)SetGlobalVar(0,myEntryPrice);/ 保存最后一次开仓的价格/ 加上止损指令If(Close = 1)If(Open = preEntryPrice + 0.5*N) / 如果开盘就超过设定的1/
12、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,m
13、yEntryPrice)IsAddThisBar = True;SetGlobalVar(0,preEntryPrice);/ 保存最后一次开仓的价格/ 止损指令If(IsAddThisBar)/ 当前 Bar 有过增仓,此时不能直接按 Low 来判断是否止损,因为不能确定 Bar 的价格的走势,只按收盘价进行止损判断。If(Close ExitHighestPrice )myExitPrice = Min(High,ExitHighestPrice + PriceScale()*MinMove();BuyToCover(0,ExitHighestPrice); / 数量用0的情况下将全部平仓
14、Else If(IsEntryThisBar)/ 当前 Bar 开过仓的情况,如果 Close 比 myEntryPrice 小于1/2N.用收盘价加仓。If(Close = 1)myEntryPrice = myEntryPrice - 0.5 * N;If(SellShort(TurtleUnits,myEntryPrice)SetGlobalVar(0,myEntryPrice);/ 保存最后一次开仓的价格/ 加上止损指令If(Close = MyEntryPrice + 2 * N)myExitPrice = MyEntryPrice + 2 * N;BuyToCover(0,myEx
15、itPrice); / 数量用0的情况下将全部平仓ElsepreEntryPrice = GetGlobalVar(0); / 取出上一次开仓的价格If(preEntryPrice!=InvalidNumeric BuyToCover(0,myExitPrice); / 数量用0的情况下将全部平仓ElseIf(High = preEntryPrice + 2 * N)myExitPrice = preEntryPrice + 2 * N;BuyToCover(0,myExitPrice); / 数量用0的情况下将全部平仓End分析家:VARIABLE:dayCount=1,PositionCo
16、unt=1,SellSign=0; VARIABLE:EntAndExitSign=1,EntPoint=0,ExitPoint=0; VARIABLE:True=1,False=0,N=0; TR :=MAX(HIGH,CLOSE1)-MIN(LOW,CLOSE1); IF BARPOS=20 THEN BEGIN IF BARPOS=20 THEN N:=MA(TR,20); IF DayCount=5 OR BARPOS=20 THEN BEGIN5 天调整 N 值 N:=(19*N+TR)/20;计算 N 值 DayCount:=1; END DayCount:=DayCount+1;
17、 EntPoint:=ENTERBARS+1; IF EntPoint=EntAndExitSign THEN BEGIN说明 STOP 指令买进头寸成功 PositionCount:=PositionCount+1;头寸计数 SellSign:=True;开始以 STOP 卖出,如果达到指定的价格 END IF PositionCount=1 THEN BEGIN第一头寸 HOW:=CASH*0.01/N;波动性百分比决定头寸规模 BUY(HOW,STOP,HHV(H,20);在 20 日新高 STOP 指令买进 END IF PositionCount=2 THEN BEGIN如到第二头寸
18、 HOW:=CASH*0.01/N;波动性百分比决定头寸规模 BUY(HOW,STOP,ENTERPRICE+0.5*N);在上头寸(即第一头寸)+0.5 个 N 以 STOP 指令买进 END IF PositionCount=3 THEN BEGIN如到第三头寸 HOW:=CASH*0.01/N; BUY(HOW,STOP,ENTERPRICE+0.5*N);在上头寸(即第二头寸)+0.5 个 N 以 STOP 指令买进 END IF PositionCount=4 THEN BEGIN HOW:=CASH*0.01/N; BUY(HOW,STOP,ENTERPRICE+0.5*N); END IF SellSign=True THEN BEGIN ExitPoint:=EXITBARS+1; IF ExitPoint=EntAndExitSign THEN BEGIN 说明卖出成功 PositionCount:=1;头寸计算复原 SellSign:=False; END IF ENTERPRICE-2*NLLV(L,10) THEN SELL(100%,STOP,LLV(L,10);退出离盈利头寸 ELSE SELL(100%,STOP,ENTERPRICE-2*N);退出亏损头寸 END END;