开拓者期货期权程序化系统交易论坛

标题: A_CurrentEquity 函数问题 [打印本页]

作者: 道勤    时间: 2010-8-5 12:49:54     标题: A_CurrentEquity 函数问题

系统自带的海龟系统中
TotalEquity=CurrentCapital()+ Abs(CurrentContracts()*Close*ContractUnit()*BigPointValue()*MarginRatio());

是否等同于
TotalEquity = A_CurrentEquity;

谢谢
作者: 道勤    时间: 2010-8-5 13:04:19

本帖最后由 道勤 于 2010-8-5 13:10 编辑

我想把系统自带的海龟交易系统修改成用A_SendOrder发单的形式,请老大帮忙看看,这样改有没有问题。
Params
    Numeric RiskRatio(1);                 
    Numeric ATRLength(20);                  
    Numeric boLength(20);                  
    Numeric fsLength(55);                  
    Numeric teLength(10);                  
    Bool LastProfitableTradeFilter(True);   
        Numeric BFB(1);
        Numeric WaitTime(10);

Vars
        Numeric MinPoint;                       
    Numeric N;                             
    Numeric TotalEquity;                    
    Numeric TurtleUnits;                  
    NumericSeries DonchianHi;              
    NumericSeries DonchianLo;              
    NumericSeries fsDonchianHi;            
    NumericSeries fsDonchianLo;           
    Numeric ExitHighestPrice;               
    Numeric ExitLowestPrice;               
    Numeric myEntryPrice;                  
    Numeric myExitPrice;                  
    Bool SendOrderThisBar(False);         
        NumericSeries preEntryPrice(0);      
        BoolSeries PreBreakoutFailure(false);       
        Numeric TimeSeconds;
Begin
       
        If ( GetGlobalVar(10)==InvalidNumeric  )        SetGlobalVar(10,0);
        TimeSeconds=Value(Left(TimeToString(CurrentTime),2))*3600                //记录系统当前时间,转化为秒数
                                +Value(Mid(TimeToString(CurrentTime),3,2))*60
                                +Value(Right(TimeToString(CurrentTime),2));        
        If ( TimeSeconds-GetGlobalVar(10)<WaitTime )        Return;        //如果发单后等待时间小于WaitTime,则返回
          

    If(BarStatus == 0)
    {
                preEntryPrice = InvalidNumeric;
                PreBreakoutFailure = false;
        }Else
        {
                preEntryPrice = preEntryPrice[1];
        PreBreakoutFailure = PreBreakoutFailure[1];
    }

        MinPoint = MinMove*PriceScale;
    N = XAverage(TrueRange,ATRLength);
    TotalEquity = A_CurrentEquity()*BFB /* CurrentCapital()+ Abs(CurrentContracts()*Close*ContractUnit()*BigPointValue()*MarginRatio()) */;
    TurtleUnits = (TotalEquity*RiskRatio/100) /(N * ContractUnit()*BigPointValue());
    TurtleUnits = IntPart(TurtleUnits); // 对小数取整

    DonchianHi = HighestFC(High[1],boLength);
    DonchianLo = LowestFC(Low[1],boLength);

        fsDonchianHi = HighestFC(High[1],fsLength);
    fsDonchianLo = LowestFC(Low[1],fsLength);

        Commentary("N="+Text(N));
        Commentary("preEntryPrice="+Text(preEntryPrice));
        Commentary("PreBreakoutFailure="+IIFString(PreBreakoutFailure,"True","False"));
       
    // 当不使用过滤条件,或者使用过滤条件并且条件为PreBreakoutFailure为True进行后续操作
    If(A_TotalPosition == 0 && ((!LastProfitableTradeFilter) Or (PreBreakoutFailure)))
    {
        // 突破开仓
        If(CrossOver(High,DonchianHi) && TurtleUnits >= 1)
        {
            // 开仓价格取突破上轨+一个价位和最高价之间的较小值,这样能更接近真实情况,并能尽量保证成交
            myEntryPrice = min(high,DonchianHi + MinPoint);
            myEntryPrice = IIF(myEntryPrice < Open, Open,myEntryPrice); // 大跳空的时候用开盘价代替
                        preEntryPrice = myEntryPrice;
            A_SendOrder(Enum_Buy,Enum_Entry,TurtleUnits,Q_AskPrice()+MinPoint);
                        SetGlobalVar(10,TimeSeconds);
                        SendOrderThisBar = True;
                        PreBreakoutFailure = False;
        }

        If(CrossUnder(Low,DonchianLo) && TurtleUnits >= 1)
        {
            // 开仓价格取突破下轨-一个价位和最低价之间的较大值,这样能更接近真实情况,并能尽量保证成交
            myEntryPrice = max(low,DonchianLo - MinPoint);
            myEntryPrice = IIF(myEntryPrice > Open, Open,myEntryPrice); // 大跳空的时候用开盘价代替
            preEntryPrice = myEntryPrice;
            A_SendOrder(Enum_Sell,Enum_Entry,TurtleUnits,Q_BidPrice()-MinPoint);
                        SetGlobalVar(10,TimeSeconds);
                        SendOrderThisBar = True;
                        PreBreakoutFailure = False;
        }
    }

    // 长周期突破开仓 Failsafe Breakout point
    If(A_TotalPosition == 0)
    {
                Commentary("fsDonchianHi="+Text(fsDonchianHi));
        If(CrossOver(High,fsDonchianHi) && TurtleUnits >= 1)
        {
            // 开仓价格取突破上轨+一个价位和最高价之间的较小值,这样能更接近真实情况,并能尽量保证成交
            myEntryPrice = min(high,fsDonchianHi + MinPoint);
            myEntryPrice = IIF(myEntryPrice < Open, Open,myEntryPrice); // 大跳空的时候用开盘价代替
                        preEntryPrice = myEntryPrice;
            A_SendOrder(Enum_Buy,Enum_Entry,TurtleUnits,Q_AskPrice()+MinPoint);
                        SetGlobalVar(10,TimeSeconds);
                        SendOrderThisBar = True;
                        PreBreakoutFailure = False;
        }

                Commentary("fsDonchianLo="+Text(fsDonchianLo));
        If(CrossUnder(Low,fsDonchianLo) && TurtleUnits >= 1)
        {
            // 开仓价格取突破下轨-一个价位和最低价之间的较大值,这样能更接近真实情况,并能尽量保证成交
            myEntryPrice = max(low,fsDonchianLo - MinPoint);
            myEntryPrice = IIF(myEntryPrice > Open, Open,myEntryPrice); // 大跳空的时候用开盘价代替
            preEntryPrice = myEntryPrice;
            A_SendOrder(Enum_Sell,Enum_Entry,TurtleUnits,Q_BidPrice()-MinPoint);
                        SetGlobalVar(10,TimeSeconds);
                        SendOrderThisBar = True;
                        PreBreakoutFailure = False;
        }
    }

    If(A_TodayBuyPosition > 0) // 有多仓的情况
    {
        // 求出持多仓时离市的条件比较值
        ExitLowestPrice = Lowest(Low[1],teLength);
                Commentary("ExitLowestPrice="+Text(ExitLowestPrice));
        If(Low < ExitLowestPrice)
        {
            /* myExitPrice = max(Low,ExitLowestPrice - MinPoint);
                        myExitPrice = IIF(myExitPrice > Open, Open,myExitPrice); // 大跳空的时候用开盘价代替 */
            A_SendOrder(Enum_Sell,Enum_Exit,A_BuyPosition(),Q_BidPrice()-MinPoint) ;    // 数量用0的情况下将全部平仓
                        SetGlobalVar(10,TimeSeconds);
        }Else
        {
            If(preEntryPrice!=InvalidNumeric && TurtleUnits >= 1)
            {
                If(Open >= preEntryPrice + 0.5*N) // 如果开盘就超过设定的1/2N,则直接用开盘价增仓。
                {
                    myEntryPrice = Open;
                                        preEntryPrice = myEntryPrice;
                    A_SendOrder(Enum_Buy,Enum_Entry,TurtleUnits,Q_AskPrice()+MinPoint);
                                        SetGlobalVar(10,TimeSeconds);
                                        SendOrderThisBar = True;
                }

                while(High >= preEntryPrice + 0.5*N) // 以最高价为标准,判断能进行几次增仓
                {
                    myEntryPrice = preEntryPrice + 0.5 * N;
                    preEntryPrice = myEntryPrice;
                   A_SendOrder(Enum_Buy,Enum_Entry,TurtleUnits,Q_AskPrice()+MinPoint);
                                        SetGlobalVar(10,TimeSeconds);

                                        SendOrderThisBar = True;                                       
                }
            }
                       
            // 止损指令
                        If(Low <= preEntryPrice - 2 * N && SendOrderThisBar == false) // 加仓Bar不止损
                        {
                                //myExitPrice = preEntryPrice - 2 * N;
                                A_SendOrder(Enum_Sell,Enum_Exit,A_BuyPosition(),Q_BidPrice()-MinPoint); // 数量用0的情况下将全部平仓
                                SetGlobalVar(10,TimeSeconds);
                                PreBreakoutFailure = True;
                        }
        }
    }Else If(A_TodaySellPosition >0 ) // 有空仓的情况
    {
        // 求出持空仓时离市的条件比较值
        ExitHighestPrice = Highest(High[1],teLength);
                Commentary("ExitHighestPrice="+Text(ExitHighestPrice));
        If(High > ExitHighestPrice)
        {
            /* myExitPrice = Min(High,ExitHighestPrice + MinPoint);
                        myExitPrice = IIF(myExitPrice < Open, Open,myExitPrice); // 大跳空的时候用开盘价代替 */
            A_SendOrder(Enum_Buy,Enum_Exit,A_TodaySellPosition(),Q_AskPrice()+MinPoint);    // 数量用0的情况下将全部平仓
                        SetGlobalVar(10,TimeSeconds);
        }Else
        {
            If(preEntryPrice!=InvalidNumeric && TurtleUnits >= 1)
            {
                If(Open <= preEntryPrice - 0.5*N) // 如果开盘就超过设定的1/2N,则直接用开盘价增仓。
                {
                    myEntryPrice = Open;
                                        preEntryPrice = myEntryPrice;
                   A_SendOrder(Enum_Sell,Enum_Entry,TurtleUnits,Q_BidPrice()-MinPoint);
                                        SetGlobalVar(10,TimeSeconds);
                                        SendOrderThisBar = True;
                }

                while(Low <= preEntryPrice - 0.5*N) // 以最低价为标准,判断能进行几次增仓
                {
                    myEntryPrice = preEntryPrice - 0.5 * N;
                    preEntryPrice = myEntryPrice;
                    A_SendOrder(Enum_Sell,Enum_Entry,TurtleUnits,Q_BidPrice()-MinPoint);
                                        SetGlobalVar(10,TimeSeconds);

                                        SendOrderThisBar = True;
                }
            }

            // 止损指令
                        If(High >= preEntryPrice + 2 * N &&SendOrderThisBar==false) // 加仓Bar不止损
                        {
                                //myExitPrice = preEntryPrice + 2 * N;
                                A_SendOrder(Enum_Buy,Enum_Exit,A_TodaySellPosition(),Q_AskPrice()+MinPoint); // 数量用0的情况下将全部平仓
                                SetGlobalVar(10,TimeSeconds);
                                PreBreakoutFailure = True;
                        }
        }
    }
End
作者: lh948    时间: 2010-8-5 13:58:44

要用全局变量控制发单,否则A_SendOrder会一直发单,直到你账户的资金用光
公式改完后,用模拟交易跑跑看
作者: 道勤    时间: 2010-8-5 14:06:08

哦  谢谢 我先试试
作者: 文静的狮子    时间: 2010-8-10 17:03:07

本帖最后由 文静的狮子 于 2010-8-16 17:20 编辑

用setTBProfileString




欢迎光临 开拓者期货期权程序化系统交易论坛 (http://bbs.tb18.net/) Powered by Discuz! X2