XS語法何處有錯?

  •   130 
  • 最後發表   XQYi  2023 十二月 05
XQYi 發文於   2023/11/30

 近期所提問題都是用在當沖下執行,若有錯誤使用函數請並告知

因為編譯都是正確的,但是執行結果同時有預期的也有不是預期,卻不知錯在何處,是目前最大的困擾!!

A腳本,

1.何處有誤,
如何避免金叉買進的股票未達獲利前就被死叉的賣出訊號賣掉、
如何避免死叉賣出的股票未達獲利前就被金叉的買進訊號買入?

2.當日有盤中交易紀錄,但回測時卻都沒有資料?

value1=getField("均價"); 

value2=(close+open)/2; 

value3=average(value2,5);

if position=0 and value3 cross over value1 then setposition(1,market);//1分K均價向上穿越

if position=1 and filled=1 and high > filledAvgPrice*1.01 then setposition(0);

 

if position=0 and filled=0 and value3 cross under value1 then  setposition(-1,market);

if position=-1 and filled=-1 and low > filledAvgPrice*0.99 then  setposition(0);

 

B腳本=>

3. 買進之後(labe:買1),卻在下一段程式中賣出(賣2) ,如何修正?

//先買後賣

if  position=0 and filled=0 and open > close[1] then setposition(1,market,label:="買1");//上漲先買

if filled=1 and (high >= filledAvgPrice*1.01 or high >= filledAvgPrice+500) then setposition (0,label:="賣1"); 

 

//前一日有庫存先賣再買

if position=1 and open < close[1] then  begin 

setposition(0 ,market,label:="賣2");//下跌先賣

if filled=1 and (low <= filledAvgPrice*0.99 or low <= filledAvgPrice-500)  then  setposition(1,label:="買2");

end

 else

begin

//無庫存先放空再回補

if position=0 and open < close[1] then  setposition(-1 ,market,label:="賣3");//下跌先賣

if filled=-1 and (low <= filledAvgPrice*0.99 or low <= filledAvgPrice-500)  then setposition(0,label:="買3");

end;

 

4. 另外若成交之後,7分鐘內沒平倉要強制平倉,該如何編寫?

附加文件

XQ小幫手 發文於   2023/12/05

Hello xqyi,

 

1.您的出場條件都有限制部位庫存符合條件 (ex. position=1 and filled=1) 才會執行,所以應該不會有多方的庫存被空方的條件出掉的狀況。

但空方停利的條件有誤,low > filledAvgPrice*0.99 並不是空方停利,應該是 low < filledAvgPrice*0.99 才對。

小幫手建議您使用 print 函數將相關數值印出會比較好理解。

 

2.小幫手不知道您回測的設定和策略的設定為何,但請注意回測沒辦法完全模擬實際運作情況,尤其是在逐筆洗價的狀況下。

回測最多只能洗到1分鐘OHLC,但即時的狀況下可以到每筆交易 (快市時除外)。

如果您希望兩者盡量相同,那麼請使用非逐筆洗價 (日頻率除外,因為自動交易會強制逐筆洗價)。

同樣,小幫手建議您使用 print 函數將相關數值印出檢查會比較好理解。

 

3.除非您策略持續執行沒有中斷,不然現在的XQ沒辦法判斷啟動時的未平倉庫存是在什麼時候入場。

對策略來說,所有的庫存都是相同的。

故 if position=1 and open < close[1] then  begin setposition(0 ,market,label:="賣2"); 只要符合就會出場。

最簡單的方法小幫手會建議,"前一日有庫存先賣" 這個條件另外寫一個策略並先執行,原本的策略則在另一個策略執行完後再運作 (庫存為0的狀況下啟動)。

 

4.您可以用 FilledRecordTime 來取得成交時間,並搭配 TimeDiff 來計算過了幾分鐘。

舉例來說:

if filled <> 0 and position <> 0 and timediff(currenttime, FilledRecordTime(FilledRecordCount), "M") >= 7 then setposition(0, market);

這樣只要最後一次成交的時間和當下本機的時間相差7分鐘以上,且目前持有庫存的話就會直接出場

 

小幫手建議您可以觀看 XS實戰7門課功能教學 裡面的7部影片,影片中有比較完整的教學。

另外也可以參考 三週學會程式交易:打造你的第一筆自動化交易 這本書。

發表回覆
Close