- 精华
- 0
- 在线时间
- 37 小时
- UID
- 189789
- 积分
- 3
- 帖子
- 2
- 阅读权限
- 10
- 注册时间
- 2014-7-2
- 最后登录
- 2015-12-10
- 精华
- 0
- UID
- 189789
- 积分
- 3
- 帖子
- 2
- 主题
- 1
- 阅读权限
- 10
- 注册时间
- 2014-7-2
- 最后登录
- 2015-12-10
|
我的模型是用在3分钟周期的棕榈油上,偶尔会发生超过止损点位很多却不执行止损的问题,止损部分的代码我是直接复制使用手册里的实例,以下是源码,请帮我找出问题所在,谢谢!
/------------------------------------------------------------------------
// 简称: P9888JYXT
// 名称: 棕榈油3分钟交易系统
// 类别: 公式应用
// 类型: 用户应用
//------------------------------------------------------------------------
Params
Numeric Lots(1);
Numeric MAzq(90);
Numeric BK1diff(1.8);
Numeric SK1diff(-1.9);
Numeric BK2macd(0.8);
Numeric SK2macd(2.1);
Numeric Time_SWk(09.00);
Numeric Time_XWzhK(23.05);
Numeric time_XWqp(23.20);
Numeric BKadx1(10);
Numeric BKadx2(58);
Numeric BKkd(79);
Numeric BKboll(20);
Numeric SKadx1(18);
Numeric SKadx2(68);
Numeric SKkd(20);
Numeric SKboll(8);
//////////////////////////////////////////////////////
Numeric StopLossSetB(9); // 止损设置
Numeric TrailingStop1B(35); // 跟踪止损设置1
Numeric TrailingStart1B(0); // 跟踪止损启动设置1
Numeric StopLossSetS(9); // 止损设置
Numeric TrailingStop1S(36); // 跟踪止损设置1
Numeric TrailingStart1S(0); // 跟踪止损启动设置1
Vars
NumericSeries MACD;
NumericSeries MACDav;
NumericSeries MACDDiff;
NumericSeries UpLine; //上轨
NumericSeries DownLine; //下轨
NumericSeries MidLine; //中间线
Numeric Band;
NumericSeries MA60;
Numeric up_x;
Numeric down_x;
Numeric min_x;
Numeric zhangtingK;
Numeric dietingK;
Numeric zhangting;
Numeric dieting;
Numeric MinPoint; // 一个最小变动单位,也就是一跳
Numeric MyEntryPrice; // 开仓价格
Numeric MyExitPrice; // 平仓价格
NumericSeries HighestAfterEntry; // 开仓后出现的最高价
NumericSeries LowestAfterEntry; // 开仓后出现的最低价
//DMI最终输出
NumericSeries oDMIPlus;
NumericSeries oDMIMinus;
NumericSeries oDMI;
NumericSeries oADX;
NumericSeries oADXR;
NumericSeries oVolty;
//DMI过程计算
NumericSeries sDMI;
NumericSeries sADX;
NumericSeries cumm;
NumericSeries sVolty;
Numeric PlusDM;
Numeric MinusDM;
Numeric UpperMove;
Numeric LowerMove;
Numeric SumPlusDM(0);
Numeric SumMinusDM(0);
Numeric SumTR(0);
NumericSeries AvgPlusDM;
NumericSeries AvgMinusDM;
Numeric SF; // smoothing factor
Numeric Divisor;
Numeric i;
NumericSeries TRValue;
//--------------------
NumericSeries HighestValue;
NumericSeries LowestValue;
NumericSeries KValue;
NumericSeries SumHLValue;
NumericSeries SumCLValue;
NumericSeries DValue;
Begin
If(Date>20151230)
{ Return;}
MACD = XAverage( Close, 12 ) - XAverage( Close, 26 ) ;
MACDav = XAverage(MACD,9);
MACDDiff = MACD - MACDav;
MidLine = AverageFC(Close,26);
Band = StandardDev(Close,26,2);
UpLine = MidLine + 2 * Band;
DownLine = MidLine - 2 * Band;
PlotNumeric("UpLine",UpLine);
PlotNumeric("DownLine",DownLine);
PlotNumeric("MidLine",MidLine);
MA60=AverageFC(Close,MAzq);
// 集合竞价和小节休息过滤
If(!CallAuctionFilter()) Return;
Minpoint=Minmove*PriceScale;
//DMI指标计算, 最终将输出ADX指标
//--------------------------DMI计算开始-----------------------------------//
SF = 1/14;
TRValue = TrueRange;
If(CurrentBar == 14)
{
For i = 0 To 14 - 1
{
PlusDM = 0 ;
MinusDM = 0 ;
UpperMove = High[i] - High[ i + 1 ] ;
LowerMove = Low[ i + 1 ] - Low[i] ;
If (UpperMove > LowerMove and UpperMove > 0 )
{
PlusDM = UpperMove;
}Else if (LowerMove > UpperMove and LowerMove > 0)
{
MinusDM = LowerMove ;
}
SumPlusDM = SumPlusDM + PlusDM ;
SumMinusDM = SumMinusDM + MinusDM ;
SumTR = SumTR + TRValue[i] ;
}
AvgPlusDM = SumPlusDM / 14 ;
AvgMinusDM = SumMinusDM / 14 ;
sVolty = SumTR / 14 ;
}Else if(CurrentBar > 14)
{
PlusDM = 0 ;
MinusDM = 0 ;
UpperMove = High - High[1] ;
LowerMove = Low[1] -Low ;
If (UpperMove > LowerMove and UpperMove > 0 )
{
PlusDM = UpperMove;
}Else if (LowerMove > UpperMove and LowerMove > 0 )
{
MinusDM = LowerMove ;
}
AvgPlusDM = AvgPlusDM[1] + SF * ( PlusDM - AvgPlusDM[1] ) ;
AvgMinusDM = AvgMinusDM[1] + SF * ( MinusDM - AvgMinusDM[1] ) ;
sVolty = sVolty[1] + SF * ( TRValue - sVolty[1] ) ;
}Else
{
oDMIPlus = InvalidNumeric;
oDMIMinus = InvalidNumeric;
oDMI = InvalidNumeric;
oADX = InvalidNumeric;
oADXR = InvalidNumeric;
oVolty = InvalidNumeric;
}
If (sVolty > 0)
{
oDMIPlus = 100 * AvgPlusDM / sVolty ;
oDMIMinus = 100 * AvgMinusDM / sVolty ;
}Else
{
oDMIPlus = 0 ;
oDMIMinus = 0 ;
}
Divisor = oDMIPlus + oDMIMinus ;
if (Divisor > 0)
{
sDMI = 100 * Abs( oDMIPlus - oDMIMinus ) / Divisor;
}else
{
sDMI = 0 ;
}
cumm=Cum( sDMI );
If(CurrentBar > 0)
{
If (CurrentBar <= 14)
{
sADX = Cumm / CurrentBar ;
oADXR = ( sADX + sADX[ CurrentBar - 1 ] ) * 0.5 ;
}Else
{
sADX = sADX[1] + SF * ( sDMI - sADX[1] ) ;
oADXR = ( sADX + sADX[ 30 - 1 ] ) * 0.5 ;
}
}
oVolty = sVolty;
oDMI = sDMI;
oADX = sADX;
HighestValue = HighestFC(High, 14);
LowestValue = LowestFC(Low, 14);
SumHLValue = SummationFC(HighestValue-LowestValue,3);
SumCLValue = SummationFC(Close - LowestValue,3);
If(SumHLValue <> 0)
{
KValue = SumCLValue/SumHLValue*100;
}Else
{
KValue = 0;
}
DValue = AverageFC(KValue,3);
PlotNumeric("MA60",MA60,0,Red);
If(MarketPosition==0&&Time>=Time_SWk/100 &&Time<=Time_XWzhK/100&&oADX[1]>BKadx1&&oADX[1]<BKadx2&&KValue[1]<BKkd&&UpLine[1]-DownLine[1]>BKboll)
{
If(MACDDiff[1]>BK1diff&&MACD[2]<0&&MACD[1]>0)//1
{
Buy(Lots,Open);
}
If(MACD[1]>BK2macd&&MACDDiff[2]<0&&MACDDiff[1]>0)//2
{
Buy(Lots,Open);
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////
If(MarketPosition==0&&Time>=Time_SWk/100 &&Time<=Time_XWzhK/100&&oADX[1]>SKadx1&&oADX[1]<SKadx2&&KValue[1]>SKkd&&UpLine[1]-DownLine[1]>SKboll)
{
If(MACDDiff[1]<SK1diff&&MACD[2]>0&&MACD[1]<0)//1
{
SellShort(Lots,Open);
}
If(MACD[1]<SK2macd&&MACDDiff[2]>0&&MACDDiff[1]<0)//2
{
SellShort(Lots,Open);
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
If(BarsSinceentry == 0)
{
HighestAfterEntry = Close;
LowestAfterEntry = Close;
If(MarketPosition <> 0)
{
HighestAfterEntry = Max(HighestAfterEntry,AvgEntryPrice); // 开仓的Bar,将开仓价和当时的收盘价的较大值保留到HighestAfterEntry
LowestAfterEntry = Min(LowestAfterEntry,AvgEntryPrice); // 开仓的Bar,将开仓价和当时的收盘价的较小值保留到LowestAfterEntry
}
}else
{
HighestAfterEntry = Max(HighestAfterEntry,High); // 记录下当前Bar的最高点,用于下一个Bar的跟踪止损判断
LowestAfterEntry = Min(LowestAfterEntry,Low); // 记录下当前Bar的最低点,用于下一个Bar的跟踪止损判断
}
Commentary("HighestAfterEntry="+Text(HighestAfterEntry));
Commentary("LowestAfterEntry="+Text(LowestAfterEntry));
MinPoint = MinMove*PriceScale;
MyEntryPrice = AvgEntryPrice;
If(MarketPosition==1) // 有多仓的情况
{
if(HighestAfterEntry[1] >= MyEntryPrice + TrailingStart1B*MinPoint)// 第一级跟踪止损的条件表达式
{
If(Low <= HighestAfterEntry[1] - TrailingStop1B*MinPoint)
{
MyExitPrice = HighestAfterEntry[1] - TrailingStop1B*MinPoint;
If(Open < MyExitPrice) MyExitPrice = Open; // 如果该Bar开盘价有跳空触发,则用开盘价代替
Sell(0,MyExitPrice);
}
}else if(Low <= MyEntryPrice - StopLossSetB*MinPoint)//可以在这里写上初始的止损处理
{
MyExitPrice = MyEntryPrice - StopLossSetB*MinPoint;
If(Open < MyExitPrice) MyExitPrice = Open; // 如果该Bar开盘价有跳空触发,则用开盘价代替
Sell(0,MyExitPrice);
}
}
else if(MarketPosition==-1) // 有空仓的情况
{
if(LowestAfterEntry[1] <= MyEntryPrice - TrailingStart1S*MinPoint)// 第一级跟踪止损的条件表达式
{
If(High >= LowestAfterEntry[1] + TrailingStop1S*MinPoint)
{
MyExitPrice = LowestAfterEntry[1] + TrailingStop1S*MinPoint;
If(Open > MyExitPrice) MyExitPrice = Open; // 如果该Bar开盘价有跳空触发,则用开盘价代替
BuyToCover(0,MyExitPrice);
}
}else If(High >= MyEntryPrice + StopLossSetS*MinPoint)//可以在这里写上初始的止损处理
{
MyExitPrice = MyEntryPrice + StopLossSetS*MinPoint;
If(Open > MyExitPrice) MyExitPrice = Open; // 如果该Bar开盘价有跳空触发,则用开盘价代替
BuyToCover(0,MyExitPrice);
}
}
If(Time >=time_XWqp/100)
{
Sell(0,Open);
BuyToCover(0,Open);
}
End
|
|