Params
Numeric OpenLen(3); //用于计算开盘价指数移动平均的周期
Numeric CloseLen(3); //用于计算收盘价指数移动平均的周期
Vars
NumericSeries Histogram; //记录开盘价的指数移动平均与收盘价的指数移动平均之差
NumericSeries BuyPrice; //多头触发价格
NumericSeries LongExitPrice; //多头平仓触发价格
NumericSeries Con1; //判断是否为上升趋势
NumericSeries Con2; //判断是否为下降趋势
NumericSeries ATR10; //ATR
Numeric N; //下单手数
Numeric SH; //平仓参数
Numeric RLP,FLP; //涨跌停价
Numeric BIDP,ASKP; //买卖一价
Numeric BRP,SRP; //多空头可用持仓
Numeric OPFLG; //模型处理标志
Numeric BKDFLG; //买开处理标志
Numeric BPDFLG; //买平处理标志
Global_Numeric BKID,SKID; //开仓委托
Global_Numeric BPID,SPID; //平仓委托
Global_Numeric BKFLG,SKFLG; //开仓标志
Global_Numeric BPFLG,SPFLG; //平仓标志
Global_Numeric BKM,SKM; //开仓委托手数
Global_Numeric BPM,SPM; //平仓委托手数
Global_Numeric BKP,SKP; //开仓委托价格
Global_Numeric BPP,SPP; //平仓委托价格
Begin
PlotNumeric("MA1", Ema(Close,CloseLen) );
PlotNumeric("MA2", Ema(Open,OpenLen) );
//------------------------信号发出------------------------//
If(1) //信号发出
{
//条件设置
Histogram = Ema(Close,CloseLen) - Ema(Open,OpenLen);
Con1 = CrossUp(Histogram,0);
Con2 = CrossDown(Histogram,0);
ATR10 = Ma(TrueRange,10);
//设置多头入场触发价与多头平仓触发价
If(Con1 == 1)
{
BuyPrice = High + ATR10 * 0.5;
LongExitPrice = Low - ATR10 * 0.5;
}
//满足上升趋势且向上突破触发价则进场做多
If(Histogram[1] > 0 && Vol > 0)
{
If(High >= BuyPrice) //最高价>买入触发价
{
BK(DefaultVol,Max(Open,BuyPrice));
}
}
//转为下降趋势多头平仓出场
If(MarketPosition == 1 && BarsSinceEntry > 0 && Con2[1] && Vol > 0)
{
SP(DefaultVol,Open);
}
//向下突破多头平仓触发价格则多头平仓出场
If(MarketPosition == 1 && BarsSinceEntry > 0 && low <= LongExitPrice && Vol > 0)
{
SP(DefaultVol,Min(Open,LongExitPrice));
}
//在图表上显示多头进场触发价格
If(MarketPosition == 0 && Histogram > 0 && BuyPrice>0)
{
PlotNumeric("BuyPrice",BuyPrice);
}
//持有多仓,输出多头平仓触发价格
If(MarketPosition == 1)
{
PlotNumeric("LongExitPrice",LongExitPrice);
}
}
//------------------------处理开启------------------------//
If(A_IsExchangeOpen() == 1) //如果是开盘状态
{
If(BarStatus() == 2) //如果不带入历史值
{
If(RunStart() == 1) //如果已初始化成功
{
OPFLG = 1; //开启模型处理
}
}
}
//------------------------变量赋值------------------------//
If(OPFLG == 1) //变量赋值
{
N = 1; //下单手数
BIDP = Price("Bid1"); //买一价
ASKP = Price("Ask1"); //卖一价
RLP = Price("RiseLimit"); //涨停价
FLP = Price("FallLimit"); //跌停价
BRP = F_BuyRemainPosition(); //多头可用持仓
BRP = Min(BRP,A_BuyRemainPosition()); //多头可用持仓
If(A_IsSHCode() == 1) //如果是上期所合约
{
SH = Enum_ExitToday; //平仓参数
}
Else //如果非上期所合约
{
SH = Enum_Exit; //平仓参数
}
}
//------------------------信号处理------------------------//
If(OPFLG == 1) //信号处理
{
If(F_FreshSig() == 1) //如果当前信号是未处理过的信号
{
If(F_SigValid() == 1) //如果当前信号未消失
{
If(F_Sig() == Sig_BK) //如果信号类型为BK
{
Commentary("【BK信号!】");
BKDFLG = 1; //开启买开处理
}
Else If(F_Sig() == Sig_BP) //如果信号类型为BP
{
Commentary("【BP信号!】");
BPDFLG = 1; //开启买平处理
}
}
}
}
//------------------------成交判断------------------------//
If(OPFLG == 1) //成交判断
{
If(BKFLG == 1) //如果有买开委托
{
If(F_OrderStatus(BKID) == Enum_Filled) //如果买开委托成交
{
Commentary("【BK信号:买开委托成交!】");
BKFLG = 0; //买开标志归0
}
}
If(BPFLG == 1) //如果有买平委托
{
If(F_OrderStatus(BPID) == Enum_Filled) //如果买平委托成交
{
Commentary("【BP信号:买平委托成交!】");
BPFLG = 0; //买平标志归0
}
}
}
//------------------------委托处理------------------------//
If(OPFLG == 1) //委托处理
{
If(BKDFLG == 1) //如果已开启买开处理
{
If(BKFLG == 0) //如果没有买开委托
{
BKM = N; //买开委托手数
BKP = ASKP; //买开委托价格
Commentary("【BK信号:买开委托发出!】");
BKID = A_SendOrder(Enum_Buy,Enum_Entry,BKM,BKP); //发出买开委托
BKFLG = 1; //已发出买开委托
}
}
If(BPDFLG == 1) //如果已开启买平处理
{
If(BPFLG == 0) //如果没有买平委托
{
If(SRP > 0) //如果有空头可用持仓
{
BPM = SRP; //买平委托手数
BPP = RLP; //买平委托价格
Commentary("【BP信号:买平委托发出!】");
BPID = A_SendOrder(Enum_Buy,SH,BPM,BPP); //发出买平委托
BPFLG = 1; //已发出买平委托
}
}
}
}
End