使用A函数的自动开平仓系统
参照其它高手写的使用A函数的自动开平仓系统,实际测试中有些问题,请高手指点。
Params
Numeric length3(3); //3均线
Numeric length15(15); //15均线
Numeric waitTime(5); //开仓延时等待时间
Vars
NumericSeries MA3; //3均线
NumericSeries MA15; //15均线
Bool conWaitTime;
Bool conTrailPrice;
Begin
If(SymbolType=="rb")
conTrailPrice=true;
If(SymbolType=="FG")
conTrailPrice=False;
MA3=AverageFC((Open+Close)/2,length3);
MA15=AverageFC((Open+Close)/2,length15);
PlotNumeric("MA3",MA3); //绘制均线3
PlotNumeric("MA15",MA15); //绘制均线15
If(A_BuyPosition==0)//开仓
{
SetGlobalVar(1,0); //多头开仓,可以执行发单指令
If(CrossOver(MA3,MA15) )
{
If(GetGlobalVar(1)==1)
{
If(GetGlobalVar(2)==InvalidNumeric)
SetGlobalVar(2,0); //初始化等待时间变量
FileAppend("d:\SendOrderTest.log","前多头开仓单的发送时间="+Text(GetGlobalVar(2) ) );
conWaitTime=TimeDiff(GetGlobalVar(2),CurrentTime) > waitTime || (TimeDiff(A_OpenOrderTime(A_GetLastOpenOrderIndex(Enum_Buy,Enum_Entry)),CurrentTime) > waitTime);
FileAppend("d:\SendOrderTest.log","最后一个未成交委托单索引="+Text(A_GetLastOpenOrderIndex(Enum_Buy,Enum_Entry) )
+"未成交委托单的委托时间="+Text(A_OpenOrderTime(A_GetLastOpenOrderIndex(Enum_Buy,Enum_Entry) ) ) );
If(conWaitTime)
{
FileAppend("d:\mySendOrder.log",TimeToString(currenttime)+" "+"延时已到,多头开仓单撤单重发");
A_DeleteOrder(A_OpenOrderContractNo(A_GetLastOpenOrderIndex(Enum_Buy,Enum_Entry) ) );
FileAppend("d:\SendOrderTest.log","撤销多头开仓的单号="+A_OpenOrderContractNo(A_GetLastOpenOrderIndex(Enum_Buy,Enum_Entry) ) );
}
If(conTrailPrice)
{
FileAppend("d:\mySendOrder.log","重发单之前,多头开仓单未成交委托单索引="+Text(A_GetLastOpenOrderIndex(Enum_Buy,Enum_Entry) ) );
If(A_GetLastOpenOrderIndex(Enum_Buy,Enum_Entry)==InvalidNumeric)
{
FileAppend("d:\mySendOrder.log","撤单已经撤完,未成交委托单索引="+Text(A_GetLastOpenOrderIndex(Enum_Buy,Enum_Entry) ) );
A_SendOrder(Enum_Buy,Enum_Entry,1,Q_BidPrice+1*MinMove*PriceScale);
FileAppend("d:\SendOrderTest.log","准备重新追加进行多头开仓------------------------------------------------");
FileAppend("d:\SendOrderTest.log","多头开仓时间="+TimeToString(CurrentTime)
+" 最后一个未成交委托单索引="+Text(A_GetLastOpenOrderIndex(Enum_Buy,Enum_Entry) )
+" 某个未成交的委托单的合同号="+A_OpenOrderContractNo(A_GetLastOpenOrderIndex(Enum_Buy,Enum_Entry) ) );
SetGlobalVar(2,CurrentTime);
}
SetGlobalVar(1,1); //已经发送多头开仓委托单
}
}
Else
{
A_SendOrder(Enum_Buy,Enum_Entry,1,Q_BidPrice);
FileAppend("d:\SendOrderTest.log","准备开仓------------------------------------------------");
FileAppend("d:\SendOrderTest.log","首次多头开仓,时间="+TimeToString(CurrentTime)
+" 最后一个未成交委托单索引="+Text(A_GetLastOpenOrderIndex(Enum_Buy,Enum_Entry) )
+" 某个未成交的委托单的合同号="+A_OpenOrderContractNo(A_GetLastOpenOrderIndex(Enum_Buy,Enum_Entry) ));
SetGlobalVar(1,1); //已经发送多头开仓委托单
SetGlobalVar(2,CurrentTime);
}
}
}
If(A_BuyPosition>0 && A_BuyPosition<=1)//增仓
{
If(A_BuyAvgPrice<Q_BidPrice)
{
//加入发单函数,将开仓的代码赋值一遍即可
}
}
//If(MarketPosition==1)
If(A_BuyPosition!=0)//平仓
{
SetGlobalVar(3,0);
If(CrossUnder(MA3,MA15) )
{
If(GetGlobalVar(3)==1)
{
If(GetGlobalVar(4)==InvalidNumeric)
SetGlobalVar(4,0); //初始化等待时间变量
FileAppend("d:\SendOrderTest.log","前多头平仓单的发送时间="+Text(GetGlobalVar(4) ) );
conWaitTime=TimeDiff(GetGlobalVar(4),CurrentTime) > waitTime || (TimeDiff(A_OpenOrderTime(A_GetLastOpenOrderIndex(Enum_Sell,Enum_Exit)),CurrentTime) > waitTime);
FileAppend("d:\SendOrderTest.log","最后一个未成交委托单索引="+Text(A_GetLastOpenOrderIndex(Enum_Sell,Enum_Exit) )
+"未成交委托单的委托时间="+Text(A_OpenOrderTime(A_GetLastOpenOrderIndex(Enum_Sell,Enum_Exit) ) ) );
If(conWaitTime)
{
FileAppend("d:\mySendOrder.log",TimeToString(currenttime)+" "+"延时已到,多头平仓单撤单重发");
A_DeleteOrder(A_OpenOrderContractNo(A_GetLastOpenOrderIndex(Enum_Sell,Enum_Exit) ) );
FileAppend("d:\SendOrderTest.log","撤销多头平仓的单号="+A_OpenOrderContractNo(A_GetLastOpenOrderIndex(Enum_Sell,Enum_Exit) ) );
}
If(conTrailPrice)
{
FileAppend("d:\mySendOrder.log","重发单之前,多头平仓单未成交委托单索引="+Text(A_GetLastOpenOrderIndex(Enum_Sell,Enum_Exit) ) );
If(A_GetLastOpenOrderIndex(Enum_Sell,Enum_Exit)==InvalidNumeric)
{
FileAppend("d:\mySendOrder.log","撤单已经撤完,未成交委托单索引="+Text(A_GetLastOpenOrderIndex(Enum_Sell,Enum_Exit) ) );
A_SendOrder(Enum_Sell,Enum_Exit,1,Q_BidPrice-1*MinMove*PriceScale);
FileAppend("d:\SendOrderTest.log","准备重新追价进行多头平仓------------------------------------------------");
FileAppend("d:\SendOrderTest.log","多头开仓时间="+TimeToString(CurrentTime)
+" 最后一个未成交委托单索引="+Text(A_GetLastOpenOrderIndex(Enum_Sell,Enum_Exit) )
+" 某个未成交的委托单的合同号="+A_OpenOrderContractNo(A_GetLastOpenOrderIndex(Enum_Sell,Enum_Exit) ) );
SetGlobalVar(4,CurrentTime);
}
SetGlobalVar(3,1); //已经发送多头平仓委托单
}
}
Else
{
A_SendOrder(Enum_Sell,Enum_Exit,1,Q_BidPrice);
FileAppend("d:\SendOrderTest.log","准备平仓------------------------------------------------");
FileAppend("d:\SendOrderTest.log","首次多头平仓,时间="+TimeToString(CurrentTime)
+" 最后一个未成交委托单索引="+Text(A_GetLastOpenOrderIndex(Enum_Sell,Enum_Exit) )
+" 某个未成交的委托单的合同号="+A_OpenOrderContractNo(A_GetLastOpenOrderIndex(Enum_Sell,Enum_Exit) ));
SetGlobalVar(3,1); //已经发送多头平仓委托单
SetGlobalVar(4,CurrentTime);
}
}
}
End :) 写的很花哨,用Close,High,Low的话信号闪吧 说实话,这个程序的运行效率很低,且很占内存,因为大量的数据交互,所以建议有数据交互的地方用全局变量代替
页:
[1]