自動(dòng)處理中金所平今倉公式代碼案例 [開拓者 TB]
- 咨詢內(nèi)容:
本帖最后由 hyjok 于 2015-11-16 15:20 編輯
自動(dòng)處理中金所平今倉公式代碼案例(實(shí)盤運(yùn)行已經(jīng)2個(gè)月的代碼邏輯)
一、AorderDataNBuy、AorderDataNSellShort函數(shù)處理平今倉邏輯:
1、無今倉時(shí),優(yōu)先平昨倉代替開倉
2、有今倉時(shí),優(yōu)先開倉代替平倉
3、設(shè)置交易賬戶最大持倉手?jǐn)?shù),預(yù)先考慮資金不足時(shí)的情況,開倉達(dá)到最大持倉手?jǐn)?shù)時(shí)按正常邏輯平今倉(其實(shí)TB中已經(jīng)有自動(dòng)處理平今倉的功能,無奈沒有考慮賬戶資金不足的情況怎么處理,只好自己寫代碼實(shí)現(xiàn),直接設(shè)定最大手?jǐn)?shù)的方式雖然粗略,但基本夠用了)
二、AutoChangeExitToday自動(dòng)轉(zhuǎn)換平今倉發(fā)單案例測(cè)試策略公式代碼(以帶止損的雙均線策略為例)
TB設(shè)置忽略自動(dòng)交易,由公式中的兩個(gè)函數(shù)里面的A函數(shù)發(fā)單
三、Amaxlots尾盤自動(dòng)鎖倉下單公式
特別需要注意:
1、函數(shù)中用到"Data/[i/].Close()"調(diào)用,而且是利用忽略自動(dòng)交易后Buy類函數(shù)只顯示信號(hào)但A函數(shù)仍然可以發(fā)單交易的特性,因此本案例公式代碼只能用于V5.1.0.16版本到V5.2.2.5版本
(TB V5.1.0.16版本起支持"Data/[i/].Close()"調(diào)用,而且保留忽略自動(dòng)交易不包括A函數(shù)發(fā)單,從TB V5.2.2.5版本之后的版本起忽略自動(dòng)交易包括了A函數(shù)發(fā)單,因此V5.2.2.5版本之后的版本不適用)
2、TB系統(tǒng)設(shè)置“中金所股指日內(nèi)開倉不超過10手”,防止開倉手?jǐn)?shù)超過10手限制
- TB技術(shù)人員:
本帖最后由 hyjok 于 2015-11-16 11:39 編輯
買入發(fā)單函數(shù)AorderDataNBuy- //------------------------------------------------------------------------
- // 簡稱: AorderDataNBuy
- // 名稱:
- // 類別: 用戶函數(shù)
- // 類型: 用戶函數(shù)
- // 輸出: 布爾型
- //------------------------------------------------------------------------
- Params
- Numeric DataN(0); //發(fā)單合約序列,Data0為0、Data1為1,以此類推DataN
- Numeric myLots(1);//下單手?jǐn)?shù)
- Numeric iLastPrice(1);//1為用最新價(jià)報(bào)單,其他為對(duì)手價(jià)報(bào)單
- Numeric OffSet(10);//委托偏移跳數(shù)
- Numeric MaxLots(4);//對(duì)鎖持倉最大手?jǐn)?shù),根據(jù)交易賬戶資金大小自行預(yù)設(shè)最大持倉手?jǐn)?shù)
- Vars
- Numeric myBuyPosition;
- Numeric myTodayBuyPosition;
- Numeric myPreDayBuyPosition;
- Numeric mySellPosition;
- Numeric myTodaySellPosition;
- Numeric myPreDaySellPosition;
- Numeric myAskPrice;
- Numeric myBidPrice;
- Numeric MinPoint;
- Bool con;
- Begin
- MinPoint = Data[DataN].MinMove*Data[DataN].PriceScale;
- myAskPrice = IIF(iLastPrice==1,Data[DataN].Q_Last,Data[DataN].Q_AskPrice) + MinPoint*OffSet;
- myBidPrice = IIF(iLastPrice==1,Data[DataN].Q_Last,Data[DataN].Q_BidPrice) - MinPoint*OffSet;
- If (A_AccountID<>"")
- {
- myBuyPosition=Data[DataN].A_BuyPosition;
- myTodayBuyPosition=Data[DataN].A_TodayBuyPosition;
- myPreDayBuyPosition=myBuyPosition-myTodayBuyPosition;
- mySellPosition=Data[DataN].A_SellPosition;
- myTodaySellPosition=Data[DataN].A_TodaySellPosition;
- myPreDaySellPosition=mySellPosition-myTodaySellPosition;
- }
- if (myTodaySellPosition==0 && mySellPosition>=myLots)//無今倉時(shí)平昨倉,昨倉足夠
- {
- con=Data[DataN].A_SendOrder(Enum_Buy,Enum_Exit,myLots,myAskPrice);
- mySellPosition = mySellPosition - myLots;
- }Else
- if (myTodaySellPosition==0 && mySellPosition<myLots && mySellPosition>=0)//無今倉時(shí)平昨倉,昨倉不夠時(shí)有多少平多少,余下的轉(zhuǎn)為開倉
- {
- con=Data[DataN].A_SendOrder(Enum_Buy,Enum_Exit,mySellPosition,myAskPrice);
- con=Data[DataN].A_SendOrder(Enum_Buy,Enum_Entry,myLots-mySellPosition,myAskPrice);
- myTodayBuyPosition = myTodayBuyPosition + myLots-mySellPosition;
- myBuyPosition = myBuyPosition + myLots-mySellPosition;
- mySellPosition = 0;
- }Else
- if (myTodaySellPosition>0 && myBuyPosition + myLots<=MaxLots)//有今倉,開倉后持倉不超過MaxLots的情況,平倉轉(zhuǎn)為開倉
- {
- con=Data[DataN].A_SendOrder(Enum_Buy,Enum_Entry,myLots,myAskPrice);
- myTodayBuyPosition = myTodayBuyPosition + myLots;
- myBuyPosition = myBuyPosition + myLots;
- }Else
- if (myTodaySellPosition>0 && myBuyPosition + myLots>MaxLots)//有今倉,開倉后持倉超過MaxLots的情況,能開多少開多少,余下的轉(zhuǎn)為開倉
- {
- if (myBuyPosition<MaxLots)
- {
- con=Data[DataN].A_SendOrder(Enum_Buy,Enum_Entry,MaxLots-myBuyPosition,myAskPrice);
- con=Data[DataN].A_SendOrder(Enum_Buy,Enum_ExitToday,myLots-(MaxLots-myBuyPosition),myAskPrice);
- myTodaySellPosition = myTodaySellPosition - (myLots-(MaxLots-myBuyPosition));
- mySellPosition = mySellPosition - (myLots-(MaxLots-myBuyPosition));
- myTodayBuyPosition = myTodayBuyPosition + (MaxLots-myBuyPosition);
- myBuyPosition = MaxLots;
- }Else if (myBuyPosition>=MaxLots)
- {
- con=Data[DataN].A_SendOrder(Enum_Buy,Enum_ExitToday,myLots,myAskPrice);
- myTodaySellPosition = myTodaySellPosition - myLots;
- mySellPosition = mySellPosition - myLots;
- }
- }
- Return con;
- End
- //------------------------------------------------------------------------
- TB客服:
本帖最后由 hyjok 于 2015-11-16 11:43 編輯
賣出發(fā)單函數(shù)AorderDataNSellShort- //------------------------------------------------------------------------
- // 簡稱: AorderDataNSellShort
- // 名稱:
- // 類別: 用戶函數(shù)
- // 類型: 用戶函數(shù)
- // 輸出: 布爾型
- //------------------------------------------------------------------------
- Params
- Numeric DataN(0); //發(fā)單合約序列,Data0為0、Data1為1,以此類推DataN
- Numeric myLots(1);//下單手?jǐn)?shù)
- Numeric iLastPrice(1);//1為用最新價(jià)報(bào)單,其他為對(duì)手價(jià)報(bào)單
- Numeric OffSet(10);//委托偏移跳數(shù)
- Numeric MaxLots(4);//對(duì)鎖持倉最大手?jǐn)?shù),根據(jù)交易賬戶資金大小自行預(yù)設(shè)最大持倉手?jǐn)?shù)
- Vars
- Numeric myBuyPosition;
- Numeric myTodayBuyPosition;
- Numeric myPreDayBuyPosition;
- Numeric mySellPosition;
- Numeric myTodaySellPosition;
- Numeric myPreDaySellPosition;
- Numeric myAskPrice;
- Numeric myBidPrice;
- Numeric MinPoint;
- Bool con;
- Begin
- MinPoint = Data[DataN].MinMove*Data[DataN].PriceScale;
- myAskPrice = IIF(iLastPrice==1,Data[DataN].Q_Last,Data[DataN].Q_AskPrice) + MinPoint*OffSet;
- myBidPrice = IIF(iLastPrice==1,Data[DataN].Q_Last,Data[DataN].Q_BidPrice) - MinPoint*OffSet;
- If (A_AccountID<>"")
- {
- myBuyPosition=Data[DataN].A_BuyPosition;
- myTodayBuyPosition=Data[DataN].A_TodayBuyPosition;
- myPreDayBuyPosition=myBuyPosition-myTodayBuyPosition;
- mySellPosition=Data[DataN].A_SellPosition;
- myTodaySellPosition=Data[DataN].A_TodaySellPosition;
- myPreDaySellPosition=mySellPosition-myTodaySellPosition;
- }
- if (myTodayBuyPosition==0 && myBuyPosition>=myLots)
- {
- con=Data[DataN].A_SendOrder(Enum_Sell,Enum_Exit,myLots,myBidPrice);
- myBuyPosition = myBuyPosition - myLots;
- }Else
- if (myTodayBuyPosition==0 && myBuyPosition<myLots && myBuyPosition>=0)
- {
- con=Data[DataN].A_SendOrder(Enum_Sell,Enum_Exit,myBuyPosition,myBidPrice);
- con=Data[DataN].A_SendOrder(Enum_Sell,Enum_Entry,myLots-myBuyPosition,myBidPrice);
- myTodaySellPosition = myTodaySellPosition + (myLots-myBuyPosition);
- mySellPosition = mySellPosition + (myLots-myBuyPosition);
- myBuyPosition = 0;
- }Else
- if (myTodayBuyPosition>0 && mySellPosition + myLots<=MaxLots)//有今倉,平倉轉(zhuǎn)為開倉
- {
- con=Data[DataN].A_SendOrder(Enum_Sell,Enum_Entry,myLots,myBidPrice);
- myTodaySellPosition = myTodaySellPosition - myLots;
- mySellPosition = mySellPosition - myLots;
- }Else
- if (myTodayBuyPosition>0 && mySellPosition + myLots>MaxLots)
- {
- if (mySellPosition<MaxLots)
- {
- con=Data[DataN].A_SendOrder(Enum_Sell,Enum_Entry,MaxLots-mySellPosition,myBidPrice);
- con=Data[DataN].A_SendOrder(Enum_Sell,Enum_ExitToday,myLots-(MaxLots-mySellPosition),myBidPrice);
- myTodayBuyPosition = myTodayBuyPosition - (myLots-(MaxLots-mySellPosition));
- myBuyPosition = myBuyPosition - (myLots-(MaxLots-mySellPosition));
- myTodaySellPosition = myTodaySellPosition + (MaxLots-mySellPosition);
- mySellPosition = MaxLots;
- }Else if (mySellPosition>=MaxLots)
- {
- con=Data[DataN].A_SendOrder(Enum_Sell,Enum_ExitToday,myLots,myBidPrice);
- myTodayBuyPosition = myTodayBuyPosition - myLots;
- myBuyPosition = myBuyPosition - myLots;
- }
- }
- Return con;
- End
- //------------------------------------------------------------------------
- 網(wǎng)友回復(fù):
本帖最后由 hyjok 于 2015-11-16 11:44 編輯
雙均線策略測(cè)試公式- //------------------------------------------------------------------------
- // 簡稱: AutoChangeExitToday
- // 名稱: 自動(dòng)轉(zhuǎn)換平今倉發(fā)單案例
- // 類別: 公式應(yīng)用
- // 類型: 用戶應(yīng)用
- // 輸出:
- //------------------------------------------------------------------------
- Params
- Numeric FastLength(5);
- Numeric SlowLength(20);
-
- Numeric DataN(0); //發(fā)單合約序列,不疊加合約時(shí)Data0為0、疊加合約Data1為1,以此類推DataN
- Numeric Lots(1);
- Numeric AOrder(1);//A函數(shù)發(fā)單開關(guān),1為A函數(shù)發(fā)單,其他為不允許A函數(shù)發(fā)單
- Numeric iLastPrice(1);//1為用最新價(jià)報(bào)單,其他為對(duì)手價(jià)報(bào)單
- Numeric OffSet(10);//委托偏移跳數(shù)
- Numeric MaxLots(4);//對(duì)鎖持倉最大手?jǐn)?shù),用戶根據(jù)賬戶資金大小預(yù)設(shè)最大持倉手?jǐn)?shù),
- //應(yīng)用時(shí)設(shè)置忽略所有自動(dòng)交易,用A函數(shù)發(fā)單,適用于TBV5.2.3.16之前的版本(V5.2.3.16版本開始忽略自動(dòng)交易也會(huì)忽略A函數(shù)發(fā)單)
- Vars
- NumericSeries AvgValue1;
- NumericSeries AvgValue2;
-
- Numeric myBuyPosition;
- Numeric myTodayBuyPosition;
- Numeric mySellPosition;
- Numeric myTodaySellPosition;
- Numeric myLots;
- Numeric MinPoint;
- Begin
- MinPoint = MinMove*PriceScale;
- If (A_AccountID<>"" && BarStatus==2)
- {
- myBuyPosition=Data[DataN].A_BuyPosition;
- myTodayBuyPosition=Data[DataN].A_TodayBuyPosition;
- mySellPosition=Data[DataN].A_SellPosition;
- myTodaySellPosition=Data[DataN].A_TodaySellPosition;
- }
- Commentary("myBuyPosition="+Text(myBuyPosition));
- Commentary("myTodayBuyPosition="+Text(myTodayBuyPosition));
- Commentary("mySellPosition="+Text(mySellPosition));
- Commentary("myTodaySellPosition="+Text(myTodaySellPosition));
-
- AvgValue1 = AverageFC(Close,FastLength);
- AvgValue2 = AverageFC(Close,SlowLength);
- If(MarketPosition <>1 && AvgValue1[1] > AvgValue2[1])
- {
- If (AOrder==1 && GetGlobalVar(0)<>1)//全局變量的作用是控制重復(fù)發(fā)單
- {
- If (AorderDataNBuy(DataN,IIF(MarketPosition==-1,2,1)*Lots,iLastPrice,OffSet,MaxLots)) SetGlobalVar(0,1);
- }
- Buy(Lots,Open);
- }
-
- If(MarketPosition <>-1 && AvgValue1[1] < AvgValue2[1])
- {
- If (AOrder==1 && GetGlobalVar(0)<>-1)
- {
- If (AOrderDataNSellShort(DataN,IIF(MarketPosition==1,2,1)*Lots,iLastPrice,OffSet,MaxLots)) SetGlobalVar(0,-1);
- }
- SellShort(Lots,Open);
- }
-
- If (MarketPosition==1 && C[1]<=EntryPrice*0.99)
- {
- If (AOrder==1 && GetGlobalVar(0)<>2)
- {
- If (AOrderDataNSellShort(DataN,Abs(CurrentContracts),iLastPrice,OffSet,MaxLots)) SetGlobalVar(0,2);
- }
- Sell(0,Open);
- }
- If (MarketPosition==-1 && C[1]>=EntryPrice*1.01)
- {
- If (AOrder==1 && GetGlobalVar(0)<>-2)
- {
- If (AorderDataNBuy(DataN,Abs(CurrentContracts),iLastPrice,OffSet,MaxLots)) SetGlobalVar(0,-2);
- }
- BuyToCover(0,Open);
- }
-
- PlotNumeric("MA1",AvgValue1);
- PlotNumeric("MA2",AvgValue2);
- End
- //------------------------------------------------------------------------
- 網(wǎng)友回復(fù):
本帖最后由 hyjok 于 2015-11-16 14:52 編輯
尾盤鎖倉代碼- //------------------------------------------------------------------------
- // 簡稱: Amaxlots
- // 名稱: A函數(shù)鎖倉下單
- // 類別: 公式應(yīng)用
- // 類型: 用戶應(yīng)用
- // 輸出:
- //------------------------------------------------------------------------
- //應(yīng)用場景,尾盤鎖倉下單,特別注意時(shí)間設(shè)置,確保其他策略在ActionTime之后不會(huì)再交易,Tick周期圖表運(yùn)行
- Params
- Numeric ActionTime(1514.02);
- Numeric AOrder(1);
- Numeric OffSet(2);//委托偏移跳數(shù)
- Numeric MaxLots(2);//對(duì)鎖持倉最大手?jǐn)?shù)
- Numeric ABspreadTick(5);//買賣價(jià)差跳數(shù)
- Vars
- Numeric myBuyPosition;
- Numeric myTodayBuyPosition;
- Numeric mySellPosition;
- Numeric myTodaySellPosition;
- Numeric myLots;
- Numeric MinPoint;
- Numeric wthd;//委托滑點(diǎn)
- Numeric bcLots;//補(bǔ)充對(duì)鎖手?jǐn)?shù)
-
- Numeric i;
- Numeric todayEntryLots;//今開手?jǐn)?shù)
- Numeric nCount;
- Begin
- Commentary("10000*Time="+Text(10000*Time));
- If (BarStatus<2) Return;
- If (A_AccountID=="") Return;
- MinPoint = MinMove*PriceScale;
- wthd = MinPoint*OffSet;
-
- If (A_AccountID<>"")
- {
- myBuyPosition=A_BuyPosition;
- myTodayBuyPosition=A_TodayBuyPosition;
- mySellPosition=A_SellPosition;
- myTodaySellPosition=A_TodaySellPosition;
- }
- Commentary("myBuyPosition="+Text(myBuyPosition));
- Commentary("myTodayBuyPosition="+Text(myTodayBuyPosition));
- Commentary("mySellPosition="+Text(mySellPosition));
- Commentary("myTodaySellPosition="+Text(myTodaySellPosition));
- If (Date<>Date[1]) SetGlobalVar(2,0);
- If (AOrder==1 && 10000*Time>ActionTime)
- {
- If (GetGlobalVar(2)==InvalidNumeric || GetGlobalVar(2)==0)
- {
- todayEntryLots = 0;
- nCount = A_GetOrderCount();
- For i = 1 To nCount
- {
- If (A_OrderStatus(i)==Enum_Filled && A_OrderEntryOrExit(i)==Enum_Entry)
- {
- todayEntryLots = todayEntryLots + A_OrderLot(i);
- }
- }
- bcLots = MaxLots-Max(myBuyPosition,mySellPosition);
- If ((todayEntryLots+2*bcLots)>10) bcLots = IntPart((10-todayEntryLots)/2);
- SetGlobalVar(2,bcLots);
- Commentary("GetGlobalVar(2)="+Text(GetGlobalVar(2)));
- Commentary("bcLots="+Text(bcLots));
- }
-
- If (GetGlobalVar(2)>0 && GetGlobalVar(0)<>1 && A_GetOpenOrderCount()==0 && Q_AskPrice-Q_BidPrice<=ABspreadTick*MinPoint)
- {
- If (A_SendOrder(Enum_Sell,Enum_Entry,GetGlobalVar(2),Q_BidPrice-wthd)) SetGlobalVar(0,1);
- Return;
- }Else
- If (GetGlobalVar(2)>0 && GetGlobalVar(1)<>1 && A_GetOpenOrderCount()==0 && Q_AskPrice-Q_BidPrice<=ABspreadTick*MinPoint)
- {
- If (A_SendOrder(Enum_Buy,Enum_Entry,GetGlobalVar(2),Q_AskPrice+wthd)) SetGlobalVar(1,1);
- Return;
- }
- }
- Commentary("GetGlobalVar(0)="+Text(GetGlobalVar(0)));
- Commentary("GetGlobalVar(1)="+Text(GetGlobalVar(1)));
- Commentary("GetGlobalVar(2)="+Text(GetGlobalVar(2)));
- End
- //------------------------------------------------------------------------
有思路,想編寫各種指標(biāo)公式,程序化交易模型,選股公式,預(yù)警公式的朋友
可聯(lián)系技術(shù)人員 QQ: 511411198 進(jìn)行 有償 編寫!(不貴!點(diǎn)擊查看價(jià)格!)
相關(guān)文章
-
沒有相關(guān)內(nèi)容