投资者咨询:MQ算法交易问题 (文华财经wh9)
来源:文华财经 日期:2018-8-20 12:10
我写了个调用账户最近成交的记录之后加1个价位挂平仓单的算法模型,同时在两个合约执行的时候,总是运行第二个的时候第一个就停掉,想请教下大概是怎么回事。是不是调用账户成交的代码只能同时在一个算法里面运行。
技术人员回复
日期:2018-8-20 13:11
投资者咨询:MQ算法交易问题 (文华财经wh9)
来源:文华财经 日期:2018-8-20 12:10
//----------------------------------------------------------------------------------------------------------
Data
data1:"b1901";
Vars
Global_Numeric X; //状态值
Global_Numeric V; //单笔委托数量
Global_Numeric MINB; //多单最低委托价
Global_Numeric YBRP; //昨日多头持仓
Global_Numeric TBRP; //今日多头持仓
Global_Numeric BC; //买报单量
Global_Numeric SC; //卖报单量、或持仓价位数量
Global_Numeric DIFB; //买单间距
Global_Numeric DIFF; //买卖价差
Global_Numeric YPR; //昨日最低持仓成本
Global_String COD; //手动下单的合约
Numeric BRP; //可用持仓,剔除底仓
Numeric BPR; //买方向委托价格
Numeric SPR; //卖方向委托价格
Numeric PR; //成交价格
Numeric VL; //成交数量
Numeric BO; //成交为买单
Numeric SO; //成交为卖单
Numeric i;
Numeric FixPsn; //底仓
Numeric YPsn; //昨日持委托单量
Numeric TPsn; //今日持委托单量
String Contract; //成交合约
Begin
//------------------------------数据初始化------------------------------
V = 3; //单笔委托量
BC = 5; //多单挂单数量
DIFB = data1.Price("MinPrice")*2; //买单间距为 个价位
DIFF = data1.Price("MinPrice")*4; //买卖价差为 个价位
FixPsn = 0; //底仓为0
If(data1.A_IsExchangeOpen()==1&&X == 0)
{
Commentary("【程序初始化!---请按F12用算法下单!!】");
// YPR = 3650; //手动改成昨日最低买单价
if(M_GetTradeVol > 0 && M_GetTradeContract== "b1901")
{
YPR = M_GetTradeOrderPrice+DIFB; //昨日最低买单价
X = 1;
Commentary("【X= 1!手动挂首单完成-----进入开盘委托状态!!】");
}
}
//------------------------------取委托状态------------------------------
BO = T_GetFrontMatchBuyOrSell(A_AccountID) == Enum_Buy;
SO = T_GetFrontMatchBuyOrSell(A_AccountID) == Enum_Sell;
PR = T_GetFrontMatchRspPrice(A_AccountID);
VL = T_GetFrontMatchRspVol(A_AccountID);
Contract = T_GetFrontMatchRspContract(A_AccountID);
// Commentary("【"+Contract+ "成交】");
//---------------------- ---------------开盘初次委托单--------------------------------------
If(data1.A_IsExchangeOpen()==1&&X == 1)
{
YBRP = data1.A_BuyRemainPosition();
BRP=YBRP - FixPsn; //多头可用持仓减去底仓
MINB = YPR-BC*DIFB;
For i = 1 to BC
{
BPR = YPR-i*DIFB;
data1.A_SendOrder(Enum_Buy,Enum_Entry,V,BPR);
}
if(BRP > 0)
{
Commentary("【 b1901可用多单为"+text(BRP)+"手】");
if(BRP/V > IntPart(BRP/V))
{
SC = IntPart(BRP/V)+1;
Commentary("【委托卖平" + Text(SC) + "个卖单!】");
SPR = YPR + DIFF;
data1.A_SendOrder(Enum_buy,Enum_Entry,SC*V-BRP,YPR);
data1.A_SendOrder(Enum_Sell,Enum_Exit,BRP-(SC-1)*V,SPR);
For i = 2 to SC
{
SPR = YPR+(i-1)*DIFB+DIFF;
data1.A_SendOrder(Enum_Sell,Enum_Exit,V,SPR);
}
}
else
{
SC = IntPart(BRP/V);
Commentary("【委托卖平" + Text(SC) + "个!】");
For i = 1 to SC
{
SPR = YPR+(i-1)*DIFB+DIFF;
data1.A_SendOrder(Enum_Sell,Enum_Exit,V,SPR);
}
}
}
X=2;
Commentary("【X = 2!开盘挂单完成------进入持续报价状态!!】");
}
//---------------------------------- -- --------持续报价--------------------------------------------
if(data1.A_IsExchangeOpen()==1&&X ==2&&Contract == "b1901")
{
//买单成交后挂新单
if( BO== 1)
{
// Commentary("【" + Text(PR) + "买开" + Text(VL) + "手!】");
SPR=PR+DIFF;
Commentary("【委托------" + Text(SPR) + "卖平" + Text(VL) + "手!】");
data1.A_SendOrder(Enum_Sell,Enum_Exit,VL,SPR);
if(PR <=MINB+DIFB) //挂卖单
{
Commentary("【委托单不足------补挂委托单!!!】");
X = 3;
}
T_PopMatchRsp(A_AccountID);
}
//卖单成交后挂新单
else if( SO== 1)
{
// Commentary("【" + Text(PR) + "卖平" + Text(VL) + "手!】");
BPR=PR-DIFF;
Commentary("【委托------"+ Text(BPR) + "买开" + Text(VL) + "手!】");
data1.A_SendOrder(Enum_Buy,Enum_Entry,VL,BPR);
T_PopMatchRsp(A_AccountID);
}
}
//----------------------------------------补挂单--------------------------------------------
If(data1.A_IsExchangeOpen()==1&&X==3)
{
Commentary("【增挂委托单!!!】");
For i = 1 to BC
{
BPR = MINB-i*DIFB;
data1.A_SendOrder(Enum_Buy,Enum_Entry,V,BPR);
}
X = 2;
Commentary("【X = 2!补挂完成-----回到持续报价状态!!】");
MINB =MINB-BC*DIFB;
}
//----------------------------------收盘记录最低买价、持仓------------------------------
If(data1.A_IsExchangeOpen()==0&& X > 1 &&CurrentTime> 0.150000&&CurrentTime<0.210000)
{
TBRP = data1.A_BuyPosition();
IF(YBRP/V > IntPart(YBRP/V))
{
YPsn = IntPart(YBRP/V)+1;
}
else
{
YPsn = IntPart(YBRP/V);
}
IF(TBRP/V > IntPart(TBRP/V))
{
TPsn = IntPart(TBRP/V)+1;
}
else
{
TPsn = IntPart(TBRP/V);
}
YPR = YPR - (TPsn - YPsn) *DIFB; //收盘后计算新的多单最低成本
X = 1;
Commentary("【X = 1!收盘------纪录多单最低成本完成!!】");
}
End
技术人员回复
日期:2018-8-20 15:28
核实一下您的操作步骤,之后我们根据您的步骤加载测试下,之后在根据现象修改源码:
――您本地合约持仓有多少手呢?是模型全部调用平仓吗?
投资者咨询:MQ算法交易问题 (文华财经wh9)
来源:文华财经 日期:2018-8-20 12:10
是第二种情况,我把模型中的b1901改成了其他合约,然后同时运行出现了这种情况。我本地没有持仓。
技术人员回复
日期:2018-8-20 15:50
投资者咨询:MQ算法交易问题 (文华财经wh9)
来源:文华财经 日期:2018-8-20 12:10
不用测算了,是因为成交历史对两个算法都是独立排序的,就会导致相互堵塞成交回复卡在合约那里。