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

模型主要架构


交易商品:白银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:主力合约换月的前一天和后一天,只能平仓,不能开仓。如果开仓,则开仓到新的主力合约中。

两个交易信号,如何分别开单和控单
代编程问题
Buy和SellShort反手下单,手数计算不足1单,是会按照默认最小1单开仓么?
编程问题
跨周期偷价和计算误差问题
向高手和研发人员请教几个简语言的编程问题
计算方式分为几何方式计算和算术方式计算
A函数和图表函数可以混编吗?
基于TBQuant开发的对手工单的风控程序。
期权交易时对【虚拟账户】和【真实账户】中动态权益的计算问题

老师好,同时出现金叉或者死叉,是指那一刻两者都交叉,还是说,一个在前期出现金叉,而另一个指标也出现了金叉即可,比如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