完善的日内交易系统框架源码 可处理信号反复问题[开拓者公式]
- 源码内容:
//------------------------------------------------------------------------
// 简称: s007
// 名称: 来源 WWW.CXH99.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走完后,信号又消失的问题!
有思路,想编写各种指标公式,程序化交易模型,选股公式,预警公式的朋友
可联系技术人员 QQ: 262069696 进行 有偿 编写!(不贵!点击查看价格!)
相关文章
-
没有相关内容