策略主要想实现课程里的内容: https://www.tbquant.net/TrainDetail?id=240 17分钟;
共有data0-5个图层,每个图层都会进行数据交互;
我主要是用大周期日线、周线、级别来确定方向,然后用小周期来回操作;
1,5,15,60,分钟级别可能都会有交易进行买卖操作,所以我会针对不同周期开发不同的策略;
这样程序框架必须以图层为单位来进行管理;
我想到的办法是,数据运算部分放在Range[i=0:DataCount-1],统一进行运算;
onbar最前端使用了 BarExistStatus函数让多周期的数据进行对齐;
用Range[2:2]函数,进行分图层管理,所有逻辑条件和交易信号都在Range[2:2] 内编写;
这样的好处是,发现data2周期有问题的时候,我可以快速根据图层找到问题点,而不用去管其他图层的逻辑信号,提高程序开发,调试,迭代升级效率;
最近在开发data2图层时发现程序会报信号闪烁
但是我检查程序,发现没有使用未来函数,数据源都是引用的Data0.close[1]这个确定的数据;
咨询老师后,叫我把逻辑信号放在最小周期内进行处理,于是我将data2图层的逻辑写到data0图层中去,然后data0输出一个交易信号 1:买开 0:卖平,然后在data2图层中检测信号进行买卖操作;
但是加载在交易单元后发现还是会存在信号闪烁;
我甚至将所均线、逻辑判断、结果都进行回溯[1]后,都会出现信号闪烁;
fb000最容易报信号闪烁,其余没有报信号闪烁的品种,策略在运行的时候也会报出信号闪烁;
试了好多种方法,还是没找到问题出在哪里,所以请各位老师们帮忙看看,找出原因后我好随之修正;
附件解读:
TM_difficult_2023.12.12-1 是用户函数文件
积寒_000_2023.12.11-1是策略单元1:,是最初发现问题, 简化后的策略单元
积寒_000_2023.12.12-2是策略单元2:是用 Range将图层分开处理后的策略单元
积寒_000_2023.12.12-3是策略单元3:这是将信号放在data0图层,在data2图层进行买卖标记的策略单元
以上文件都存在信号闪烁问题!
这是简化后的代码:
//------------------------------------------------------------------------
// 简称: TM_difficult
// 名称: 代码存在问题
// 类别: 公式应用
// 类型: 用户应用
// 输出: Void
//------------------------------------------------------------------------
Params
//此处添加参数
Numeric Length1(5);
Numeric Length2(10);
Numeric Length3(20);
Numeric DSquantity(1); //默认交易数量
Numeric SLoss(0.5); //止损位%,前5条bar为低点,超过0.5按照0.5进行止损
Numeric Sprofit(0.5); //动态止盈位%,涨幅超过止盈位并且回落后进行止盈,如果没有回落则等死叉在进行止盈
Numeric Clearance(0); //过节清仓标志位 1:保留多仓 0:无持仓 -1:保留空仓
Vars
Numeric i; //零时变量
Series <Numeric> MA1; //5均线
Series <Numeric> MA2; //10均线
Series <Numeric> MA3; //20均线
Global Array <Numeric> GANumeric1; //全局数组
//Numeric型数组数据
array <Numeric> ACounter; //计数器
array <Numeric> Arr_price; //交易价格
array <Numeric> Arrma1; //数据
//多数组指针式交互
array <array <Numeric>> Arrp_data1; //多周期数据
// 复合类型数据
Series <Array<Numeric>> SANumeric1; //序列型Numeric一维数组
Series <Array<Array<Numeric>>> SAANumeric1; //序列型Numeric二维数组
//结构体数据
Global CommissionRate rate; //手续费
Natural CodeProperty codePro; //合约属性
//Natural CommissionRate rate; //手续费
Defs
//功能函数
Events
//此处实现事件函数
//初始化事件函数,策略运行期间,首先运行且只有一次
OnInit()
{
//----------订阅周期
SubscribeBar(Symbol,5m,Data0.BeginDateTime); //5 分钟周期 data1
SubscribeBar(Symbol,15m,Data0.BeginDateTime); //15 分钟周期 data2
SubscribeBar(Symbol,1h,Data0.BeginDateTime); //1 小时周期 data3
SubscribeBar(Symbol,1d,Data0.BeginDateTime); //1 天周期 data4
SubscribeBar(Symbol,1w,Data0.BeginDateTime); //1 周周期 data5
}
//每一个bar开始前驱动
OnBarOpen(ArrayRef<Integer> indexs)
{
//Print(ON**********);
//----------多图层数据对齐
Numeric i;
Numeric result=1;
For i=0 to DataSourceSize-1
{
result=result*data[i].BarExistStatus;
}
If(result<>1) Return;
}
//Bar更新事件函数,参数indexs表示变化的数据源图层ID数组
OnBar(ArrayRef<Integer> indexs)
{
//程序报错,不继续执行
//----------多图层数据对齐
Numeric i;
Numeric result=1;
For i=0 to DataSourceSize-1
{
result=result*data[i].BarExistStatus;
}
If(result<>1) Return;
//------------------------------------------------------------------------多图层
Range[i=0:DataCount-1]
{
//------------------------------------------------------------------------数据处理
//均线数据运算
MA1=AverageFC(Close,Length1);
MA2=AverageFC(Close,Length2);
MA3=AverageFC(Close,Length3);
//------------------------------------------------------------------------Data 取数据
//取30条close值
Numeric T;
For T=0 To 30-1
{
SAANumeric1[0][33][T]=CLOSE[T];
}
/*//数据展示
For i=0 To GetArraySize(SAANumeric1[0][33])-1
{
Commentary(bar+Arrp_data[+Text(i)+]=+text(SAANumeric1[0][33][i]));
}*/
//数据替换
SAANumeric1[0][33][0]=data0.Close[1];
Numeric C;
Numeric sumValue;
sumValue=0;
For C=0 To 5-1
{
sumValue = sumValue + SAANumeric1[0][33][C]; //数组之和算5均线
}
SAANumeric1[0][35][0]=sumValue/5;
sumValue=0;
For C=0 To 20-1
{
sumValue = sumValue + SAANumeric1[0][33][C]; //数组之和算20均线
}
SAANumeric1[0][37][0]=sumValue/20;
//均值展示
Commentary(5均线+text(SAANumeric1[0][35][0]));
Commentary(20均线+text(SAANumeric1[0][37][0]));
//5&20均线 交叉状态
If(SAANumeric1[0][35][0]> SAANumeric1[0][37][0])
{
SAANumeric1[0][41][0]=1;
}
Else if (SAANumeric1[0][35][0]< SAANumeric1[0][37][0])
{
SAANumeric1[0][41][0]=-1;
}
Else
{
SAANumeric1[0][41][0]=0;
}
//data2周期赋值给data0周期
data0.SAANumeric1[0][50][0]=data2.MarketPosition; //data2.周期没有持有多单
data0.SAANumeric1[0][50][1]=data2.SAANumeric1[0][41][0]; //data2.周期均线交叉情况
//------------------------------------------------------------------------Data0图层处理
If(i==0)
{
//其他周期
PlotNumeric(data2.MA1,data2.SAANumeric1[0][35][0],0,Yellow);
PlotNumeric(data2.MA3,data2.SAANumeric1[0][37][0],0,DarkRed);
If(Data0.CurrentBar >20)
{
//------------------------------------------------------------------------Data0.图层处理data2数据
IF ( data0.SAANumeric1[0][50][0]<>1 ) //添加 data4.Arrp_data1[11][1]>0 日线5均线斜率>0 会出现信号闪烁
{
//------------------------------------------------------------------------买点
If( data0.SAANumeric1[0][50][1]==1 ) //DATA2.MA1与MA3金叉
{
data2.SAANumeric1[0][50][2]=1; //data2.图层买多
}
}
//------------------------------------------------------------------------有多单的情况
if ( data0.SAANumeric1[0][50][0]==1 ) //持有多单 and 下单>一个bar数的时候
{
//------------------------------------------------------------------------卖点
If( data0.SAANumeric1[0][50][1]<>1) //DATA2.MA1与MA3金叉
{
data2.SAANumeric1[0][50][2]=0; //data2.图层卖出
}
}
}
}
//------------------------------------------------------------------------Data1图层处理
ELSE If (i==1)
{
//画图区
PlotNumeric(MA1,MA1,0,Yellow); //黄均线
//PlotNumeric(MA2,MA2,0,Green); //绿均线
PlotNumeric(MA3,MA3,0,DarkRed); //红均线
}
//------------------------------------------------------------------------Data2图层处理
ELSE If (i==2 )
{
//画图区
PlotNumeric(MA1,MA1,0,Yellow); //黄均线
PlotNumeric(MA3,MA3,0,DarkRed); //红均线
//逻辑区
//买卖点处理1
If (data2.MarketPosition<>1 and data2.SAANumeric1[0][50][2]==1)
{
Buy(1,close[1]); //最小交易单位
}
else if (data2.MarketPosition==1 and data2.SAANumeric1[0][50][2]<>1)
{
Sell(1,close[1]); //全部卖出
}
}
//------------------------------------------------------------------------Data3图层处理
ELSE if (i==3)
{
//画图区
PlotNumeric(MA1,MA1,0,Yellow); //黄均线
//PlotNumeric(MA2,MA2,0,Green); //绿均线
PlotNumeric(MA3,MA3,0,DarkRed); //红均线
}
//------------------------------------------------------------------------Data4图层处理
ELSE if (i==4)
{
//画图区
PlotNumeric(MA1,MA1,0,Yellow); //黄均线
//PlotNumeric(MA2,MA2,0,Green); //绿均线
PlotNumeric(MA3,MA3,0,DarkRed); //红均线
}
//------------------------------------------------------------------------Data5图层处理
ELSE If (i==5)
{
PlotNumeric(MA1,MA1,0,Yellow); //黄均线
//PlotNumeric(MA2,MA2,0,Green); //绿均线
PlotNumeric(MA3,MA3,0,DarkRed); //红均线
}
}
}
//------------------------------------------------------------------------
// 编译版本 2023/12/11 112053
// 版权所有 xToby2100
// 更改声明 TradeBlazer Software保留对TradeBlazer平台
// 每一版本的TradeBlazer公式修改和重写的权利
//------------------------------------------------------------------------
调试时还发现,该策略单元很吃内存,由于运算任务重可以理解;
但是我发现软件停止任何策略单元运行后,超过10多分钟占用的内存也没有得到释放,不知道是什么原因?
计算均线当前K线CLOSE的关系。
111
请问老师是啥问题呢?
我都是调用AverageFC 平台自带的函数进行运算;
而且运算处理的值我只是用PlotNumeric展示在图上用,MA1,MA2,MA3 都并没有参与过实际的逻辑运算;
真正参与逻辑运算的是从其他周期取出来的最近CLOSE回溯值,算出的均线值,这些值都是确定的;
老师有排查问题后各品种都不会出现信号闪烁的代码吗,请一并输出一下.
顺便问一下ArrayRef<Integer> indexs 这是什么数据呀?
我可以这样写的条件将图层分开处理吗?
我理解这句话的意思是
当 indexs[0,2,3,5]中包含2
就执行if下的语句,没有就不执行?
会研究一下这个问题