- 精华
- 0
- 在线时间
- 83 小时
- UID
- 15288
- 积分
- 382
- 帖子
- 86
- 阅读权限
- 50
- 注册时间
- 2010-8-20
- 最后登录
- 2010-10-14
- 精华
- 0
- UID
- 15288
- 积分
- 382
- 帖子
- 86
- 主题
- 18
- 阅读权限
- 50
- 注册时间
- 2010-8-20
- 最后登录
- 2010-10-14
|
//本模板包含两个模块:开多仓,平多仓。
//本模板还没有完全测试完毕。已发现有个别重复发单现象。原因尚在查找中。
//欢迎copy,欢迎拍砖。
Params
//模板参数
Numeric lastOpenTime(14.55);//开仓时间限制
Numeric lastCloseTime(14.56);//退出时间限制
Numeric waittimeEntry(20);//等待入场成交时间秒数
Numeric waittimeExit(20);//等待出场成交时间秒数
Numeric lots(1); //交易量
Vars
//模板变量
Bool conBuyEntry;//开多条件
Bool conOpenOrderBuyEntry;//已存在未成交开多单
Bool conWaitTime;
Numeric priceBuyEntry;
Bool conSellExit;
Bool conOpenOrderSellExit;//已存在未成交平多单
Numeric priceSellExit;
//个性变量
Begin
//开多*******************************************************************************************************
//判断是否已有未成交多单 (防止网络延时以及全局变量意外丢失正确值)
conOpenOrderBuyEntry=(GetGlobalVar(10)==1) || (A_GetLastOpenOrderIndex(Enum_Buy,Enum_Entry) != InvalidInteger) ;
If ( CurrentTime*100<lastOpenTime && A_BuyPosition==0 )
{
FileAppend("d:\\h.log",text(currenttime*100)+"***********************************准备开多");
//-------------------------------------------------------------------------------------求开多条件
conBuyEntry=True;
//-------------------------------------------------------------------------------------求开多条件完毕
If (conBuyEntry) //多头条件
{
//处理已有未成交多单
If ( conOpenOrderBuyEntry )
{
// 判断等待时间
If (GetGlobalVar(11)==InvalidNumeric)
SetGlobalVar(11,0);//初始化等待时间变量
conWaitTime=(MyDecTime( currenttime,GetGlobalVar(11))>waittimeEntry)
|| ( MyDecTime(currenttime,A_OpenOrderTime( A_GetLastOpenOrderIndex(Enum_Buy,Enum_Entry) )) > waittimeEntry );
FileAppend("d:\\h.log",text(currenttime*100)+" "+"等待时间秒数1="+text(MyDecTime( currenttime,GetGlobalVar(11)))
+" 等待时间秒数2="+text( MyDecTime(currenttime,A_OpenOrderTime( A_GetLastOpenOrderIndex(Enum_Buy,Enum_Entry) ))));
If ( conWaitTime )
{
FileAppend("d:\\h.log",text(currenttime*100)+" "+"延时已到,撤单重发");
FileAppend("d:\\h.log",text(currenttime*100)+" "+"撤单合同号="
+A_OpenOrderContractNo( A_GetLastOpenOrderIndex(Enum_Buy,Enum_Entry)));
A_DeleteOrder( A_OpenOrderContractNo( A_GetLastOpenOrderIndex(Enum_Buy,Enum_Entry) ) ); //撤单
//算价、下单、设置、计时
priceBuyEntry= ;
A_SendOrder(Enum_Buy,Enum_Entry,lots,priceBuyEntry);
FileAppend("d:\\h.log",text(currenttime*100)+" "+"重发单(未成交)索引号="
+text( A_GetLastOpenOrderIndex(Enum_Buy,Enum_Entry)));
FileAppend("d:\\h.log",text(currenttime*100)+" "+"重发合同号(未成交)="
+A_OpenOrderContractNo( A_GetLastOpenOrderIndex(Enum_Buy,Enum_Entry)));
FileAppend("d:\\h.log",text(currenttime*100)+" "+"重发合同号(末合同)="
+A_OrderContractNo( A_GetLastOrderIndex(Enum_Buy,Enum_Entry)));
SetGlobalVar(10,1);
SetGlobalVar(11,currenttime);
}
}
Else
{
//算价、下单、设置、计时
priceBuyEntry= ;
A_SendOrder(Enum_Buy,Enum_Entry,lots,priceBuyEntry);
FileAppend("d:\\h.log",text(currenttime*100)+" "+"首次发单");
FileAppend("d:\\h.log",text(currenttime*100)+" "+"首发合同号="
+A_OpenOrderContractNo( A_GetLastOpenOrderIndex(Enum_Buy,Enum_Entry)));
SetGlobalVar(10,1);
SetGlobalVar(11,currenttime);
}
}
Else
{
FileAppend("d:\\h.log",text(currenttime*100)+" "+"不符合多头条件");
//有多单则撤单
If ( (A_GetLastOpenOrderIndex(Enum_Buy,Enum_Entry) != InvalidInteger) ) //不采用全局变量,需等待前面的单子可撤。
A_DeleteOrder( A_OpenOrderContractNo( A_GetLastOpenOrderIndex(Enum_Buy,Enum_Entry) ) );
SetGlobalVar(10,0);
}
}
Else
{
If ( (A_GetLastOpenOrderIndex(Enum_Buy,Enum_Entry) != InvalidInteger) ) //不采用全局变量,需等待前面的单子可撤。
A_DeleteOrder( A_OpenOrderContractNo( A_GetLastOpenOrderIndex(Enum_Buy,Enum_Entry) ) );
SetGlobalVar(10,0);
}
//处理多头仓位*************************************************************************************************************************************
If ( A_BuyPosition!=0 )
{
//判断是否已有未成交平多单 (防止网络延时以及全局变量意外丢失正确值)
conOpenOrderSellExit=(GetGlobalVar(30)==1) || (A_GetLastOpenOrderIndex(Enum_Sell,Enum_ExitToday) != InvalidInteger) ;
FileAppend("d:\\h.log",text(currenttime*100)+"================================================准备平多仓");
If (CurrentTime*100<=lastCloseTime) //退出时间限制
{
//有单无单分别处理
If ( conOpenOrderSellExit ) //有单处理,有手工单也同样处理
{
If (GetGlobalVar(31)==InvalidNumeric)
SetGlobalVar(31,0);//初始化等待时间变量
conWaitTime=(MyDecTime( currenttime,GetGlobalVar(31))>waittimeExit)
|| ( MyDecTime(currenttime,A_OpenOrderTime( A_GetLastOpenOrderIndex(Enum_Sell,Enum_ExitToday) )) > waittimeExit );
FileAppend("d:\\h.log",text(currenttime*100)+" "+"平仓等待时间秒数1="+text(MyDecTime( currenttime,GetGlobalVar(31)))
+" 平仓等待时间秒数2="+text( MyDecTime(currenttime,A_OpenOrderTime( A_GetLastOpenOrderIndex(Enum_Sell,Enum_ExitToday) ))));
If ( conWaitTime ) // 等待成交的延时已到,撤单追价重发
{
FileAppend("d:\\h.log",text(currenttime*100)+" "+"延时已到,撤平仓单重发");
FileAppend("d:\\h.log",text(currenttime*100)+" "+"撤单合同号="
+A_OpenOrderContractNo( A_GetLastOpenOrderIndex(Enum_Sell,Enum_ExitToday)));
A_DeleteOrder( A_OpenOrderContractNo( A_GetLastOpenOrderIndex(Enum_Sell,Enum_ExitToday) ) ); //撤单
//算价、下单、设置、计时
PriceSellExit= ;
A_SendOrder(Enum_Sell,Enum_Exit,lots,PriceSellExit);
SetGlobalVar(30,1);
SetGlobalVar(31,currenttime);
}
}
Else //无单处理
{
//-------------------------------------------------------------------------------------求平多条件
conSellExit=true;
//-------------------------------------------------------------------------------------求平多条件完毕
If (conSellExit) //平多条件
{
//算价、下单、设置、计时
PriceSellExit= ;
A_SendOrder(Enum_Sell,Enum_Exit,lots,PriceSellExit);
FileAppend("d:\\h.log",text(currenttime*100)+" "+"首次平仓发单");
SetGlobalVar(30,1);
SetGlobalVar(31,currenttime);
}
}
}
Else //退出时间已到,有单撤单,以停板价委托,之后不撤单
{
FileAppend("d:\\h.log",text(currenttime*100)+" "+"退出时限已到");
If (GetGlobalVar(39)==InvalidNumeric)
SetGlobalVar(39,0);//初始化
If ( A_GetLastOpenOrderIndex(Enum_Sell,Enum_ExitToday)!=InvalidInteger && GetGlobalVar(39)!=1)
{
A_DeleteOrder( A_OpenOrderContractNo( A_GetLastOpenOrderIndex(Enum_Sell,Enum_ExitToday) ) );
FileAppend("d:\\h.log",text(currenttime*100)+" "+"有平仓单撤单");
SetGlobalVar(30,0);
}
If ( GetGlobalVar(39)!=1 )
{
A_SendOrder(Enum_Sell,Enum_Exit,lots, Q_LowerLimit);
FileAppend("d:\\h.log",text(currenttime*100)+" "+"跌停价发平仓单");
SetGlobalVar(30,1);
SetGlobalVar(39,1);
}
}
}
Else
SetGlobalVar(30,0);
End |
|