老师好,我想请教下,我本来想查看下我写的程序里面的止盈情况,用plotbool来标记出来,但问题却是有很多地方都标出来,有些地方我对比过数据应该有信号却没有,想请教下,问题出在哪里?
//------------------------------------------------------------------------
// 简称:
// 名称:
// 类别: 公式应用
// 类型: 用户应用
// 输出: Void
//------------------------------------------------------------------------
Params
Numeric fastlength1(13);//快线周期
Numeric slowlength1(27);//慢线周期
Numeric lots(2);//手数
Numeric n(8);//均线
numeric long_TakeProfitSet(0.07);
Numeric long_stoploss(300);
numeric short_stoploss(300);
Vars
Numeric FastLength(12);
Numeric SlowLength(26);
Numeric MACDLength(9);
Series<Numeric> MACDDiff;
series<Numeric> AvgMACD;
series<Numeric> MACDValue;
bool golden(false);
bool ending(false);
bool upDiff(false);
bool dnDiff(false);
bool con_down(false);
bool upvalue(false);
bool dnvalue(false);
series<Numeric> ma;
Numeric TR;
Numeric MinPoint;
Numeric MyEntryPrice;
series<Numeric> status;
Events
OnInit()
{
AddDataFlag(Enum_Data_AutoSwapPosition()); //设置自动换仓
}
OnBar(ArrayRef<Integer> indexs)
{
Range[0:DataSourceSize() - 1]
{
MACDDiff = xAverage(Close, FastLength ) - xAverage(Close, SlowLength ) ;
AvgMACD = XAverage(MACDDiff,MACDLength);
MACDValue = 2*(MACDDiff - AvgMACD);
ma = Average(close,n);
PlotNumeric ("ma",ma);
golden = CrossOver(MACDDiff,AvgMACD);
ending = CrossUnder(MACDDiff,AvgMACD);
//////////////////////////////////////////////////////////////////////////////////
upDiff = MACDDiff > MACDDiff[1]; //DIFF做多信号
dnDiff = MACDDiff < MACDDiff[1]; //DIFF做空信号
upvalue = MACDVALUE > MACDVALUE[1] ; //macd做多信号
dnvalue = MACDVALUE < MACDVALUE[1]; //macd做空信号
MyEntryPrice = AvgEntryPrice;
MinPoint = MinMove * PriceScale;
TR= High - Low;
Commentary("TR = " + text(TR));
////////////////////////////////////////////////////////////////////
If ( high >= round( AvgEntryPrice * (1 + long_TakeProfitSet),0)) //满足多头固定止盈条件平仓
{
sell(0 ,Round(AvgEntryPrice * (1 + Long_TakeProfitSet),0));
PlotBool("止赢",true,close);
}
If ( low <= round( AvgEntryPrice * (1 - long_TakeProfitSet),0)) //满足空头固定止盈条件平仓
{
BuyToCover(0 ,Round(AvgEntryPrice * (1 - Long_TakeProfitSet),0));
}
if(BarsSinceEntry>=1 and close < ma and MarketPosition == 1) //多头反向突破均线止损离场
{
Sell(lots,close);
}
if(BarsSinceEntry>=1 and close > ma and MarketPosition == -1)//空头反向突破均线止损离场
{
BuyToCover(lots,close);
}
if(MarketPosition == 1 and low <= AvgEntryPrice- long_stoploss) Sell(lots,AvgEntryPrice- long_stoploss);
if(MarketPosition == -1 and high >= AvgEntryPrice + short_stoploss)
{
BuyToCover(lots,AvgEntryPrice + short_stoploss);
//PlotBool("止损",true,close);
}
if (avgmacd >0 and upvalue and close > ma and MarketPosition != 1 ) //多头开仓条件
{
buy(lots ,close);
}
if (avgmacd <0 and dnvalue and close < ma and MarketPosition != -1 ) //空头开仓条件
{
sellshort(lots ,close);
}
}
}
//------------------------------------------------------------------------
// 编译版本 2022/01/09 173139
// 版权所有 20220106181726058
// 更改声明 TradeBlazer Software保留对TradeBlazer平台
// 每一版本的TradeBlazer公式修改和重写的权利
//------------------------------------------------------------------------
一个比较明显的错误是,不判断marketposition就比较多空的止盈条件,出来的结果不知道是什么。另外,多个进出场条件的情况,写的时候,真得要仔细考虑写的顺序,甚至是需要把条件合在一起进行判断的