凛冬将志 发表于 2013-8-18 21:02:59

TB转过来的海龟交易系统求解释

用论坛提供的最新公式转换器转换了TB的海龟交易系统。
不见开平仓信号,TB本身好像也没有信号的。
求高手解释
转换后的代码
//海龟交易系统
// 简称: TurtleTrader
// 名称: 海龟交易系统
// 类别: 公式应用
// 类型: 内建应用
//------------------------------------------------------------------------

INPUT:
     RiskRatio(1),                   // % Risk Per N ( 0 - 100)
     ATRLength(20),                  // 平均波动周期 ATR Length
     boLength(20),                   // 短周期 BreakOut Length
     fsLength(55),                   // 长周期 FailSafe Length
     teLength(10),                   // 离市周期 Trailing Exit Length
     LastProfitableTradeFilter(True);   // 使用入市过滤条件
VARIABLE:
         MinPoint,                       // 最小变动单位
         AvgTR,                                        // ATR
     N,                              // N 值
     TotalEquity,                    // 按最新收盘价计算出的总资产
     TurtleUnits,                    // 交易单位
     DonchianHi,                      // 唐奇安通道上轨,延后1个Bar
     DonchianLo,                      // 唐奇安通道下轨,延后1个Bar
     fsDonchianHi,                    // 唐奇安通道上轨,延后1个Bar,长周期
     fsDonchianLo,                    // 唐奇安通道下轨,延后1个Bar,长周期
     ExitHighestPrice,               // 离市时判断需要的N周期最高价
     ExitLowestPrice,                // 离市时判断需要的N周期最低价
     myEntryPrice,                   // 开仓价格
     myExitPrice,                    // 平仓价格
     SendOrderThisBar(False),                  // 当前Bar有过交易
         preEntryPrice(0),               // 前一次开仓的价格
         PreBreakoutFailure(false);        // 前一次突破是否失败
Begin
    If(BarStatus == 0) then
     begin
                preEntryPrice := Invalid;
                PreBreakoutFailure := false;
         end         
        
        MinPoint := MinMove*PriceScale;
    AvgTR := EMA(TrueRange,ATRLength);
        N := AvgTR;        
    TotalEquity := Portfolio_CurrentCapital() + MarginRatio;
    TurtleUnits := (TotalEquity*RiskRatio/100) /(N * ContractUnit()*BigPointValue());
    TurtleUnits := IntPart(TurtleUnits); // 对小数取整

    DonchianHi := HHV(High,boLength);
    DonchianLo := LLV(Low,boLength);

        fsDonchianHi := HHV(High,fsLength);
    fsDonchianLo := LLV(Low,fsLength);
        
        ExitLowestPrice := LLV(Low,teLength);
        ExitHighestPrice := HHV(High,teLength);

        Comment('N='+NumToStr(N,0));
        Comment('preEntryPrice='+NumToStr(preEntryPrice,0));
        Comment('PreBreakoutFailure='+if(PreBreakoutFailure,'True','False'));
        
    // 当不使用过滤条件,或者使用过滤条件并且条件为PreBreakoutFailure为True进行后续操作
    If(MarketPosition == 0 && ((!LastProfitableTradeFilter) Or (PreBreakoutFailure))) then
     begin
        // 突破开仓
        If(High > DonchianHi && TurtleUnits >= 1) then
         begin
            // 开仓价格取突破上轨+一个价位和最高价之间的较小值,这样能更接近真实情况,并能尽量保证成交
            myEntryPrice := Min(High,DonchianHi + MinPoint);
            myEntryPrice := If(myEntryPrice < Open, Open,myEntryPrice); // 大跳空的时候用开盘价代替
                        preEntryPrice := myEntryPrice;
            Buy('',TurtleUnits,myEntryPrice,0,OT_Market, OB_ThisBar);
                        SendOrderThisBar := True;
                        PreBreakoutFailure := False;
         end

        If(Low < DonchianLo && TurtleUnits >= 1) then
         begin
            // 开仓价格取突破下轨-一个价位和最低价之间的较大值,这样能更接近真实情况,并能尽量保证成交
            myEntryPrice := Max(Low,DonchianLo - MinPoint);
            myEntryPrice := If(myEntryPrice > Open, Open,myEntryPrice); // 大跳空的时候用开盘价代替
            preEntryPrice := myEntryPrice;
            SendOrderThisBar := True;
            SellShort('',TurtleUnits,myEntryPrice,0,OT_Market, OB_ThisBar);
                        SendOrderThisBar := True;
                        PreBreakoutFailure := False;
         end
     end

    // 长周期突破开仓 Failsafe Breakout point
    If(MarketPosition == 0) then
     begin
                Comment('fsDonchianHi='+NumToStr(fsDonchianHi,0));
        If(High > fsDonchianHi && TurtleUnits >= 1) then
         begin
            // 开仓价格取突破上轨+一个价位和最高价之间的较小值,这样能更接近真实情况,并能尽量保证成交
            myEntryPrice := Min(High,fsDonchianHi + MinPoint);
            myEntryPrice := If(myEntryPrice < Open, Open,myEntryPrice); // 大跳空的时候用开盘价代替
                        preEntryPrice := myEntryPrice;
            Buy('',TurtleUnits,myEntryPrice,0,OT_Market, OB_ThisBar);
                        SendOrderThisBar := True;
                        PreBreakoutFailure := False;
         end

                Comment('fsDonchianLo='+NumToStr(fsDonchianLo,0));
        If(Low < fsDonchianLo && TurtleUnits >= 1) then
         begin
            // 开仓价格取突破下轨-一个价位和最低价之间的较大值,这样能更接近真实情况,并能尽量保证成交
            myEntryPrice := Max(Low,fsDonchianLo - MinPoint);
            myEntryPrice := If(myEntryPrice > Open, Open,myEntryPrice); // 大跳空的时候用开盘价代替
            preEntryPrice := myEntryPrice;
            SellShort('',TurtleUnits,myEntryPrice,0,OT_Market, OB_ThisBar);
                        SendOrderThisBar := True;
                        PreBreakoutFailure := False;
         end
     end

    If(MarketPosition == 1) then  // 有多仓的情况
     begin        
                Comment('ExitLowestPrice='+NumToStr(ExitLowestPrice,0));
        If(Low < ExitLowestPrice) then
         begin
            myExitPrice := Max(Low,ExitLowestPrice - MinPoint);
                        myExitPrice := If(myExitPrice > Open, Open,myExitPrice); // 大跳空的时候用开盘价代替
            Sell('',0,myExitPrice,0,OT_Market, OB_ThisBar);    // 数量用0的情况下将全部平仓
         end Else
         begin
            If(preEntryPrice!=Invalid && TurtleUnits >= 1) then
             begin
                If(Open >= preEntryPrice + 0.5*N) then  // 如果开盘就超过设定的1/2N,则直接用开盘价增仓。
                 begin
                    myEntryPrice := Open;
                                        preEntryPrice := myEntryPrice;
                    Buy('',TurtleUnits,myEntryPrice,0,OT_Market, OB_ThisBar);
                                        SendOrderThisBar := True;
                 end

                while(High >= preEntryPrice + 0.5*N) do  // 以最高价为标准,判断能进行几次增仓
                 begin
                    myEntryPrice := preEntryPrice + 0.5 * N;
                    preEntryPrice := myEntryPrice;
                    Buy('',TurtleUnits,myEntryPrice,0,OT_Market, OB_ThisBar);
                                        SendOrderThisBar := True;                                       
                 end
             end
                        
            // 止损指令
                        If(Low <= preEntryPrice - 2 * N && SendOrderThisBar == false) then  // 加仓Bar不止损
                         begin
                                myExitPrice := preEntryPrice - 2 * N;
                                Sell('',0,myExitPrice,0,OT_Market, OB_ThisBar); // 数量用0的情况下将全部平仓
                                PreBreakoutFailure := True;
                         end
         end
     end Else If  (MarketPosition ==-1) then // 有空仓的情况
     begin
        // 求出持空仓时离市的条件比较值        
                Comment('ExitHighestPrice='+NumToStr(ExitHighestPrice,0));
        If(High > ExitHighestPrice) then
         begin
            myExitPrice := Min(High,ExitHighestPrice + MinPoint);
                        myExitPrice := If(myExitPrice < Open, Open,myExitPrice); // 大跳空的时候用开盘价代替
            BuyToCover('',0,myExitPrice,0,OT_Market, OB_ThisBar);    // 数量用0的情况下将全部平仓
         end Else
         begin
            If(preEntryPrice!=Invalid && TurtleUnits >= 1) then
             begin
                If(Open <= preEntryPrice - 0.5*N) then  // 如果开盘就超过设定的1/2N,则直接用开盘价增仓。
                 begin
                    myEntryPrice := Open;
                                        preEntryPrice := myEntryPrice;
                    SellShort('',TurtleUnits,myEntryPrice,0,OT_Market, OB_ThisBar);
                                        SendOrderThisBar := True;
                 end

                while(Low <= preEntryPrice - 0.5*N) do  // 以最低价为标准,判断能进行几次增仓
                 begin
                    myEntryPrice := preEntryPrice - 0.5 * N;
                    preEntryPrice := myEntryPrice;
                    SellShort('',TurtleUnits,myEntryPrice,0,OT_Market, OB_ThisBar);
                                        SendOrderThisBar := True;
                 end
             end

            // 止损指令
                        If(High >= preEntryPrice + 2 * N &&SendOrderThisBar==false) then  // 加仓Bar不止损
                         begin
                                myExitPrice := preEntryPrice + 2 * N;
                                BuyToCover('',0,myExitPrice,0,OT_Market, OB_ThisBar); // 数量用0的情况下将全部平仓
                                PreBreakoutFailure := True;
                         end
         end
     end
End

//------------------------------------------------------------------------
// 编译版本        GS2010.12.08
// 版权所有        TradeBlazer Software 2003-2010
// 更改声明        TradeBlazer Software保留对TradeBlazer平
//                        台每一版本的TradeBlazer公式修改和重写的权利
//------------------------------------------------------------------------

ktdev 发表于 2013-8-20 07:28:57

这里有一个貌似海龟实现,原来是TradeStation Easy language实现,转换成金魔方,有信号显示
http://hs633.com/forum.php?mod=viewthread&tid=10301&extra=page%3D1

chenjiaq 发表于 2013-8-23 14:13:56

谢谢提供分享

bluechina 发表于 2013-8-28 12:40:21

收藏,学习!

大炼钢铁 发表于 2013-9-9 23:35:09

收藏,学习,研究

xiuzong 发表于 2013-11-16 15:46:25

学习,研究!

shg1014 发表于 2014-6-16 08:46:57

收藏学习了。感谢提供分享:loveliness::loveliness::loveliness:

zhangzhe212 发表于 2014-9-24 22:10:02

习学习!

wind 发表于 2014-10-6 11:38:10

收藏学习了。感谢提供分享
页: [1]
查看完整版本: TB转过来的海龟交易系统求解释