五月 (文华财经wh9)

投资者咨询:五月 (文华财经wh9)
来源:文华财经  日期:2019-5-21 12:07
第二腿合约成交后,第一腿合约还没发出就平掉了 
怎么可以改为第一腿先发,然后时间上快点反馈到第二腿委托呢?
代码就是md,例子?求改
Data
  Data1:"m1905"; //第一腿合约
  Data2:"m1909"; //第二腿合约
Vars
//------------------------------定义普通变量------------------------------
  Numeric Data1Ma; //第一腿合约近20笔TICK均值
  Numeric Data2Ma; //第二腿合约近20笔TICK均值
  Numeric Data1fc; //第一腿合约近20笔TICK均值
  Numeric Data2fc; //第二腿合约近20笔TICK均值
  Numeric Ma5; //5周期均线
  Numeric Ma10; //10周期均线
  Numeric Data1DownLine; //第一腿合约下轨
  Numeric Data2DownLine; //第二腿合约下轨
  Numeric Data1UpLine; //第一腿合约上轨
  Numeric Data2UpLine; //第二腿合约上轨
  Numeric Size(20); //Tick区大小
  Numeric i; //For循环变量                                     
  Numeric j; //For循环变量
//------------------------------定义数据区变量------------------------------
  Var_TickData Datum1; //第一腿合约数据区
  Var_TickData Datum2; //第二腿合约数据区
  Var_TickData Datum3; //第二腿合约数据区
//------------------------------定义条件变量------------------------------
  Numeric Data2SumBidVol; //第二腿合约最近3笔的买量和
  Numeric Data2SumAskVol; //第二腿合约最近3笔的卖量和
  Numeric Data2BidVol; //第二腿合约买量
  Numeric Data2AskVol; //第二腿合约卖量
  Numeric Data1Var; //第一腿合约标准差
  Numeric Data2Var; //第二腿合约标准差
  Numeric Data1Cond; //第一腿合约条件
  Numeric Data2Cond; //第二腿合约条件
//------------------------------定义委托标识全局变量------------------------------
  Numeric Data2SellID1;                      //第二腿合约卖出标识1
  Numeric Data2SellID2;                      //第二腿合约卖出标识2
  Numeric Data2SellID3;                      //第二腿合约卖出标识3
  Numeric Data2SellID4;                    //第二腿合约卖出标识4
  Numeric Data1SellID5;                      //第一腿合约卖出标识5
  Numeric Data1SellID6;                      //第一腿合约卖出标识6
  Numeric Data1BuyID1;                      //第一腿合约买入标识1
  Numeric Data1BuyID2;                      //第一腿合约买入标识2
  Numeric Data2BuyID3;                      //第二腿合约买入标识3
//------------------------------定义委托状态全局变量------------------------------
  Numeric Data2SellStatus1;                //第二腿合约卖出委托标识1的委托状态
  Numeric Data2SellStatus2;                //第二腿合约卖出委托标识2的委托状态
  Numeric Data2SellStatus3;                //第二腿合约卖出委托标识3的委托状态
  Numeric Data2SellStatus4;                //第二腿合约卖出委托标识4的委托状态
  Numeric Data1SellStatus5;                //第一腿合约卖出委托标识5的委托状态
  Numeric Data1SellStatus6;                //第一腿合约卖出委托标识6的委托状态
  Numeric Data1BuyStatus1;                //第一腿合约买入委托标识1的委托状态
  Numeric Data1BuyStatus2;                //第一腿合约买入委托标识2的委托状态
  Numeric Data2BuyStatus3;                //第二腿合约买入委托标识3的委托状态
//------------------------------公式关键字------------------------------
Setting
  SignalNoTrading:1;//模型发出信号不委托

//------------------------------模型主体------------------------------
Begin
  If(Ref(Cross(Ma5,Ma10),1))//一个周期前MA5金叉MA10
  {
Buy;//买入
  }
  If(Ref(CrossDown(Ma5,Ma10),1))//一个周期前MA5死叉MA10
  {
Sell;//卖出
  }
//------------------------------取委托状态------------------------------
  Data2SellStatus1 = F_OrderStatus(GetGlobalVar2("Data2SellID1")) == Enum_Filled;//第二腿合约卖出委托标识1的委托状态为全部成交
  Data2SellStatus2 = F_OrderStatus(GetGlobalVar2("Data2SellID2")) == Enum_Filled;//第二腿合约卖出委托标识2的委托状态为全部成交
  Data2SellStatus3 = F_OrderStatus(GetGlobalVar2("Data2SellID3")) == Enum_Filled;//第二腿合约卖出委托标识3的委托状态为全部成交
  Data2SellStatus4 = F_OrderStatus(GetGlobalVar2("Data2SellID4")) == Enum_Filled;//第二腿合约卖出委托标识4的委托状态为全部成交
  Data2BuyStatus3 = F_OrderStatus(GetGlobalVar2("Data2BuyID3")) == Enum_Filled;//第二腿合约买入委托标识3的委托状态为全部成交
  Data1SellStatus5 = F_OrderStatus(GetGlobalVar2("Data1SellID6")) == Enum_Filled;//第一腿合约卖出委托标识5的委托状态为全部成交
  Data1SellStatus6 = F_OrderStatus(GetGlobalVar2("Data1SellID6")) == Enum_Filled;//第一腿合约卖出委托标识6的委托状态为全部成交
  Data1BuyStatus1 = F_OrderStatus(GetGlobalVar2("Data1BuyID1")) == Enum_Filled;//第一腿合约买入委托标识1的委托状态为全部成交
  Data1BuyStatus2 = F_OrderStatus(GetGlobalVar2("Data1BuyID2")) == Enum_Filled;//第一腿合约买入委托标识2的委托状态为全部成交


  Ma5 = Ma(Close,5);//5周期均线
  Ma10 = Ma(Close,10);//10周期均线
  PlotNumeric("Ma5",Ma5);
  PlotNumeric("Ma10",Ma10);
  Datum1 = Def_TickData("m1901",1,20);//第一腿合约取20笔TICK
  Datum2 = Def_TickData("m1905",1,20);//第二腿合约取20笔TICK
  Datum3 = Def_TickData("m1905",0,3);//第二腿合约取3秒的TICK
  If(Datum1.State == 1)
  {
For i = 0 To Size - 1  
{
  Data1Ma = (Datum1[i].TickPrice + Data1Ma) / 20;//计算第一腿合约的20笔TICK算数平均值
  Data1fc = Square(Datum1[i].TickPrice - Data1Ma) + Data2fc;
}
  }
  If(Datum2.State == 1)
  {
For j = 0 To Size - 1
{
  Data2Ma = (Datum2[j].TickPrice + Data2Ma) / 20;//计算第一腿合约的20笔TICK算数平均值
  Data2fc = Square(Datum2[j].TickPrice - Data2Ma) + Data2fc;
}
  }


  Data1Var = Sqrt(Data1fc / 20);//计算第一腿合约标准差
  Data1UpLine = Data1Ma + 1.645 * Data1Var;//计算第一腿合约上轨
  Data1DownLine = Data1Ma - 1.645 * Data1Var;//计算第一腿合约下轨

  Data2Var = Sqrt(Data2fc / 20);//计算第二腿合约标准差
  Data2BidVol = Data2.Price("BidVol1");//第二腿合约买量
  Data2AskVol = Data2.Price("AskVol1");//第二腿合约卖量
  Data2SumBidVol = Datum3[0].BidVol1 + Datum3[1].BidVol1 + Datum3[2].BidVol1;//第二腿合约最近3秒的买量和
  Data2SumAskVol = Datum3[0].AskVol1 + Datum3[1].AskVol1 + Datum3[2].AskVol1;//第二腿合约最近3秒的卖量和
  Data2UpLine = Data2Ma + 1.645 * Data2Var;//计算第二腿合约上轨
  Data2DownLine = Data2Ma - 1.645 * Data2Var;//计算第二腿合约下轨

  Data1Cond = Data1.Price("New") > Data1DownLine && Data1.Price("New") < Data1UpLine;//第一腿合约最新价大于20笔TICK均值且第一腿合约最新价小于上轨
  Data2Cond = Data2.Price("New") > Data2DownLine && Data2.Price("New") < Data2UpLine;//第二腿合约最新价大于20笔TICK均值且第二腿合约最新价小于上轨

//------------------------------定义开仓------------------------------
//------------------------------第二腿合约先开------------------------------
  If(Data1Cond == 1  &&  Data2Cond == 1  &&  Data2BidVol >=  Data2AskVol / 3  &&  Data2SumBidVol < Data2SumAskVol * 2  &&  Datum3[0].BidVol1 >=  Datum3[2].BidVol1 * 0.5)//当满足括号中条件时
  {
If(F_CurrentSig == Sig_Buy && GetGlobalVar2("BuyTimeCoin") == 0)//当前信号为BUY 且全局变量BuyTimeCoin没有存入任何值或值为0
{
  SetGlobalVar2("BuyTimeCoin",CurrentTime);//记录当前时间
  SetGlobalVar2("SCoin",0);//SCoin归零
}
If(F_CurrentSig == Sig_Buy && GetGlobalVar2("BuyTimeCoin") > 0)//信号为Buy信号且全局变量BuyTimeCoin已存入时间
{
  If(Data1.F_GetOpenOrderCount() == 0 && Data2.F_GetOpenOrderCount() == 0 && GetGlobalVar2("BCoin") == 0 && TimeDiff(GetGlobalVar2("BuyTimeCoin"),CurrentTime) >= 3)//持仓为0,且且两腿合约均无挂单 且信号发出时间与当前时间差值大于等于3秒时 Bcoin值为0
  {
If(Data2.F_SellRemainPosition() == 0 && Data1.F_BuyRemainPosition() == 0 && GetGlobalVar2("BCoin1") == 0)
{
  Data2SellID1 = Data2.A_SendOrder(Enum_Sell,Enum_Entry,2,Data2.Price("Bid1"));//对价卖开2手第二腿合约
  SetGlobalVar2("Data2SellID1",Data2SellID1);//存入委托标识Data2SellID1
  SetGlobalVar2("BCoin1",1); 
}
If(Data2.F_SellRemainPosition() == 2 &&  Data2SellStatus1 == 1)//第二腿合约空头可用持仓为2手 且Data2SellStatus1的委托状态为全部成交
{
  Data2SellID2 = Data2.A_SendOrder(Enum_Sell,Enum_Entry,2,Data2.Price("Bid1"));//对价卖开2手第二腿合约
  SetGlobalVar2("Data2SellID2",Data2SellID2);//存入委托标识Data2SellID2
}
If(Data2.F_SellRemainPosition() == 4 &&  Data2SellStatus1 == 1 && Data2SellStatus2 == 1)//第二腿合约空头可用持仓为4手且Data2SellStatus1、Data2SellStatus2的委托状态为全部成交
{
  Data2SellID3 = Data2.A_SendOrder(Enum_Sell,Enum_Entry,3,Data2.Price("Bid1"));//对价卖开3手第二腿合约
  SetGlobalVar2("Data2SellID3",Data2SellID3);//存入委托标识Data2SellID3
}
If(Data2.F_SellRemainPosition() == 7 &&  Data2SellStatus1 == 1 && Data2SellStatus2 == 1 && Data2SellStatus3 == 1)//第二腿合约空头可用持仓为4手且Data2SellStatus1、Data2SellStatus2、Data2SellStatus3的委托状态为全部成交
{
  Data2SellID4 = Data2.A_SendOrder(Enum_Sell,Enum_Entry,3,Data2.Price("Bid1"));//对价卖开3手第二腿合约
  SetGlobalVar2("Data2SellID4",Data2SellID4);//存入委托标识Data2SellID4
  SetGlobalVar2("SellPrice",Data2.Price("New"));//存入此时的最新价
  SetGlobalVar2("BCoin",1);//将全局变量BCoin赋值为1
}
SetGlobalVar2("Time",CurrentTime);//存入当前时间
  }
}
//------------------------------撤单------------------------------
If((Data2SellStatus1 == 0 || Data2SellStatus2 == 0 || Data2SellStatus3 == 0 || Data2SellStatus4 == 0) && (Data2.Price("New") > GetGlobalVar2("SellPrice") + 5 * Data2.Price("MinPrice") || TimeDiff(GetGlobalVar2("Time"),CurrentTime) > 10))
//第二腿合约的4笔卖出开仓委托全部发出,且其中存在任意一笔委托没有全部成交且(第二腿合约当前最新价大于第四笔委托发出时的最新价5个最小变动价位以上或第4笔委托发出至当前时间大于10秒)
{
  Data2.F_DeleteOrder();//撤掉第二腿合约的全部挂单
  SetGlobalVar2("BCoin",0);//将全局变量Coin重新归0
  SetGlobalVar2("BCoin1",0); 
}
//------------------------------第二腿合约成交后委托第一腿合约------------------------------
If(Data2.F_SellRemainPosition() == 10 && Data1.F_BuyRemainPosition() != 10 && Data1.F_GetOpenOrderCount() == 0 && Data2.F_GetOpenOrderCount() == 0 && GetGlobalVar2("Coin") == 0)//第二腿合约可用持仓为10手,且两腿合约均无挂单,Coin值为0
{
  Data1BuyID1 = Data1.A_SendOrder(Enum_Buy,Enum_Entry,10,Data1.Price("New"));//最新价买开第一腿合约
  SetGlobalVar2("Data1BuyID1",Data1BuyID1);//存入委托标识Data1BuyID1
  SetGlobalVar2("BuyTime1",CurrentTime);//存入当前买入时间
  SetGlobalVar2("BuyPrice",Data1.Price("New"));//存入此时最新价
  SetGlobalVar2("Coin",1);

}
    If(Data1BuyStatus1 == 0 && TimeDiff(GetGlobalVar2("BuyTime1"),CurrentTime) > 3)//Data1BuyStatus1的委托状态为没有全部成交,且挂单时间超过3秒
{
  Data1.F_DeleteOrder(F_OrderContractNo(GetGlobalVar2("Data1BuyID1")));//撤掉Data1BuyID1的挂单
  Data1BuyID2 = Data1.A_SendOrder(Enum_Buy,Enum_Entry,10-Data1.F_BuyRemainPosition,Data1.Price("New"));//计算合约1可用持仓,最新价买入不足10手的部分
  SetGlobalVar2("Data1BuyID2",Data1BuyID2);//存入委托标识Data1BuyID2
  SetGlobalVar2("BuyTime2",CurrentTime);//存入当前买入时间
}
    If(Data1BuyStatus2 == 0 && TimeDiff(GetGlobalVar2("BuyTime2"),CurrentTime) > 2)//Data1BuyStatus2的委托状态没有全部成交,且挂单时间超过3秒
{
  Data1.F_DeleteOrder(F_OrderContractNo(GetGlobalVar2("Data1BuyID2")));//撤掉Data1BuyID2的挂单
  Data1.A_SendOrder(Enum_Buy,Enum_Entry,10 - Data1.F_BuyRemainPosition,Data1.Price("RiseLimit"));////计算合约1可用持仓,涨停价买入不足10手的部分
  SetGlobalVar2("Coin",0);
}
  }
//------------------------------定义平仓------------------------------
  If(F_CurrentSig == Sig_Sell )//信号为Sell信号
  {
If(Data1.F_BuyRemainPosition() == 10  &&  Data2.F_SellRemainPosition() == 10 && Data1.F_GetOpenOrderCount == 0 && Data2.F_GetOpenOrderCount == 0 && GetGlobalVar2("SCoin") == 0)//两腿合约各持仓10手,且两腿合约均无挂单,SCoin值为0
{
  Data2BuyID3 = Data2.A_SendOrder(Enum_Buy,Enum_Exit,10,Data2.Price("RiseLimit"));//涨停价买平10手第二腿合约
  SetGlobalVar2("Data2BuyID3",Data2BuyID3);//存入委托标识Data2BuyID3
}
If(Data2BuyStatus3 == 1 && Data1.F_BuyRemainPosition() == 10)//Data2BuyStatus3的委托状态为全部成交且第一腿合约可用持仓为10手
{
  Data1SellID5 = Data1.A_SendOrder(Enum_Sell,Enum_Exit,10,Data1.Price("New"));//最新价卖平10手第1腿合约
  SetGlobalVar2("Data1SellID5",Data1SellID5);//存入委托标识Data1SellID6
  SetGlobalVar2("SellTime5",CurrentTime);//存入当前时间
}
If(Data1SellStatus5 == 0 && TimeDiff(GetGlobalVar2("SellTime5"),CurrentTime > 3))//Data1SellStatus5的委托状态为没有全部成交,且挂单时间大于3秒
{
  Data1.F_DeleteOrder(F_OrderContractNo(GetGlobalVar2("Data1SellID5")));//撤掉Data1SellID5的挂单
  Data1SellID6 = Data1.A_SendOrder(Enum_Sell,Enum_Exit,Data1.F_BuyRemainPosition,Data1.Price("New"));//最新价卖平合约1全部可用持仓
  SetGlobalVar2("Data1SellID6",Data1SellID6);//存入委托标识Data1SellID6
  SetGlobalVar2("SellTime6",CurrentTime);//存入当前时间
}
If(Data1SellStatus6 == 0 && TimeDiff(GetGlobalVar2("SellTime6"),CurrentTime > 2))//Data1SellStatus6的委托状态为没有全部成交,且挂单时间大于2秒
{
  Data1.F_DeleteOrder(F_OrderContractNo(GetGlobalVar2("Data1SellID6")));//撤掉Data1SellID6的挂单
  Data1.A_SendOrder(Enum_Sell,Enum_Exit,Data1.F_BuyRemainPosition,Data1.Price("FallLimit"));//跌停价卖出合约1的全部可用持仓
  SetGlobalVar2("SCoin",1);//SCoin赋值为1
}
SetGlobalVar2("BuyTimeCoin",0);//BuyTimeCoin归零
SetGlobalVar2("BCoin",0);//BCoin归零
  }


End
     
   
投资者咨询:五月 (文华财经wh9)
来源:文华财经  日期:2019-5-21 12:07
 还加上一个尾盘收盘之前4分钟时候清仓,!求改进例子
技术人员回复
日期:2019-5-21 13:08
 
是正常的

您的模型中有对应源码

是会第二腿合约挂单超过一定时间,撤单并清理未配对持仓的

时间是2秒和3秒,参考425行和439行


算法交易模型是需要专门的金融工程师编写的,论坛不提供算法模型的编写


需要购买程序化授权,购买后会有专门的金融工程师给您编写,参考置顶帖:


https://help.wenhua.com.cn/dispbbs.asp?boardid=14&Id=571777






   
投资者咨询:五月 (文华财经wh9)
来源:文华财经  日期:2019-5-21 12:07
 改为第一腿先发,不可以?
技术人员回复
日期:2019-5-21 14:51
 
从思路上来说,先委托第二腿不活跃的合约,等第二腿合约成交再委托第一腿合约,是为了避免套利发生瘸腿

第一腿活跃的合约先发,那后面判断是否成交进行的撤单清仓操作都没有意义了

算法交易模型需要整体判断,需要专门的金融工程师编写的
投资者咨询:五月 (文华财经wh9)
来源:文华财经  日期:2019-5-21 12:07
 这个问题不是我一个人反应了
技术人员回复
日期:2019-5-21 15:08
 
和您说的不是一个问题的

您参考看下