完善的日內交易系統框架源碼 可處理信號反復問題
作者:開拓者 TB 來源:cxh99.com 發布時間:2012年10月20日
- 源碼內容:
//------------------------------------------------------------------------
// 簡稱: s007
// 名稱: 來源 www.tumamayizhan.com
// 類別: 交易指令
// 類型: 其他
// 輸出:
//------------------------------------------------------------------------
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
- 補充說明: m1=iTodayEMA(Open,ma1);//指標
m2=iTodayEMA(Open,ma2);//指標
dopos=DoPosition(tradState,tradCyc,curProfit,maxProfit,stopLoss,stopProfis,tracProfis,tracLoss,returnProfis,minProfis,maxHolds,closeTime);
是用戶函數,自己編吧。
- 該指令采用文件方式保存開平倉狀態,可以解決開倉bar走完后,信號又消失的問題!