1程序化交易策略实现与实例详解程序化交易策略实现与实例详解蔡云华蔡云华深圳开拓者科技有限公司深圳开拓者科技有限公司内容安排内容安排通过实例讲解Ø 持仓交易系统的策略与实现Ø 日内交易系统的策略与实现2持仓交易系统的设计要素持仓交易系统的设计要素Ø设计思路:趋势跟踪;Ø设计原则:捕捉主要的波段行情;Ø设计细节:减少盘整时的连续亏损和最大资金回撤Ø总的原则:ØCut loss short, Let profit runØ截短亏损,让利润奔跑截短亏损,让利润奔跑! 双均线交叉系统双均线交叉系统DMACSØ交易规则:Ø如果短期均线上穿长期均线,做多,如原来持有空单,则先平空单,再建多仓Ø如果短期均线下穿长期均线,做空,如原来持有多单,则先平多单,再建空单Ø短周期:10Ø长周期:20Ø交易头寸暂为1手4 双均线指标双均线指标DualMAParamsNumeric Length1(10);Numeric Length2(20);BeginPlotNumeric("MA1",AverageFC(Close,Length1));PlotNumeric("MA2",AverageFC(Close,Length2));End5 DMACS版本版本1Params Numeric Length1(10);Numeric Length2(20); Numeric Lots(1); Vars NumericSeries MA1; NumericSeries MA2; BoolSeries condBuy(false);BoolSeries condSell(false);Begin MA1 = AverageFC(Close,Length1); MA2 = AverageFC(Close,Length2); condBuy = CrossOver(MA1,MA2);condSell = CrossUnder(MA1,MA2);If (condBuy[1]==true) Buy(Lots,Open); If (condSell[1]==true) SellShort(lots,Open); End 6 DMACS_V1主要交易品种测试结果主要交易品种测试结果品种品种测试佣金测试佣金测试时间段测试时间段净利润净利润最大回撤最大回撤净利润净利润/最大回撤最大回撤Cu0004%%1998.07.30--526451-1300574.05ZN0004%%2007.03.26--114012-310793.66RU0004%%1998.11.05--279287-533185.23RB0004%%2009.03.27--14724-83621.76A90004%%1998.12.10--25723-113882.25M90004%%2000.07.17--19923-157251.26Y90004%%2006.01.09--27494-647510.04L90004%%2007.07.31--37485-194691.92CF0004%%2004.06.01--78075-470571.66SR0004%%2006.01.06--37522-182062.06TA0004%%2006.12.18--63531-114455.55ER0004%%2009.04.20--1727-27720.62 DMACS V1存在的问题存在的问题Ø盈利单利润回吐太多。
必须增加追踪止赢的设置 增加追踪止赢增加追踪止赢Ø以天胶做多为例:Ø 假如,我们在开盘价30000元/吨买入;Ø 追踪止盈 300点(300X5=1500元/吨);盈利峰值价盈利峰值价止损点止损点31000295003150030000320003050032500310003300031500………… Ø增加参数TrailingStop,默认值设为400;Ø增加变量MinPoint,用来保存最小变动单位ØMinPoint = MinMove*PriceScale;Ø增加序列变量HigherAfterEntry,LowerAfterEntry用来保存开仓后的最高价或最低价Ø因为我们的入场是以开盘价入场,所以可以实现开仓Bar的止损,但开仓Bar的最高价,不能计入开仓后的最高价,而只能以进场价作为开仓后的最高价 进场位置和盈利峰值价计算进场位置和盈利峰值价计算 开盘价开盘价最低价最低价追踪止损价追踪止损价盈利峰值价盈利峰值价止止损损没没被被止止损损 开盘价进场的追踪止损开盘价进场的追踪止损 开盘价开盘价(进场价(进场价)最低价最低价追踪止损价追踪止损价以进场价作为盈利峰值价以进场价作为盈利峰值价止止损损 DMACS_V2(1)Params Numeric Length1(10);Numeric Length2(20); Numeric TrailingStop(400);Numeric Lots(1); Vars NumericSeries MA1; NumericSeries MA2; BoolSeries condBuy(false);BoolSeries condSell(false);Numeric MinPoint;Numeric MyPrice;NumericSeries HigherAfterEntry;NumericSeries LowerAfterEntry;Begin If(BarsSinceEntry >= 1){HigherAfterEntry = Max(HigherAfterEntry[1],High[1]);LowerAfterEntry = Min(LowerAfterEntry[1],Low[1]);}13 DMACS_V2(2)MinPoint = MinMove * PriceScale;MA1 = AverageFC(Close,Length1); MA2 = AverageFC(Close,Length2); condBuy = CrossOver(MA1,MA2);condSell = CrossUnder(MA1,MA2); If (condBuy[1]==true){Buy(Lots,Open);HigherAfterEntry = Open;LowerAfterEntry = HigherAfterEntry;}If (condSell[1]==true){SellShort(lots,Open);HigherAfterEntry = Open;LowerAfterEntry = Open;}14 DMACS_V2(3)Commentary("HigherAfterEntry="+Text(HigherAfterEntry));Commentary("LowerAfterEntry="+Text(LowerAfterEntry));If(MarketPosition==1){If(Low <= HigherAfterEntry - TrailingStop*MinPoint){MyPrice = HigherAfterEntry - TrailingStop*MinPoint;If(Open < MyPrice) MyPrice = Open;Sell(Lots,MyPrice);}}Else If(MarketPosition == -1){If(High >= LowerAfterEntry + TrailingStop*MinPoint){MyPrice = LowerAfterEntry + TrailingStop*MinPoint;If(Open > MyPrice) MyPrice = Open;BuyToCover(Lots,MyPrice);}}End 15 DMACS_V2主要交易品种测试结果主要交易品种测试结果品种品种测试佣金测试佣金测试时间段测试时间段净利润净利润最大回撤最大回撤净利润净利润/最大回撤最大回撤Cu0004%%1998.07.30--555589▲-96350 ▼4.05->5.76 ▲ZN0004%%2007.03.26--107320▼-23125 ▼3.66->4.64 ▲RU0004%%1998.11.05--272302▼-42767 ▼5.23->6.36 ▲RB0004%%2009.03.27--17813 ▲ -8362 1.76->2.13 ▲A90004%%1998.12.10--27533 ▲-9206 ▼2.25->2.99 ▲M90004%%2000.07.17--20093 ▲-16138 ▲1.26->1.24 ▼Y90004%%2006.01.09--28617 ▲-38430 ▼0.04->0.74 ▲L90004%%2007.07.31--38360 ▲-19469 1.92->1.97 ▲CF0004%%2004.06.01--111640▲-16353 ▼1.66->6.82 ▲SR0004%%2006.01.06--39489 ▲-13079 ▼2.06->3.02 ▲TA0004%%2006.12.18--67949 ▲-11445 5.55->5.93 ▲ER0004%%2009.04.20--1727 -2772 0.62 DMACS_V2测试总结测试总结Ø绝大多数品种,改进后效果都非常显著。
Ø以铜为例,净利润提高了29138元,最大回撤则大幅下降了33707元Ø前面我们采用的是固定400点的追踪止损,但对于不同品种或者同一品种的不同历史时段来说,采用统一的追踪止损标准,显然是不太合理的Ø因此,我们决定采用当时价格的一定比例来进行追踪止损为简单设计,我们就以开仓后的盈利峰值价的一定比例作为止损价格Ø具体追踪止损的比例,可以进行一定的参数优化 DMACS_V3Ø参数部分修改为百分比:Numeric TrailingStop(100);Ø追踪止损的相应部分改为:If(Low <= HigherAfterEntry * (1 – TrailingStop/1000)){MyPrice = HigherAfterEntry * (1 – TrailingStop/1000);…}… …If(High >= LowerAfterEntry * (1 + TrailingStop/1000)){MyPrice = LowerAfterEntry * (1 + TrailingStop/1000);…} DMACS_V3主要交易品种测试结果主要交易品种测试结果品种品种测试佣金测试佣金测试时间段测试时间段净利润净利润最大回撤最大回撤净利润净利润/最大回撤最大回撤Cu0004%%1998.07.30--530855▲-105099 ▼4.05->5.05 ▲ZN0004%%2007.03.26--139032▲-25499 ▼3.66->5.45 ▲RU0004%%1998.11.05--298379▲-49184 ▼5.23->6.06 ▲RB0004%%2009.03.27--16863 ▲ -8362 1.76->2.01 ▲A90004%%1998.12.10--29034 ▲-9436 ▼2.25->3.07 ▲M90004%%2000.07.17--18542 ▼-14856 ▼1.26->1.25 ▼Y90004%%2006.01.09--27099 ▼-39836 ▼0.04->0.68 ▲L90004%%2007.07.31--30384 ▼-15256 ▼1.92->1.99 ▲CF0004%%2004.06.01--103724▲-24027 ▼1.66->4.31 ▲SR0004%%2006.01.06--36902 ▼-18547 ▲2.06->1.99 ▼TA0004%%2006.12.18--62602 ▼-11581 ▲5.55->5.41 ▼ER0004%%2009.04.20--1597 ▼-2911 ▲0.62->0.55 ▼ DMACS_V3测试总结测试总结Ø测试结果发现,在不优化参数的情况下,和V1版比还是有一定效果,但和V2版比差别不大。
Ø仔细分析原因,我们会发现,追踪止损的回落百分比参数的设置对结果影响很大Ø百分比参数设置得大,则盈利回吐比例也大,但大的波段基本能捕捉到Ø百分比参数设置得小,则盈利大部分能拿住,但一波大的行情,有可能中途就出场了 进一步的策略改进进一步的策略改进Ø进一步的分析,我们还可以发现一些交易进场后不久就有一定的盈利,但最后却以亏损收场; Ø而赚钱的单,往往进场后,就马上开始盈利; 新的出场策略新的出场策略Ø基于这种思路,我们完全可以在进场后,设定一个较紧的初始止损,一旦行情朝不利的方向变动,我们即止损出场,等待下次入场机会;Ø如果止损后,行情又恢复原有趋势,我们可制定相应的再入场规则,以免错失大的波段行情;Ø而一旦单子开始盈利,达到一定比例,我们立即将止损位调整到保本的位置;Ø如行情继续朝有利于我们的方向发展,通过追踪止赢策略,将止损价不断上移(或下移) 出场部分设计出场部分设计Ø我们使用三种类型的止损设置:Ø进场后设置初始止损;Ø有一定盈利后设置保本止损;Ø盈利增大后使用追踪止盈;Ø为此,设置三个止损参数: Numeric InitialStop(20); // 初始止损(千分之N)Numeric BreakEvenStop(30); // 保本止损(千分之N)Numeric TrailingStop(50); // 追踪止损(千分之N)Ø三种止损的代码可以放在一起处理,取最有利的价格作为止损(赢)价。
Ø为了实现追踪止赢,我们有必要记录进场后,赢利最高时的价格(赢利峰值价);Ø设置两个序列变量,分别保存多头赢利峰值价和空头赢利峰值价:NumericSeries HigherAfterEntry;// 多头盈利峰值价NumericSeries LowerAfterEntry; // 空头盈利峰值价Ø传递和比较赢利峰值价If(BarsSinceEntry >= 1){HigherAfterEntry = Max(HigherAfterEntry[1],High[1]);LowerAfterEntry = Min(LowerAfterEntry[1],Low[1]);} Else{HigherAfterEntry = HigherAfterEntry[1];LowerAfterEntry = LowerAfterEntry[1];} 多头止损部分的代码多头止损部分的代码// 初始止损StopLine = EntryPrice * (1-InitialStop/1000);// 达到保本止损条件,将止损位上移到保本的价位If (HigherAfterEntry >= EntryPrice * (1+BreakEvenStop/1000))StopLine = EntryPrice;// 追踪止损的价位超过保本止损价,止损价随盈利峰值价的上升同步提高If (StopLine < HigherAfterEntry*(1-TrailingStop/1000))StopLine = HigherAfterEntry*(1-TrailingStop/1000);Commentary("止损价:"+Text(StopLine));// 止损触发If(Low <= StopLine){MyPrice = StopLine;If(Open < MyPrice) MyPrice = Open;Sell(Lots,MyPrice);bLongStoped = True;// 止损后设置标志Commentary("Long Position Stoped at "+text(MyPrice));} 重新进场规则重新进场规则Ø首先判断大趋势有没有改变?Ø趋势没变,何时再进场?Ø行情再创新高(低)时,再次进场;Ø是否创新高(低),跟出场前赢利峰值价比较。
Ø如何判断大趋势有没有改变?Ø根据均线交叉情况;Ø如果当前K线均线未交叉,则趋势取决于上一次均线交叉的方向;Ø代码如下:if ( condBuy == false and condSell == false ){condBuy = condBuy[1];condSell = condSell[1];} Ø如何区分初次入场和再次入场?Ø增加两个序列变量分别记录多头止损情况和空头止损情况,进场时根据这两个值来判断是初次进场,还是再次进场,进场后重置这两个值BoolSeries bLongStoped(false); // 多头止损情况BoolSeries bShortStoped(false);// 空头止损情况Ø止损触发时,进行记录 If(Low <= StopLine){MyPrice = StopLine;If(Open < MyPrice) MyPrice = Open;Sell(Lots,MyPrice);bLongStoped = True; // 止损后设置标志} Ø为了判断是否突破前期高点或低点,还需要保留前期的高低点值。
这部分可以利用实现追踪止赢的代码If(BarsSinceEntry >= 1){HigherAfterEntry = Max(HigherAfterEntry[1],High[1]);LowerAfterEntry = Min(LowerAfterEntry[1],Low[1]);}Else{HigherAfterEntry = HigherAfterEntry[1];LowerAfterEntry = LowerAfterEntry[1];} 初次进场代码初次进场代码初次进场做多初次进场做空重置标志重置标志 重新进场代码重新进场代码 止损处理的细节止损处理的细节Ø无论初次进场还是再次进场,进场后都是把进场价作为开仓后的盈利最高价或最低价两者的区别之处在于:Ø初次进场,因为是开盘价进场,可以在开仓Bar实现止损;Ø而再次入场,因为在历史K线中,无法确定入场点和最高价最低价在时间次序上的关系,从而无法实现在开仓BAR的止损因此,必须在记录开仓后最高和最低后,加上Return指令,从而忽略掉后面的止损部分公式。
DMACS_V4主要交易品种测试结果主要交易品种测试结果品种品种佣金佣金测试时间段测试时间段净利润净利润最大回撤最大回撤净利润净利润/最大回撤最大回撤Cu0004%%1998.07.30--578005▲-49193 ▼4.05->5.76->11.75 ▲ZN0004%%2007.03.26--118715▲-19238 ▼3.66->4.64->6.17 ▲RU0004%%1998.11.05--278181▲-23831 ▼5.23->6.36->11.67 ▲RB0004%%2009.03.27--21989 ▲ -4459 ▼ 1.76->2.13->4.93 ▲A90004%%1998.12.10--27657 ▲-7495 ▼2.25->2.99->3.69 ▲M90004%%2000.07.17--25721 ▲-7517▼ 1.26->1.24->3.42 ▲Y90004%%2006.01.09--71157 ▲-21730 ▼0.04->0.74->3.27 ▲L90004%%2007.07.31--23312 ▼-18363 ▼1.92->1.97->1.27 ▼CF0004%%2004.06.01--55066 ▼-28690 ▲1.66->6.82->1.92 ▼SR0004%%2006.01.06--35647 ▼-8515 ▼2.06->3.02->4.18 ▲TA0004%%2006.12.18--47150 ▼-6714 ▼5.55->5.93->7.02 ▲ER0004%%2009.04.20--1727 -2772 0.62 测试结果测试结果(铜铜)用30分钟指数图测试,参数进行优化。
手续费万分之四,每次操作1手 测试结果测试结果(铜铜)用30分钟指数图测试,参数进行优化手续费万分之四,每次操作1手 测试结果测试结果(胶胶)用30分钟指数图测试,参数进行优化手续费万分之四,每次操作1手 测试结果测试结果(胶胶)用30分钟指数图测试,参数进行优化手续费万分之四,每次操作1手 测试结果测试结果(塑料塑料)用30分钟指数图测试,参数进行优化手续费万分之四,每次操作1手 测试结果测试结果(塑料塑料)用30分钟指数图测试,参数进行优化手续费万分之四,每次操作1手 测试结果测试结果(白糖白糖)用30分钟指数图测试,参数进行优化手续费万分之四,每次操作1手。
测试结果测试结果(白糖白糖)用30分钟指数图测试,参数进行优化手续费万分之四,每次操作1手 实例二:实例二:RangeBreak系统系统Ø这是个日内交易系统,收盘一定平仓;ØRangeBreak基于昨日振幅和今日开盘价的关系Ø昨日振幅=昨日最高价-昨日最低价Ø上轨 = 今日开盘价+N*昨日振幅Ø下轨 = 今日开盘价-N*昨日振幅Ø当价格突破上轨,买入开仓Ø当价格跌穿下轨,卖出开仓RangeBreak指标指标ParamsNumeric PercentOfRange(0.3);VarsNumeric DayOpen;Numeric preDayRange;Numeric UpperBand;Numeric LowerBand;BeginDayOpen = OpenD(0);preDayRange = HighD(1) - LowD(1);UpperBand = DayOpen + preDayRange*PercentOfRange;LowerBand = DayOpen - preDayRange*PercentOfRange;PlotNumeric("UpperBand",UpperBand);PlotNumeric("LowerBand",LowerBand);PlotNumeric("MidLine",DayOpen);EndRangeBreak指标指标RBS_V1(1)vParamsvNumeric PercentOfRange(0.3);vNumeric ExitOnCloseMins(14.59);vVarsvNumeric DayOpen;vNumeric preDayRange;vNumeric UpperBand;vNumeric LowerBand;vNumeric MyPrice;vBeginvDayOpen = OpenD(0);vpreDayRange = HighD(1) - LowD(1);vUpperBand = DayOpen + preDayRange*PercentOfRange;vLowerBand = DayOpen - preDayRange*PercentOfRange;vIf(MarketPosition!=1 && High>=UpperBand) {vMyPrice = UpperBand;vIf(Open > MyPrice) MyPrice = Open;vBuy(1,MyPrice);vReturn;v}RBS_V1(2)vIf(MarketPosition!=-1 && Low<=LowerBand)v{vMyPrice = LowerBand;vIf(Open < MyPrice) MyPrice = Open;vSellShort(1,MyPrice);vReturn;v}v// 收盘平仓vIf(Time >=ExitOnCloseMins/100)v{vSell(1,Open);vBuyToCover(1,Open);v}vSetExitOnClose;vEnd必须考虑的特殊情况必须考虑的特殊情况v如果前一日涨停或跌停,则会出现范围很小。
v解决方案:v设定一个范围的最小值,假定为当前价格的0.2%代码中的改动代码中的改动vParamsv Numeric MinRange(0.2);vVarsv NumericSeries DayOpen;v Numeric preDayHigh;v Numeric preDayLow; v NumericSeries preDayRange;vBeginv preDayHigh = HighD(1);v preDayLow = LowD(1);v If(Date!=Date[1])v {v DayOpen = Open;v preDayRange = preDayHigh - preDayLow;v If(preDayRange < Open*MinRange*0.01) v preDayRange = Open*MinRange*0.01;v }Elsev {v DayOpen = DayOpen[1];v preDayRange = preDayRange[1];v } 增加止损增加止损v有可能通道会比较宽,难道非要等到反转才平仓?v考虑增加止损设置,有2种方案:v1、亏损固定点数。
v2、亏损当前价格的百分比v考虑到商品价格变化的差异,我们采取第二种方式止损部分代码止损部分代码v 先增加一个变量StopLine,用来保存止损位置v下面是做多时的止损代码:vIf(MarketPosition==1)v{vStopLine = AvgEntryPrice-DayOpen*StopLossSet*0.01;vIf(Low <= StopLine)v{vMyPrice = StopLine;vIf(Open < MyPrice) MyPrice = Open;vSell(Lots,MyPrice);v}v}v下面是做空的止损代码:vElse If(MarketPosition==-1)v{vStopLine = AvgEntryPrice+DayOpen*StopLossSet*0.01;vIf(High >= StopLine)v{vMyPrice = StopLine;vIf(Open > MyPrice) MyPrice = Open;vBuyToCover(Lots,MyPrice);v}v}入场时间的考虑入场时间的考虑v突破的时效性,发生在上午和下午意义是不同的。
v不同的商品时效属性不尽相同v为此我们增加最后交易时间参数,可供优化测试来确定最佳值 实现代码实现代码v增加参数:vNumeric LastTradeMins(14.00);v开仓条件处增加一个时间条件vIf(MarketPosition!=1 && High>=UpperBand && Time < LastTradeMins/100)v{v// 多头开仓v}vIf(MarketPosition!=-1 && Low<=LowerBand && Time < LastTradeMins/100)v{v// 空头开仓v} 止赢规则止赢规则Ø为了防止较大的盈利被吞噬,增加跟踪止赢Ø设定跟踪止赢的起始点Ø设定跟踪止赢的回撤值Ø或者可以选择百分比跟踪止赢这里我们采取回撤值v要实现跟踪止赢,我们需要记录开仓后出现的最大盈利的位置,即开多仓后出现的最高价,开空仓后出现的最低价v为了记录最大盈利,我们用两个序列变量,一个记录开仓后的最高价,一个记录开仓后的最低价 实现代码实现代码v新增变量:vNumericSeries HigherAfterEntry;vNumericSeries LowerAfterEntry;v在脚本开始部分增加以下代码,来记录高低价:vIf(BarsSinceEntry == 1)v{vHigherAfterEntry = AvgEntryPrice;vLowerAfterEntry = HigherAfterEntry;v}Else If(BarsSinceEntry > 1)v{vHigherAfterEntry = max(HigherAfterEntry[1],High[1]);vLowerAfterEntry = min(LowerAfterEntry[1],Low[1]);v}v跟踪止损的编码可配合前面的止损编码一起控制。
vIf(HigherAfterEntry>=AvgEntryPrice+DayOpen*TrailingStart*0.01)v{vStopLine = HigherAfterEntry - DayOpen*TrailingStop*0.01;v}Else // 止损v{vStopLine = AvgEntryPrice-DayOpen*StopLossSet*0.01;v}vvIf(Low <= StopLine)v{vMyPrice = StopLine;vIf(Open < MyPrice) MyPrice = Open;vSell(1,MyPrice);v}v做空的代码类似 再进场原则再进场原则Ø当我们止损或跟踪止损之后,有两种情况我们需要加以控制:Ø止损后,再次突破上轨或下轨;Ø追踪止赢后,价格仍符合最初的开仓条件,出场后,马上又会开仓入场Ø同时,为了不错失大的波段,我们也需要再次入场,只是进场需要更高的条件我们增加一条:Ø再次进场必须在突破前期的高点\低点 代码的修改代码的修改Ø我们需要标记止损动作,并要记录高低位。
Ø新建两个布尔型序列变量:ØBoolSeries bLongStoped;ØBoolSeries bShortStoped;Ø在脚本开始位置增加处理,保证其值向后传递Ø增加HigherAfterEntry和LowerAfterEntry在平仓后的值传递初次进场和再次进场初次进场和再次进场v在原始开仓位置增加条件,开多仓时bLongStoped不能为True,开空仓时bShortStoped不能为Truev在各个交易动作的地方处理这两个序列变量v增加再次入场的代码:vIf(bLongStoped && MarketPosition==0 && High >=UpperBand && High > HigherAfterEntry && Time < LastTradeMins/100)v{vMyPrice = Max(HigherAfterEntry,UpperBand) + MinPoint;vIf(Open > MyPrice) MyPrice = Open;vBuy(1,MyPrice);vbLongStoped = False;vReturn;v}v v// 做空再次入场代码:vIf(bShortStoped && MarketPosition==0 && Low<=LowerBand && Low < LowerAfterEntry && Time < LastTradeMins/100 && bInBoardRange==false)v{vMyPrice = Min(LowerAfterEntry,LowerBand) - MinPoint;vIf(Open < MyPrice) MyPrice = Open;vSellShort(1,MyPrice);vbShortStoped = False;vReturn;v}涨跌停的控制涨跌停的控制Ø接近涨跌停板不应开仓。
Ø若有持仓,价格到达涨跌停板马上平仓判断是否接近涨跌停判断是否接近涨跌停v我们新建一个布尔变量bInBoardRange,默认值设置为FalsevbInBoardRange = v(Open < Q_LowerLimit + DayOpen*StopLossSet*0.02) Or v( Open > Q_UpperLimit - DayOpen*StopLossSet*0.02);v在开仓条件中加入(bInBoardRange==false)涨跌停板平仓涨跌停板平仓v为了在价格达到涨跌停价马上平仓,我们需要在增加如下代码:v做多时:vIf(Open == Q_UpperLimit) Sell(1,Open);v做空时:vIf(Open == Q_LowerLimit) BuyToCover(Lots,Open);交易次数控制交易次数控制Ø增加失败次数限制,防止单日亏损无限制扩大Ø增加二个变量记录失败的次数ØNumericSeries LongFailureCnts;ØNumericSeries ShortFailureCnts;Ø增加一个参数设置最大次数ØNumeric FailureLimit(2);实现代码实现代码v在脚本开始部分增加序列变量值的向后传递处理。
v在平仓时增加是否亏损的判断,如果亏损则将计数+1.If(PositionProfit < 0 ) LongFailureCnts = LongFailureCnts + 1;v在开仓时增加次数限定 LongFailureCnts < FailureLimit 测试结果测试结果(股指股指)用1分钟指数图测试,参数未进行优化手续费每手300元,每次操作1手 测试结果测试结果(天胶天胶)用1分钟指数图测试,参数未进行优化手续费万分之四,每次操作1手 测试结果测试结果(铜铜)用1分钟指数图测试,参数未进行优化手续费万分之四,每次操作1手 测试结果测试结果(铜铜)参数优化后,收益曲线更好谢谢大家!谢谢大家!u公司网站:u新浪微博: 0755-83410021u上海办事处:021-68366255u我的:1350168324372。