開(kāi)拓者 TB 強(qiáng)悍的全局變量功能 及 源碼范例 想成為開(kāi)拓者高手必看[開(kāi)拓者公式]
全自動(dòng)的程序化交易必須解決以下三大難題:
⒈既要保證交易信號(hào)的及時(shí)性,又要做到信號(hào)不能反復(fù);
⒉記錄每一次系統(tǒng)開(kāi)、平倉(cāng)的價(jià)格,以及賬戶的持倉(cāng)變動(dòng),以便進(jìn)行加減頭寸及資金管理的安排;
⒊在同一根K線上進(jìn)行交易控制,實(shí)現(xiàn)跨周期數(shù)據(jù)引用,以便精確實(shí)現(xiàn)短線交易時(shí)機(jī)的把握。
通過(guò)三天的學(xué)習(xí),依托交易開(kāi)拓者軟件全局變量的強(qiáng)大功能,我終于攻克了上述三大難關(guān)。
除了普通變量外,交易開(kāi)拓者軟件提供了三種特殊變量,它們分別是:
⒈序列變量:可以進(jìn)行數(shù)據(jù)的回溯,從而實(shí)現(xiàn)條件、循環(huán)語(yǔ)句的應(yīng)用;它的運(yùn)行特點(diǎn)是每一根BAR依次執(zhí)行,這不同于坊間文華等其它交易軟件平臺(tái)的一次性運(yùn)算。而且,它的全部函數(shù)均提供了算法,不同于黑箱的做法,有利于校對(duì)和修改。
⒉引用型變量:可以通過(guò)用戶函數(shù)的形式,進(jìn)行一勞永逸式的編寫,避免程序的冗余。
⒊全局變量:用于中間計(jì)算過(guò)程的記錄和存取,可以實(shí)現(xiàn)同一根BAR上的倉(cāng)位管理與開(kāi)平倉(cāng)價(jià)格記錄。
假設(shè)我們需要記錄當(dāng)前BAR的動(dòng)態(tài)倉(cāng)位狀態(tài),使用普通變量、序列變量都是無(wú)法完成這項(xiàng)任務(wù)的,必須使用全局變量來(lái)實(shí)施控制,并配合A_SENDORDER函數(shù)來(lái)發(fā)出買賣指令。比如,我們當(dāng)條件滿足時(shí),分別記錄買賣倉(cāng)位的動(dòng)態(tài)變化后,采用SET GLOBALVAR(0,1),記錄當(dāng)前的倉(cāng)位為1手多單,然后可以不斷改寫第一個(gè)全局變量的值,在需要讀取操作的時(shí)候,我們采用cw=getglobvar(0)的方式來(lái)實(shí)時(shí)地取回。使用全局變量時(shí)一定要進(jìn)行初始化的設(shè)置,這樣在系統(tǒng)斷線后,只要不關(guān)閉相關(guān)圖表,重連后的數(shù)據(jù)依然可以保持正確。切記不可簡(jiǎn)單使用BARSTATS的狀態(tài)來(lái)確認(rèn)全局變量,
以下的這個(gè)例子較好地表述了套利系統(tǒng)中全局變量的應(yīng)用。
Params
Bool bInitStatus(False); // 初始化標(biāo)志,修改初始倉(cāng)位時(shí)需設(shè)置為True
Numeric EveryLots(1); // 每次交易數(shù)量手?jǐn)?shù)
Numeric LongEntryPrice(-100000); // 開(kāi)多倉(cāng)的觸發(fā)價(jià)格
Numeric LongExitPrice(100000); // 平多倉(cāng)的觸發(fā)價(jià)格
Numeric ShortEntryPrice(100000); // 開(kāi)空倉(cāng)的觸發(fā)價(jià)格
Numeric ShortExitPrice(-100000); // 平空倉(cāng)的觸發(fā)價(jià)格
Numeric LongStartLots(0); // 多倉(cāng)的初始倉(cāng)位(手?jǐn)?shù)),必須是EveryLots的倍數(shù)
Numeric LongEndLots(0); // 多倉(cāng)的最大倉(cāng)位(手?jǐn)?shù)),必須是EveryLots的倍數(shù)
Numeric ShortStartLots(0); // 空倉(cāng)的初始倉(cāng)位(手?jǐn)?shù)),必須是EveryLots的倍數(shù)
Numeric ShortEndLots(0); // 空倉(cāng)的最大倉(cāng)位(手?jǐn)?shù)),必須是EveryLots的倍數(shù)
Numeric OffsetPoint(2); // 委托價(jià)格的偏移值(點(diǎn)數(shù))
Vars
Numeric SpreadUpper;
Numeric SpreadLower;
Numeric longPosition;
Numeric shortPosition;
Bool bLongEntryCon;
Bool bShortEntryCon;
Bool bLongExitCon;
Bool bShortExitCon;
Bool bTimeCon;
Numeric Data0Lots(1);
Numeric Data1Lots(2);
Begin
longPosition = GetGlobalVar(0);
shortPosition = GetGlobalVar(1);
If (BarStatus == 0)
{
If(longPosition == InvalidNumeric || bInitStatus)
{
longPosition = LongStartLots;
SetGlobalVar(0,longPosition);
}
If(shortPosition == InvalidNumeric || bInitStatus)
{
shortPosition = ShortStartLots;
SetGlobalVar(1,shortPosition);
}
}Else If(BarStatus == 2 && A_AccountID!="")
{
If(EveryLots < 1) Return;
If(Data0.Q_AskPrice <= 0 || Data0.Q_BidPrice <= 0 || Data1.Q_AskPrice <= 0 || Data1.Q_BidPrice <= 0) Return;
If(Data0.Q_BidPrice == Data0.Q_UpperLimit || Data0.Q_AskPrice == Data0.Q_LowerLimit) Return;
If(Data1.Q_BidPrice == Data1.Q_UpperLimit || Data1.Q_AskPrice == Data1.Q_LowerLimit) Return;
SpreadUpper = Data0.Q_AskPrice-Data1.Q_BidPrice;
SpreadLower = Data0.Q_BidPrice-Data1.Q_AskPrice;
// www.kzuj.com.cn
bTimeCon = true;//Time>0.0903 ;//And (Time<0.1127 Or Time>0.1333) And Time<0.1456;
bLongEntryCon = (SpreadUpper<=LongEntryPrice) && (Data0.Q_AskVol>=EveryLots && Data1.Q_BidVol>=EveryLots);
bLongExitCon = (SpreadLower>=LongExitPrice) && (Data1.Q_AskVol>=EveryLots && Data0.Q_BidVol>=EveryLots);
bShortEntryCon = (SpreadLower>=ShortEntryPrice) && (Data1.Q_AskVol>=EveryLots && Data0.Q_BidVol>=EveryLots);
bShortExitCon = (SpreadUpper<=ShortExitPrice) && (Data0.Q_AskVol>=EveryLots && Data1.Q_BidVol>=EveryLots);
If(((bLongExitCon And bTimeCon And longPosition>0) Or longPosition>LongEndLots ))
{
Data0.A_SendOrder(Enum_Sell,Enum_Exit,Data0Lots,Data0.Q_BidPrice-OffsetPoint*MinMove*PriceScale);
Data1.A_SendOrder(Enum_Buy,Enum_Exit,Data1Lots,Data1.Q_AskPrice+OffsetPoint*MinMove*PriceScale);
SetGlobalVar(0,longPosition - EveryLots);
}
If(((bShortExitCon And bTimeCon And shortPosition>0) Or shortPosition>ShortEndLots ))
{
Data0.A_SendOrder(Enum_Buy,Enum_Exit,Data0Lots,Data0.Q_AskPrice+OffsetPoint*MinMove*PriceScale);
Data1.A_SendOrder(Enum_Sell,Enum_Exit,Data1Lots,Data1.Q_BidPrice-OffsetPoint*MinMove*PriceScale);
SetGlobalVar(1,shortPosition - EveryLots);
}
//
If((bLongEntryCon And bTimeCon And longPosition<LongEndLots))
{
Data0.A_SendOrder(Enum_Buy,Enum_Entry,Data0Lots,Data0.Q_AskPrice+OffsetPoint*MinMove*PriceScale);
Data1.A_SendOrder(Enum_Sell,Enum_Entry,Data1Lots,Data1.Q_BidPrice-OffsetPoint*MinMove*PriceScale);
SetGlobalVar(0,longPosition + EveryLots);
}
If(( bShortEntryCon And bTimeCon And shortPosition<ShortEndLots))
{
Data0.A_SendOrder(Enum_Sell,Enum_Entry,Data0Lots,Data0.Q_BidPrice-OffsetPoint*MinMove*PriceScale);
Data1.A_SendOrder(Enum_Buy,Enum_Entry,Data1Lots,Data1.Q_AskPrice+OffsetPoint*MinMove*PriceScale);
SetGlobalVar(1,shortPosition + EveryLots);
}
}
Commentary("多頭倉(cāng)位="+Text(longPosition));
Commentary("空頭倉(cāng)位="+Text(shortPosition));
End
有思路,想編寫各種指標(biāo)公式,程序化交易模型,選股公式,預(yù)警公式的朋友
可聯(lián)系技術(shù)人員 QQ: 262069696 進(jìn)行 有償 編寫!(不貴!點(diǎn)擊查看價(jià)格!)
相關(guān)文章
-
沒(méi)有相關(guān)內(nèi)容