请问MQ算法编写 (文华财经wh9)

投资者咨询:请问MQ算法编写 (文华财经wh9)
来源:文华财经  日期:2018-8-13 22:06
 老师好!

案例:
Params
    Numeric Length(30); //定义均线的周期数
Vars
    Numeric Lost(2); //定义止损参数
    Numeric Win(2); //定义止盈参数
    Numeric Time_Exit(151450); //定义尾盘清仓时间
    Numeric MinP; //定义合约最小变动价位
    NumericSeries Ma1; //均线
Begin
    MinP = MinPrice;
    Ma1 = Ma(New,Length);

//------------------------------------------------------开仓条件-------------------------------------------------------

    If(MarketPosition == 0)
    {
If(Ref(Ma1,1) > Ref(Ma1,2) && Ma1 > Ref(Ma1,1) && Time < Time_Exit / 1000000) //均线连续两周期上升,则入场做多
Buy;
If(Ref(Ma1,1) < Ref(Ma1,2) && Ma1 < Ref(Ma1,1) && Time < Time_Exit / 1000000) //均线连续两周期下降,则入场做空
SellShort;
    }

 //-----------------------------------------------------平仓条件-----------------------------------------------------------

 Else If(MarketPosition == 1 )
 {
If( Time >= Time_Exit / 1000000) //多头尾盘平仓
Sell;
Else If( New > BKPrice + Win * MinP) // 多头止盈
Sell;
Else If( New < BKPrice - Lost * MinP) //多头止损
Sell;
 }

 Else If(MarketPosition == -1 ) 
 {
If( Time >= Time_Exit / 1000000) //空头尾盘平仓
BuyToCover;
Else If( New < SKPrice - Win * MinP) // 空头止盈
BuyToCover;
Else If( New > SKPrice + Lost * MinP) //空头止损
BuyToCover;
 }

End

在上述的案例中,我希望的条件是这样的:
1、Buy;  Buy的功能应该是先平空仓,然后开多仓是吧。  我希望是这样的: 当条件触发Buy时,按A--买1价平空仓(而非卖1价),并且B--也按买1价开多仓(非卖1价);信号发出以后,如果10根线或5秒之内,如果都已成交,然后执行下一个指令。如果在10跟线或5秒之内,上面二个(或者至少一个)没有成交,如A-买1价平空仓未成交(或部分未成交)--按现价(即卖1价)执行清仓交易;如B-买1价开多仓未成交或部分未成交--那么取消这个买1价开多的指令(即不再开仓,如果部分已成交那么已开的保留,未成交的取消);完成这二方面的步骤以后,然后再等待下一个指令的到来。

2、同理,SellShort的功能应该是先平多仓,然后开空仓是吧。  我也希望是这样的: 当条件触发SellSHORT时,按C--卖1价平多仓(而非买1价),并且D--也按卖1价开空仓(非买1价);信号发出以后,如果10根线或5秒之内,如果都已成交,然后执行下一个指令。如果在10跟线或5秒之内,上面二个(或者至少一个)没有成交,如C-卖1价平多仓未成交(或部分未成交)--按现价(即买1价)执行清仓交易;如D-卖1价开空仓未成交或部分未成交--那么取消这个卖1价开空的指令(即不再开仓,如果部分已成交那么已开的保留,未成交的取消);完成这二方面的步骤以后,然后再等待下一个指令的到来。

不知上面二点是否已表达清楚,请老师以上面的TICK案例程序为基础,帮忙写一下如何实现的语句,谢谢!






 
技术人员回复
日期:2018-8-13 22:12
 MQ改写较复杂,分析后预计本周三之前给您回复
投资者咨询:请问MQ算法编写 (文华财经wh9)
来源:文华财经  日期:2018-8-13 22:06
 好了吗? 坐等呀
技术人员回复
日期:2018-8-15 14:39
 算法语句编写较复杂需要时间,预计今晚22:00之前给您回复
投资者咨询:请问MQ算法编写 (文华财经wh9)
来源:文华财经  日期:2018-8-13 22:06
 好的,谢谢老师!
技术人员回复
日期:2018-8-15 20:59
 Params
    Numeric Length(30); //定义均线的周期数
Vars
    Numeric Lost(2); //定义止损参数
    Numeric Win(2); //定义止盈参数
    Numeric Time_Exit(151450); //定义尾盘清仓时间
    Numeric MinP; //定义合约最小变动价位
    NumericSeries Ma1; //均线
 Numeric  SK1;
 Numeric  BK1;
 Numeric  SK2;
 Numeric  BK2;
Setting
 SignalNoTrading:1;//模型发出信号不委托
Begin
    MinP = MinPrice;
    Ma1 = Ma(New,Length);


//------------------------------------------------------开仓条件-------------------------------------------------------


    If(MarketPosition == 0)
    {
If(Ref(Ma1,1) > Ref(Ma1,2) && Ma1 > Ref(Ma1,1) && Time < Time_Exit / 1000000) //均线连续两周期上升,则入场做多
Buy;
If(Ref(Ma1,1) < Ref(Ma1,2) && Ma1 < Ref(Ma1,1) && Time < Time_Exit / 1000000) //均线连续两周期下降,则入场做空
SellShort;
    }


 //-----------------------------------------------------平仓条件-----------------------------------------------------------


Else If(MarketPosition == 1 )
{
If( Time >= Time_Exit / 1000000) //多头尾盘平仓
Sell;
Else If( New > BKPrice + Win * MinP) // 多头止盈
Sell;
Else If( New < BKPrice - Lost * MinP) //多头止损
Sell;
}


Else If(MarketPosition == -1 ) 
{
If( Time >= Time_Exit / 1000000) //空头尾盘平仓
BuyToCover;
Else If( New < SKPrice - Win * MinP) // 空头止盈
BuyToCover;
Else If( New > SKPrice + Lost * MinP) //空头止损
BuyToCover;
}
//Buy信号处理部分
If(F_CurrentSig == Sig_Buy &&GetGlobalVar(0)==0)
{
BK1=A_SendOrder(Enum_Sell,Enum_Exit,1,Price("Bid1"));
SK1=A_SendOrder(Enum_Buy,Enum_Entry,1,Price("Bid1"));
SetGlobalVar(0,1);
SetGlobalVar2("BuyTimeCoin",CurrentTime);
}
if(GetGlobalVar(0)==0&& TimeDiff(GetGlobalVar2("BuyTimeCoin"),CurrentTime) > 5&& F_OrderStatus(GetGlobalVar2("SK1")) == Enum_Filled&& F_OrderStatus(GetGlobalVar2("BK1")) == Enum_Filled)
{
SetGlobalVar(0,0);
}
if(GetGlobalVar(0)==0&&TimeDiff(GetGlobalVar2("BuyTimeCoin"),CurrentTime) > 5&& F_OrderStatus(GetGlobalVar2("SK1")) == 0)
{
F_DeleteOrder();
SetGlobalVar(1,1);
}
If(GetGlobalVar(1)==1)
{
 A_SendOrder(Enum_Sell,Enum_Exit,F_BuyRemainPosition(),Price("FallLimit"));
SetGlobalVar(0,0);
}
//SellShort信号处理部分
If(F_CurrentSig == Sig_SellShort &&GetGlobalVar(3)==0)
{
BK2=A_SendOrder(Enum_Buy,Enum_Exit,1,Price("ASK1"));
SK2=A_SendOrder(Enum_Sell,Enum_Entry,1,Price("ASK1"));
SetGlobalVar(3,1);
SetGlobalVar2("SellTimeCoin",CurrentTime);
}
if(GetGlobalVar(3)==0&& TimeDiff(GetGlobalVar2("SellTimeCoin"),CurrentTime) > 5&& F_OrderStatus(GetGlobalVar2("SK2")) == Enum_Filled&& F_OrderStatus(GetGlobalVar2("BK2")) == Enum_Filled)
{
SetGlobalVar(3,0);
}
if(GetGlobalVar(3)==0&&TimeDiff(GetGlobalVar2("SellTimeCoin"),CurrentTime) > 5&& F_OrderStatus(GetGlobalVar2("SK2")) == 0)
{
F_DeleteOrder();
SetGlobalVar(4,1);
}
If(GetGlobalVar(4)==1)
{
 A_SendOrder(Enum_buy,Enum_Exit,F_SellRemainPosition(),Price("RiseLimit"));
SetGlobalVar(3,0);
}
End 
投资者咨询:请问MQ算法编写 (文华财经wh9)
来源:文华财经  日期:2018-8-13 22:06
 谢谢老师!您辛苦啦!

另,我把您编的二信号处理部分加到 另一个案例--通道案例上,如下:

Vars
  NumericSeries Ma_bid;
  NumericSeries Ma_ask;
  NumericSeries Ma_Up; //定义文华通道线上轨
  NumericSeries Ma_Down; //定义文华通道线下轨
 Numeric  SK1;
 Numeric  BK1;
 Numeric  SK2;
 Numeric  BK2;
Setting

 SignalNoTrading:1;//模型发出信号不委托


  Begin

  Ma_ask = (Ask1 * AskVol1 + Ask2 * AskVol2 + Ask3 * AskVol3 + Ask4 * AskVol4 + Ask5 * AskVol5) / (AskVol1 + AskVol2 + AskVol3 + AskVol4 + AskVol5);
  Ma_bid = (Bid1 * BidVol1 + Bid2 * BidVol2 + Bid3 * BidVol3 + Bid4 * BidVol4 + Bid5 * BidVol) / (BidVol1 + BidVol2 + BidVol3 + BidVol4 + BidVol5);
  Ma_Up = Ma(Ma_ask,30);
  Ma_Down = Ma(Ma_bid,30);

  If(Cross(New,Ma_Up)) //最新价上穿文华通道线上轨,入场做多
  {
Buy;
   }
  Else If(CrossDown(New,Ma_Down)) //最新价下穿文华通道线下轨,入场做空
  {
SellShort;
   }

 //文华通道线
  DrawColorLine(Rising(5), Ma_Up, Red, Green, Linethick1);
  DrawColorLine(Rising(5), Ma_Down, Red, Green, Linethick1); 


//Buy信号处理部分
If(F_CurrentSig == Sig_Buy &&GetGlobalVar(0)==0)
{
BK1=A_SendOrder(Enum_Sell,Enum_Exit,1,Price("Bid1"));
SK1=A_SendOrder(Enum_Buy,Enum_Entry,1,Price("Bid1"));
SetGlobalVar(0,1);
SetGlobalVar2("BuyTimeCoin",CurrentTime);
}
if(GetGlobalVar(0)==0&& TimeDiff(GetGlobalVar2("BuyTimeCoin"),CurrentTime) > 5&& F_OrderStatus(GetGlobalVar2("SK1")) == Enum_Filled&& F_OrderStatus(GetGlobalVar2("BK1")) == Enum_Filled)
{
SetGlobalVar(0,0);
}
if(GetGlobalVar(0)==0&&TimeDiff(GetGlobalVar2("BuyTimeCoin"),CurrentTime) > 5&& F_OrderStatus(GetGlobalVar2("SK1")) == 0)
{
F_DeleteOrder();
SetGlobalVar(1,1);
}
If(GetGlobalVar(1)==1)
{
 A_SendOrder(Enum_Sell,Enum_Exit,F_BuyRemainPosition(),Price("FallLimit"));
SetGlobalVar(0,0);
}
//SellShort信号处理部分
If(F_CurrentSig == Sig_SellShort &&GetGlobalVar(3)==0)
{
BK2=A_SendOrder(Enum_Buy,Enum_Exit,1,Price("ASK1"));
SK2=A_SendOrder(Enum_Sell,Enum_Entry,1,Price("ASK1"));
SetGlobalVar(3,1);
SetGlobalVar2("SellTimeCoin",CurrentTime);
}
if(GetGlobalVar(3)==0&& TimeDiff(GetGlobalVar2("SellTimeCoin"),CurrentTime) > 5&& F_OrderStatus(GetGlobalVar2("SK2")) == Enum_Filled&& F_OrderStatus(GetGlobalVar2("BK2")) == Enum_Filled)
{
SetGlobalVar(3,0);
}
if(GetGlobalVar(3)==0&&TimeDiff(GetGlobalVar2("SellTimeCoin"),CurrentTime) > 5&& F_OrderStatus(GetGlobalVar2("SK2")) == 0)
{
F_DeleteOrder();
SetGlobalVar(4,1);
}
If(GetGlobalVar(4)==1)
{
 A_SendOrder(Enum_buy,Enum_Exit,F_SellRemainPosition(),Price("RiseLimit"));
SetGlobalVar(3,0);
}
End 


由于通道案例中的开平仓条件中没有:If(MarketPosition == 0)  语句,我试了一下好像没有什么变化;

请问老师,我上面这样直接加行吗?如果想达到1楼的二个要求,是否需要做一些调整,应怎样调整?  谢谢!

技术人员回复
日期:2018-8-16 8:17
 参考2楼添加的信号处理部分加到7楼部分中就可以不需要特殊调整的
投资者咨询:请问MQ算法编写 (文华财经wh9)
来源:文华财经  日期:2018-8-13 22:06
 刚才在模拟盘里试了一下;  好像平仓有点乱,有些仓位不能平仓; 
显示原因: “可平仓位数量不足。”

请问在软件中可否设置?:按实际仓位平仓

谢谢!
技术人员回复
日期:2018-8-16 9:45
 分析后回复