//------------------------------------------------------------------------
// 简称: fe_gridTrade2
// 名称: 示例--两小段代码轻松搞定网格交易法
// 类别: 公式应用
// 类型: 用户应用
// 输出: Void
//------------------------------------------------------------------------
// TBQ新版增加流控后,改写了一下。
Params
String sym("SA2209.SHFE"); // 交易的品种
Numeric GridStartPrice(2930); // 网格起始价格
Integer Lots(1); // 交易手数
Integer GridStep(10); // 网格的大小
Integer GridLength(20); // 网格格数
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; // 网格挂单计数器
Defs
//log输出
Integer LogFile(String str)
{
FileAppend(FormulaName()+".txt","["+Text(SystemDateTime())+"] "+ str);
Return 0;
}
Events
//初始化事件函数,策略运行期间,首先运行且只有一次
OnInit()
{
LogFile("【OnInit】"+sym);
SubscribeBar(sym,"5m", 20201029, 20220501) ;
SubscribeBar(sym,"tick",20201029, 20220501);
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;
flag = 1;
}
}
}
OnTimer(Integer id,Integer millsecs)
{
if(id==timeID1)
{
// 网格布单
if(gridCnt<=GridLength)
{
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;
}
}
}
}
//委托更新事件函数,参数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));
}
}
//------------------------------------------------------------------------
// 编译版本 2021/12/01 214820
// 版权所有 tblaocai
// 更改声明 TradeBlazer Software保留对TradeBlazer平台
// 每一版本的TradeBlazer公式修改和重写的权利
//------------------------------------------------------------------------
纯碱代码是209,不是2209,而且交易所后缀不是SHFE,是郑商所的后缀。
想要获取正确的合约名,可以看数据中心里的属性信息,或者写一个公式 comentary(symbol)