模型主要架构
交易商品:白银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:主力合约换月的前一天和后一天,只能平仓,不能开仓。如果开仓,则开仓到新的主力合约中。
老师好,同时出现金叉或者死叉,是指那一刻两者都交叉,还是说,一个在前期出现金叉,而另一个指标也出现了金叉即可,比如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
}
}