老师,上午好,问题是这样的:
黄金买多网格 850以下 每下跌超8 买1手 每下跌超16 买2手 以此类推/价格反弹8就卖1手 反弹超16就卖2手 以此类推 /上一个网格价是786(上周五晚上) 今天周一低开
1)上周五晚上净多仓:(850-786)/8网格间距=8手净多仓
2)今天周一刚开盘那会: 上一baseprice网格基准价是786,掉到775多点,已经掉了8个点多,信号显示增加1手,净持仓+8手,
这时baseprice网格基准价是778(验证 850-778=72除以网格间距8 得出净持仓+9手)
3)价格低开后 继续往下掉 最低掉到765.64 此时较上一基准价778跌了超过8 ,信号显示增加2手,净持仓+10手
但此时我的代码打死不再开仓 净持仓还是9手
代码名称叫WANGGGE_AU_DUO5 // 因其它代码也有au成交
麻烦老师看一下 问题如下:信号是对的 但是跳空几格就只买/卖1手 代码如下(关键是下跌买入跳空跳几个网格买入 每次就买1手 // 估计跳空卖出也存在这个问题): 下跌买入还有上涨卖出的代码应该怎么改呀
//------------------------------------------------------------------------
// 简称: WANGGGE_AU_DUO5
// 名称: 黄金多网格 解决跳空
// 类别: 删除minMove * priceScale 因为有偏移委托10跳 Low + minMove * priceScale/High - minMove * priceScale
// 类型: 用户应用
// 输出: Void
//------------------------------------------------------------------------
Params
Numeric gridSpacing (8); // 网格间距
Numeric lots (1);
Numeric startprice(850);
Vars
Series <Numeric> baseBKVol; // 净多仓 删除了Global
Series <Numeric> basePrice; // 作为衡量的基准价格
Series <Numeric> gridCount; // 用于计算买量的变量
Events
// 初始化事件函数,策略运行期间,首先运行且只有一次
OnInit()
{
// 初始化变量
baseBKVol = 0;
basePrice = 0;
gridCount = 0;
}
// Bar更新事件函数,参数indexs表示变化的数据源图层ID数组
OnBar(ArrayRef<Integer> indexs)
{
// 初始建仓(使用当前Bar的最低价)
If (MarketPosition == 0 and Low <= startprice)
{
gridCount = RoundDown((startprice - Low) / gridSpacing, 0);
if (gridCount >= 1)
{
baseBKVol = lots * gridCount;
// 修改开仓价
Buy(baseBKVol, Max(open, startprice - gridCount * gridSpacing)); // 买价虽用min 卖价虽用max 但都是偏离10跳 更具优势更易成交 // 改前 Buy(baseBKVol, Min(open, min(Low, startprice - gridCount * gridSpacing)))
basePrice = startprice - gridCount * gridSpacing;
Commentary("抄底初始建仓@网格" + Text(gridCount)+",买入建仓价:" + Text(basePrice) + ",当前净多仓:" + Text(baseBKVol)+ " / 间距:"+ Text(gridSpacing)+ ",初始价:"+ Text(startprice));
Print("抄底初始建仓@网格" + Text(gridCount)+",买入建仓价:" + Text(basePrice) + ",当前净多仓:" + Text(baseBKVol)+ " / 间距:"+ Text(gridSpacing)+ ",初始价:"+ Text(startprice));
}
}
// 持仓网格逻辑 下跌买入(使用当前Bar的最低价,严格基于最新basePrice)
else if (MarketPosition > 0 and Low <= basePrice - gridSpacing)
{
// 计算当前价格与基准价格的差值对应的网格数
Numeric gridDiff = RoundDown((basePrice - Low) / gridSpacing, 0);
if (gridDiff >= 1)
{
// 根据网格数进行一次性增仓操作,修改开仓价
Buy(lots * gridDiff, max(open, basePrice - gridDiff * gridSpacing)); //改前 Buy(lots * gridDiff, Min(open, min(Low, basePrice - gridDiff * gridSpacing))) 这个滑点大
baseBKVol = baseBKVol + lots * gridDiff;
basePrice = basePrice - gridDiff * gridSpacing; // 买价
Commentary("抄底加仓买入@网格" + Text(gridDiff) + ",手数:" + Text(lots * gridDiff) + ",价格:" + Text(basePrice) + ",当前净多仓:" + Text(baseBKVol)+ " / 间距:"+ Text(gridSpacing)+ ",初始价:"+ Text(startprice));
Print("抄底加仓买入@网格" + Text(gridDiff) + ",手数:" + Text(lots * gridDiff) + ",价格:" + Text(basePrice) + ",当前净多仓:" + Text(baseBKVol)+ " / 间距:"+ Text(gridSpacing)+ ",初始价:"+ Text(startprice));
}
}
// 上涨卖出(使用当前Bar的最高价,严格基于最新basePrice)
else if (MarketPosition > 0 and High >= basePrice + gridSpacing)
{
// 计算当前价格与基准价格的差值对应的网格数(这里是上涨情况)
Numeric gridDiff = RoundDown((High - basePrice) / gridSpacing, 0);
if (gridDiff >= 1 && baseBKVol > 0)
{
// 确定卖出数量,不超过持仓量
Numeric sellVol = Min(lots * gridDiff, baseBKVol);
// 修改平仓价
Sell(sellVol, min(open, basePrice + gridDiff * gridSpacing)); // 改前 Sell(sellVol, Max(open, max(High, basePrice + gridDiff * gridSpacing))) 这个滑点大
baseBKVol = baseBKVol - sellVol;
basePrice = basePrice + gridDiff * gridSpacing;
Commentary("抄底减仓卖出@网格" + Text(gridDiff) + ",手数:" + Text(sellVol) + ",价格:" + Text(basePrice) + ",当前净多仓:" + Text(baseBKVol)+ " / 间距:"+ Text(gridSpacing)+ ",初始价:"+ Text(startprice));
Print("抄底减仓卖出@网格" + Text(gridDiff) + ",手数:" + Text(sellVol) + ",价格:" + Text(basePrice) + ",当前净多仓:" + Text(baseBKVol)+ " / 间距:"+ Text(gridSpacing)+ ",初始价:"+ Text(startprice));
}
}
}
这种复杂的问题除了写调试代码,查看模型运行日志,慢慢一点点分析,其他没什么办法。
谢谢老师!