OnBar(ArrayRef<Integer> indexs)
{
If(MarketPosition==1 And BarsSinceEntry>=0)
{
ruanzhisun_duo=Max(ruanzhisun_duo,ruanzhisun_duo[1]);
yingzhisun_duo=Max(yingzhisun_duo,yingzhisun_duo[1]);//止损只能上移
plt_duo.line("软止损-多",ruanzhisun_duo);
plt_duo.line("硬止损-多",yingzhisun_duo);
Commentary("成本价"+Text(chengbenjia));
If(ruanzhisun_duo>=chengbenjia)//软止损上移到成本价以上
{
zhisunval=ruanzhisun_duo;//止损价=软止损
plt_duo.line("止损线",zhisunval);//画最终止损线
If(MarketPosition==0); //触发止盈,退出循环
Else If(L<=zhisunval) //触发软止损,平仓退出
{
Sell(0, 0);
} //没有止损也没有止盈,继续循环
}
OnFill(FillRef ordFill)//记录开仓状态,只有开仓才记录止损位置,平仓不记录
{
If(MarketPosition==1)//多头持仓下,记录多头止损价
{
zhisunval=yingzhisun_duo;
chengbenjia=ordFill.fillPrice;//获取成本价
}
Else If(MarketPosition==-1)
{
zhisunval=yingzhisun_kong;
chengbenjia=ordFill.fillPrice;//获取成本价
}
}
为什么图表上有信号,但ordFill.fillPrice=0?怎么改才能获取到当时的成交价
你这个跨域的赋值都不能确定是否正确,显然
你输出的这个变量是0
可能性很多:
比如你定义的不是全局变量
比如你赋值压根时机不对,你怎么保证是赋值后再输出的?
Params
//此处添加参数
Numeric ATRLength(14); //ATR周期
Vars
//此处添加变量
Numeric ATR;//ATR值
//止损相关参数
Series<Numeric> ruanzhisun_duo;//做多软止损
Series<Numeric> yingzhisun_duo;//做多硬止损
Series<Numeric> ruanzhisun_kong;//做空软止损
Series<Numeric> yingzhisun_kong;//做空硬止损
Numeric zhisunval;//最终止损价格
Global Numeric chengbenjia;//成本价
//画图相关
Plot plt_duo;//做多止损
Plot plt_kong;//做空止损
Events
//此处实现事件函数
//初始化事件函数,策略运行期间,首先运行且只有一次
OnInit()
{
AddDataFlag(Enum_Data_RolloverBackWard()); //设置后复权
AddDataFlag(Enum_Data_RolloverRealPrice()); //设置映射真实价格
AddDataFlag(Enum_Data_AutoSwapPosition()); //设置自动换仓
AddDataFlag(Enum_Data_IgnoreSwapSignalCalc()); //设置忽略换仓信号计算
plt_duo.setOption("软止损-多","color",Yellow);
plt_duo.setOption("硬止损-多","color",Yellow);
}
OnReady()
{
setPlotOption("ATR", "begin-bar", ATRLength);
}
//Bar更新事件函数,参数indexs表示变化的数据源图层ID数组
OnBar(ArrayRef<Integer> indexs)
{
//计算ATR上轨,作为止盈用
ATR=AvgTrueRange(ATRLength);
//计算ATR及止损上轨和下轨位置,只在操作周期的图层用
ruanzhisun_duo=H-2*ATR;
yingzhisun_duo=L-2*ATR;
ruanzhisun_kong=L+2*ATR;
yingzhisun_kong=H+2*ATR;
Commentary("成本价"+Text(chengbenjia));
//开多单情况下,止损只能上移
If(MarketPosition==1 And BarsSinceEntry>0)//忽略开仓Bar
{
ruanzhisun_duo=Max(ruanzhisun_duo,ruanzhisun_duo[1]);
yingzhisun_duo=Max(yingzhisun_duo,yingzhisun_duo[1]);//止损只能上移
plt_duo.line("软止损-多",ruanzhisun_duo);
plt_duo.line("硬止损-多",yingzhisun_duo);
Commentary("成本价"+Text(chengbenjia));
If(ruanzhisun_duo>=chengbenjia)//软止损上移到成本价以上
{
zhisunval=ruanzhisun_duo;//止损价=软止损
plt_duo.line("止损线",zhisunval);//画最终止损线
If(MarketPosition==0); //触发止盈,退出循环
Else If(L<=zhisunval) //触发软止损,平仓退出
{
Sell(0, 0);
} //没有止损也没有止盈,继续循环
}Else//止损一直在成本价以下
{
If(L <= zhisunval) //触发硬止损,平仓退出
{
Sell(0, 0);
}
}
}
//开空单情况下,止损只能下移
Else If(MarketPosition==-1 And BarsSinceEntry>0)//忽略开仓Bar
{
ruanzhisun_kong=Min(ruanzhisun_kong,ruanzhisun_kong[1]);
yingzhisun_kong=Min(yingzhisun_kong,yingzhisun_kong[1]);//止损只能下移
//PlotAuto("软止损—空",ruanzhisun_kong,0,RGB(0, 255, 255),-1,-1,Enum_1Pix);
//PlotAuto("硬止损—空",yingzhisun_kong,0,RGB(0, 255, 255),-1,-1,Enum_2Pix);
Commentary("这里画空单止损线");
If(ruanzhisun_kong<=chengbenjia)//软止损下移到成本价以下
{
zhisunval=ruanzhisun_kong;//止损价=软止损
If(MarketPosition==0); //触发止盈,退出循环
Else If(H>=zhisunval) //触发软止损,平仓退出
{
BuyToCover(0, 0);
}
}Else//止损一直在成本价以下
{
If(H >= zhisunval) //触发硬止损,平仓退出
{
BuyToCover(0, 0);
}
}
}
Else
{
Commentary("这里不画止损线");
plt_duo.setOption("软止损-多","line-break",true);
plt_duo.setOption("硬止损-多","line-break",true);
plt_duo.setOption("止损线","line-break",true);
}
}
OnFill(FillRef ordFill)//记录开仓状态,只有开仓才记录止损位置,平仓不记录
{
If(MarketPosition==1)//多头持仓下,记录多头止损价
{
zhisunval=yingzhisun_duo;
chengbenjia=ordFill.fillPrice;//获取成本价
}
Else If(MarketPosition==-1)
{
zhisunval=yingzhisun_kong;
chengbenjia=ordFill.fillPrice;//获取成本价
}
Else
{
chengbenjia=1;//重置成本价
}
}
本来设置的就是全局变量,OnBar里我又设置了BarsSinceEntry>0,确保输出是在赋值之后,还设置了空仓重置chengbenjia=1,但我发现持仓空仓状态下,chengbenjia显示都是0,这是完整代码,可以复制下试试
你chengbenjia 是什么类型的变量?有些变量的作用范围有限