止損出現(xiàn)錯誤 [開拓者 TB]
- 咨詢內(nèi)容:
今天在用數(shù)據(jù)庫測試時發(fā)現(xiàn)開倉不正確,根據(jù)輸出的日志發(fā)現(xiàn)一個問題。
程序如下,本程序在價格突破前6根Bar的高低點時建倉,止損設(shè)置為4跳。但是在09:29:01時開空后立即止損,止損價格就是開倉價格,并且止損單買入平倉失敗。我沒有發(fā)現(xiàn)程序的問題,所以請版主解答一下,謝謝!- Params
- Numeric L1(6);
- Numeric Stoploss(4);
- Vars
- Bool upbreak;
- Bool lowbreak;
- String orderstate;
- Numeric protectprice;
- Numeric Mx;
- Numeric Mn;
- Numeric i;
- Begin
- //求最值------------------------------------------------------------------------
- Mx=High[1];
- Mn=Low[1];
- For i=2 To L1
- {
- If(High[i]>Mx)
- Mx=High[i];
- If(Low[i]<Mn)
- Mn=Low[i];
- }
- PlotNumeric("最大值",Mx);
- PlotNumeric("最小值",Mn);
-
- If(BarStatus==2)
- {
- orderstate=GetTBProfileString2File("C:\\breaktest.log","開倉控制","已發(fā)單");
- Commentary("已發(fā)單:"+orderstate);
- If(orderstate=="0" Or orderstate==InvalidString)
- {
- If(Q_Last>Mx)
- {
- FileAppend("C:\\breaktest記錄.log",TimeToString(CurrentTime)+",開多前orderstate為:"+orderstate+",開多前持倉為:"+Text(A_TotalPosition)+",發(fā)單價格:"+Text(Q_Last));
- A_SendOrder(Enum_Buy,Enum_Entry,1,Q_AskPrice);
- SetTBProfileString2File("C:\\breaktest.log","開倉控制","已發(fā)單",Text(1));
- }
- If(Q_Last<Mn)
- {
- FileAppend("C:\\breaktest記錄.log",TimeToString(CurrentTime)+"開空前orderstate為:"+orderstate+",開空前持倉為:"+Text(A_TotalPosition)+",發(fā)單價格:"+Text(Q_Last));
- A_SendOrder(Enum_Sell,Enum_Entry,1,Q_BidPrice);
- SetTBProfileString2File("C:\\breaktest.log","開倉控制","已發(fā)單",Text(-1));
- }
- }
- If(orderstate=="1")
- {
- protectprice=A_BuyAvgPrice-Stoploss;
- If(Q_Last<protectprice)
- {
- FileAppend("C:\\breaktest記錄.log",TimeToString(CurrentTime)+"多單止損前orderstate為:"+orderstate+"止損前持倉為:"+Text(A_TotalPosition)+",發(fā)單價格:"+Text(Q_Last));
- A_SendOrder(Enum_Sell,Enum_Exit,1,Q_BidPrice);
- SetTBProfileString2File("C:\\breaktest.log","開倉控制","已發(fā)單",Text(0));
- }
- Else If(Q_Last<Mn)
- {
- FileAppend("C:\\breaktest記錄.log",TimeToString(CurrentTime)+"平多前orderstate為:"+orderstate+"平倉前持倉為:"+Text(A_TotalPosition)+",發(fā)單價格:"+Text(Q_Last));
- A_SendOrder(Enum_Sell,Enum_Exit,1,Q_BidPrice);
- SetTBProfileString2File("C:\\breaktest.log","開倉控制","已發(fā)單",Text(0));
- }
- }
- If(orderstate=="-1")
- {
- protectprice=A_SellAvgPrice+Stoploss;
- If(Q_Last>protectprice)
- {
- FileAppend("C:\\breaktest記錄.log",TimeToString(CurrentTime)+"空單止損前orderstate為:"+orderstate+"止損前持倉為:"+Text(A_TotalPosition)+",發(fā)單價格:"+Text(Q_Last));
- A_SendOrder(Enum_Buy,Enum_Exit,1,Q_AskPrice);
- SetTBProfileString2File("C:\\breaktest.log","開倉控制","已發(fā)單",Text(0));
- }
- Else If(Q_Last>Mx)
- {
- FileAppend("C:\\breaktest記錄.log",TimeToString(CurrentTime)+"平空前orderstate為:"+orderstate+"平倉前持倉為:"+Text(A_TotalPosition)+",發(fā)單價格:"+Text(Q_Last));
- A_SendOrder(Enum_Buy,Enum_Exit,1,Q_AskPrice);
- SetTBProfileString2File("C:\\breaktest.log","開倉控制","已發(fā)單",Text(0));
- }
- }
- }
- End
- Params
- TB技術(shù)人員:
買入平倉失敗的原因是前面的開空單尚未成交,因此平倉會失敗。但是不明白為什么止損條件未達到就發(fā)了止損單
- TB客服:
zhoucx 發(fā)表于 2016-7-14 14:23
買入平倉失敗的原因是前面的開空單尚未成交,因此平倉會失敗。但是不明白為什么止損條件未達到就發(fā)了止損單 ...
現(xiàn)有的日志可以確認是滿足了哪一個條件而進行的平倉動作。
可以在日志里再加上內(nèi)容,判斷當(dāng)時的條件分別是什么從而滿足了人工認為不應(yīng)該滿足的條件 。。
上述出現(xiàn)問題的是條件是If(Q_Last>protectprice),可以在日志里將q_last,protectprice的值都分別寫日志里再觀察 。。
在使用A函數(shù)交易中,在沒有經(jīng)過一段時間的實時交易測試確認策略能完全按自己的需求執(zhí)行前,建議在必要的地方(特別是開平倉時)都寫日志吧。這樣有助于及時排查問題,減少測試周期。 - 網(wǎng)友回復(fù):
小米 發(fā)表于 2016-7-14 15:19
現(xiàn)有的日志可以確認是滿足了哪一個條件而進行的平倉動作。
可以在日志里再加上內(nèi)容,判斷當(dāng)時的條件分別 ...
剛才加入了你說的這些,不過只進行了三次交易,沒有錯誤,明天再試試吧 - 網(wǎng)友回復(fù):
小米 發(fā)表于 2016-7-14 15:19
現(xiàn)有的日志可以確認是滿足了哪一個條件而進行的平倉動作。
可以在日志里再加上內(nèi)容,判斷當(dāng)時的條件分別 ...
問題解決了,謝謝小米
確實是開倉單未成交的原因,因為已經(jīng)發(fā)出了開空單,orderstate已經(jīng)變成-1,下一tick到來時由于A_SellAvgPrice=0,所以protectprice=4,觸發(fā)了平倉動作,造成多開一單
有思路,想編寫各種指標公式,程序化交易模型,選股公式,預(yù)警公式的朋友
可聯(lián)系技術(shù)人員 QQ: 511411198 進行 有償 編寫!(不貴!點擊查看價格!)
相關(guān)文章
-
沒有相關(guān)內(nèi)容