impierre 发表于 2013-3-24 23:51:41

使用A函数的自动开平仓系统


参照其它高手写的使用A函数的自动开平仓系统,实际测试中有些问题,请高手指点。
Params
        Numeric length3(3);                //3均线
        Numeric length15(15);        //15均线
        
        Numeric waitTime(5);        //开仓延时等待时间
        
Vars
        NumericSeries MA3;                //3均线
        NumericSeries MA15;                //15均线
        
        Bool conWaitTime;
        Bool conTrailPrice;

Begin
        If(SymbolType=="rb")
                conTrailPrice=true;
        
        If(SymbolType=="FG")
                conTrailPrice=False;
               
        MA3=AverageFC((Open+Close)/2,length3);
        MA15=AverageFC((Open+Close)/2,length15);
        
        PlotNumeric("MA3",MA3);                        //绘制均线3
        PlotNumeric("MA15",MA15);                //绘制均线15
        
        If(A_BuyPosition==0)//开仓
        {        
                SetGlobalVar(1,0);        //多头开仓,可以执行发单指令
               
                If(CrossOver(MA3,MA15) )
                {
                        If(GetGlobalVar(1)==1)
                        {
                                If(GetGlobalVar(2)==InvalidNumeric)
                                        SetGlobalVar(2,0);        //初始化等待时间变量
                                       
                                FileAppend("d:\SendOrderTest.log","前多头开仓单的发送时间="+Text(GetGlobalVar(2) ) );
                                conWaitTime=TimeDiff(GetGlobalVar(2),CurrentTime) > waitTime || (TimeDiff(A_OpenOrderTime(A_GetLastOpenOrderIndex(Enum_Buy,Enum_Entry)),CurrentTime) > waitTime);
                                FileAppend("d:\SendOrderTest.log","最后一个未成交委托单索引="+Text(A_GetLastOpenOrderIndex(Enum_Buy,Enum_Entry) )
                                        +"未成交委托单的委托时间="+Text(A_OpenOrderTime(A_GetLastOpenOrderIndex(Enum_Buy,Enum_Entry) ) ) );
                                If(conWaitTime)
                                {
                                        FileAppend("d:\mySendOrder.log",TimeToString(currenttime)+" "+"延时已到,多头开仓单撤单重发");
                                        A_DeleteOrder(A_OpenOrderContractNo(A_GetLastOpenOrderIndex(Enum_Buy,Enum_Entry) ) );
                                        FileAppend("d:\SendOrderTest.log","撤销多头开仓的单号="+A_OpenOrderContractNo(A_GetLastOpenOrderIndex(Enum_Buy,Enum_Entry) ) );
                                }
                                If(conTrailPrice)
                                {        
                                        FileAppend("d:\mySendOrder.log","重发单之前,多头开仓单未成交委托单索引="+Text(A_GetLastOpenOrderIndex(Enum_Buy,Enum_Entry) ) );
                                        If(A_GetLastOpenOrderIndex(Enum_Buy,Enum_Entry)==InvalidNumeric)
                                        {        
                                                FileAppend("d:\mySendOrder.log","撤单已经撤完,未成交委托单索引="+Text(A_GetLastOpenOrderIndex(Enum_Buy,Enum_Entry) ) );
                                                A_SendOrder(Enum_Buy,Enum_Entry,1,Q_BidPrice+1*MinMove*PriceScale);
                                                FileAppend("d:\SendOrderTest.log","准备重新追加进行多头开仓------------------------------------------------");
                                                FileAppend("d:\SendOrderTest.log","多头开仓时间="+TimeToString(CurrentTime)
                                                        +" 最后一个未成交委托单索引="+Text(A_GetLastOpenOrderIndex(Enum_Buy,Enum_Entry) )
                                                        +" 某个未成交的委托单的合同号="+A_OpenOrderContractNo(A_GetLastOpenOrderIndex(Enum_Buy,Enum_Entry) ) );
                                                SetGlobalVar(2,CurrentTime);
                                        }
                                        SetGlobalVar(1,1);        //已经发送多头开仓委托单
                                }
                        }
                        Else
                        {
                                A_SendOrder(Enum_Buy,Enum_Entry,1,Q_BidPrice);
                                FileAppend("d:\SendOrderTest.log","准备开仓------------------------------------------------");
                                FileAppend("d:\SendOrderTest.log","首次多头开仓,时间="+TimeToString(CurrentTime)
                                        +" 最后一个未成交委托单索引="+Text(A_GetLastOpenOrderIndex(Enum_Buy,Enum_Entry) )
                                        +" 某个未成交的委托单的合同号="+A_OpenOrderContractNo(A_GetLastOpenOrderIndex(Enum_Buy,Enum_Entry) ));
                                SetGlobalVar(1,1);        //已经发送多头开仓委托单
                                SetGlobalVar(2,CurrentTime);
                        }
                }
        }
        
        
        If(A_BuyPosition>0 && A_BuyPosition<=1)//增仓
        {
                If(A_BuyAvgPrice<Q_BidPrice)
                {
                        //加入发单函数,将开仓的代码赋值一遍即可
                }
        }
        //If(MarketPosition==1)
        If(A_BuyPosition!=0)//平仓
        {
                SetGlobalVar(3,0);
               
                If(CrossUnder(MA3,MA15) )
                {
                        If(GetGlobalVar(3)==1)
                        {
                                If(GetGlobalVar(4)==InvalidNumeric)
                                        SetGlobalVar(4,0);        //初始化等待时间变量
                                       
                                FileAppend("d:\SendOrderTest.log","前多头平仓单的发送时间="+Text(GetGlobalVar(4) ) );
                                conWaitTime=TimeDiff(GetGlobalVar(4),CurrentTime) > waitTime || (TimeDiff(A_OpenOrderTime(A_GetLastOpenOrderIndex(Enum_Sell,Enum_Exit)),CurrentTime) > waitTime);
                                FileAppend("d:\SendOrderTest.log","最后一个未成交委托单索引="+Text(A_GetLastOpenOrderIndex(Enum_Sell,Enum_Exit) )
                                        +"未成交委托单的委托时间="+Text(A_OpenOrderTime(A_GetLastOpenOrderIndex(Enum_Sell,Enum_Exit) ) ) );
                                       
                                If(conWaitTime)
                                {
                                        FileAppend("d:\mySendOrder.log",TimeToString(currenttime)+" "+"延时已到,多头平仓单撤单重发");
                                        A_DeleteOrder(A_OpenOrderContractNo(A_GetLastOpenOrderIndex(Enum_Sell,Enum_Exit) ) );
                                        FileAppend("d:\SendOrderTest.log","撤销多头平仓的单号="+A_OpenOrderContractNo(A_GetLastOpenOrderIndex(Enum_Sell,Enum_Exit) ) );
                                }
                                If(conTrailPrice)
                                {        
                                        FileAppend("d:\mySendOrder.log","重发单之前,多头平仓单未成交委托单索引="+Text(A_GetLastOpenOrderIndex(Enum_Sell,Enum_Exit) ) );
                                        If(A_GetLastOpenOrderIndex(Enum_Sell,Enum_Exit)==InvalidNumeric)
                                        {        
                                                FileAppend("d:\mySendOrder.log","撤单已经撤完,未成交委托单索引="+Text(A_GetLastOpenOrderIndex(Enum_Sell,Enum_Exit) ) );
                                                A_SendOrder(Enum_Sell,Enum_Exit,1,Q_BidPrice-1*MinMove*PriceScale);
                                                FileAppend("d:\SendOrderTest.log","准备重新追价进行多头平仓------------------------------------------------");
                                                FileAppend("d:\SendOrderTest.log","多头开仓时间="+TimeToString(CurrentTime)
                                                        +" 最后一个未成交委托单索引="+Text(A_GetLastOpenOrderIndex(Enum_Sell,Enum_Exit) )
                                                        +" 某个未成交的委托单的合同号="+A_OpenOrderContractNo(A_GetLastOpenOrderIndex(Enum_Sell,Enum_Exit) ) );
                                                SetGlobalVar(4,CurrentTime);
                                        }
                                        SetGlobalVar(3,1);        //已经发送多头平仓委托单
                                }
                        }
                        Else
                        {
                                A_SendOrder(Enum_Sell,Enum_Exit,1,Q_BidPrice);
                                FileAppend("d:\SendOrderTest.log","准备平仓------------------------------------------------");
                                FileAppend("d:\SendOrderTest.log","首次多头平仓,时间="+TimeToString(CurrentTime)
                                        +" 最后一个未成交委托单索引="+Text(A_GetLastOpenOrderIndex(Enum_Sell,Enum_Exit) )
                                        +" 某个未成交的委托单的合同号="+A_OpenOrderContractNo(A_GetLastOpenOrderIndex(Enum_Sell,Enum_Exit) ));
                                SetGlobalVar(3,1);        //已经发送多头平仓委托单
                                SetGlobalVar(4,CurrentTime);
                        }
                        
                }
        }
End

新鱼人2013 发表于 2013-4-12 14:49:19

:)

TB2012 发表于 2013-4-27 02:33:16

写的很花哨,用Close,High,Low的话信号闪吧

s061106206 发表于 2014-7-14 15:39:19

说实话,这个程序的运行效率很低,且很占内存,因为大量的数据交互,所以建议有数据交互的地方用全局变量代替
页: [1]
查看完整版本: 使用A函数的自动开平仓系统