//------------------------------------------------------------------------
// 简称: EMA30Price
// 名称: 均线斜率
// 类别: 策略应用
// 类型: 内建应用
//------------------------------------------------------------------------
Params
Numeric EMA30Length(30); // 30日均线参数
Numeric MinDiff(0); // 与30线的最小价差
Numeric MaxDiff(100); // 与30线的最大价差
Numeric DiffPrice(3); // 多几跳去买/卖
Numeric SlopeCnt(5); // 近N天均线值的斜率
Numeric SlopeVal(2); // 斜率
Vars
Series<Numeric> ema30; // 30日均线值
Series<Numeric> slope; // 30日均线值
Numeric CurrentPrice; // 当前实时价格
Numeric Diff;
Numeric longPosition;
Numeric shortPosition;
Bool Flag(False);
String mainSymbol;
Numeric Cnt(1); // 手数
Numeric MarketPosition; // 图表上信号的当前净持仓状态,-1表示当前位置为持空仓,0表示当前位置为持平,1表示当前位置为持多仓
Events
//初始化事件函数,策略运行期间,首先运行且只有一次,应用在订阅数据等操作
OnInit()
{
//与数据源有关
Range[0:DataCount-1]
{
//=========数据源相关设置==============
AddDataFlag(Enum_Data_RolloverBackWard()); //设置后复权
AddDataFlag(Enum_Data_RolloverRealPrice()); //设置映射真实价格
AddDataFlag(Enum_Data_AutoSwapPosition()); //设置自动换仓 (据说只是回测时用的)
AddDataFlag(Enum_Data_IgnoreSwapSignalCalc()); //设置忽略换仓信号计算
//=========交易相关设置==============
SetSlippage(Enum_Rate_PointPerHand,2); //设置滑点为2跳/手
SetOrderMap2MainSymbol(); //设置委托映射到主力
}
}
// 每根BAR开始的时候设置触发时间点, 收盘价模型收盘提前N秒发单
OnBarOpen(ArrayRef<Integer> indexes)
{
Array<Numeric> timePoint;
Numeric ret = DateTimeAdd(RealEndDateTime, -10); // 提前10秒发单
ret = StringToTime(TimeToString(ret));
ArrayPushBack(timePoint, ret);
ret = DateTimeAdd(RealEndDateTime, -5); // 提前5秒发单
ret = StringToTime(TimeToString(ret));
ArrayPushBack(timePoint, ret);
SetTriggerBarClose(timePoint);
}
OnReady()
{
SetBackBarMaxCount(1 + EMA30Length); // 设置最大回溯条数
Range[0:DataSourceSize() - 1]
{
setPlotOption("ema30", "begin-bar", EMA30Length);
}
}
OnBar(ArrayRef<Integer> indexs)
{
// data0 是日线数据
// data1 是分钟级别数据
Range[0:DataSourceSize() - 1]
{
// 计算30日均线
ema30 = AverageFC(Close, EMA30Length);
PlotNumeric("ema30", ema30);
// 计算日均线的斜率
Array<Numeric> arr;
Numeric i;
for i=SlopeCnt DownTo 1
{
ArrayInsert(arr, 0, ema30[i]);
}
slope = LinearRegSlopeArray(arr); //线性回归斜率
Commentary("均线斜率:" + Text(slope));
}
}
OnBarClose(ArrayRef<Integer> indexs)
{
Print("OnBarClose 执行时间:" + DateTimeToString(MakeDateTime(Date, Time)));
// 获取当前实时价格(当前bar的close价)
CurrentPrice = Close();
// 计算分钟线的最低价格/最高价格
Numeric lowest = data1.Lowest(data1.Close[1], EMA30Length);
Numeric highest = data1.Highest(data1.Close[1], EMA30Length);
if(data1.MarketPosition <> 1) // 没有多单
{
Flag = data1.Buy(Cnt, CurrentPrice + DiffPrice); // 尽量成交,减少偷价
FileAppend("d:/tb_data/ma30.tbf", "开多单: " +DateTimeToString(MakeDateTime(Date, Time))+ ", 结果: " +Text(IIF(Flag, 1, 0)));
}
}
为什么我在 OnBarClose 中开多单以后,用data1.MarketPosition 获取到的值一直是0,然后导致一直开单;data0是日线级别,data1是分钟/小时线级别;以下是截图:
看到原因了,打扰了
哦好