Params
Numeric AfStep( 0.02);
Numeric AfLimit( 0.2 ) ;
Numeric timeExit(0.1455);
Numeric timeInto(0.0900);
Numeric a(0.006);
Numeric initcapital(100); //单位:万
Numeric moneyrate(80); //资金使用比例:单位%
Numeric money(100); //固定市值开仓:单位万
Vars
Numeric oParCl( 0 );
Numeric oParOp( 0 );
Numeric oPosition( 0 );
Numeric oTransition( 0 );
Series<Numeric> sar1( 0 );
Series<Numeric> ParCl( 0 );
Series<Numeric> CC( 0 );
Numeric lots(0); //下单手数
Events
OnInit()
{
SetInitCapital(initcapital*10000); //设定初始资金
SetMarginRate(0.1); //设定保证金比例
SetBeginBarMaxCount(1);
SubscribeBar("rb2110.SHFE","3m",20210501);
}
OnBar(ArrayRef<Integer> indexs)
{
Range[0:DataSourceSize() - 1]
{
data1.ParabolicSAR( AfStep, AfLimit, oParCl, oParOp, oPosition, oTransition ) ;
PlotNumeric( "ParCl" , data1.oParCl) ;
ParCl = data1.oParCl;
sar1 = data1.ParCl[1];
CC = data1.Close[1];
lots=IntPart(A_CurrentEquity*0.7/(myprice*contractunit*BigPointValue*0.1)); //计算开仓手数
If(A_FreeMargin == A_CurrentEquity)
{
If( CC > sar1 And Time < timeExit And Time >= timeInto)
{
A_SendOrder(Enum_Buy,Enum_Entry,lots,MIN(Close*1.01,Q_AskPrice));
}
}
If(A_TotalPosition == 1)
{
If(CC < sar1 || Time > timeExit)
{
A_SendOrder(Enum_Sell,Enum_Exit,A_BuyPosition(),MAX(Close*0.99,Q_BidPrice));
}
}
}
}
非常感谢专业指导!
建议你把公式运行机制了解清楚再写
运行机制在哪里可以了解?我只看到帮助,但依然无法解决问题,在有持仓的条件下也居然开仓,实在不懂。谢谢
这些内容都是很系统性的,建议你搜索视频区 启航 关键字 从最早的视频开始先学起来
这里简单解释一下
程序本地的运行速度是很快的 基本0.5秒一次
但是网络i通信的速度可能就没这么快,报送单到期货公司,期货公司再到交易所,交易所再返回,可能0.5秒内处理不完
也就是说 第一个时刻,程序判断当前没有持仓,于是报单。第二次运行的时候,成交的信息还没及时回报,虽然订单已经在撮合交易了,但是本地还是认为现在没有持仓,于是又报单了。这就是为什么你会发现重复报单的主要原因。当然,也有可能是你代码业务逻辑就写得有问题。
这个问题属于订单管理问题,文华是没有这个部分的,因为文华本来就不是给专业人士用的,很简单。
tb也有类似的简单的交易命令,可以把订单管理托管给系统去处理,而不需要自己处理。系统里提供的策略都是这样的类型。
不太清楚为什么你已上来要用最专业的方式去开发模型,你看起来并没有订单管理相关的经验,突然用账户函数开发模型肯定非常难。