请问如果要 让网格的间隔动态调整,比如上涨1%内 间隔都是5,连续上涨时,网格的间隔按等比间隔去开平,需要如何修改GridStep ?
划线红体位置为自己修改上去 实盘模拟发单错误需要修改,其他部分为蔡老师编写的网格-名称: 示例--两小段代码轻松搞定网格交易法
//------------------------------------------------------------------------
// 简称: fe_gridTrade2
// 名称: 示例--两小段代码轻松搞定网格交易法
// 类别: 公式应用
// 类型: 用户应用
// 输出: Void
//------------------------------------------------------------------------
// TBQ新版增加流控后,改写了一下。
Params
String sym(\"SA305.CZCE\"); // 交易的品种
Integer Lots(1); // 交易手数
//Integer GridStep(5); // 网格的大小
Integer GridLength(10); // 网格格数
Integer BS(1); // 交易方向,1-多,-1空
Vars
Array<Integer> ordIds; // 存放发单后的报单号
Numeric CurGridPrice; // 当前网格价格
Numeric TPPrice; // 止盈价格
Numeric REPrice; // 补挂单价格
Integer i(0);
Global Integer flag; // 是否布网格的标志
Global Integer timeID1; // 定时器ID
Global Integer gridCnt; // 网格挂单计数器
Global Integer N; // 幂指数
Global Integer GridStep; // 网格的大小
Numeric GridStartPrice; // 网格起始价格
Defs
//log输出
Integer LogFile(String str)
{
FileAppend(FormulaName()+\".txt\",\"[\"+Text(SystemDateTime())+\"] \"+ str);
Return 0;
}
Events
//初始化事件函数,策略运行期间,首先运行且只有一次
OnInit()
{
LogFile(\"【OnInit】\"+sym);
SubscribeBar(sym,\"5m\",SystemDateTime());
SubscribeBar(sym,\"tick\",SystemDateTime());
flag = 0;
}
OnBar(ArrayRef<Integer> indexs)
{
If(AccountDataExist() && IsTradingTime(SystemDateTime) && BarStatus==2 && flag==0)
{
LogFile(\"网格交易启动,BarStatus=\"+Text(BarStatus));
if(flag==0)
{
timeID1 = CreateTimer(1000,0,GridLength);
gridCnt = 1;
n = 1 ;
flag = 1;
}
}
}
OnTimer(Integer id,Integer millsecs)
{
if(id==timeID1)
{
// 网格布单
if(gridCnt<=GridLength)
{
GridStartPrice = Q_Last;
GridStep = Open[0] * 0.005*Power(1.2,N-1);
CurGridPrice = GridStartPrice - (gridCnt-1) * GridStep * BS;
if(A_SendOrderEx(sym,iif(BS==1,Enum_Buy,Enum_Sell),Enum_Entry,Lots,CurGridPrice,ordIds))
{
LogFile(\"网格布单,第\"+text(gridCnt)+\"格....\");
LogFile(\"CurGridPrice= \"+text(CurGridPrice));
gridCnt = gridCnt + 1;
N = N + 1 ;
}
}
}
}
//委托更新事件函数,参数ord表示更新的委托结构体
OnOrder(OrderRef ord)
{
LogFile(\"【OnOrder】\"+sym);
If(ord.status == Enum_Declared)
{
LogFile(\" 挂单已报 !!\");
LogFile(\" OrderId = \"+Text(ord.orderId));
LogFile(\" price = \"+Text(ord.price));
}
if(ord.status==3)
{
LogFile(\" 挂单被废 !!继续布单\");
LogFile(\" price = \"+Text(ord.price));
A_SendOrderEx(ord.symbol,iif(BS==1,Enum_Buy,Enum_Sell),Enum_Entry,ord.volume,ord.price,ordIds);
}
}
OnFill(FillRef ordFill)
{
LogFile(\"【OnFill】\"+ordFill.symbol);
LogFile(\" 委托成交!!\"+Text(ordFill.fillVolume)+\"手\");
LogFile(\" OrderId = \"+Text(ordFill.orderId));
LogFile(\" OrdPrice = \"+Text(ordFill.price));
LogFile(\" FillPrice = \"+Text(ordFill.fillPrice));
// 如果开仓挂单成交了,则挂止盈单
If(ordFill.combOffset==Enum_Entry)
{
TPPrice = ordFill.price + GridStep * BS;
A_SendOrderEx(ordFill.symbol,iif(BS==1,Enum_Sell,Enum_Buy),Enum_Exit,Lots,TPPrice,ordIds);
LogFile(\"-> 开仓挂单成交,挂止盈单。 理论网格价 = \"+Text(ordFill.price)+\", 止盈价格 = \"+Text(TPPrice));
}
Else
{
REPrice = ordFill.price - GridStep * BS;
A_SendOrderEx(ordFill.symbol,iif(BS==1,Enum_Buy,Enum_Sell),Enum_Entry,Lots,REPrice,ordIds);
LogFile(\"-> 止盈单成交,继续按原网格价挂单。 理论网格价 = \"+Text(REPrice));
}
}
建议咨询代码作者
请教;这个网格策略,基准价格能否设置为最新价,就是每次交易完毕后都以最新价为基准价来开仓,上下挂单,完毕后再次以最新价为基准价挂单?