TBQ和TBQ3对同一份跨周期策略公式,策略报告和执行行为不一样

我在测试一个跨周期的交易策略公式,大周期是1H,小周期是15M,同一个公式,同一个工作区,一开始我在TBQ里进行测试和参数优化,但导出公式和工作区,再导入TBQ3,发现策略报告里的净利润数值差别很大,各个策略单元的数据也不同,而且实际测试下来,TBQ3里开空单的,到了TBQ里可能就不开仓。我不太方便把代码贴出来,因为是我花钱购买来的代码,但是想问一下TBQ3和TBQ里对多周期执行的优化比较大吗?有什么潜在的机制会造成这个问题吗?TBQ策略报告:TBQ3策略报告:是TBQ3的跨周期运行机制更好,回测结果和策略报告结果更准确吗?

如果TB和TB3的跨周期不一致,说明你TB的策略代码大概率有未来函数,即在小周期用到了大周期已经跑完的信息,比如 5min 小周期用到了日线大周期的 close。TB3 强行将大周期 Close 对齐到小周期,也就是在 5min 调用大周期的 Close应该等于当根 5min K线的 Close,这样每根 bar 往前推,反复如此;而 TB 的话调用大周期的 Close 则为当天已经走完的日线 Bar Close。也不能说这两个哪个比哪个好,因为无论是 5min 小周期还是日线大周期,调用 Close 构建信号都是不合适的,因为会产生信号闪烁,造成回测结果和实盘结果的偏差。只能说在 TB 里面调用日线 Close 比 TB3 里面调用日线Close 的偏差更大一些。在写策略中的普遍做法是使用 Close[1] 而不是 Close,这样的话 TB3 和 TB 的结果就一致了,不会出现你图中净利润砍掉一半的偏差。我个人更偏向使用 TB(已经用了好几年了,一时改不过来),对于TB3也是刚刚接触不久,回答可能有不全面的地方~

这两个版本主要的区别是体现在执行自动交易上,回测一般是不会有区别的这个要分析原因就必须有源代码,仔细比较两边测试报告的异同,查看是哪里计算结果有不一样

回复:我把简化过的代码发给你,因为我花了几万块钱买的(可能被坑了),不太愿意直接给完整代码。但是我试过简化过的代码也能复现问题。如果可能的话,如果你本地也复现了问题,可以让你们的研发看看是不是个问题。

回复://------------------------------------------------------------------------ // 简称: TE_MultipleTimeframes // 名称: 测试版MultipleTimeframes // 类别: 公式应用 // 类型: 用户应用 // 输出: Void //------------------------------------------------------------------------ Params Numeric Length(60); //均线周期 //MACD参数 Numeric FastLength(12); //MACD快速周期 Numeric SlowLength(26); //MACD慢速周期 Numeric MACDLength(9); //MACD平滑周期 //其他参数 Numeric HalfProfit(3); // 盈利3%后减半仓 Numeric ATRPeriod(14); // ATR计算周期 Numeric StopLossMultiplier(2.0); // 止损倍数 Numeric Lots(1); //开仓手数 Vars //MACD变量 Global Numeric Diff; Global Numeric Dea; Series<Numeric> MACDValue; Series<Numeric> MAValue; Global Bool condLong1; Global Bool condLong2; Global Bool condLong3; Global Bool condShort1; Global Bool condShort2; Global Bool condShort3; Global Bool condLong; Global Bool condShort; Global Numeric HighAfterEntry; Global Numeric LowAfterEntry; // 大周期MACD变量 Global Numeric MainFastLength(12); //大周期MACD快速周期 Global Numeric MainSlowLength(26); //大周期MACD慢速周期 Global Numeric MainMACDLength(9); //大周期MACD平滑周期 Global Numeric MainDiff; Global Numeric MainDea; Global Numeric MainMACDValue; Global Numeric HighestMainMACDValueInBar; Global Numeric LowestMainMACDValueInBar; Defs //此处添加公式函数 Events OnBarOpen(ArrayRef<Integer> indexs) { // 计算大周期MACD指标 Range[0:0] { //计算MACD MainDiff = XAverage(Open, MainFastLength) - XAverage(Open, MainSlowLength); MainDea = XAverage(MainDiff, MainMACDLength); MainMACDValue = 2 * (MainDiff - MainDea); HighestMainMACDValueInBar = MainMACDValue; LowestMainMACDValueInBar = MainMACDValue; } } OnBar(ArrayRef<Integer> indexs) { // 计算大周期MACD指标 Range[0:0] { //计算MACD MainDiff = XAverage(Close, MainFastLength) - XAverage(Close, MainSlowLength); MainDea = XAverage(MainDiff, MainMACDLength); MainMACDValue = 2 * (MainDiff - MainDea); HighestMainMACDValueInBar = Max(MainMACDValue, HighestMainMACDValueInBar); LowestMainMACDValueInBar = Min(MainMACDValue, LowestMainMACDValueInBar); } Range[1:1] { //计算均线 MAValue = AverageFC(Close, Length); //计算MACD Diff = XAverage(Close, FastLength) - XAverage(Close, SlowLength); Dea = XAverage(Diff, MACDLength); MACDValue = 2 * (Diff - Dea); //计算多头开仓条件 condLong1 = Close[1] > Close[2] And Close[2] > Close[3] And Close[3] > Close[4]; condLong2 = MACDValue[1] > 0; condLong3 = HighestMainMACDValueInBar > 0; condLong = condLong1 And condLong2 And condLong3; //计算空头开仓条件 condShort1 = Close[1] < Close[2] And Close[2] < Close[3] And Close[3] < Close[4]; condShort2 = MACDValue[1] < 0; condShort3 = LowestMainMACDValueInBar < 0; condShort = condShort1 And condShort2 And condShort3; // 多头开仓或反手 If (condLong) { If (MarketPosition == 0) // 没仓位,多头开仓 { Buy(Lots, Open); } If (MarketPosition == -1) // 有空单,空头平仓 { BuyToCover(Lots, Open); } } // 空头开仓或反手 If (condShort) { If (MarketPosition == 0) // 没仓位,空头开仓 { SellShort(Lots, Open); } If (MarketPosition == 1) // 有多单,多头平仓 { Sell(Lots, Open); } } If (MarketPosition == 1) { If (BarsSinceEntry == 0) HighAfterEntry = Open; Else HighAfterEntry = Max(Open, HighAfterEntry); } If (MarketPosition == -1) { If (BarsSinceEntry == 0) LowAfterEntry = Open; Else LowAfterEntry = Min(Open, LowAfterEntry); } } }

回复:策略单元XML导出文件<?xml version="1.0" encoding="utf-8"?> <App> <TradeUnit xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" UnitName="沪铝加权0" PreFix="1H_15M" UnitVersion="1.0.0.0" TradeLock="false" RunLock="false" Expand="false" RefUnitID=""> <Goods> <G RefID="3ace5a05-389e-461a-aa2d-95e35884f339" lBeginTime="0" lEndTime="0"> <GoodsSetting Source="User" Display="On" GoodsName="沪铝加权0"> <DataRangeSetting FinishedStart="0" FinishedEnd="0" SampleValue="1000" SampleRangeUnit="Day" SampleUnitValue="1" EnableSampleEndDate="false"> <DataRange RangeType="BEGINEND" RangeUnit="0" RangeValue="20200106090000000" Term="Hour" NValue="1" EnableNValue="false"> <GoodsKey Goods="al000" Category="CategoryFutures" Exchange="SHFE" nCodeID="-8983285507050605926" /> </DataRange> </DataRangeSetting> <TradeSetting LongMargin="9" ShortMargin="9" CurrentPercent="0" MarginFlag="PercentOfTotalAccount" CommissionFlag="PercentOfTotalAccount" CommissionOpen="1.5" CommissionClose="1.5" CommissionCloseToday="1.5" SlipPointMode="PointByNum" SlipPointValue="2" /> <MappingSetting MappingMode="D0ToMain"> <MappingGoods /> </MappingSetting> <DelegateSetting EnableMarketPrice="true" OrderPriceType="ORDER_PRICE_OPP" MarketStep="10" /> <AimSetting AimType="Speculate" /> <KChartGoodsDataSetting eFormerRights="None" eKChartDataRange="All" EnableCC="false" EnableKCutTradeTime="false" KCutTradeTimeFlag="Normal" EnableKCutShowEndTime="false" DataSourceType="ByUser" IsAutoSwapPosition="false" /> <GoodsLineSetting KLineType="Hollow" CurrentKLineStyle="Nagative" Is3DStyle="false"> <NagativeLineStyle KLineStyle="Nagative" KLineColorHtml="#FFFF5858" /> <PositiveLineStyle KLineStyle="Positive" KLineColorHtml="#FF00FFFF" /> <NShadowLineStyle KLineStyle="NShadow" KLineColorHtml="#FFFF5858" /> <PShadowLineStyle KLineStyle="PShadow" KLineColorHtml="#FF00FFFF" /> </GoodsLineSetting> <AlgoTradeSetting EnableAlgo="false" HaveInited="false"> <Template TemplateName="tempTemplate" RunMinNum="10" bSingleOrHandicap="true" SingleNum="1" SingleRange="1" HandicapPercent="0" OrderPriceType="ORDER_PRICE_OPP" OffsetHops="0" bOrderDependency="false" MinOrderHandicaps="50" bTimeDependency="true" OrderSpan="5" OrderSpanRange="0" TotalTime="60" eTotalTimeLimit="CurrentDay" bTakeActionsWhenHarmful="false" MinHarmfulHops="0" bStopOrAccelerateWhenHarmful="true" bTakeActionsWhenBenefit="false" MinBenefitHops="0" bStopOrAccelerateWhenBenefit="true" bChildReOrderWhenHarmful="false" ChildReOrderPriceType="ORDER_PRICE_LATEST" MinChildReOrderHarmfulHops="1" bCanAlgoTrade="false" bAutoKP="false"> <nBidAskTicks>0</nBidAskTicks> </Template> </AlgoTradeSetting> </GoodsSetting> </G> <G RefID="1fc6f5d0-601a-4f1b-9665-0b2d011602da" lBeginTime="0" lEndTime="0"> <GoodsSetting Source="User" Display="On" GoodsName="沪铝加权0"> <DataRangeSetting FinishedStart="0" FinishedEnd="0" SampleValue="1000" SampleRangeUnit="Day" SampleUnitValue="1" EnableSampleEndDate="false"> <DataRange RangeType="BEGINEND" RangeUnit="0" RangeValue="20200106090000000" Term="Minitus" NValue="15" EnableNValue="false"> <GoodsKey Goods="al000" Category="CategoryFutures" Exchange="SHFE" nCodeID="-8983285507050605926" /> </DataRange> </DataRangeSetting> <TradeSetting LongMargin="9" ShortMargin="9" CurrentPercent="0" MarginFlag="PercentOfTotalAccount" CommissionFlag="PercentOfTotalAccount" CommissionOpen="1.5" CommissionClose="1.5" CommissionCloseToday="1.5" SlipPointMode="PointByNum" SlipPointValue="2" /> <MappingSetting MappingMode="D0ToMain"> <MappingGoods /> </MappingSetting> <DelegateSetting EnableMarketPrice="true" OrderPriceType="ORDER_PRICE_OPP" MarketStep="10" /> <AimSetting AimType="Speculate" /> <KChartGoodsDataSetting eFormerRights="None" eKChartDataRange="All" EnableCC="false" EnableKCutTradeTime="false" KCutTradeTimeFlag="Normal" EnableKCutShowEndTime="false" DataSourceType="ByUser" IsAutoSwapPosition="false" /> <GoodsLineSetting KLineType="Hollow" CurrentKLineStyle="Nagative" Is3DStyle="false"> <NagativeLineStyle KLineStyle="Nagative" KLineColorHtml="#FFFF5858" /> <PositiveLineStyle KLineStyle="Positive" KLineColorHtml="#FF00FFFF" /> <NShadowLineStyle KLineStyle="NShadow" KLineColorHtml="#FFFF5858" /> <PShadowLineStyle KLineStyle="PShadow" KLineColorHtml="#FF00FFFF" /> </GoodsLineSetting> <AlgoTradeSetting EnableAlgo="false" HaveInited="false"> <Template TemplateName="tempTemplate" RunMinNum="10" bSingleOrHandicap="true" SingleNum="1" SingleRange="1" HandicapPercent="0" OrderPriceType="ORDER_PRICE_OPP" OffsetHops="0" bOrderDependency="false" MinOrderHandicaps="50" bTimeDependency="true" OrderSpan="5" OrderSpanRange="0" TotalTime="60" eTotalTimeLimit="CurrentDay" bTakeActionsWhenHarmful="false" MinHarmfulHops="0" bStopOrAccelerateWhenHarmful="true" bTakeActionsWhenBenefit="false" MinBenefitHops="0" bStopOrAccelerateWhenBenefit="true" bChildReOrderWhenHarmful="false" ChildReOrderPriceType="ORDER_PRICE_LATEST" MinChildReOrderHarmfulHops="1" bCanAlgoTrade="false" bAutoKP="false"> <nBidAskTicks>0</nBidAskTicks> </Template> </AlgoTradeSetting> </GoodsSetting> </G> </Goods> <Formular> <F> <TacticSetting Enabled="true" Loaded="false" bShow="true" EnableWarn="false" WarnType="0" WarnSettingID="0" WarnTimes="-1" SerVarRefCount="0" dWeight="1"> <IsSelectedAllGoodsByDisplayStatus>false</IsSelectedAllGoodsByDisplayStatus> <Layers /> <Master IsHavePlotInfo="false" Code="DE_MultipleTimeframes" Author="" Name="" ShowMode="Main" ScaleMode="Relative" MaxBarBack="0" TacticsCategory="Formular" TacticsType="EStrategyType_UserFormula" IsFromDrawLine="false" FuncRetType="ReturnType_VOID" IsSrcCodeEmpty="false" IsSrcCodeInvisible="false" IsSightLess="false" IsHasTradeFunc="true" IsHasPickStokeFunc="false" GroupName="My开发环境"> <NativeStrategyKey> <author /> <strName>DE_MultipleTimeframes</strName> <type>EStrategyType_UserFormula</type> </NativeStrategyKey> </Master> <Parameters> <Parameter Name="Length" DataType="DataType_Numeric" Value="19" Notes="均线周期" IsMust="false" IsHide="false"> <Enums /> </Parameter> <Parameter Name="FastLength" DataType="DataType_Numeric" Value="12" Notes="MACD快速周期" IsMust="false" IsHide="false"> <Enums /> </Parameter> <Parameter Name="SlowLength" DataType="DataType_Numeric" Value="26" Notes="MACD慢速周期" IsMust="false" IsHide="false"> <Enums /> </Parameter> <Parameter Name="MACDLength" DataType="DataType_Numeric" Value="9" Notes="MACD平滑周期" IsMust="false" IsHide="false"> <Enums /> </Parameter> <Parameter Name="HalfProfit" DataType="DataType_Numeric" Value="3" Notes="盈利3%后减半仓" IsMust="false" IsHide="false"> <Enums /> </Parameter> <Parameter Name="ATRPeriod" DataType="DataType_Numeric" Value="14" Notes="ATR计算周期" IsMust="false" IsHide="false"> <Enums /> </Parameter> <Parameter Name="StopLossMultiplier" DataType="DataType_Numeric" Value="2.0" Notes="止损倍数" IsMust="false" IsHide="false"> <Enums /> </Parameter> <Parameter Name="Lots" DataType="DataType_Numeric" Value="1" Notes="开仓手数" IsMust="false" IsHide="false"> <Enums /> </Parameter> </Parameters> <Lines /> <Deal TacticsID="0" UserTacticsID="0" ShowTradeLine="true" TradeLineStyle="LineType_Dashed" TradeLineWidth="1" LoseColorHtml="#FF00FF00" WinColorHtml="#FFFF0000" /> <Symbles> <Symble TacticsID="0" UserTacticsID="0" SymbleID="Buy" SymbleStyleID="1" SymbleStyleColorHtml="#FFFFFF00" PriceStyleID="1" PriceStyleColorHtml="#FFFFFF00" Flag="ShowTradeNum" /> <Symble TacticsID="0" UserTacticsID="0" SymbleID="Sell" SymbleStyleID="1" SymbleStyleColorHtml="#FFFFFF00" PriceStyleID="1" PriceStyleColorHtml="#FFFFFF00" Flag="ShowTradeNum" /> <Symble TacticsID="0" UserTacticsID="0" SymbleID="SellShort" SymbleStyleID="1" SymbleStyleColorHtml="#FFFF00FF" PriceStyleID="1" PriceStyleColorHtml="#FFFF00FF" Flag="ShowTradeNum" /> <Symble TacticsID="0" UserTacticsID="0" SymbleID="BuyToCover" SymbleStyleID="1" SymbleStyleColorHtml="#FFFF00FF" PriceStyleID="1" PriceStyleColorHtml="#FFFF00FF" Flag="ShowTradeNum" /> </Symbles> <OptimizeParamters /> </TacticSetting> </F> </Formular> <StrategyTradeSetting> <BaseAccountSetting Equity="20000000" Rate="1" /> <TradeSetting VolType="TRADE_VOLUMN_TYPE_VOL" Vol="1" IniMargin="500000" IgnoreHistorySignal="false" SignalBeginMillSecTime="1776661478752" EnableSignalBeginBar="false" SignalBeginBar="1" EnableMaxTradeCount="false" MaxTradeCount="-1" AllowOpenOnEnd="false" MaxOpenOnEndNum="0" MaxPositionNum="200" CalExpandWhenOpti="true" NumForAverDrawdownCal="5" RptByReturnRate="false" RptIncLossOutGain="false" ZXSPDefault="95" ZXSPSampleSizeDefault="10000" /> </StrategyTradeSetting> <ProgramTradeSetting> <IgnoreSetting IgnoreBuy="false" IgnoreSell="false" IgnoreSellShort="false" IgnoreBuyToCover="false" /> <ExSetting OrderUserConfirm="false" StrategyShowDialog="false" SendMsgToApp="false" /> <UnitSetting IniMargin="500000" /> </ProgramTradeSetting> </TradeUnit> </App>

回复:在我本地可以复习这样的问题,策略报告TBQ和TBQ3不一样:

回复:我今天打印了一下输出,发现在OnBar函数的Range[0:0]和Range[1:1]代码块里, HighestMainMACDValueInBar 和 LowestMainMACDValueInBar 的值在TBQ3里不一致,但是在TBQ里是一致的,这两个变量都是Global Numeric,照理来说应该是在运行过程中保持一致的。。。

回复:代码分析问题要么走付费代写要么走周四投稿直播讲解

回复:其实不是代码编写和分析的问题,核心问题是同一份代码,同样的策略单元配置,在TBQ和TBQ3上的回测报告结果不一致。不过我个人经过实盘的观察,发现TBQ3上策略信号和执行是一致的,但TBQ上是会有信号闪烁的问题发生,所以我切换到TBQ3上就好了,问题不大,以后就主要用更新更好的TBQ3来跑实盘了。感觉TBQ3比TBQ消耗系统资源少,执行效率更高,更精确。🙂

回复:我再提供一些线索,主要是为了让TBQ越来越好。因为我实盘已经完全切换到TBQ3了,后期也不打算用TBQ了,所以对发现的这个问题不是特别需要着急解决,而且这个问题我也只是在我的多周期策略发现,单周期策略TBQ和TBQ3表现很一致。当然也可能是我本地哪里设置有问题,但还是发帖记录一下。如下是TBQ里的对同一个策略公式和策略单元设置的K线里的表现:如下是相同条件下在TBQ3里的表现:对比TBQ和TBQ3的表现结果,发现在“打开K线”页面里,历史回测数据的一些OnBar里获得的值不一样。TBQ实盘是开仓了,但过了一根Bar后之前的开仓信号消失了,但TBQ3就很好,保留了开仓信号,实际开仓行为和信号一致。

回复:你这个策略是跨周期么?跨周期策略只能用tbquant3tbquant存在数据不对齐导致信号闪烁的问题这个问题零基础课程里是说过的,没看过? https://video.tbquant.net/video?id=video434 不过现在不需要这么处理了,后面tbquant3从底层解决了数据对齐问题

回复:你这个策略是跨周期么?跨周期策略只能用tbquant3tbquant存在数据不对齐导致信号闪烁的问题这个问题零基础课程里是说过的,没看过? https://video.tbquant.net/video?id=video434 不过现在不需要这么处理了,后面tbquant3从底层解决了数据对齐问题