//下一个Bar开始前,重新执行当前bar最后一次,参数为当前bar的图层数组
OnBarClose(ArrayRef<Integer> indexs)
{
//指标计算
b = (XAverage(Close,shortPeriod)/AverageFC(Close,longPeriod)-1)*100;
//交易信息
If(b<-doors){
//打印成功
Print("b<doors");
If(MarketPosition==0 And b>b[1]){
//多头建仓
Buy(lots,Close); //为什么没有执行
Print("close is ok");//打印成功
}
}
Params
//此处添加参数
Vars
//此处添加变量
Global Numeric n(0);
Numeric lots(1);
Defs
//此处添加公式函数
Events
//此处实现事件函数
//初始化事件函数,策略运行期间,首先运行且只有一次
OnInit()
{
}
//Bar更新事件函数,参数indexs表示变化的数据源图层ID数组
OnBar(ArrayRef<Integer> indexs)
{
n=n+1;
Print("n= "+Text(n));
If(n==2300){
Buy(lots,Close);
Print("Condition is ok,and close = "+Text(Close));
If(Buy(lots,Close)){
Print("Buy is ok");
}Else{
Print("Buy isn't ok, and why");
}
}
}
又写了一段代码来实测,就是一个计数器,到达设定值就买入,结果还是没有执行Buy函数,返回Buy isn't ok, and why
你这段代码我测试也是正常发单了,就改了个计数器参数,从改成了1100,快一点触发
这里唯一的问题是信号闪烁,你的global判断条件是等于,那么当计数器超过1100的时候条件就不满足了,信号就没了。
简单来说过程就是,当计数器等于1100的那一跳驱动,条件满足,执行buy命令,图上出现信号,系统根据信号发单,成交
下一跳,计数器等于1101,不满足条件,图上的信号就消失了,也不会在print内容
这个运行结果是符合我上面的描述的,不知道你是哪里有问题?
//------------------------------------------------------------------------
// 简称: Amita_T
// 名称:
// 类别: 公式应用
// 类型: 用户应用
// 输出: Void
//------------------------------------------------------------------------
//------------------------------------------------------------------------
Params
//此处添加参数
Numeric shortPeriod(62);
Numeric longPeriod(83);
Numeric doors(1);
Vars
//此处添加变量
Numeric lots(1);
Series<Numeric> b(0);
Global Numeric millsecs(1000);
Global Integer timerId;
Defs
//此处添加公式函数
Events
//此处实现事件函数
//初始化事件函数,策略运行期间,首先运行且只有一次,应用在订阅数据等操作
OnInit()
{
timerId=createTimer(millsecs);
//与数据源有关
Range[0:DataCount-1]
{
//=========数据源相关设置==============
//AddDataFlag(Enum_Data_RolloverBackWard()); //设置后复权
//AddDataFlag(Enum_Data_RolloverRealPrice()); //设置映射真实价格
//AddDataFlag(Enum_Data_AutoSwapPosition()); //设置自动换仓
//AddDataFlag(Enum_Data_IgnoreSwapSignalCalc()); //设置忽略换仓信号计算
//AddDataFlag(Enum_Data_OnlyDay()); //设置仅日盘
//AddDataFlag(Enum_Data_OnlyNight()); //设置仅夜盘
//AddDataFlag(Enum_Data_NotGenReport()); //设置数据源不参与生成报告标志
//=========交易相关设置==============
//MarginRate rate;
//rate.ratioType = Enum_Rate_ByFillAmount; //设置保证金费率方式为成交金额百分比
//rate.longMarginRatio = 0.1; //设置保证金率为10%
//rate.shortMarginRatio = 0.2; //设置保证金率为20%
//SetMarginRate(rate);
//CommissionRate tCommissionRate;
//tCommissionRate.ratioType = Enum_Rate_ByFillAmount;
//tCommissionRate.openRatio = 5; //设置开仓手续费为成交金额的5%%
//tCommissionRate.closeRatio = 2; //设置平仓手续费为成交金额的2%%
//tCommissionRate.closeTodayRatio = 0; //设置平今手续费为0
//SetCommissionRate(tCommissionRate); //设置手续费率
//SetSlippage(Enum_Rate_PointPerHand,2); //设置滑点为2跳/手
SetOrderPriceOffset(2); //设置委托价为叫买/卖价偏移2跳
//SetOrderMap2MainSymbol(); //设置委托映射到主力
//SetOrderMap2AppointedSymbol(symbols, multiples); //设置委托映射到指定合约,symbols是映射合约数组,multiples是映射倍数数组
}
//与数据源无关
//SetBeginBarMaxCount(10); //设置最大起始bar数为10
//SetBackBarMaxCount(10); //设置最大回溯bar数为10
//=========交易相关设置==============
SetInitCapital(20000); //设置初始资金为100万
//AddTradeFlag(Enum_Trade_Ignore_Buy()); //设置忽略多开
//AddTradeFlag(Enum_Trade_Ignore_Sell()); //设置忽略多平
//AddTradeFlag(Enum_Trade_Ignore_SellShort()); //设置忽略空开
//AddTradeFlag(Enum_Trade_Ignore_Buy2Cover()); //设置忽略空平
}
//在所有的数据源准备完成后调用,应用在数据源的设置等操作
OnReady()
{
}
//在新bar的第一次执行之前调用一次,参数为新bar的图层数组
OnBarOpen(ArrayRef<Integer> indexs)
{
//指标计算
b = (XAverage(Close,shortPeriod)/AverageFC(Close,longPeriod)-1)*100;
//交易信息
If(b<-doors){
If(MarketPosition==0 And b>b[1]){
Buy(lots,Close);
}Else if(MarketPosition==1 And BarsSinceEntry>=1 And Close<LastEntryPrice){
Buy(lots,Close);
}Else if(MarketPosition==-1){
If(b>b[1]){
BuyToCover(0,Close);
Buy(lots,Close);
}
}
}Else If(b>doors){
If(MarketPosition==0 And b<b[1]){
SellShort(lots,Close);
}Else if(MarketPosition==-1 And BarsSinceEntry>=1 And Close>LastEntryPrice){
SellShort(lots,Close);
}Else if(MarketPosition==1){
If(b<b[1]){
Sell(0,Close);
SellShort(lots,Close);
}
}
}Else{
If(MarketPosition==1 And BarsSinceEntry>=1 And Close<LastEntryPrice){
Buy(lots,Close);
}
If(MarketPosition==-1 And BarsSinceEntry>=1 And Close>LastEntryPrice){
SellShort(lots,Close);
}
}
}
//Bar更新事件函数,参数indexs表示变化的数据源图层ID数组
OnBar(ArrayRef<Integer> indexs)
{
//指标计算
b = (XAverage(Close,shortPeriod)/AverageFC(Close,longPeriod)-1)*100;
//指标划线
PlotNumeric("BIAS",b);
PlotNumeric("z",0);
PlotNumeric("u",doors);
PlotNumeric("d",-doors);
}
//下一个Bar开始前,重新执行当前bar最后一次,参数为当前bar的图层数组
OnBarClose(ArrayRef<Integer> indexs)
{
//指标计算
b = (XAverage(Close,shortPeriod)/AverageFC(Close,longPeriod)-1)*100;
//交易信息
If(b<-doors){
Print("b<doors");
If(MarketPosition==0 And b>b[1]){
//多头建仓
Buy(lots,Close);
Print("close is ok");
if(Buy(lots,Close)){
Print("Buy is ok");
}Else{
Print("Buy is not ok");
}
}Else if(MarketPosition==1 And BarsSinceEntry>=1 And Close<LastEntryPrice){
Buy(lots,Close);
}Else if(MarketPosition==-1){
If(b>b[1]){
BuyToCover(0,Close);
Buy(lots,Close);
}
}
}Else If(b>doors){
Print("b>doors");
If(MarketPosition==0 And b<b[1]){
SellShort(lots,Close);
}Else if(MarketPosition==-1 And BarsSinceEntry>=1 And Close>LastEntryPrice){
SellShort(lots,Close);
}Else if(MarketPosition==1){
If(b<b[1]){
Sell(0,Close);
SellShort(lots,Close);
}
}
}Else{
Print("doors<b<doors");
If(MarketPosition==1 And BarsSinceEntry>=1 And Close<LastEntryPrice){
Buy(lots,Close);
}
If(MarketPosition==-1 And BarsSinceEntry>=1 And Close>LastEntryPrice){
SellShort(lots,Close);
}
}
//打印信息
Print("===================");
Print("b="+Text(b)+",b[1]="+Text(b[1]));
Print("pos"+Text(MarketPosition));
}
//持仓更新事件函数,参数pos表示更新的持仓结构体
OnPosition(PositionRef pos)
{
}
//策略账户仓更新事件函数,参数pos表示更新的账户仓结构体
OnStrategyPosition(PositionRef pos)
{
}
//委托更新事件函数,参数ord表示更新的委托结构体
OnOrder(OrderRef ord)
{
}
//成交更新事件函数,参数ordFill表示更新的成交结构体
OnFill(FillRef ordFill)
{
}
//定时器更新事件函数,参数id表示定时器的编号,millsecs表示定时间的间隔毫秒值
OnTimer(Integer id,Integer intervalMillsecs)
{
}
//通用事件触发函数,参数evtName为事件名称,参数evtValue为事件内容
OnEvent(StringRef evtName,MapRef<String,String> evtValue)
{
}
//当前策略退出时触发
OnExit()
{
}
//------------------------------------------------------------------------
// 编译版本 2023/01/10 111537
// 版权所有 Amita2012
// 更改声明 TradeBlazer Software保留对TradeBlazer平台
// 每一版本的TradeBlazer公式修改和重写的权利
//------------------------------------------------------------------------
我这个是实盘账户,虚拟账户也要有资金吗
谢谢你,我明白你的意思,但我的代码却没执行,我也没想明白,这不在找原因吗,
一直发单,已经连续六单了
if(Buy(lots,Close)){
Print("Buy is ok");
}
刚才又增加这一段代码在同一条件域内,没有打印成功,说明这句Buy(lots,Close)没有成功
buy没有执行成功一般的问题就是虚拟账户资金不足,或者价格参数有问题
我反正没有复现出来你的问题
不是历史信号,每根Bar close时都会打印条件信息,每次打印,都是满足条件,但就是没有交易
这是我的测试结果,发单很正常。
无法复现你说的不执行结果,除非你能提供完整的能复现问题的代码
是的,Print("close is ok"); 和Buy对应
首先,你的代码是无法运行的,很多变量参数没有定义,我不能完全确定这是一个完整的模型
其次,因为不是完整的模型,我不能确定运行结果,所以你说得打印信息一一对应也是不可信的,从这个代码无法确定这个推断
咨询模型运行问题,请把代码和环境配置完全,以后再看到这种半吊子的内容就不回复了,浪费时间诊断不出有用的结论
buy也可能执行失败的
你如果是要监控buy的执行结果 那应该是
if(Buy(lots,Close)) Print("close is ok");
另外你能确定你打印的东西和buy是一一对应的么?