投资者咨询:五月 (文华财经wh9)
来源:文华财经 日期:2019-5-21 12:07
第二腿合约成交后,第一腿合约还没发出就平掉了
怎么可以改为第一腿先发,然后时间上快点反馈到第二腿委托呢?
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
是正常的
算法交易模型是需要专门的金融工程师编写的,论坛不提供算法模型的编写
需要购买程序化授权,购买后会有专门的金融工程师给您编写,参考置顶帖:
投资者咨询:五月 (文华财经wh9)
来源:文华财经 日期:2019-5-21 12:07
改为第一腿先发,不可以?
技术人员回复
日期:2019-5-21 14:51
投资者咨询:五月 (文华财经wh9)
来源:文华财经 日期:2019-5-21 12:07
这个问题不是我一个人反应了
技术人员回复
日期:2019-5-21 15:08