设为首页收藏本站

 找回密码
 注册
查看: 6075|回复: 5
打印 上一主题 下一主题

自动处理中金所平今仓公式代码案例 [复制链接]

Rank: 9Rank: 9Rank: 9

精华
3
UID
2459
积分
14133
帖子
179
主题
19
阅读权限
150
注册时间
2008-9-26
最后登录
2015-12-3
跳转到指定楼层
1#
发表于 2015-11-16 11:42:24 |只看该作者 |倒序浏览
本帖最后由 hyjok 于 2015-11-16 15:20 编辑

自动处理中金所平今仓公式代码案例(实盘运行已经2个月的代码逻辑)
一、AorderDataNBuy、AorderDataNSellShort函数处理平今仓逻辑:
1、无今仓时,优先平昨仓代替开仓
2、有今仓时,优先开仓代替平仓
3、设置交易账户最大持仓手数,预先考虑资金不足时的情况,开仓达到最大持仓手数时按正常逻辑平今仓(其实TB中已经有自动处理平今仓的功能,无奈没有考虑账户资金不足的情况怎么处理,只好自己写代码实现,直接设定最大手数的方式虽然粗略,但基本够用了)

二、AutoChangeExitToday自动转换平今仓发单案例测试策略公式代码(以带止损的双均线策略为例)
TB设置忽略自动交易,由公式中的两个函数里面的A函数发单

三、Amaxlots尾盘自动锁仓下单公式

特别需要注意:
1、函数中用到"Data/[i/].Close()"调用,而且是利用忽略自动交易后Buy类函数只显示信号但A函数仍然可以发单交易的特性,因此本案例公式代码只能用于V5.1.0.16版本到V5.2.2.5版本
(TB V5.1.0.16版本起支持"Data/[i/].Close()"调用,而且保留忽略自动交易不包括A函数发单,从TB V5.2.2.5版本之后的版本起忽略自动交易包括了A函数发单,因此V5.2.2.5版本之后的版本不适用)
2、TB系统设置“中金所股指日内开仓不超过10手”,防止开仓手数超过10手限制


乐丁

Rank: 9Rank: 9Rank: 9

精华
3
UID
2459
积分
14133
帖子
179
主题
19
阅读权限
150
注册时间
2008-9-26
最后登录
2015-12-3
2#
发表于 2015-11-16 11:42:25 |只看该作者
本帖最后由 hyjok 于 2015-11-16 11:39 编辑

买入发单函数AorderDataNBuy
  1. //------------------------------------------------------------------------
  2. // 简称: AorderDataNBuy
  3. // 名称:
  4. // 类别: 用户函数
  5. // 类型: 用户函数
  6. // 输出: 布尔型
  7. //------------------------------------------------------------------------

  8. Params
  9.     Numeric DataN(0); //发单合约序列,Data0为0、Data1为1,以此类推DataN
  10.     Numeric myLots(1);//下单手数
  11.         Numeric iLastPrice(1);//1为用最新价报单,其他为对手价报单
  12.         Numeric OffSet(10);//委托偏移跳数
  13.         Numeric MaxLots(4);//对锁持仓最大手数,根据交易账户资金大小自行预设最大持仓手数
  14. Vars
  15.         Numeric myBuyPosition;
  16.         Numeric myTodayBuyPosition;
  17.         Numeric myPreDayBuyPosition;
  18.         Numeric mySellPosition;
  19.         Numeric myTodaySellPosition;
  20.         Numeric myPreDaySellPosition;
  21.         Numeric myAskPrice;
  22.         Numeric myBidPrice;
  23.         Numeric MinPoint;
  24.         Bool con;
  25. Begin
  26.     MinPoint = Data[DataN].MinMove*Data[DataN].PriceScale;
  27.         myAskPrice = IIF(iLastPrice==1,Data[DataN].Q_Last,Data[DataN].Q_AskPrice) + MinPoint*OffSet;
  28.         myBidPrice = IIF(iLastPrice==1,Data[DataN].Q_Last,Data[DataN].Q_BidPrice) - MinPoint*OffSet;
  29.     If (A_AccountID<>"")
  30.         {
  31.             myBuyPosition=Data[DataN].A_BuyPosition;
  32.                 myTodayBuyPosition=Data[DataN].A_TodayBuyPosition;
  33.                 myPreDayBuyPosition=myBuyPosition-myTodayBuyPosition;
  34.                 mySellPosition=Data[DataN].A_SellPosition;
  35.                 myTodaySellPosition=Data[DataN].A_TodaySellPosition;
  36.                 myPreDaySellPosition=mySellPosition-myTodaySellPosition;
  37.         }
  38.         if (myTodaySellPosition==0 && mySellPosition>=myLots)//无今仓时平昨仓,昨仓足够
  39.         {
  40.             con=Data[DataN].A_SendOrder(Enum_Buy,Enum_Exit,myLots,myAskPrice);
  41.                 mySellPosition = mySellPosition - myLots;
  42.         }Else
  43.         if (myTodaySellPosition==0 && mySellPosition<myLots && mySellPosition>=0)//无今仓时平昨仓,昨仓不够时有多少平多少,余下的转为开仓
  44.         {
  45.             con=Data[DataN].A_SendOrder(Enum_Buy,Enum_Exit,mySellPosition,myAskPrice);
  46.             con=Data[DataN].A_SendOrder(Enum_Buy,Enum_Entry,myLots-mySellPosition,myAskPrice);
  47.                 myTodayBuyPosition = myTodayBuyPosition + myLots-mySellPosition;
  48.                 myBuyPosition = myBuyPosition + myLots-mySellPosition;
  49.                 mySellPosition = 0;
  50.         }Else
  51.         if (myTodaySellPosition>0 && myBuyPosition + myLots<=MaxLots)//有今仓,开仓后持仓不超过MaxLots的情况,平仓转为开仓
  52.         {
  53.                 con=Data[DataN].A_SendOrder(Enum_Buy,Enum_Entry,myLots,myAskPrice);
  54.                 myTodayBuyPosition = myTodayBuyPosition + myLots;
  55.                 myBuyPosition = myBuyPosition + myLots;
  56.         }Else
  57.         if (myTodaySellPosition>0 && myBuyPosition + myLots>MaxLots)//有今仓,开仓后持仓超过MaxLots的情况,能开多少开多少,余下的转为开仓
  58.         {
  59.                 if (myBuyPosition<MaxLots)
  60.                 {
  61.                     con=Data[DataN].A_SendOrder(Enum_Buy,Enum_Entry,MaxLots-myBuyPosition,myAskPrice);
  62.                         con=Data[DataN].A_SendOrder(Enum_Buy,Enum_ExitToday,myLots-(MaxLots-myBuyPosition),myAskPrice);
  63.                         myTodaySellPosition = myTodaySellPosition - (myLots-(MaxLots-myBuyPosition));
  64.                         mySellPosition = mySellPosition - (myLots-(MaxLots-myBuyPosition));
  65.                         myTodayBuyPosition = myTodayBuyPosition + (MaxLots-myBuyPosition);
  66.                     myBuyPosition = MaxLots;
  67.                 }Else if (myBuyPosition>=MaxLots)
  68.                 {
  69.                     con=Data[DataN].A_SendOrder(Enum_Buy,Enum_ExitToday,myLots,myAskPrice);
  70.                         myTodaySellPosition = myTodaySellPosition - myLots;
  71.                         mySellPosition = mySellPosition - myLots;
  72.                 }
  73.         }
  74.     Return con;
  75. End
复制代码

使用道具 举报

Rank: 9Rank: 9Rank: 9

精华
3
UID
2459
积分
14133
帖子
179
主题
19
阅读权限
150
注册时间
2008-9-26
最后登录
2015-12-3
3#
发表于 2015-11-16 11:42:26 |只看该作者
本帖最后由 hyjok 于 2015-11-16 11:43 编辑

卖出发单函数AorderDataNSellShort
  1. //------------------------------------------------------------------------
  2. // 简称: AorderDataNSellShort
  3. // 名称:
  4. // 类别: 用户函数
  5. // 类型: 用户函数
  6. // 输出: 布尔型
  7. //------------------------------------------------------------------------

  8. Params
  9.     Numeric DataN(0); //发单合约序列,Data0为0、Data1为1,以此类推DataN
  10.     Numeric myLots(1);//下单手数
  11.         Numeric iLastPrice(1);//1为用最新价报单,其他为对手价报单
  12.         Numeric OffSet(10);//委托偏移跳数
  13.         Numeric MaxLots(4);//对锁持仓最大手数,根据交易账户资金大小自行预设最大持仓手数
  14. Vars
  15.         Numeric myBuyPosition;
  16.         Numeric myTodayBuyPosition;
  17.         Numeric myPreDayBuyPosition;
  18.         Numeric mySellPosition;
  19.         Numeric myTodaySellPosition;
  20.         Numeric myPreDaySellPosition;
  21.         Numeric myAskPrice;
  22.         Numeric myBidPrice;
  23.         Numeric MinPoint;
  24.         Bool con;
  25. Begin
  26.     MinPoint = Data[DataN].MinMove*Data[DataN].PriceScale;
  27.         myAskPrice = IIF(iLastPrice==1,Data[DataN].Q_Last,Data[DataN].Q_AskPrice) + MinPoint*OffSet;
  28.         myBidPrice = IIF(iLastPrice==1,Data[DataN].Q_Last,Data[DataN].Q_BidPrice) - MinPoint*OffSet;
  29.     If (A_AccountID<>"")
  30.         {
  31.             myBuyPosition=Data[DataN].A_BuyPosition;
  32.                 myTodayBuyPosition=Data[DataN].A_TodayBuyPosition;
  33.                 myPreDayBuyPosition=myBuyPosition-myTodayBuyPosition;
  34.                 mySellPosition=Data[DataN].A_SellPosition;
  35.                 myTodaySellPosition=Data[DataN].A_TodaySellPosition;
  36.                 myPreDaySellPosition=mySellPosition-myTodaySellPosition;
  37.         }
  38.         if (myTodayBuyPosition==0 && myBuyPosition>=myLots)
  39.         {
  40.                 con=Data[DataN].A_SendOrder(Enum_Sell,Enum_Exit,myLots,myBidPrice);
  41.                 myBuyPosition = myBuyPosition - myLots;
  42.         }Else
  43.         if (myTodayBuyPosition==0 && myBuyPosition<myLots && myBuyPosition>=0)
  44.         {
  45.                 con=Data[DataN].A_SendOrder(Enum_Sell,Enum_Exit,myBuyPosition,myBidPrice);
  46.                 con=Data[DataN].A_SendOrder(Enum_Sell,Enum_Entry,myLots-myBuyPosition,myBidPrice);
  47.                 myTodaySellPosition = myTodaySellPosition + (myLots-myBuyPosition);
  48.                 mySellPosition = mySellPosition + (myLots-myBuyPosition);
  49.                 myBuyPosition = 0;
  50.         }Else
  51.         if (myTodayBuyPosition>0 && mySellPosition + myLots<=MaxLots)//有今仓,平仓转为开仓
  52.         {
  53.                 con=Data[DataN].A_SendOrder(Enum_Sell,Enum_Entry,myLots,myBidPrice);
  54.                 myTodaySellPosition = myTodaySellPosition - myLots;
  55.                 mySellPosition = mySellPosition - myLots;
  56.         }Else
  57.         if (myTodayBuyPosition>0 && mySellPosition + myLots>MaxLots)
  58.         {
  59.                 if (mySellPosition<MaxLots)
  60.                 {
  61.                     con=Data[DataN].A_SendOrder(Enum_Sell,Enum_Entry,MaxLots-mySellPosition,myBidPrice);
  62.                         con=Data[DataN].A_SendOrder(Enum_Sell,Enum_ExitToday,myLots-(MaxLots-mySellPosition),myBidPrice);
  63.                         myTodayBuyPosition = myTodayBuyPosition - (myLots-(MaxLots-mySellPosition));
  64.                         myBuyPosition = myBuyPosition - (myLots-(MaxLots-mySellPosition));
  65.                         myTodaySellPosition = myTodaySellPosition + (MaxLots-mySellPosition);
  66.                     mySellPosition = MaxLots;
  67.                 }Else if (mySellPosition>=MaxLots)
  68.                 {
  69.                     con=Data[DataN].A_SendOrder(Enum_Sell,Enum_ExitToday,myLots,myBidPrice);
  70.                         myTodayBuyPosition = myTodayBuyPosition - myLots;
  71.                         myBuyPosition = myBuyPosition - myLots;
  72.                 }
  73.         }
  74.     Return con;
  75. End
复制代码

使用道具 举报

Rank: 9Rank: 9Rank: 9

精华
3
UID
2459
积分
14133
帖子
179
主题
19
阅读权限
150
注册时间
2008-9-26
最后登录
2015-12-3
4#
发表于 2015-11-16 11:42:27 |只看该作者
本帖最后由 hyjok 于 2015-11-16 11:44 编辑

双均线策略测试公式
  1. //------------------------------------------------------------------------
  2. // 简称: AutoChangeExitToday
  3. // 名称: 自动转换平今仓发单案例
  4. // 类别: 公式应用
  5. // 类型: 用户应用
  6. // 输出:
  7. //------------------------------------------------------------------------

  8. Params
  9.         Numeric FastLength(5);
  10.         Numeric SlowLength(20);
  11.        
  12.         Numeric DataN(0); //发单合约序列,不叠加合约时Data0为0、叠加合约Data1为1,以此类推DataN
  13.         Numeric Lots(1);
  14.         Numeric AOrder(1);//A函数发单开关,1为A函数发单,其他为不允许A函数发单
  15.         Numeric iLastPrice(1);//1为用最新价报单,其他为对手价报单
  16.         Numeric OffSet(10);//委托偏移跳数
  17.         Numeric MaxLots(4);//对锁持仓最大手数,用户根据账户资金大小预设最大持仓手数,
  18.         //应用时设置忽略所有自动交易,用A函数发单,适用于TBV5.2.3.16之前的版本(V5.2.3.16版本开始忽略自动交易也会忽略A函数发单)
  19. Vars
  20.         NumericSeries AvgValue1;
  21.         NumericSeries AvgValue2;
  22.        
  23.         Numeric myBuyPosition;
  24.         Numeric myTodayBuyPosition;
  25.         Numeric mySellPosition;
  26.         Numeric myTodaySellPosition;
  27.         Numeric myLots;
  28.         Numeric MinPoint;
  29. Begin
  30.      MinPoint = MinMove*PriceScale;
  31.      If (A_AccountID<>"" && BarStatus==2)
  32.         {
  33.             myBuyPosition=Data[DataN].A_BuyPosition;
  34.                 myTodayBuyPosition=Data[DataN].A_TodayBuyPosition;
  35.                 mySellPosition=Data[DataN].A_SellPosition;
  36.                 myTodaySellPosition=Data[DataN].A_TodaySellPosition;
  37.         }
  38.         Commentary("myBuyPosition="+Text(myBuyPosition));
  39.         Commentary("myTodayBuyPosition="+Text(myTodayBuyPosition));
  40.         Commentary("mySellPosition="+Text(mySellPosition));
  41.         Commentary("myTodaySellPosition="+Text(myTodaySellPosition));
  42.        
  43.         AvgValue1 = AverageFC(Close,FastLength);
  44.         AvgValue2 = AverageFC(Close,SlowLength);

  45.         If(MarketPosition <>1 && AvgValue1[1] > AvgValue2[1])
  46.         {
  47.                 If (AOrder==1 && GetGlobalVar(0)<>1)//全局变量的作用是控制重复发单
  48.                 {
  49.                         If (AorderDataNBuy(DataN,IIF(MarketPosition==-1,2,1)*Lots,iLastPrice,OffSet,MaxLots)) SetGlobalVar(0,1);
  50.                 }
  51.                 Buy(Lots,Open);
  52.         }
  53.        
  54.         If(MarketPosition <>-1 && AvgValue1[1] < AvgValue2[1])
  55.         {
  56.                 If (AOrder==1 && GetGlobalVar(0)<>-1)
  57.                 {
  58.                         If (AOrderDataNSellShort(DataN,IIF(MarketPosition==1,2,1)*Lots,iLastPrice,OffSet,MaxLots)) SetGlobalVar(0,-1);
  59.                 }
  60.                 SellShort(Lots,Open);
  61.         }
  62.        
  63.         If (MarketPosition==1 && C[1]<=EntryPrice*0.99)
  64.         {
  65.             If (AOrder==1 && GetGlobalVar(0)<>2)
  66.             {
  67.               If (AOrderDataNSellShort(DataN,Abs(CurrentContracts),iLastPrice,OffSet,MaxLots)) SetGlobalVar(0,2);
  68.             }
  69.             Sell(0,Open);
  70.         }
  71.         If (MarketPosition==-1 && C[1]>=EntryPrice*1.01)
  72.         {
  73.             If (AOrder==1 && GetGlobalVar(0)<>-2)
  74.             {
  75.                 If (AorderDataNBuy(DataN,Abs(CurrentContracts),iLastPrice,OffSet,MaxLots)) SetGlobalVar(0,-2);
  76.             }
  77.             BuyToCover(0,Open);
  78.         }
  79.        
  80.         PlotNumeric("MA1",AvgValue1);
  81.         PlotNumeric("MA2",AvgValue2);               
  82. End
复制代码

使用道具 举报

Rank: 9Rank: 9Rank: 9

精华
3
UID
2459
积分
14133
帖子
179
主题
19
阅读权限
150
注册时间
2008-9-26
最后登录
2015-12-3
5#
发表于 2015-11-16 14:49:40 |只看该作者
本帖最后由 hyjok 于 2015-11-16 14:52 编辑

尾盘锁仓代码
  1. //------------------------------------------------------------------------
  2. // 简称: Amaxlots
  3. // 名称: A函数锁仓下单
  4. // 类别: 公式应用
  5. // 类型: 用户应用
  6. // 输出:
  7. //------------------------------------------------------------------------
  8. //应用场景,尾盘锁仓下单,特别注意时间设置,确保其他策略在ActionTime之后不会再交易,Tick周期图表运行
  9. Params
  10.     Numeric ActionTime(1514.02);
  11.         Numeric AOrder(1);
  12.         Numeric OffSet(2);//委托偏移跳数
  13.         Numeric MaxLots(2);//对锁持仓最大手数
  14.         Numeric ABspreadTick(5);//买卖价差跳数
  15. Vars
  16.         Numeric myBuyPosition;
  17.         Numeric myTodayBuyPosition;
  18.         Numeric mySellPosition;
  19.         Numeric myTodaySellPosition;
  20.         Numeric myLots;
  21.         Numeric MinPoint;
  22.         Numeric wthd;//委托滑点
  23.         Numeric bcLots;//补充对锁手数
  24.        
  25.         Numeric i;
  26.         Numeric todayEntryLots;//今开手数
  27.     Numeric nCount;
  28. Begin
  29.     Commentary("10000*Time="+Text(10000*Time));
  30.     If (BarStatus<2) Return;
  31.         If (A_AccountID=="") Return;
  32.     MinPoint = MinMove*PriceScale;
  33.         wthd = MinPoint*OffSet;
  34.        
  35.     If (A_AccountID<>"")
  36.         {
  37.             myBuyPosition=A_BuyPosition;
  38.                 myTodayBuyPosition=A_TodayBuyPosition;
  39.                 mySellPosition=A_SellPosition;
  40.                 myTodaySellPosition=A_TodaySellPosition;
  41.         }
  42.         Commentary("myBuyPosition="+Text(myBuyPosition));
  43.         Commentary("myTodayBuyPosition="+Text(myTodayBuyPosition));
  44.         Commentary("mySellPosition="+Text(mySellPosition));
  45.         Commentary("myTodaySellPosition="+Text(myTodaySellPosition));
  46.         If (Date<>Date[1]) SetGlobalVar(2,0);
  47.         If (AOrder==1 && 10000*Time>ActionTime)
  48.         {
  49.             If (GetGlobalVar(2)==InvalidNumeric || GetGlobalVar(2)==0)
  50.                 {
  51.                     todayEntryLots = 0;
  52.                     nCount = A_GetOrderCount();
  53.             For i = 1 To nCount
  54.             {
  55.                                 If (A_OrderStatus(i)==Enum_Filled && A_OrderEntryOrExit(i)==Enum_Entry)
  56.                                 {
  57.                                     todayEntryLots = todayEntryLots + A_OrderLot(i);
  58.                                 }
  59.             }
  60.                     bcLots = MaxLots-Max(myBuyPosition,mySellPosition);
  61.                         If ((todayEntryLots+2*bcLots)>10) bcLots = IntPart((10-todayEntryLots)/2);
  62.                         SetGlobalVar(2,bcLots);
  63.                         Commentary("GetGlobalVar(2)="+Text(GetGlobalVar(2)));
  64.                         Commentary("bcLots="+Text(bcLots));
  65.                 }
  66.                
  67.             If (GetGlobalVar(2)>0 && GetGlobalVar(0)<>1 && A_GetOpenOrderCount()==0 && Q_AskPrice-Q_BidPrice<=ABspreadTick*MinPoint)
  68.                 {
  69.                     If (A_SendOrder(Enum_Sell,Enum_Entry,GetGlobalVar(2),Q_BidPrice-wthd)) SetGlobalVar(0,1);
  70.                         Return;
  71.                 }Else
  72.                 If (GetGlobalVar(2)>0 && GetGlobalVar(1)<>1 && A_GetOpenOrderCount()==0 && Q_AskPrice-Q_BidPrice<=ABspreadTick*MinPoint)
  73.                 {
  74.                     If (A_SendOrder(Enum_Buy,Enum_Entry,GetGlobalVar(2),Q_AskPrice+wthd)) SetGlobalVar(1,1);
  75.                         Return;
  76.                 }
  77.         }
  78.         Commentary("GetGlobalVar(0)="+Text(GetGlobalVar(0)));
  79.         Commentary("GetGlobalVar(1)="+Text(GetGlobalVar(1)));
  80.         Commentary("GetGlobalVar(2)="+Text(GetGlobalVar(2)));
  81. End
复制代码

使用道具 举报

Rank: 6Rank: 6

精华
0
UID
208212
积分
2006
帖子
103
主题
24
阅读权限
70
注册时间
2015-5-2
最后登录
2019-6-18
6#
发表于 2016-10-27 08:52:30 |只看该作者
赞,了不起

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

bottom

静态版|手机版|联系我们|交易开拓者 ( 粤ICP备07044698   

GMT+8, 2024-5-24 00:19

Powered by Discuz! X2 LicensedChrome插件扩展

© 2011-2012 交易开拓者 Inc.

回顶部