夜盤換日停損問題

  •   29 
  • 最後發表   桂桂  2 週前
桂桂 發文於   2026/01/13

教授小編您好

我在台指日盤下面寫法可以停損然後隔日再進場

但如果在夜盤不知道是不卡換日問題,不管怎麼修改停損後都會立即進場

我需要的是跟日盤一樣,在夜盤過程中如果停損就停止進場隔天夜盤開啟再進場

能不能給我個範本或建議去調整    

 

var: intrabarpersist grid_started(false);       

var: intrabarpersist grid_base(0);             

var: intrabarpersist grid_current_base(0);     

var: intrabarpersist grid_current_ord(0);       

 

var: intrabarpersist allow_grid_today(false);       

var: intrabarpersist stoploss_date(0);       // ★ 記錄停損發生日   

 

{========================       

  初始化(只跑一次)       

========================}       

if not grid_started and GetInfo("TradeMode") = 1 then begin       

    grid_started = true;       

 

    if Position > 0 then       

        grid_base = FilledAvgPrice       

    else       

        grid_base = Close;              

 

    grid_current_base = grid_base;       

    grid_current_ord  = 0;       

    allow_grid_today  = true;       

    stoploss_date     = 0;   

end;       

 

{========================       

  每個交易日都重新判斷是否允許進場   

========================}       

if Date <> stoploss_date then begin   

    if Position <= 0     

    then allow_grid_today = true   

    else allow_grid_today = false;   

end 

else begin   

    allow_grid_today = false;   

end;   

 

{========================       

  停損(只影響當天) ← ★ 用平均成本停損       

========================}       

if Position > 0 and Close <= FilledAvgPrice - stoploss_point then begin       

    SetPosition(0, Market, label:="停損");       

    stoploss_date = Date;   

end;       

       

if time < timein then begin       

 

    if Position = 0 and allow_grid_today then begin       

        SetPosition(1, Market, label:="空手進場");       

 

        grid_base         = Close;       

        grid_current_base = Close;       

        grid_current_ord  = 0;       

    end;      

排序方式: 標準 | 最新
虎科大許教授 發文於   2026/01/14

(1)我不清楚你的TimeIn是什麼,程式裡面沒看到宣告,猜測是代表最後進場時間的參數。

(2)問題應該出在0-5點之間的Time小於進場時間,所以會再次進場。要解決問題,就要從當0-5點期間控制。你可以將

if time < timein then begin

改成

if time>050000 and time < timein then begin

這樣就可以在最後進場時間在凌晨0點之前的情況下,0-5點不會再進場。當然,若你設定0-5點之間的某個時間為最後進場時間,這樣寫,會造成凌晨0點到最後進場時間之間無法進場。為了解決這種跨日時間處理的問題,我寫了一個DateTimeDiff函數(需要綁定我的優惠碼才可使用),使用這個函數就可輕鬆解決你的問題。

桂桂 發文於   2026/01/14

教授您好!  下面是我夜盤的程式碼,這樣請教您! 1分K

我目前設定這樣在條件買賣情況下都能正常!

問題出在如果出現停損,不管是在當日停損或是換日後的停損,他都會直接在進場!

我的需求是不管哪個時段停損都不再進場,直到下一次夜盤開啟!

想說換日題也有嘗試過用記錄K棒方式,進場當下記憶那隻K棒,然後下次庫存0要進場,至少要經過幾百隻K棒這樣(大於我進場時間)

讓她免除換日奇怪問題! 麻煩您幫我看一下指點一下

 

桂桂 發文於   2026/01/14

這是夜盤的程式碼

input: grid_gap(100, "每格點數");                   

input: stoploss_point(500, "停損(點)");           

input: timein1(150000, "進場時間1");

input: timein2(042400, "進場時間2");          

input: timeout(04250, "出場時間1");      

input: timeout1(043000, "出場時間2");      

       

var: intrabarpersist grid_started(false);           

var: intrabarpersist grid_base(0);                 

var: intrabarpersist grid_current_base(0);         

var: intrabarpersist grid_current_ord(0);           

var: intrabarpersist allow_grid_today(false);           

var: intrabarpersist stoploss_date(0);       

       

{========================           

  初始化(只跑一次)           

========================}           

if not grid_started and GetInfo("TradeMode") = 1 then begin           

    grid_started = true;           

       

    if Position > 0 then           

        grid_base = FilledAvgPrice           

    else           

        grid_base = Close;                  

       

    grid_current_base = grid_base;           

    grid_current_ord  = 0;           

    allow_grid_today  = true;           

    stoploss_date     = 0;       

end;           

 

{========================           

  每個交易日都重新判斷是否允許進場       

========================}           

if Date <> stoploss_date then begin       

    if Position <= 0 then       

        allow_grid_today = true       

    else       

        allow_grid_today = false;       

end       

else begin       

    allow_grid_today = false;       

end;       

 

{========================           

  停損(只影響當天) ← ★ 用 FilledAvgPrice     

========================}           

if Position > 0 and Close <= FilledAvgPrice - stoploss_point then begin           

    SetPosition(0, Market, label:="停損");           

    stoploss_date = Date;       

end;       

 

{========================           

  空手第一次進場(只受停損當天限制)           

========================}           

if time > timein and time <035400 then begin           

    if Position = 0 and allow_grid_today then begin           

        SetPosition(1, Market, label:="進場");           

        grid_base         = Close;           

        grid_current_base = Close;           

        grid_current_ord  = 0;           

    end;           

    

       

{========================           

  時間出場(不影響隔日)       

========================}           

if Position > 0 and filled > 0 and time < timeout1 and time > timeout then       

 

    SetPosition(0, Market, label:="時間出場"); 

桂桂 發文於   2026/01/14

教授您好! 想說先確認一下是否是邏輯問題! 然後DateTimeDiff函數! 綁定您推薦瑪後會有教學使用嗎?

虎科大許教授 發文於   2026/01/14

你的程式邏輯是有問題的。

if time > timein1 and time <035400

會讓timein1在凌晨0點之前永遠不會進場,因為一個Time數值要大於150000,又要小於035400,這是不可能為True的。

有關DateTimeDiff函數,在我的FB粉專貼文(精選)裡面可下載,你可以追蹤我的粉專:

https://reurl.cc/zK58LV

 

  • 按讚來自於
  • ddh090101
桂桂 發文於   2026/01/15

謝謝教授! 不過我沒用到~ 有找到問題! 是在編排順序上的錯誤! 更改順序就解決了! 有追蹤您粉專了! 謝謝

發表回覆
Close