gwf_13380222 发表于 2019-12-17 22:17:24

高频交易这个案例要如何配置才能看到效果啊

策略思路:
如果多头净仓位超过最大仓位,则增加空头仓位;
如果空头净仓位超过最大仓位,则增加多头仓位。
*/
Params   
//此处添加参数   
        Integer netMaxPos(5);//净持仓上线   
        //String mySym("ag1912.SHFE");
        String mySym("i9000.SHFE");        
Vars   
//此处添加变量   
        Integer side(0);   
        Integer lMaxPos(0);   
        Integer sMaxPos(0);   
        Array<Integer> ids;   
        Global Position myPos;   
        Global Integer i(0);
Defs   
//log 输出   
        Integer LogFile(String str)   
        {        
                FileAppend(FormulaName()+".txt","["+Text(SystemDateTime())+"] "+ str);        
                Return 0;   
        }        
    //控制仓位循环发单   
    Integer trySendOrder(StringRef sym,Numeric price,Integer volume)   
    {        
            If(len(myPos.symbol)==0)        
            {            
                    A_GetPosition(sym,myPos);        
            }        
            lMaxPos=myPos.longCurrentVolume+myPos.longActiveVolume+myPos.longActiveCloseVolume;
            sMaxPos=myPos.shortCurrentVolume+myPos.shortActiveVolume+myPos.shortActiveCloseVolume;
        //多头超过最大持仓,提高空头持仓        
        If(lMaxPos>=netMaxPos)        
        {            
                side=-1;
        }
        //空头超过最大持仓,提高多头持仓
        If(sMaxPos>=netMaxPos)
        {
                side=1;
        }
        //如果有未成交单先平仓
        If(myPos.longActiveVolume !=0 || myPos.shortActiveVolume!=0 ||myPos.longActiveCloseVolume !=0 || myPos.shortActiveCloseVolume!=0)  
        {
                A_DeleteAccountOrder(sym);
                Return 1;
        }
        LogFile("try:"+Text(side)+",l="+Text(lMaxPos)+",s="+Text(sMaxPos));
        If(side>0)
        {
                if(sMaxPos==0)
                {
                        A_SendOrderEx(sym,Enum_Buy,Enum_Entry,volume,price,ids);
                }
                Else if(myPos.shortCurrentVolume >0)
                {
                        A_SendOrderEx(sym,Enum_Buy,Enum_ExitAuto,volume,price,ids);
                }
        }Else
                       {
                    if(lMaxPos==0)
                    {
                            A_SendOrderEx(sym,Enum_Sell,Enum_Entry,volume,price,ids);
                    }Else if(myPos.longCurrentVolume >0)
                    {
                            A_SendOrderEx(sym,Enum_Sell,Enum_ExitAuto,volume,price,ids);
                    }
                   }
            Return 1;
        }
Events        
    //初始化事件函数,策略运行期间,首先运行且只有一次   
    OnInit()
    {
            SubscribeBar(mySym,"10s");
    }
    //OnBarOpen 更新事件函数,参数 indexs 表示变化的数据源图层 ID 数组   
    OnBarOpen(ArrayRef<Integer> indexs)   
    {
            Range
            {
                    if(BarStatus==2)
                    {
                            If(BarCount%2==0)
                            {
                                    trySendOrder(Symbol(),Open,1);
                            }
                    }
                    }
    }
    //持仓更新事件函数,参数 pos 表示更新的持仓结构体
    OnPosition(PositionRef pos)
    {
            myPos=pos;
            LogFile("持 仓 更 新 : "+pos.symbol+",lsz="+Text(pos.longCurrentVolume)+",ssz="+Text(pos.shortCurrentVolume));
    }

        //委托更新事件函数,参数 ord 表示更新的委托结构体
        OnOrder(OrderRef ord)
    {
            //如果委托已经撤单,且撤单操作员是当前策略,则重新委托
            LogFile("委 托 更 新 : "+ord.accountId+",index="+Text(ord.orderId)+",exchOrdId="+ord.exchOrderId+","+ord.note+","+ord.createSource);
    }

wahaha2020 发表于 2020-7-6 20:00:44

有Q、A开头的函数,做不了回测的,挂个账户才行
页: [1]
查看完整版本: 高频交易这个案例要如何配置才能看到效果啊