龙听期货论坛's Archiver

龙听 发表于 2021-10-4 20:48

较完善的日内交易系统框架

**** Hidden Message *****[code]

//------------------------------------------------------------------------
// 简称: s007
// 名称:
// 类别: 交易指令
// 类型: 其他
// 输出:
//------------------------------------------------------------------------
Params
       Numeric maxLots(1);//单次开仓手数
       Numeric maxTrad(3);//最大交易次数
       Numeric splitRate(3); //交易滑点和佣金      
      
       Numeric ma1(5);
       Numeric ma2(18);
      
       Numeric tradBegin(909); //开仓时间      
       Numeric tradEnd(1440); //开仓时间      
       Numeric closeTime(1456); //bar的时间超过此值后平仓
      
       Numeric stopLoss(40); //亏损大于于此值时止损,为0不判断
       Numeric stopProfis(200); //盈利高于此值时止赢,为0不判断
      
       Numeric tracProfis(0); //盈利高于此值后执行追踪止赢,为0不判断
       Numeric tracLoss(0); //追踪止盈的回撤值,为0不判断,
      
       Numeric returnProfis(70); //盈利高于此值后执行回撤止赢,为0不判断      
            
       Numeric minProfis(10); //持仓bar数超过maxHoles后盈利小于此值平仓,为0不判断
       Numeric maxHolds(7);//为0不判断
Vars
       String fileName;      
       String fileName2;
       String toDay;
       Numeric splitDot;      //交易滑点
      
       Bool b1(False);//开多条件
       Bool b2(False);//开多条件      
      
       Bool s1(False);//开空条件
       Bool s2(False);//开空条件      
      
       Bool bc(False);//开多条件
       Bool sc(False);//开多条件
      
       Numeric tradePrice(0);//发单的价格      
      
      StringSeries  tradMem("");//交易描述      
       Numeric tradProve(0);//可否开仓:0/禁止,1/允许
       Numeric tradNum(0);//交易次数
       Numeric tradState(0);//持仓状态:0/无,1/多,-1/空      
       Numeric tradCost(0);//持仓成本
       Numeric tradIdx(0);//持仓Bar的index
       Numeric tradCyc(0);//持仓周期
       String pKey;//
       String pKeyTradProve("TRADPROVE");//
       String pKeyTradState("TRADSTATE");//
       String pKeyTradCost("TRADCOST");//
       String pKeyTradNum("TRADNUM");//
       String pKeyTradIdx("TRADIDX");//
      
       Numeric curProfit(0);//持仓当前浮动盈亏
       NumericSeries maxProfit(0);//持仓最大浮盈
       NumericSeries maxLoss(0);//持仓最大浮亏
      
      String  dopos("");//持仓处理代码
       NumericSeries m1(0);
       NumericSeries m2(0);
      
Begin
       splitDot=splitRate*MinMove();
      
      pKey=FormulaName()+SymbolName()+Text(BarType())+Text(BarInterval());
       pKeyTradProve="TRADPROVE";//
       pKeyTradState="TRADSTATE";//
       pKeyTradCost="TRADCOST";//
       pKeyTradNum="TRADNUM";//
       pKeyTradIdx="TRADIDX";//      
       //初始化
       If(BarStatus==0)
       {            
             SetTBProfileString(pKey,pKeyTradProve,Text(1));
             SetTBProfileString(pKey,pKeyTradState,Text(0));
             SetTBProfileString(pKey,pKeyTradCost,Text(0));
             SetTBProfileString(pKey,pKeyTradNum,Text(0));
             SetTBProfileString(pKey,pKeyTradIdx,Text(0));

              tradMem="";
              maxProfit=0;
              maxLoss=0;      
              Return;
       }

       if(Day !=Day[1])
       {
             SetTBProfileString(pKey,pKeyTradProve,Text(1));
             SetTBProfileString(pKey,pKeyTradState,Text(0));
             SetTBProfileString(pKey,pKeyTradCost,Text(0));
             SetTBProfileString(pKey,pKeyTradNum,Text(0));
             SetTBProfileString(pKey,pKeyTradIdx,Text(0));
            
              tradMem=" ";            
              maxProfit=0;
              maxLoss=0;            
       }      
       Else
       {
              //获取交易状态
             tradProve=Value(GetTBProfileString(pKey,pKeyTradProve));
             tradState=Value(GetTBProfileString(pKey,pKeyTradState));
             tradCost=Value(GetTBProfileString(pKey,pKeyTradCost));
             tradNum=Value(GetTBProfileString(pKey,pKeyTradNum));
             tradIdx=Value(GetTBProfileString(pKey,pKeyTradIdx));
            
              tradMem=" ";            
              maxProfit=maxProfit[1];
              maxLoss=maxLoss[1];

             m1=iTodayEMA(Open,ma1);//指标
             m2=iTodayEMA(Open,ma2);//指标

              //开仓条件
              //跌停板附近不开多仓,涨停附近不开空仓
              if(BarStatus==2)
              {
                    b1=Close>(Q_LowerLimit()+15*MinMove());
                    s1=Close<(Q_UpperLimit()-15*MinMove()) ;
              }
              Else
              {      
                    b1=Not(High==Low And High==Close Or High[1]==Low[1] );
                    s1=Not(High==Low And High==Close Or High[1]==Low[1] );
              }            
                    
             If(tradNum<=maxTrad And Time>=0.0001*tradBegin And Time<=0.0001*tradEnd)
              {
                    //开仓条件
                    bc=CrossOver(m1,m2) And b1 ;//
                    sc=CrossUnder(m1,m2) And b1 ;//                                       
              }            
      
              // 当前无仓-----------------------------------------------------------------Begin
              if(tradState==0 )
              {            
                     // 当前无仓,开始建立多头
                    if(bc)
                     {
                           if(BarStatus==2)      tradePrice= Q_AskPrice +splitDot; Else tradePrice=Open+splitDot;                          
                           If(Buy(maxLots,tradePrice))
                           {
                                 SetTBProfileString(pKey,pKeyTradProve,Text(0));
                                 SetTBProfileString(pKey,pKeyTradState,Text(1));
                                 SetTBProfileString(pKey,pKeyTradCost,Text(tradePrice));
                                 SetTBProfileString(pKey,pKeyTradNum,Text(1+tradNum));
                                 SetTBProfileString(pKey,pKeyTradIdx,Text(CurrentBar()));            
                                 tradMem="开多-"+Text(tradePrice);
                                 Commentary(tradMem);                                                                  
                           }
                     }
                     Else
                     // 当前无仓,开始建立空头
                    If(sc)
                     {
                           if(BarStatus==2)tradePrice= Q_BidPrice -splitDot; Else tradePrice=Open-splitDot;                          
                           If(SellShort(maxLots,tradePrice))
                           {
                                 SetTBProfileString(pKey,pKeyTradProve,Text(0));
                                 SetTBProfileString(pKey,pKeyTradState,Text(-1));
                                 SetTBProfileString(pKey,pKeyTradCost,Text(tradePrice));
                                 SetTBProfileString(pKey,pKeyTradNum,Text(1+tradNum));
                                 SetTBProfileString(pKey,pKeyTradIdx,Text(CurrentBar()));                                                   
                                 tradMem="开空-"+Text(tradePrice);
                                 Commentary(tradMem);                                 
                           }
                     }
              }
              // 当前无仓-----------------------------------------------------------------end
              // 当前有仓-----------------------------------------------------------------begin
              Else
              {
                    //计算当前盈亏和最大浮动盈亏
                    curProfit=tradState*(Close-tradCost);                  
                    If(BarStatus==2)
                    {                          
                          If(curProfit>maxProfit)      maxProfit=curProfit;
                          If(curProfit<maxLoss)             maxLoss=curProfit;
                     }
                     Else
                     {
                           If(tradState==1)
                           {
                                 If((High-tradCost)>maxProfit) maxProfit=(High-tradCost);
                                 If((Low-tradCost)<maxLoss)             maxLoss=(Low-tradCost);
                           }
                           If(tradState==-1)
                           {
                                 If((tradCost-Low)>maxProfit)      maxProfit=tradCost-Low;
                                 If((tradCost-High)<maxLoss)      maxLoss=tradCost-High;      
                           }
                    }                    
                    
                    //平多反空
                    If(tradState==1 And sc And tradNum<maxTrad And Time>=0.0001*tradBegin And Time<=0.0001*tradEnd)
                     {
                           if(BarStatus==2)tradePrice= Q_BidPrice -splitDot; Else tradePrice=Open-splitDot;      
                           If(SellShort(maxLots,tradePrice))
                           {
                                 tradMem="平多反空-"+Text(tradePrice);Commentary(tradMem);
                                 SetTBProfileString(pKey,pKeyTradProve,Text(1));
                                 SetTBProfileString(pKey,pKeyTradState,Text(-1));
                                 SetTBProfileString(pKey,pKeyTradCost,Text(tradePrice));
                                 SetTBProfileString(pKey,pKeyTradNum,Text(1+tradNum));
                                 SetTBProfileString(pKey,pKeyTradIdx,Text(CurrentBar()));
                                  maxProfit=0;
                                  maxLoss=0;      
                                  curProfit=0;
                           }
                     }
                    //平空反多
                    If(tradState==-1 And bc And tradNum<maxTrad And Time>=0.0001*tradBegin And Time<=0.0001*tradEnd)
                     {
                           if(BarStatus==2)      tradePrice= Q_AskPrice +splitDot; Else tradePrice=Open+splitDot;      
                           If(Buy(maxLots,tradePrice))
                           {
                                 tradMem="平空反多-"+Text(tradePrice);Commentary(tradMem);
                                 SetTBProfileString(pKey,pKeyTradProve,Text(1));
                                 SetTBProfileString(pKey,pKeyTradState,Text(1));
                                 SetTBProfileString(pKey,pKeyTradCost,Text(tradePrice));
                                 SetTBProfileString(pKey,pKeyTradNum,Text(1+tradNum));
                                 SetTBProfileString(pKey,pKeyTradIdx,Text(CurrentBar()));
                                  maxProfit=0;
                                  maxLoss=0;
                                 curProfit=0;                                 
                           }
                    }      
                    
                    tradCyc=(CurrentBar()-tradIdx);
                    tradMem="浮盈:"+Text(curProfit)+",最大浮盈:"+Text(maxProfit)+",仓期:"+Text(tradCyc);Commentary(tradMem);
                    dopos="";
                    //开仓BAR的处理
                    if(tradCyc==0)
                     {
                    
                    }                    
                    //持仓BAR的处理
                     Else
                    if(tradCyc>0)
                     {
                           //开仓后第一根BAR的处理-应对bar走完后的信号消失问题**********************************************                          
                           if(tradCyc==1)
                           {
                                。。。。。
                           }            
                           Else                          
                          dopos=DoPosition(tradState,tradCyc,curProfit,maxProfit,stopLoss,stopProfis,tracProfis,tracLoss,returnProfis,minProfis,maxHolds,closeTime);
                     }
                    
                    dopos=DoPosition(tradState,tradCyc,curProfit,maxProfit,stopLoss,stopProfis,tracProfis,tracLoss,returnProfis,minProfis,maxHolds,closeTime);
                    //统一的平仓处理-------------------------------------------------------------------------------------------
                    if(Len(dopos)>2)
                     {
                           //处理交易价格,叫卖叫买价加上滑点,便于成交
                           if(BarStatus==2)
                           {
                                  If(tradState==1)        tradePrice= Q_BidPrice -splitDot;
                                  If(tradState==-1)        tradePrice= Q_AskPrice +splitDot;
                           }Else tradePrice=Close-tradState*splitDot;
                          
                           //平多
                           If(tradState==1)
                           {
                                 If(Sell(maxLots,tradePrice))
                                  {
                                        tradMem=dopos+":平多-"+Text(tradePrice);
                                        SetTBProfileString(pKey,pKeyTradProve,Text(1));
                                        SetTBProfileString(pKey,pKeyTradState,Text(0));                                       
                                        maxProfit=0;
                                        maxLoss=0;
                                  }
                           }
                           //平空
                           If(tradState==-1)
                           {
                                 If(BuyToCover(maxLots,tradePrice))
                                  {
                                        tradMem=dopos+":平空-"+Text(tradePrice);
                                        SetTBProfileString(pKey,pKeyTradProve,Text(1));
                                        SetTBProfileString(pKey,pKeyTradState,Text(0));                                       
                                        maxProfit=0;
                                        maxLoss=0;                                       
                                  }
                           }            
                           Commentary(tradMem);                  
                    }                    
              }                                
       }
End[/code]

西门斯 发表于 2021-10-7 08:51

谢谢

无往不利 发表于 2021-12-22 11:44

学习了

无往不利 发表于 2021-12-22 11:46

隐藏了啥内容?

清风 发表于 2022-4-10 23:41

这么长的代码{:funk:}

丛林猎人 发表于 2022-11-21 14:23

不错,研究,学习,思考

丛林猎人 发表于 2022-11-21 14:28

为啥不能用啊

萱花酱 发表于 2023-2-26 16:11

学习

萱花酱 发表于 2024-6-28 17:05

学习

沈小凤 发表于 2024-10-5 09:01

谢谢!学习了。

沈小凤 发表于 2024-10-5 09:02

[b]回复 [url=http://www.qhlt.cn/redirect.php?goto=findpost&pid=138288&ptid=115028]1#[/url] [i]龙听[/i] [/b]
谢谢!

沈小凤 发表于 2024-10-5 09:02

太牛了, 厉害!

理信 发表于 2024-10-6 09:26

进来学习

页: [1]