如何讓程式繼續執行?
執行頻率15分鐘,為何8:45與9:00 程式沒有執行

掛單至尾盤,程式停止
- 80
- 最後發表 34264331 2025 七月 07
-
- 為何8:45與9:00 程式沒有執行?
- A:這要看你程式怎麼寫,是不是程式裡面有控制接受訊號的時間控制。
- 如何讓程式繼續執行?
- A:沒有任何資訊得知你的程式是如何停止,哪有辦法提供讓程式繼續執行的建議?
input:
period(20),
multiplier(3.5),
profit_point(100, "停利(點)"),
loss_point(100, "停損(點)");
variable:
avrng(0),
AC(0),
hi_band(0),
lo_band(0),
filt(0),
fdir(0),
upward(0),
downward(0),
CondIni(0),
longCond(false),
shortCond(false),
longSignal(false),
shortSignal(false),
rng_filt1(0);
setTotalBar(10000);
// 利用EMA計算趨勢線
//訊號跳出
longCond = Close > filt and (Close > Close[1] or Close < Close[1]) and upward = 1;
shortCond = Close < filt and (Close < Close[1] or Close > Close[1]) and downward = 1;
// 趨勢方向切換記憶
if longCond then
CondIni = 1
else if shortCond then
CondIni = -1
else
CondIni = CondIni[1];
// 訊號觸發(從空轉多、或從多轉空)
longSignal = longCond and CondIni[1] = -1;
shortSignal = shortCond and CondIni[1] = 1;
//下單區
if longSignal[0]and filled <= 0 then
setposition(1, Market);
if shortSignal[0]and filled >= 0 then
setposition(-1, Market);
If filled <> filled[1] Then Begin
print("=== 倉位變化偵測 ===");
print("時間=", NumToStr(date,0),NumToStr(Time,0), "倉位=", NumToStr(filled,2), ", 平均成交價=", NumToStr(FilledAvgPrice, 2));
End;
//多單停利停損
if Position <> position[1] and position <> 0 then begin
if position > 0 then begin
{ 多單停利 }
print("時間=", NumToStr(date,0),NumToStr(Time,0), "多單停利價格= ",FilledAvgPrice + profit_point);
print("時間=", NumToStr(date,0),NumToStr(Time,0), "多單停損價格= ",FilledAvgPrice - loss_point);
SetPosition(0,FilledAvgPrice + profit_point,label:= "多單停利");
end;
end;
//空單停利
if Position <> position[1] and position <> 0 then begin
if position < 0 then begin
{ 空單停利 }
print("時間=", NumToStr(date,0),NumToStr(Time,0),"空單停利價格= ",FilledAvgPrice - profit_point);
print("時間=", NumToStr(date,0),NumToStr(Time,0),"空單停損價格= ",FilledAvgPrice + loss_point);
SetPosition(0,FilledAvgPrice - profit_point,label:= "空單停利");
end;
end;
if position <> 0 and low <= FilledAvgPrice - loss_point then begin
{ 多單停損 }
SetPosition(0,market,label:= "多單停損");
end;
if filled < 0 and high >= FilledAvgPrice + loss_point then begin
{ 空單停損 }
SetPosition(0,market,label:= "空單停損");
end;
自動交易 執行頻率15分鐘,無逐筆無自動洗價,與庫存同步,交易安控已停用。昨晚開一整晚,因於尾盤跳出訊號於5:00:10分下單,程式停止(因API過久無回應),今早上手於6:59分重新啟動,程式內也無接受訊號的時間控制。照我的理解,頻率每15分鐘一次,是每15分K結束時程式碼運行一次,上午期貨開盤時程式沒有運行(不知是否有任何辦法?),8:54我手動平倉,他程式停止,原因與庫存同步,同一秒 重啟,直到11:45訊號反轉才下空單(還是要用庫存由腳本預算,是否就會於開盤時下多單?),因為我的策略是多轉空時反手做空,反之則反手做多。然後我的策略是預掛止盈單,尾盤時他顯示:因手動刪除委託,所以程式停止,是否不支援此種下單方式?
PS: XS系統回測(庫存由腳本運算)時並無異常。
(1)分鐘頻率,非逐筆洗價,洗價真實發生時間點會是下一根K棒的第一個Tick。在還沒收K之前,任何一個Tick進來,我們都不會知道它是否就是收K的最後一個Tick,要確定收K,一定是下一根K的第一個Tick進來才知道。第一盤早上5點收盤,照理說最後一個Tick會發生在5點之前,但有時候會出現在5點,而5點是15分K另外一根新的K棒,所以有可能5點洗價且送單,但用於已過交易時段,所以委託無效,會被刪單。若5點收盤,亦即4點45分這根K棒收盤時符合觸發條件,早上8點45分是不會觸發的。若要早上8點45分開盤觸發訊號,洗價模式要改成逐筆洗價,且用變數控制每根K棒的第一個Tick判斷前一根收盤是否有觸發訊號。
(2)手動交易的委託,策略不會知道。你若預掛限價停利單,沒成交之前就刪單,策略會一直認定position為0而產生錯亂。若要刪單,也應該是策略自行處理,而非用人工方式。
謝謝教授,
針對第一點,這個策略不適合使用逐筆洗價
第二點,是否改為由腳本運算模式就會受到手動操作的影響?
以及(然後我的策略是確認有部位直接掛止盈單,尾盤時自動交易中心顯示錯誤:原因/手動刪除委託,所以程式停止,是否不支援此種下單方式?)當時我並沒有進行任何動作。是否不支援這種停利的下單方式。
最後請問是否能讓腳本依舊按照15分鐘頻率進行,但對時間進行切割,並能夠在開盤時將前面收盤的數據納入計算? 例:讓腳本在8:46分執行,並在之後每15分鐘進行一次,同時於8:46分時獲取4:46~5:00+8:45~8:46的資料
if longSignal and filled <= 0 then begin
if not (Time = 44500 or Time = 133000) then begin
SetPosition(1, Market, label:="多頭趨勢");
print("時間=", NumToStr(date,0), NumToStr(Time,0), " 多頭進場");
end else begin
print("時間=", NumToStr(date,0), NumToStr(Time,0), " 開盤或尾盤,跳過多單下單");
end;
end;
避免尾盤下單導致程式終止
(1)非逐筆洗價都可以透過逐筆洗價結合變數控制達到相同效果。
(2)手動操作會影響策略運作,並可能造成程式停止。你應該改由程式判斷有部位立即掛止盈單,不要人工操作。
(3)既然程式是非逐筆洗價,就不可能在084600執行。開盤前,可以透過變數計算過去特定期間的數據。
(4)若你希望早上5點收盤出現訊號且8點45分開盤送單,洗價模式應該改成逐筆洗價,且結合變數控制在每根K第一個Tick執行程式。
了解 謝謝教授
針對第二點,當我的程式檢測到有部位時立即掛出止盈單,但若於尾盤結束時,若一直未達止盈點,將導致程式出現自動交易錯誤 而關閉,這是我現在遇到的狀況。
若止盈單是程式送出,就沒問題。
Hello 34264331,
關於策略在尾盤下單導致錯誤的部分,如果可以的話麻煩提供 XQ Log 並告知問題發生的日期時間讓相關人員確認看是否有異常的情況發生。
您可以透過XQ內的設定 => 問題回報方式來上傳提供,並附上討論區問題連結。
感謝。
9 評論