//------------------------------------------------------------------------
// 简称: EMA30Price
// 名称: 均线斜率
// 1.跌破前低就止损
// 2.止损以后下一根K线不开仓
// 类别: 策略应用
// 类型: 内建应用
//------------------------------------------------------------------------
Params
Numeric EMA30Length(30); // 30日均线参数
Numeric MinDiff(0); // 与30线的最小价差
Numeric MaxDiff(100); // 与30线的最大价差
Numeric DiffPrice(3); // 多几跳去买/卖
Numeric SlopeCnt(5); // 近N天均线值的斜率
Numeric SlopeVal(1); // 斜率
Numeric DiffPercent(0.02); // 价差
Numeric LHKCnt(15); // 价差
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); // 手数
Global Numeric Skip; // 止损以后跳过的K线(跳过几根K线再开仓)
//此处添加变量
Plot plt;
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(); //设置委托映射到主力
}
}
OnReady()
{
SetBackBarMaxCount(1 + EMA30Length); // 设置最大回溯条数
Range[0:DataSourceSize() - 1]
{
setPlotOption("ema30", "begin-bar", EMA30Length);
}
}
OnBarClose(ArrayRef<Integer> indexs)
{
Numeric endTime = data1.RealEndDateTime();
Numeric currentTime = SystemDateTime();
Print("OnBarClose 执行时间:" +DateTimeToString(currentTime)+ ", RealEndDateTime: " +DateTimeToString(endTime));
data1.Commentary("Skip: " + Text(Skip));
if (endTime < currentTime)
{
Print("跳过回测K线 " + DateTimeToString(MakeDateTime(Date, Time)));
return;
}
if (Skip > 0)
{
Print("跳过执行, Skip: " + Text(Skip) + DateTimeToString(MakeDateTime(Date, Time)));
Skip = Skip - 1;
return;
}
// 获取当前实时价格(当前bar的close价)
CurrentPrice = data1.Close();
// 计算分钟线的最低价格/最高价格
Numeric i;
Numeric curPrice;
Numeric backCnt;
Numeric lowest = 99999999;
for i = 1 to LHKCnt
{
curPrice = data1.Close[i];
if(curPrice<lowest)
{
backCnt = i;
lowest = curPrice;
}
}
Bar barVal;
Bool ret = data1.GetBar(barVal, backCnt);
data1.Commentary("Lowest: " + Text(lowest) + "," +DateTimeToString(barVal.dateTime));
Numeric highest = 0;
for i = 1 to LHKCnt
{
curPrice = data1.Close[i];
if(highest<curPrice)
{
backCnt = i;
highest = curPrice;
}
}
ret = data1.GetBar(barVal, backCnt);
data1.Commentary("Highest: " + Text(highest) + "," + DateTimeToString(barVal.dateTime));
//获取当前商品的仓位
Position pos;
mainSymbol = MainSymbol(Symbol());
A_GetPosition(mainSymbol, pos);
longPosition = pos.longCurrentVolume;
shortPosition = pos.shortCurrentVolume;
Print("多单量: " + Text(longPosition) + ", 空单量 : " + Text(shortPosition) + ", " +DateTimeToString(MakeDateTime(Date, Time)));
Numeric TargetPrice = Round(lowest * (1+DiffPercent), 1);
data1.Commentary("跌到: " + Text(TargetPrice) + " 开多");
if (CurrentPrice > lowest && CurrentPrice <= TargetPrice)
{
if(longPosition <= 0) // 没有多单
{
Print("开多单, data0.slope: " + Text(data0.slope) + ", SlopeVal: " + Text(SlopeVal) + ", ema30: " + Text(data0.ema30) + ", CurrentPrice: " + Text(CurrentPrice) + ", lowest: " + Text(lowest) + ", " + DateTimeToString(MakeDateTime(Date, Time)));
plt.text("Text",Low, "开多");
Flag = data1.Buy(Cnt, CurrentPrice + DiffPrice); // 尽量成交,减少偷价
FileAppend("d:/tb_data/ma30.tbf", "开多单: " +DateTimeToString(MakeDateTime(Date, Time))+ ", 结果: " +Text(IIF(Flag, 1, 0)));
}
}
}
以上是相关代码,data0是日线,data1是分钟线;
原来是用 data1.MarketPosition 判断信号的,可正确在分钟图上显示入场/出场信号,如下图:

但是改为 A_GetPosition(mainSymbol, pos); 判断仓位以后,在分钟图上就不显示信号了,信号跑到日线图上了,如下图:


麻烦各位老师帮忙看看
A_GetPosition是实时函数,你没登账户不会有持仓,而且实时是没有历史的

我登录账户了,用的是模拟账户;另外我的平多单的方法已经被触发了,而且执行到Sell函数了,Flag 的值显示为1, 但是怎么持有的多单就是没有被平仓掉啊?我这个多单是手动开仓的
另外我用 A_GetPosition 已经拿到持有的多单数量了
图表和A函数混用是不会有什么正确结果的
你A_GetPosition 取到有什么用,刷新一下看看 图表上还会在吗?
意思是 推荐用MarketPosition 做真正的持仓信号是吗?用A_GetPosition是因为可以拿到真正的持仓信息,以免MarketPosition发生信号闪烁导致重复开仓;
图表系统就用图表信号
那我上面那个sell函数被触发了,但是却没有平仓,是因为 MarketPosition 的原因啊?还是因为我这个单子是手动开仓的单子引起的啊?

另外我的平多单的方法已经被触发了,而且Flag 的值显示为1, 但是怎么持有的多单就是没有被平仓掉啊?我这个多单是手动开仓的
原来使用 data1.MarketPosition 判断仓位的时候,可在分钟图上看到信号,但是改为 A_GetPosition(mainSymbol, pos); 判断仓位以后,在分钟图上就看不到信号了
不同图层需要加前缀运行