系统函数:基于商品价差的通道突破系统多执行问题
2023-03-30 23:58

老师您好。最近在研究系统函数基于商品价差的通道突破系统,里面的开仓条件是:

If(Data0.Marketposition == 0 And CC[1] >= UpperLine[1] And Data0.Vol > 0 And Data1.Vol > 0)

理论上每一笔交易两个图层应该都是同时开仓或平仓的,Data1没有成交量的话应该不会开仓(如图一)

但是在做回测以及模拟盘的时候发现还是经常会瘸腿(只有Data0开仓或平仓)(如图二),想请教一下老师这是什么原因呢,要怎么调整才能规避这个问题?data-href=

data-href=

评论区
ablabs

老师您好,我是用模拟盘,每次开仓一手,应该不是资金的问题,图表回测和模拟盘跑的时候都会有这个问题,这是个系统自带的案例,我做了好多次测试一直解决不了,尤其是在10秒的线上出现劈叉的概率还挺高的。公式是// 简称: SpreadChannelBreakout_L// 名称: 基于商品价差的通道突破系统多 

2023-04-03 10:50
ablabs

老师您好,完整的代码如下,如果周期设置的越短(比如10秒线,越容易出错)

Params

Numeric Lots0(1); // 商品A的头寸 

Numeric Lots1(1); // 商品B的头寸 

Numeric Length(20); // 通道的周期数

Numeric StopLen(10); // 止损通道的周期数

Vars

Series<Numeric> OO; // 价差开盘价

Series<Numeric> HH; // 价差最高价

Series<Numeric> LL; // 价差最低价

Series<Numeric> CC; // 价差收盘价

Numeric Factor0; // A商品计算价差的系数

Numeric Factor1; // B商品计算价差的系数

Series<Numeric> UpperLine; // 通道上轨

Series<Numeric> LowerLine; // 通道下轨

Series<Numeric> StopLine; // 止损位

Events

OnInit()

{

Numeric count = Max(Length,StopLen);

SetBeginBarMaxCount(count - 1);

}

OnBar(ArrayRef<Integer> indexs)

{

// 价差计算系数

Factor0 = Lots0*Data0.ContractUnit*Data0.BigPointValue;

Factor1 = Lots1*Data1.ContractUnit*Data1.BigPointValue;

// 计算价差并输出价差K线

CC = Data0.Close*Factor0 - Data1.Close*Factor1;

OO = Data0.Open*Factor0 - Data1.Open*Factor1;

HH = Max(OO,CC);

LL = Min(OO,CC);

PlotNumeric(\"Open\",OO);

PlotNumeric(\"High\",HH);

PlotNumeric(\"Low\",LL);

PlotNumeric(\"Close\",CC);

// 计算价差的周期通道上下轨

UpperLine = Highest(HH[1],Length); 

LowerLine = Lowest(LL[1],Length);

PlotNumeric(\"UpperLine\", UpperLine);

PlotNumeric(\"LowerLine\", LowerLine);

// 开仓

If(Data0.Marketposition == 0 And CC[1] >= UpperLine[1] And Data0.Vol > 0 And Data1.Vol > 0)

{

Data0.Buy(Lots0, data0.Open);

Data1.SellShort(Lots1, Data1.Open);

}

// 反向平仓

If(Data0.Marketposition == 1 And CC[1] <= LowerLine[1] And Data0.Vol > 0 And Data1.Vol > 0)

{

Data0.Sell(0, Data0.Open);

Data1.BuyToCover(0, Data1.Open);

}

// 止损

Stopline = Lowest(LL[1], StopLen);

If(Data0.MarketPosition == 1 And Data0.BarsSinceEntry > 0 And Data0.Vol > 0 And Data1.Vol > 0)

{

If(CC[1] <= StopLine[1])

{

Data0.Sell(0,Data0.Open);

Data1.BuyToCover(0,Data1.Open);

}

}

}

//------------------------------------------------------------------------

// 编译版本 GS2014.10.25

// 版权所有 TradeBlazer Software 2003-2025

// 更改声明 TradeBlazer Software保留对TradeBlazer平

// 台每一版本的TradeBlazer公式修改和重写的权利

//------------------------------------------------------------------------

2023-04-03 09:13
顶部