网格如何修改间隔为动态间隔
2023-02-22 11:32

请问如果要 让网格的间隔动态调整,比如上涨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));

}

}

评论区
顶部