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