图表编程问题,涉及控单和成功率累加计算

模型主要架构交易商品:白银5分钟图和白银3分钟图初始资金:30万RMB模型主要涉及指标: MACD(5MIN)  和 KDJ(3min)  // 指标参数引用系统默认,即可。首单开仓,三种模式1: MACD (5min图) 金叉, 开仓1手多单,死叉,则开仓1手空单 // 这里的金叉是指,快慢线首次出现金叉现象后的一根棒,进行开仓。   2: KDJ (3Min图) 金叉,开仓2手多单,死叉,则开仓2手空单 // 这里金叉死叉是指,KDJ三根线首次出现金叉或者死叉,进行开仓。(特殊,需要两个开仓信号,下方描述)3: macd (5分钟图)和 KDJ(3分钟图)同时出现金叉,做多3手多单,同时出现死叉做空3手空单。如果两者信号不同步出现,按照上述开仓1和开仓2进行。注意 :无需考虑信号闪烁问题,但要确保首次出现开仓一次。开仓出现闪烁,单根棒体内不重复开仓, 三组信号开仓后,分别在其未平仓前不予新开仓。 (也就是有个禁则,就是不要频繁开仓。三组模式,首次确认信号,开仓即可。开仓一次后,对应三个模式的平仓信号,分别平仓)已上为常规模式开仓信号, 其中 KDJ开仓模式,还有一个条件判断。符合条件,KDJ模式单独开仓。但这个条件,和第三种共鸣模式无关。特殊模式:融入在开仓模式2中。也就是开仓模式2有两个开仓条件;模式2 的开仓条件如下:做多信号: A: KDJ(3分钟图)金叉,  B :多单突破成功率大于等于35%,可以做多。做空信号:AA: KDJ(3分钟图)死叉, BB: 空单突破成功率大于等于40%,可以做空。KDJ单独开仓条件,需要一个统计算法。成功率的统计算法KDJ 成功率定义:                          Pd(KDJ多单成功率) = (多单突破成功 / 多单突破总次数 )*100%                        Pk(KDJ空单成功率) = (空单突破成功 / 空单突破总次数 )*100%  多单突破成功定义: KDJ金叉形成后的两根棒体的,close[1]减去open[2] 的差值大于2.3个 ATR(14)的值,算突破成功。// ATR(14)值用 open[1]时候的值,即可。  空单突破成功的定义:KDJ死叉后的两个棒体的 open[1]减去close[2]的差值 大于2.4个ATR(14)的值,算突破成功。// atr(14) 取值是 open【1】时候的值。平仓信号:模式1:MACD 平仓信号: // 注意,模式1,平仓后,3根帮内,不允许再次交易。MACD 多单平仓信号:    1:MACD 快慢线,形成死叉,平仓。  /  2:盈利30点,平仓。   / 3:亏损10个点,平仓。MACD  空单平仓信号:   1:MACD快慢线,形成金叉,平仓。/ 2: 盈利30点 平仓, / 3:亏损10个点,平仓,模式2:KDJ 平仓信号  KDJ多单平仓信号:    1: KDJ形成死叉,平仓该组 多单 / 2:盈利32点,平仓  / 3,亏损11个点,平仓  KDJ 空单平仓信号    1:KDJ形成金叉,平仓该组空单 /  2 :盈利32点,平仓,/ 3,亏损11个点,平仓模式3:KDJ 和 MACD 共鸣模式  平仓时,有移动止损   共鸣模式 多单平仓信号:     1:多单盈利20点,平仓2手多单,并启动移动止损,移动止损空间为10个点。   2:盈利60点,全部平仓    3:原始止损40点             模式3的多单 启动移动止损后的 剩余多单,满足移动止损平仓,或者满足盈利60点平仓。   共鸣模式 空单平仓信号:     1:空单盈利20点,平仓2手空单,并启动移动止损,移动止损空间为10个点。 2:盈利50点平仓,全部平仓。3:原始止损40点             模式3共鸣模式的空单,启动移动止损后的 剩余空单,满足移动止损平仓条件后 平仓,或者满足 盈利50点平仓。总风控和禁则:  1:单日浮亏或者单日总亏损在4000元(变量),全部平仓。平仓后12小时内,不予开仓。  2:总风控金额达到本金的7% (变量)时,停止所有开仓。弹出警告窗口。予以提示,人工确认后,予以提示  3:主力合约换月的前一天和后一天,只能平仓,不能开仓。如果开仓,则开仓到新的主力合约中。

//data0.pen1.barv("MACD", data[i2].MACDValue);打开这行代码 1 分钟 K 线图,相对值就会变得很大。显示不正常的问题是怎么修复的?

老师好,同时出现金叉或者死叉,是指那一刻两者都交叉,还是说,一个在前期出现金叉,而另一个指标也出现了金叉即可,比如KDJ出现金叉,那么只要MACD的快线大于慢线即可,还是说两者都要同时某一个K线出现同时金叉?谢谢

回复:这个是直播配套的代码,具体详细看直播录像。就最近两期的

回复:嘿嘿 刘老师又加班啦

//交易商品:白银5分钟图和白银3分钟图 //跨周期1:信号必须出在小周期上,最小的周期 //跨周期2:多个计算数据的周期,那么出信号的信号周期,必须是所有数据周期的公约数 Params Numeric FastLength(12); Numeric SlowLength(26); Numeric MACDLength(9); Numeric Length(9); Numeric SlowLength_kdj(3); Numeric SmoothLength(3); Numeric atrLength(14); Vars Numeric MACDDiff; Numeric AvgMACD; series<Numeric> MACDValue; plot pen1; plot pen2; global numeric i1;//3分钟图层编号 global numeric i2;//5分钟图层编号 Numeric HighestValue; Numeric LowestValue; Numeric k; series<Numeric> kValue; series<Numeric> DValue; Series<Numeric> mp; series<Numeric> macd_sw; series<Numeric> kdj_sw; series<Numeric> kdj_total_count; series<Numeric> kdj_succ_count; series<Numeric> atrvalue; series<Numeric> mark; series<Numeric> mode_3; series<Bool> firstopen; Defs Numeric SMAValue(Numeric Price,Numeric Length,Numeric Weight) { if(InvalidNumeric == Price || InvalidNumeric == Length || InvalidNumeric == Weight) { return InvalidNumeric; } return SMA(Price,Length,Weight); } Events OnInit() { i1 = SubscribeBar(symbol, "3m", BeginDateTime); i2 = SubscribeBar(symbol, "5m", BeginDateTime); //data[i1].hide; //data[i2].hide; SetInitCapital(300000); pen1.figure(0); pen2.figure(0); } OnReady() { pen1.setOption("MACDDiff", "begin-bar", SlowLength); pen1.setOption("MACDDEA", "begin-bar", SlowLength + MACDLength); pen1.setOption("MACD", "begin-bar", SlowLength + MACDLength); pen1.setOption("K", "begin-bar", SlowLength_kdj); pen1.setOption("D", "begin-bar", SmoothLength); pen1.setOption("J", "begin-bar", SmoothLength); } OnBar(ArrayRef<Integer> indexes) { If(BarStatus==0) firstopen = true; Commentary("close[1]:"+text(close[1])); Commentary("vol[1]:"+text(vol[1])); //macd If(BarStatus==0) { macd_sw = 0; kdj_sw = 0; } data0.mp = MarketPosition; Range[i2:i2] { MACDDiff = XAverage( Close, FastLength ) - XAverage( Close, SlowLength ) ; AvgMACD = XAverage(MACDDiff, MACDLength); MACDValue = 2 * (MACDDiff - AvgMACD); data0.pen1.line("MACDDiff", data[i2].MACDDiff); data0.pen1.line("MACDDEA", data[i2].AvgMACD); If (MACDValue >= 0) data0.pen1.setOption("MACD", "color", Color9()); Else data0.pen1.setOption("MACD", "color", Color10()); data0.pen1.barv("MACD", data[i2].MACDValue); data0.pen1.line("零线", 0); } //kdj Range[i1:i1] { HighestValue = HighestFC(High, Length); LowestValue = LowestFC(Low, Length); k = (Close - LowestValue) / (HighestValue - LowestValue) * 100; kValue = SMAValue(k, SlowLength_kdj, 1); DValue = SMAValue(KValue, SmoothLength, 1); atrvalue = AvgTrueRange(atrLength); if(kValue <> InvalidNumeric) { data0.pen2.line("K", data[i1].KValue); } if(DValue <> InvalidNumeric) { data0.pen2.line("D",data[i1].DValue); } if(kValue <> InvalidNumeric && DValue <> InvalidNumeric) { data0.pen2.line("J", 3 * data[i1].KValue - 2 * data[i1].DValue); } data0.pen2.line("Ref1", 20); data0.pen2.line("Ref2", 80); //统计kdj金叉成功次数 //统计kdj金叉次数 If(KValue[2]<=DValue[2] and KValue[1]>DValue[1]) { kdj_total_count = kdj_total_count + 1; } //统计kdj金叉成功次数 If(KValue[4]<=DValue[4] and KValue[3]>DValue[3] and close[1]-open[2]>2.3*atrvalue[1] ) { kdj_succ_count = kdj_succ_count + 1; } //data0.Commentary(text(data[i1].kdj_succ_count)); data0.Commentary("kdj金叉:"+text(data[i1].kdj_total_count)); //data0.Commentary(text(2.3*data[i1].atrvalue[1])); //data0.Commentary(text(round(100*data[i1].kdj_succ_count/data[i1].kdj_total_count,2))); } If(data[i1].CurrentBar<1+Max(Max(Length,SlowLength),SmoothLength) or data[i2].CurrentBar<SlowLength + MACDLength) return; //series my_rollover //my_rollover = Rollover If(my_rollover<>my_rollover[1]) { //记录一下序列变量my_date记录TrueDate //TrueDate和序列变量 //模式3做多 If(data[i2].MACDValue[2]<=0 and data[i2].MACDValue[1]>0 and data[i1].KValue[2]<=data[i1].DValue[2] and data[i1].KValue[1]>data[i1].DValue[1] and macd_sw<>1 and kdj_sw<>1 and my_date<>truedate(0)) { Buy(3,open); macd_sw = 1; kdj_sw = 1; firstopen = false; mode_3 = 1; } { //macd做多模式1 If(data[i2].MACDValue[2] <= 0 and data[i2].MACDValue[1] > 0 and macd_sw <> 1 and (BarsSinceExit > 5 or firstopen)) { buy(1, open); macd_sw = 1; firstopen = false; } //kdj做多模式2 If(data[i1].KValue[2] <= data[i1].DValue[2] and data[i1].KValue[1] > data[i1].DValue[1] and kdj_sw <>1 and round(100 * data[i1].kdj_succ_count / data[i1].kdj_total_count, 2) > 35) { buy(2, open); kdj_sw = 1; firstopen = false; } } //macd做空 If(data[i2].MACDValue[2]>=0 and data[i2].MACDValue[1]<0 and macd_sw <> -1) { SellShort(1, open); macd_sw = -1; } //kdj做空 If(data[i1].KValue[2]>=data[i1].DValue[2] and data[i1].KValue[1]<data[i1].DValue[1] and kdj_sw <>-1) { sellshort(2,open); kdj_sw = -1; } If(mode_3 == 1)//进入3模式 { //3模式平仓方式 //先判断止损,然后是固定止盈, //要么固定止盈60,要么移动止盈10 //If(CurrentContracts>1)//判断止损,判断固定止盈 //If(CurrentContracts==1)//判断移动止盈10跳,固定止盈60 mode_3 = 0; }Else { //加仓减仓逻辑写,盈利30,减1手,盈利32,减2手 //亏损30,减1手,亏损32,减2手. //macd_sw,kdj_sw,=0 } }

回复:https://tbq3.tbquant.net/helper?product_id=991&search=%E6%8D%A2%E6%9C%88&type=search

回复://data0.pen1.barv("MACD", data[i2].MACDValue); 打开这行代码 1 分钟 K 线图,相对值就会变得很大。显示不正常的问题是怎么修复的?

回复:代码是全部复制的吗老师的Oninit()里面的 pen1.figure(0); 是不是抄漏了

回复:也不对 pen1.figure(0) 抄漏的话,diff和dea也在上面那你是哪的问题,我复制老师的代码运行没问题呀

回复:我是跟着视频写的,第一次课的时候,有这个问题,第二次课就突然好了,所以一直卡在这。比对一下代码,问题找到了。 MACDValue 需要加上图层号。data0.pen1.barv("MACD", MACDValue);