下單組件"掛價發出委托,3秒不成交的話撤單,以對價再發出委托" 源碼[文華財經公式]
-
下面這個下單組件,目的是實現“掛價發出委托,3秒不成交的話撤單,以對價再發出委托”,半年前我曾經發過到論壇,經過一個多星期的討論和更新,最后文華員工的答復是軟件存在BUG,沒法實現~
現在不知道能不能實現,上星期再次測試,結果是模型可以發出開、平倉信號,但是沒有發出任何具體委托。
因為,我這個下單組件,估計80%用文華實盤的人都會用到,到時候正常使用的話可以寫到文華下單組件的示范里面供更多人使用~
源碼如下:
VAR Price,M,N;
VAR BKID,SKID,BPID,SPID,SPKID1,BPKID1,SPKID2,BPKID2;//定義BKID,SKID,BPID,SPID
VAR LastWithDrawFinsh;
VAR LastState;
VAR KNALL;//目標總開倉數
VOID MAIN() //
{
//KPN設為按照模型信號
M=0;//發出信號時,0為掛價委托,1為對價委托,>=2為超價委托
N=1;//再委托的委托價參數,0為掛價委托,1為對價委托,>=2為超價委托
Price=Price(F_DealCode());//
BKID=ReadGlobalStr("BKID");
SKID=ReadGlobalStr("SKID");
BPID=ReadGlobalStr("BPID");
SPID=ReadGlobalStr("SPID");
BPKID1=ReadGlobalStr("BPKID1");
SPKID1=ReadGlobalStr("SPKID1");
BPKID2=ReadGlobalStr("BPKID2");
SPKID2=ReadGlobalStr("SPKID2");
KNALL=ReadGlobal("KNALL");
//下面是3秒沒有成交,撤單。
LastWithDrawFinsh=ReadGlobal("LASTWITHDRAW");
IF(T_IsNoOrder()!=1 ) //有掛單的情況
{
//查詢掛單然后進行撤單
IF(CurrentTime()-LastOrderTime()==3 && LastWithDrawFinsh==1) //如果3秒有委托未成交,全撤,下次進入會重新下委托
{
IF(F_Sig()==BK) //如果取出的信號為BP
{
IF(T_IsNoOrder()==0)
{
MessageOut("BK撤單到了!");
T_DeleteOrder(BKID);
LastState=0;
//
}
}
IF(F_Sig()==SK) //如果取出的信號為SP
{
IF(T_IsNoOrder()==0)
{
MessageOut("SK撤單到了!");
T_DeleteOrder(SKID);
LastState=0;
}
}
IF(F_Sig()==BP) //如果取出的信號為BP
{
IF(T_SellPosition(F_DealCode())>0&&T_IsNoOrder()==0)
{
MessageOut("BP撤單到了!");
T_DeleteOrder(BPID);
LastState=0;
//
}
}
IF(F_Sig()==SP) //如果取出的信號為SP
{
IF(T_BuyPosition(F_DealCode())>0&&T_IsNoOrder()==0)
{
MessageOut("SP撤單到了!");
T_DeleteOrder(SPID);
LastState=0;
}
}
IF(F_Sig()==SPK) //如果取出的信號為SP
{
IF(T_IsNoOrder()==0)
{
MessageOut("SPK撤單到了!");
T_DeleteOrder(SPKID1);
T_DeleteOrder(SPKID2);
LastState=0;
}
}
IF(F_Sig()==BPK) //如果取出的信號為BP
{
IF(T_IsNoOrder()==0)
{
MessageOut("BPK撤單到了!");
T_DeleteOrder(BPKID1);
T_DeleteOrder(BPKID2);
LastState=0;
//
}
}LastWithDrawFinsh=0;
}
WriteGlobal("LASTWITHDRAW", LastWithDrawFinsh);
RETURN;
}
LastWithDrawFinsh=1;
IF(F_FreshSig()==1)//刷新現有的信號,有新信號
{
SEND();
}
ELSE IF(F_FreshSig()==0)//如果是處理過的信號
{
IF((T_OrderState(BKID)==2||T_OrderState(SKID)==2||T_OrderState(BPID)==2||T_OrderState(SPID)==2||T_OrderState(BPKID1)==2||T_OrderState(SPKID1)==2||T_OrderState(BPKID2)==2||T_OrderState(SPKID2)==2||T_OrderState(BKID)==3||T_OrderState(SKID)==3||T_OrderState(BPID)==3||T_OrderState(SPID)==3||T_OrderState(BPKID1)==3||T_OrderState(SPKID1)==3||T_OrderState(BPKID2)==3||T_OrderState(SPKID2)==3)&&LastState==0)//如果委托撤單
{
RESEND();
LastState=1;
}
}
WriteGlobalStr("BKID",BKID);
WriteGlobalStr("SKID",SKID);
WriteGlobalStr("BPID",BPID);
WriteGlobalStr("SPID",SPID);
WriteGlobalStr("BPKID1",BPKID1);
WriteGlobalStr("SPKID1",SPKID1);
WriteGlobalStr("BPKID2",BPKID2);
WriteGlobalStr("SPKID2",SPKID2);
WriteGlobal("LASTSTATE", LastState);
WriteGlobal("LASTWITHDRAW", LastWithDrawFinsh);
WriteGlobal("KNALL",KNALL);}
VOID SEND()
{
IF(F_Sig()==BPK && F_SigValid()==1) //如果取出的信號為BPK 且信號不是消失狀態
{
IF(F_SellPosition()!=0)
{
MessageOut("信號BPK生效,平掉所有賣倉");
BPKID1=T_ReduceSellOpiTo(F_DealCode(), Offers(F_DealCode(),"bid1")+MinPrice(F_DealCode())*M,0); //平掉所有空頭持倉
}
IF(F_BuyPosition()>=0)//
{
MessageOut("信號BPK生效,開倉");
KNALL=F_SigVol()+F_BuyPosition();
BPKID2=T_AddBuyOpiTo(F_DealCode(), Offers(F_DealCode(),"bid1")+MinPrice(F_DealCode())*M,F_SigVol()+F_BuyPosition()); //補充持倉
}
}
IF(F_Sig()==SPK && F_SigValid()==1) //如果取出的信號為SPK 且信號不是消失狀態
{
IF(F_BuyPosition()!=0)
{
SPKID1=T_ReduceBuyOpiTo(F_DealCode(), Offers(F_DealCode(),"ask1")-MinPrice(F_DealCode())*M,0); //平掉所有多頭持倉
}
IF(F_SellPosition()>=0) //如果買倉為0,不存在止贏止損問題,直接開倉
{
KNALL=F_SigVol()+F_SellPosition();
SPKID2=T_AddSellOpiTo(F_DealCode(), Offers(F_DealCode(),"ask1")-MinPrice(F_DealCode())*M,F_SigVol()+F_SellPosition()); //補充空頭持倉
}
}
IF(F_Sig()==BP && F_SigValid()==1) //如果取出的信號為BP 且信號不是消失狀態
{
IF(F_SellPosition()!=0)
{
MessageOut("信號BP生效,平掉所有賣倉");
BPID=T_ReduceSellOpiTo(F_DealCode(), Offers(F_DealCode(),"bid1")+MinPrice(F_DealCode())*M,0); //平掉所有空頭持倉
}
}IF(F_Sig()==SP && F_SigValid()==1) //如果取出的信號為SP 且信號不是消失狀態
{
IF(F_BuyPosition()!=0)
{
SPID=T_ReduceBuyOpiTo(F_DealCode(), Offers(F_DealCode(),"ask1")-MinPrice(F_DealCode())*M,0); //平掉所有多頭持倉
}
}
IF(F_Sig()==BK && F_SigValid()==1) //如果取出的信號為BK 且信號不是消失狀態
{
IF(F_BuyPosition()>=0 && F_SellPosition()==0)//判斷是不是部分成交
{
MessageOut("信號BK生效,開倉");
KNALL=F_SigVol()+F_BuyPosition();
BKID=T_AddBuyOpiTo(F_DealCode(), Offers(F_DealCode(),"bid1")+MinPrice(F_DealCode())*M,F_SigVol()+F_BuyPosition()); //
}
}IF(F_Sig()==SK && F_SigValid()==1) //如果取出的信號為SK 且信號不是消失狀態
{
IF(F_SellPosition()>=0 && F_BuyPosition()==0) //如果買倉為0,不存在止贏止損問題,直接開倉
{
KNALL=F_SigVol()+F_SellPosition();
SKID=T_AddSellOpiTo(F_DealCode(), Offers(F_DealCode(),"ask1")-MinPrice(F_DealCode())*M,F_SigVol()+F_SellPosition()); //
}
}
}
VOID RESEND()
{
IF(F_Sig()==BPK && F_SigValid()==1) //如果取出的信號為BPK 且信號不是消失狀態
{
IF(F_SellPosition()!=0)
{
MessageOut("信號BPK生效,平掉所有賣倉");
BPKID1=T_ReduceSellOpiTo(F_DealCode(), Offers(F_DealCode(),"bid1")+MinPrice(F_DealCode())*N,0); //平掉所有空頭持倉
}
IF(F_BuyPosition()<=KNALL)//判斷是不是部分成交
{
MessageOut("信號BPK生效,開倉");
BPKID2=T_AddBuyOpiTo(F_DealCode(), Offers(F_DealCode(),"bid1")+MinPrice(F_DealCode())*N,KNALL); //補充持倉
}
}
IF(F_Sig()==SPK && F_SigValid()==1) //如果取出的信號為SPK 且信號不是消失狀態
{
IF(F_BuyPosition()!=0)
{
SPKID1=T_ReduceBuyOpiTo(F_DealCode(), Offers(F_DealCode(),"ask1")-MinPrice(F_DealCode())*N,0); //平掉所有多頭持倉
}
IF(F_SellPosition()<=KNALL) //如果買倉為0,不存在止贏止損問題,直接開倉
{
SPKID2=T_AddSellOpiTo(F_DealCode(), Offers(F_DealCode(),"ask1")-MinPrice(F_DealCode())*N,KNALL); //補充空頭持倉
}
}
IF(F_Sig()==BP && F_SigValid()==1) //如果取出的信號為BP 且信號不是消失狀態
{
IF(F_SellPosition()!=0)
{
MessageOut("信號BP生效,平掉所有賣倉");
BPID=T_ReduceSellOpiTo(F_DealCode(), Offers(F_DealCode(),"bid1")+MinPrice(F_DealCode())*N,0); //平掉所有空頭持倉
}
}IF(F_Sig()==SP && F_SigValid()==1) //如果取出的信號為SP 且信號不是消失狀態
{
IF(F_BuyPosition()!=0)
{
SPID=T_ReduceBuyOpiTo(F_DealCode(), Offers(F_DealCode(),"ask1")-MinPrice(F_DealCode())*N,0); //平掉所有多頭持倉
}
}
IF(F_Sig()==BK && F_SigValid()==1) //如果取出的信號為BK 且信號不是消失狀態
{
IF(F_BuyPosition()<=KNALL && F_SellPosition()==0)//判斷是不是部分成交
{
MessageOut("信號BK生效,開倉");
BKID=T_AddBuyOpiTo(F_DealCode(), Offers(F_DealCode(),"bid1")+MinPrice(F_DealCode())*N,KNALL); //補多倉
}
}IF(F_Sig()==SK && F_SigValid()==1) //如果取出的信號為SK 且信號不是消失狀態
{
IF(F_SellPosition()<=KNALL && F_BuyPosition()==0) //如果買倉為0,不存在止贏止損問題,直接開倉
{
SKID=T_AddSellOpiTo(F_DealCode(), Offers(F_DealCode(),"ask1")-MinPrice(F_DealCode())*N,KNALL); //補空倉
}
}
}
有思路,想編寫各種指標公式,程序化交易模型,選股公式,預警公式的朋友
可聯系技術人員 QQ: 262069696 進行 有償 編寫!(不貴!點擊查看價格!)
相關文章
-
沒有相關內容