不會自動平倉

  •   272 
  • 最後發表   Alex嘉  2023 四月 28
Alex嘉 發文於   2023/04/17

想請問一下  為什麼這樣寫,不會每天再1325分就平倉呢? 然後 我要週三 固定1310平倉

另外再請教一個問題,回測時洗價觸發這件事情,若我要設定自動下單時 是關閉的,

用網頁的說法是,第一根判斷後第二根進場, 但若我沒有特別寫,是不是就是當下判斷就進場呢?

if Position <> 1 and long_condition then begin
    { 如果符合做多情境(long_condition), 則把部位變成1 (可能是0->1 or -1->1) }
    SetPosition(1);

end else if Position <> -1 and short_condition then begin
    { 如果符合做空情境(short_condition), 則把部位變成-1 (可能是0->-1 or 1->1) }
    SetPosition(-1);

end else if Position = 1 and exit_long_condition then begin
    { 如果已經做多, 且發生多方出場情形時(exit_long_condition), 則把部位變成0 }
    SetPosition(0);
end else if Position = -1 and exit_short_condition then begin
    { 如果已經做空, 且發生空方出場情形時(exit_short_condition), 則把部位變成0 }
    SetPosition(0);

end else if Position <>0 and DayOfWeek(Date) = 3 and time=131000 then begin 
   setposition(0);
   {如果庫存數 不等於0 而且 是禮拜三,時間到1310分時,就出場。}
end else if position <>0 and time=132500 then begin 
    setposition(0);
    {如果庫存數 不等於0 而且 時間到1325分時,就出場。}
end;

排序方式: 標準 | 最新
XQ小幫手 發文於   2023/04/19

Hello Alex嘉,

 

如果您是用1分鐘頻率的話,XQ的時間是K棒開始的時間,所以132500實際上是132500~132600這段時間的資料,若交易股票的話這段時間不會有交易。

沒有交易的K棒系統不會下單交易。

您可以將其改為 132400,這樣回測就會在下根有交易的K棒,也就是132900出場。

 

不論您有沒有開啟逐筆洗價,腳本都是在運算後才決定是否要下單,所以下單是否會成交的判斷和運算時的觸發價是無關的,而是用接下來的價格來判斷。

如果要用觸發的價格下單,那請勾選 觸發即判斷成交 選項。

Alex嘉 發文於   2023/04/19

不好意思 

因為我會這樣詢問的原因是

我在回測時 有開 觸發及判斷成交 的功能和沒開這個功能 績效差很多,不是很懂 為什麼?

可以麻煩小幫手在白話一點說明嗎?還是告知怎樣 將語法設定成  在自動交易下 觸法時判斷成交功能是關閉的呢

 

另外為什麼設定成132400會是在1329出場呢?因為我設定後小台無法在1329出場。和週三1315前出場。

若照您說的 我週三的時間要改為 131300對嗎?

原本是=132500 改為 >=132400 就會 1330前完全平倉嗎?

XQ小幫手 發文於   2023/04/20

Hello Alex嘉,

 

關於 觸發即判斷成交 您可以參考網站說明。

這是在回測中的設定,和語法沒有關係,或著說語法沒辦法控制。

 

另外為什麼設定成132400會是在1329出場呢?

=> 小幫手以為您是在交易股票,所以132400腳本運算後下單,因13:25~13:30只有13:30時會有一筆成交,故會成交在132900這根Bar上。

 

如果是期貨的話,按照您的寫法,只要132500有成交量的話,腳本就會在 132500 這根Bar上運算後下單,所以會成交在 132600 這根Bar上。(參考附圖)

需注意若腳本中同時有複數個交易指令觸發的話,那麼只會執行第一個運算的交易指令。

 

附加文件

Alex嘉 發文於   2023/04/20

想請問一下  如果用以下語法的話

end else if Position <>0 and DayOfWeek(Date) = 3 and time>=131000 then begin 
17   setposition(0);
18   {如果庫存數 不等於0 而且 是禮拜三,時間到1310分時,就出場。}
19end else if position <>0 and time>=132500 then begin 
20    setposition(0);
21    {如果庫存數 不等於0 而且 時間到1325分以後若有庫存都直接平倉,並且不再進場。}

 

若今日在執行時, 會先判斷第一個 end if  是不是禮拜三,若是 會去偵測時間是不是在1310,若是就直接平倉出場,並到1345之前都不再進場。

若不是禮拜三就會跳下一個 end if  判斷時間是不是 超過1325,若是就直接平倉出場,並到1345之前都不再進場。
是這樣嗎?

因為我用以上的語法回測,發現好像會在 1310或1325當下出場,但還是會再進場。

 

 

XQ小幫手 發文於   2023/04/21

Hello Alex嘉,

 

您附上的腳本不知道是怎麼輸入的導致出現HTML語法很難看清楚。

不過就發文描述應該是

end else if Position <>0 and DayOfWeek(Date) = 3 and time=131000 then begin 

   setposition(0);

   {如果庫存數 不等於0 而且 是禮拜三,時間到1310分時,就出場。}

end else if position <>0 and time=132500 then begin 

    setposition(0);

    {如果庫存數 不等於0 而且 時間到1325分時,就出場。}

end;

這一段。

 

這段腳本會先判斷星期三和時間為1310分符合的話出場,接下來判斷時間為1325分出場。

但並沒有寫到1325分以後不要再進場。

 

您的進場條件中也沒有寫到1325以後不要再進場。 (至少就上面的腳本看來是這樣 if Position <> 1 and long_condition ...)

所以出場後只要 long_condition 或 short_condition 符合的話,還是會再度進場。

Alex嘉 發文於   2023/04/21

請問一下   要怎樣寫才會讓周三 1310後不再進場,或是1325之後不要再進場呢?

是要將 time= 改為 time >=嗎?還是 要改前面的進場判斷式 如下 這樣嗎?

if Position <> 1 and long_condition and time <= 131500 then begin

 

但我要寫入兩個條件  一個是周三 1310出場,其他星期是1325出場。 要怎修改呢?

Alex嘉 發文於   2023/04/22

謝謝小幫手的提點,我有想出來了。也回測出來了,分享給各位,再請小幫手看一下有沒有什麼有問題的,還是有風險建議的。4

condition1 = time <= 133500 and time >=084500;  //時間小於1335,大於0845 判斷true
condition2 = time >= 133500 ;   //時間大於1335 判斷true
condition3 = dayOfWeek(date)=3 and time>= 130000;  //星期三 和 時間>= 1300 判斷true

if Position <> 1 and long_condition and condition1  then begin
    { 如果符合做多情境(long_condition), 則把部位變成1 (可能是0->1 or -1->1) }
    SetPosition(1,value1);

end else if Position <> -1 and short_condition and condition1 then begin
    { 如果符合做空情境(short_condition), 則把部位變成-1 (可能是0->-1 or 1->1) }
    SetPosition(-1,Value1);

end else if Position = 1 and exit_long_condition or condition2 or condition3 then begin
    { 如果已經做多, 且發生多方出場情形時(exit_long_condition), 則把部位變成0 }
    SetPosition(0);
end else if Position = -1 and exit_short_condition or condition2 or condition3 then begin
    { 如果已經做空, 且發生空方出場情形時(exit_short_condition), 則把部位變成0 }
    SetPosition(0);

end;

XQ小幫手 發文於   2023/04/25

Hello Alex嘉,

 

您的 condition1 這樣寫還是會碰到如果是星期3提早出場的話還是會進場。

另外在 133500 這個時間點 condition1 和 condition2 都會符合。

小幫手會修改為:

condition1 = (dayOfWeek(date)=3 and time < 130000) or (dayOfWeek(date) <> 3 and time < 133500 and time >=084500);

這樣就可以避免時間重疊和星期三提早出場的話還是會進場的問題。

Alex嘉 發文於   2023/04/25

這樣的寫法就等於 把我的1+2+3都寫完了.. 所以可以同時套用在 進場與出場對吧,而且是是用 and 串接,對吧

但我回測 還是會留倉,而不會強制在1335前平倉掉。

condition1 = (dayOfWeek(date)=3 and time < 130000) or (dayOfWeek(date) <> 3 and time < 133500 and time >=084500); 


if Position <> 1 and filled <>1 and long_condition and condition1  then begin
    { 如果符合做多情境(long_condition), 則把部位變成1 (可能是0->1 or -1->1) }
    SetPosition(1,value1);

end else if Position <> -1 and filled <>-1 and short_condition and condition1 then begin
    { 如果符合做空情境(short_condition), 則把部位變成-1 (可能是0->-1 or 1->1) }
    SetPosition(-1,Value1);

end else if Position = 1 and filled =1 and exit_long_condition and condition1 then begin
    { 如果已經做多, 且發生多方出場情形時(exit_long_condition), 則把部位變成0 }
    SetPosition(0);
end else if Position = -1 and filled =-1 and exit_short_condition and condition1 then begin
    { 如果已經做空, 且發生空方出場情形時(exit_short_condition), 則把部位變成0 }
    SetPosition(0);

end;

Alex嘉 發文於   2023/04/25

但是我將 條件設定上去後,變成不會 進場。 補充一下 這是單獨夜盤的語法

condition2 =  time < 044000 and  time >=145000; 


if Position <> 1 and filled <>1 and  long_condition and condition2  then begin
    { 如果符合做多情境(long_condition), 則把部位變成1 (可能是0->1 or -1->1) }
    SetPosition(1,value1);

end else if Position <> -1 and filled <>-1  and  short_condition and condition2 then begin
    { 如果符合做空情境(short_condition), 則把部位變成-1 (可能是0->-1 or 1->1) }
    SetPosition(-1,Value1);

end else if Position = 1 and filled = 1  and exit_long_condition and condition2  then begin
    { 如果已經做多, 且發生多方出場情形時(exit_long_condition), 則把部位變成0 }
    SetPosition(0,market);
end else if Position = -1 and filled = -1  and exit_short_condition and condition2  then begin
    { 如果已經做空, 且發生空方出場情形時(exit_short_condition), 則把部位變成0 } 
    SetPosition(0,market);


end;

顯示更多回應 發表回覆
Close