偷价格,信号闪烁,未来函数
偷价格
偷价格 在后验过程中使用了错误的下单函数,实际交易中不一定成交。
偷价格 开仓bar走完 用前一根bar的最高价(high[1])刷新higherafterentry 用前一根bar的最低价(lower[1])刷新 Lowerafterentry 开仓bar没走完 Higheratfterentry=开仓价 Loweratferentry=开仓价 记录最高价最低价 if Pos.MarketPosition != 0.0: if Bar.Count - Pos.LastEntryBar > 1: if High[1] > HigherAfterEntry: HigherAfterEntry = High[1] if Low[1] < LowerAfterEntry: LowerAfterEntry = Low[1] elif Bar.Count - Pos.LastEntryBar == 1: HigherAfterEntry = Pos.LastEntryPrice LowerAfterEntry = Pos.LastEntryPrice if UpperStoped == 0:二次开多 if Pos.MarketPosition!=1 and High[0]>=UpperBand and High[0]>=HigherAfterEntry and Bar.Time<Ex.ExitOnCloseMins and Bar.Count > Pos.LastExitBar: MyPrice = max(UpperBand,Open[0]) MyPrice = max(HigherAfterEntry,MyPrice) (信号触发的理论价格与实际交易时的最新价保持接近) if Pos.MarketPosition==-1: trade.T_BuyToCover(strSecuCode, Lot, OrderType.MARKETORDER, MyPrice) trade.T_Buy(strSecuCode, Lot, OrderType.MARKETORDER, MyPrice) LowerStoped = 0
Hans123 v1 信号闪烁 引用数据不确定或开仓和平仓条件出现交集
信号闪烁
信号闪处理方法 Ex: 参数 HansTime = 926 ExTime=1455 ExitOnCloseMins =1454 …(before) if Pos.MarketPosition!=1 and High[0]>=UpperBand and Bar.Time>Ex.HansTime: …(after) if Pos.MarketPosition!=1 and High[0]>=UpperBand and Bar.Time< Ex.ExitOnCloseMins and Bar.Count > Pos.LastExitBar and Bar.Time>Ex.HansTime: ( Bar.Count > Pos.LastExitBar 告诉程序,已经开仓或者平仓的bar,不能再次触发信号)
信号闪烁:引用数据不确定 ……H[2] H[1] H[0] Now
信号闪烁
未来函数 If high[1] >low[1], buy @ low[1], and sell @high[1]. 现实中的行情是有时间顺序的,站在现在就只能知道过去的数据,不可能确切的获取到未来的行情,因此当下做判断时,不会引用到任何未来的信息——因为根本就获取不到。而在程序化交易后验中,数据是一股脑呈现出来,但额外加了一个时间戳来间接地区分其时间顺序。 If high[1] >low[1], buy @ low[1], and sell @high[1].
未来函数 例子 长均线之上,如果收阳线做多。但是问题是,下单价格是Open[0],即当前bar的开盘价,所以当前bar的开盘就是“现在”。而判断条件中使用的Close[0] ,即当前bar的收盘价,显然就是“未来”.
Too good to be true
未来函数 例子2 当头寸价格向有利方向已经变动0.5%时,从最高点回撤0.8个点即平仓止盈。但是High[0],相对于Open[0] 是未来数据。
Too good to be true 2
单策略去最优化 全样本优化,选择最优结果。 抽样优化,样本外测试。 选择参数区域。
比赛之外 “All Models Are Wrong, but Some Are Useful” George Box 只有分散才是免费的午餐。