投资者咨询:模型 (文华财经WH8赢智V8.2)
来源:文华财经 日期:2018-8-22 19:09
//该组件仅仅用来示范如何编写算法交易组件
//用户需要根据自己交易经验,编写组件再实际应用!!!
//主要策略:设定分批总手数,开平仓时,自动根据买卖盘动态分批。
VAR Modname;
VAR N;//定义总手数。
VAR Code1;//定义合约名称
VAR KPN;//卖1量
VAR PPN;//买1量
VAR Status;//定义交易所状态修正变量,开仓总手数
GLOBAL_VAR YYN;//定义目前已有手数。
GLOBAL_VAR BuyPosition;//定义目前已有手数。
GLOBAL_VAR SellPosition;//定义目前已有手数。
VOID MAIN()//主函数。
{
Modname="模组名";
N=20;//开仓总手数
Code1=Modname.F_DealCode();
SellPosition=AL_SellRemainPosition(Code1);
BuyPosition=AL_BuyRemainPosition(Code1);
KPN=Offers(Code1,"askvol1");//取得当前合约卖1量。
PPN=Offers(Code1,"bidvol1");//取得当前合约买1量。
Status=T_IsExchangeOpen(Code1);//判断当前合约所属交易所的状态。
IF(Modname.F_FreshSig() == 1)
{
IF(Modname.F_Sig() == BK&&T_IsExchangeOpen(Code1) == 1)//当前信号为开多仓信号并且交易所处于开盘状态的时候。
{
BKDeal();//运行开多仓分批函数。
}
ELSE IF(Modname.F_Sig() == SK&&T_IsExchangeOpen(Code1) == 1)//当前信号为开空仓信号并且交易所处于开盘状态的时候。
{
SKDeal();//运行开空仓分批函数。
}
ELSE IF(Modname.F_Sig() == BP&&T_IsExchangeOpen(Code1) == 1) //当前信号为平空仓信号并且交易所处于开盘状态的时候。
{
BPDeal();//运行平空仓分批函数。
}
ELSE IF(Modname.F_Sig() == SP&&T_IsExchangeOpen(Code1) == 1) //当前信号为平多仓信号并且交易所处于开盘状态的时候。
{
SPDeal();//运行平多仓分批函数。
}
}
ELSE IF(Modname.F_FreshSig() == 0)
{
IF(Modname.F_Sig() == BK&&T_IsExchangeOpen(Code1) == 1)//当前信号为开多仓信号并且交易所处于开盘状态的时候。
{
BKDeal();//运行开多仓分批函数。
}
ELSE IF(Modname.F_Sig() == SK&&T_IsExchangeOpen(Code1) == 1)//当前信号为开空仓信号并且交易所处于开盘状态的时候。
{
SKDeal();//运行开空仓分批函数。
}
ELSE IF(Modname.F_Sig() == BP&&T_IsExchangeOpen(Code1) == 1) //当前信号为平空仓信号并且交易所处于开盘状态的时候。
{
BPDeal();//运行平空仓分批函数。
}
ELSE IF(Modname.F_Sig() == SP&&T_IsExchangeOpen(Code1) == 1) //当前信号为平多仓信号并且交易所处于开盘状态的时候。
{
SPDeal();//运行平多仓分批函数。
}
}
}
VOID BKDeal()//定义开仓分批函数
{
IF(YYN+KPN<=N)//如果已开仓手数小于需要开仓手数。
{
IF(Modname.F_Sig() == BK&&T_IsNoOrder() == 1&&Status == 1)//如果当前信号为BK并且无挂单。
{
T_Deal(Code1,0,0,KPN,Offers(Code1,"ask1"));//做多指定手数。
YYN=YYN+KPN;//已开仓手数增加KPN
}
ELSE
MessageOut("等待成交");//其他情况显示“等待成交”。
}
ELSE IF(YYN+KPN>N && YYN<N)//如果已开仓手数大于需要开仓手数。
{
IF(Modname.F_Sig() == BK&&T_IsNoOrder() == 1&&Status == 1)//如果当前信号为BK并且无挂单。
{
T_Deal(Code1,0,0,N-YYN,Offers(Code1,"ask1"));//做多指定手数。
MessageOut("good");
}
ELSE
MessageOut("等待成交");//其他情况显示“等待成交”。
}
ELSE
{
MessageOut("开多仓分批已成交");//新的已开仓手数等于需要开仓手数。
}
}
VOID SKDeal()//定义开仓分批函数
{
IF(YYN+PPN<=N)//如果已开仓手数小于需要开仓手数。
{
IF(Modname.F_Sig() == SK&&T_IsNoOrder() == 1&&Status == 1)//如果当前信号为SK并且无挂单。
{
T_Deal(Code1,1,0,PPN,Offers(Code1,"bid1"));//做空指定手数。
YYN=YYN+PPN;//已开仓手数增加PPN
}
ELSE
MessageOut("等待成交");//其他情况显示“等待成交”。
}
ELSE IF(YYN+PPN>N && YYN<N)//日过已开仓手数等于需要开仓手数。
{
IF(Modname.F_Sig() == SK&&T_IsNoOrder() == 1&&Status == 1)//如果当前信号为BK并且无挂单。
{
T_Deal(Code1,0,0,N-YYN,Offers(Code1,"bid1"));//做多指定手数。
MessageOut("good");
}
ELSE
MessageOut("等待成交");//其他情况显示“等待成交”。
}
ELSE
{
MessageOut("开空仓分批已成交");//新的已开仓手数等于需要开仓手数。
}
}
VOID BPDeal()//定义平仓分批手数
{
IF(SellPosition-KPN>=0 && SellPosition>0)//如果已有持仓的手数大于0
{
IF(Modname.F_Sig() == BP&&T_IsNoOrder() == 1&&Status == 1)//如果当前信号为BP并且无挂单。
{
T_Deal(Code1,0,1,KPN,Offers(Code1,"ask1"));//平空仓指定手数。
//此句中T_Deal的第3个参数为1,表示平仓,只适用于非上交所合约,如果绑定上交所合约时,请将1改为2即可。下同理。
YYN=YYN-KPN;//已开仓手数减少KPN
}
ELSE
MessageOut("等待成交");//其他情况显示“等待成交”。
}
ELSE IF(SellPosition<KPN && SellPosition>0)//已开仓手数为0的时候
{
IF(Modname.F_Sig() == BP&&T_IsNoOrder() == 1&&Status == 1)//如果当前信号为BK并且无挂单。
{
T_Deal(Code1,0,1,SellPosition,Offers(Code1,"ask1"));//做多指定手数。
}
ELSE
MessageOut("等待成交");//其他情况显示“等待成交”。
}
ELSE
{
MessageOut("平空仓分批已成交");//新的已开仓手数等于需要开仓手数。
}
}
VOID SPDeal()//定义平仓分批手数
{
IF(BuyPosition-PPN>=0 && BuyPosition>0)//如果已有持仓的手数大于0
{
IF(Modname.F_Sig() == SP&&T_IsNoOrder() == 1&&Status == 1)//如果当前信号为SP并且无挂单。
{
T_Deal(Code1,1,1,PPN,Offers(Code1,"bid1"));//平多仓指定手数。
//此句中T_Deal的第3个参数为1,表示平仓,只适用于非上交所合约,如果绑定上交所合约时,请将1改为2即可。下同理。
YYN=YYN-PPN;//已开仓手数增加KPN
}
ELSE
MessageOut("等待成交");//其他情况显示“等待成交”。
}
ELSE IF(BuyPosition<PPN && BuyPosition>0)//已开仓手数为0的时候
{
IF(Modname.F_Sig() == BP&&T_IsNoOrder() == 1&&Status == 1)//如果当前信号为BK并且无挂单。
{
T_Deal(Code1,1,1,BuyPosition,Offers(Code1,"ask1"));//做多指定手数。
}
ELSE
MessageOut("等待成交");//其他情况显示“等待成交”。
}
ELSE
{
MessageOut("平多仓分批已成交");//新的已开仓手数等于需要开仓手数。
}
上面是软件里的模型范例,我虽不太懂,但还是看出了不少错误,包括后面的中文说明,希望老师们仔细看看
技术人员回复
日期:2018-8-22 19:19