Params
Numeric K1(20);
Numeric K2(5);
Numeric K3(60);
Numeric M1(10);
Vars
series<Numeric> MA;
series<Numeric> MA1;
series<Numeric> MA2;
Numeric MinPoint;
Numeric MyEntryPrice;
Numeric MyExitPrice;
Events
OnBar(ArrayRef<Integer> indexs)
{
MA = DATA1.AverageFC(Close[1],K1);
MA1 = AverageFC(Close[1],K2);
MA2 = AverageFC(Close[1],K3);
DATA0.PlotNumeric("MA",MA);
PlotNumeric("MA1",MA1);
PlotNumeric("MA2",MA2);
MyEntryPrice = AvgEntryPrice;
MinPoint = MinMove*pricescale;
If(MarketPosition == 0 && CrossOver(MA1[1],MA2[1]) && Close[1] > MA);
Buy(1,Open);
If(MarketPosition == 1)
{
If(Low <= MyEntryPrice - M1*MinPoint)
{
MyExitPrice = MyEntryPrice - M1*MinPoint;
Sell(1,MyExitPrice);
}
If(Close[1] < Open[1] && close < Low[1])
Sell(1,Open);
}
If(MarketPosition == 0 && CrossUnder(MA1[1],MA2[1]) && Close[1] < MA)
SellShort(1,Open);
If(MarketPosition == -1)
{
If(High >= MyEntryPrice + M1*MinPoint)
{
MyExitPrice = MyEntryPrice + M1*MinPoint;
BuyToCover(1,MyExitPrice);
}
If(Close[1] > Open[1] && Close > High[1])
BuyToCover(1,Open);
}
}
下面的截图就是我回测的时候出现的,我想了很久都不知道为什么会出现频繁建仓的问题。大家帮忙看看
老师你好,这个是根据你们的tb语言编程里面的追踪止盈止损写的,您说的序列函数问题,我在三个变量ma中已经用了series了,怎么还会有序列函数问题呢?偷价问题,open那里我是知道的,但是您说的另外一个MyExitPrice,这个写法是你们tb教程里面歇过来的,不知道为什么会有偷价问题呢?您说的出场顺序也不对,后面的应该写到前面,这是什么意思?问题有点多,麻烦您花点时间解答一下
您好!
1、序列函数问题,不是说序列变量问题。CrossOver这个函数是个序列函数,如果你搞不清楚深层次的原因,记住不要放在条件语句中就可以了,可以把这个函数值赋值给一个变量,条件语句中对这个变量进行判断,效果是一样的且没有任何问题。
2、出场偷价,是说Open的跳空没有考虑到,如果Open直接就比MyEntryPrice - M1*MinPoint低,你说止损应该是哪个价格合理呢?
If(Low <= MyEntryPrice - M1*MinPoint)
{
MyExitPrice = MyEntryPrice - M1*MinPoint;
Sell(1,MyExitPrice);
}
3、顺序问题,先写止损出场,后写开盘价出场,这样会导致,止损出场优先。但实际上如果开盘就出场了,轮得到止损吗?您细想下
最后,再万年不变地啰嗦一句,学习要一步步来,先学基础,掌握后再做复杂的东西。您能把示例的代码拿来做练习,这点很好!但是第一步,您需要原封不动地复制示例代码,把每一句是干嘛的搞清楚,学通一个,后面类似的就才好办。这就跟学书法,先要临帖是一个道理,如果一上来,就想搞出个自己的体,恐怕就是天才都难做到啊。
好的,感谢老师的回复,因为刚学tb没多久,所以有很多知识点盲区,感谢老师指点
If(MarketPosition == 0 && CrossUnder(MA1[1],MA2[1]) && Close[1] < MA)
这一句和后面还有句类似,都存在序列函数问题
If(MarketPosition == 1)
{
If(Low <= MyEntryPrice - M1*MinPoint)
{
MyExitPrice = MyEntryPrice - M1*MinPoint;
Sell(1,MyExitPrice);
}
If(Close[1] < Open[1] && close < Low[1])
Sell(1,Open);
}
这一段有两个问题,第一偷价问题,两个Sell都有;第二出场顺序也不对,后面的应该写到前面
多了个分号,还有序列函数问题。还有偷价问题