//------------------------------------------------------------------------
//仅适用于反手,若信号超过两个以上会出错.
Params
Numeric FastLength(5);// 短期指数平均线参数
Numeric SlowLength(20);// 长期指数平均线参数
Vars
Series<Numeric> AvgValue1;
Series<Numeric> AvgValue2;
Series<Numeric> cc;
//订单管理
global array<integer> orderids;
global Signal sig_tp;
Defs
bool print_signal(signal sig)
{
print("-----");
print("图层:"+text(sig.index));
print("时间:"+DateTimeToString(sig.datetime));
If(sig.side == Enum_Buy)
{
print("方向:买入");
}Else
{
print("方向:卖出");
}
If(sig.comboffset == Enum_Entry)
{
print("开平:开仓");
}Else If(sig.comboffset == Enum_Exit)
{
print("开平:平仓");
}Else
{
print("开平:平今");
}
print("价格:"+text(sig.price));
print("数量:"+text(sig.volume));
print("操作源:"+sig.createsource);
If(sig.flag == Enum_Signal_History)
{
print("flag:历史");
}Else If(sig.flag == Enum_Signal_NotSend)
{
print("flag:不发");
}else
{
print("flag:不矫正");
}
return true;
}
Bool A_SendOrderEx_signal(signal sig,ArrayRef<Integer> orderid,integer status=0,bool price_off_sw = False,integer price_offset=1)
{
//status:1-开平互转 2-净头寸 待完成
//price_off_sw true:开启委托偏移
//price_offset 委托偏移跳数,不开启无效
numeric price;
If(price_off_sw)
{
If(sig.side == Enum_Buy)
{
price = Q_AskPrice + price_offset * MinMove * PriceScale;
}
Else
price = Q_bidprice - price_offset * MinMove * PriceScale;
}
If(status == 1)
{
//开平互转待处理
return A_SendOrderex(data[sig.index].Symbol, sig.side, sig.comboffset, sig.volume, sig.price, orderid);
}Else If(status == 2)
{
//净头寸待处理
return A_SendOrderex(data[sig.index].Symbol, sig.side, sig.comboffset, sig.volume, sig.price, orderid);
}Else return A_SendOrderex(data[sig.index].Symbol, sig.side, sig.comboffset, sig.volume, sig.price, orderid);
}
Events
OnReady()
{
PrintClear;
}
OnBar(ArrayRef<Integer> indexs)
{
If(IsTradeEnabled)//自动交易
{
if(close[1] > open[1] and MarketPosition<>1)
{
Buy(1, open);
}
If(close[1] < open[1] and MarketPosition<> -1)
{
SellShort(1, open);
}
}
}
OnSignal(ArrayRef<Signal> signals)
{
print("***signal***");
Array<Integer> orderid;
numeric i;
numeric size;
size = GetArraySize(signals);
for i = 0 to size -1
{
print_signal(signals[0]);
}
If(signals[0].flag ==0 and size == 2 and signals[0].comboffset <> Enum_Entry and signals[1].comboffset == Enum_Entry)
{
A_SendOrderEx_signal(signals[0], orderids);
sig_tp = signals[1];
}Else
{
A_SendOrderEx_signal(signals[0], orderid);
}
}
OnFill(FillRef ordFill)
{
print("***fill***");
If(ordfill.volume == ordfill.fillVolume and ordfill.orderId == orderids[0])//平仓单已全部成交
{
Array<Integer> orderid;
A_SendOrderEx_signal(sig_tp, orderid);//报开仓单
}
}
实测效果
onbar部分的信号逻辑是全部可以自行替换的,模板里纯粹是为了测试方便,没有任何交易逻辑,勿莽撞实盘。
自定义函数部分的根据signal数据保单的函数,还未完工,不支持锁仓或者开平互转,待更新