平倉後反向做會額外交易

  •   271 
  • 最後發表   瓜瓜  2023 三月 10
瓜瓜 發文於   2023/03/01

我是把多空都寫在同一個自動交易策略裡面,

做多後如果符合做空,會把多單平倉後再反向做空

反之做空相反,

但偶爾會有反向後,額外觸發到停損的條件,導致額外交易的狀況,

可以幫我看一下是哪裡的語法有問題導致這個狀況?

 

if Position < 1  and conditionB and not conditionT 
then begin SetPosition ( 1, MARKET); end else
if Position > -1 and conditionS and not conditionT 
then begin SetPosition (-1, MARKET); end;

if Position = 1  then begin if close <= FilledAvgPrice - losspoint 
then begin SetPosition(0, market); end; end else
if position = -1 then begin if Close >= FilledAvgPrice + losspoint 
then begin SetPosition(0, market); end; end;

 

 如果 losspoint 不要讓他是個變數,我直接輸入一個固定的點數可以嗎? 

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

 Hello 瓜瓜,

 

position變化並不代表filled也會馬上跟著變化。

在腳本觸發進出場條件並運行完此次運算時,position會變化,但filled要變化是在收到成交回報以後。

若在收到成交回報以前腳本因為洗價而運算的話,此時filledavgprice會是0,導致 Close >= FilledAvgPrice + losspoint 一定符合。

建議您改用 filled 來做停損停利的判斷。

關於position和filled的說明您可以參考此篇文章

 

losspoint 您當然可以改成一個常數,或是改用input方便修改所需點數。

內建的交易腳本中有停損停利的範例可以參考。

  • 按讚來自於
  • chuhaihuei
瓜瓜 發文於   2023/03/07

Dear 小幫手

由於我是做台指期,所以會有非當盤交易留下的庫存,

我以為的filled是指當盤成交的數值,這樣子庫存單在抓取filled上,是否能夠判斷呢?

因為有可能日盤的庫存單留到夜盤才作停損,這樣子跨盤的狀況下是否能夠抓取filled?

 

瓜瓜 發文於   2023/03/07

Dear 小幫手,

如果加上 filled 的話,如以下這樣子寫是OK的嗎??

 

var : conditionB(false); //做多條件
var : conditionS(false); //做空條件
var : conditionT(false); //是否已經進入收盤階段
var : addconditionB(false);  //多單加碼
var : addconditionS(false);  //空單加碼

conditionB = ;  //做多條件
conditionS = ;  //做空條件
addconditionB = ;  //多單加碼條件
addconditionS = ;  //空單加碼條件
conditionT = EnterMarketCloseTime(Period3);  //是否已經進入收盤階段

if Position<1  and conditionB and not conditionT then begin SetPosition( 1,label:="做多"); end else
if Position>-1 and conditionS and not conditionT then begin SetPosition(-1,label:="做空"); end;

if Position=1  and filled = 1  and addconditionB and not conditionT then begin SetPosition( 2,label:="做多加碼"); end else
if Position=-1 and filled = -1 and addconditionS and not conditionT then begin SetPosition(-2,label:="做空加碼"); end;

if Position = 1  and filled = 1  and Close <= (FilledAvgPrice-100) then begin SetPosition(0,label:="做多停損"); end else
if position = -1 and filled = -1 and Close >= (FilledAvgPrice+100) then begin SetPosition(0,label:="做空停損"); end;

iker 發文於   2023/03/08

這樣寫有點風險

除非 conditionB 有包含 filled <> 1 條件,第13、16、19行每次其實都會跑到,而且第13行 Position < 1 的條件會先跑到,有可能導致第16行和第19行 Position = 1 and filled = 1 沒機會被觸發。做空條件也有同樣問題。


建議用大範圍條件包起來處理:

var : conditionB(false),       //做多條件
      conditionS(false),       //做空條件
      conditionT(false),       //是否已經進入收盤階段
      addconditionB(false),  //多單加碼
      addconditionS(false);  //空單加碼

//是否已經進入收盤階段
conditionT = EnterMarketCloseTime(Period3);  

// 停損區先寫,避免邏輯上先跑去進場區,導致觸發不到停損區
// 多寫一個 FilledAvgPrice <> 0 做個防呆
// 原本條件上少了 > 和 <,如果真的觸發加碼,反而你會無法觸發停損
if FilledAvgPrice <> 0 then begin
    if Position >= 1 and Filled >= 1 and Close <= (FilledAvgPrice-100) 
    then SetPosition(0,label:="做多停損"); 
    if Position <= -1 and Filled <= -1 and Close >= (FilledAvgPrice+100) 
    then SetPosition(0,label:="做空停損"); 
end;

// 不在收盤階段才去判斷這些進場參數
if not conditionT 
then begin
    conditionB = xxx;  //做多條件
    conditionS = xxx;  //做空條件
    addconditionB = xxx;  //多單加碼條件
    addconditionS = xxx;  //空單加碼條件
    // 進場區加碼先寫,理由與停損區先寫一樣,雖然這次 Position 和 Filled 有寫清楚比較沒差
    if Position = 1 and Filled = 1 and addconditionB then SetPosition( 2,label:="做多加碼");
    if Position = -1 and Filled = -1 and addconditionS then SetPosition( -2,label:="做空加碼"); 

    if Position = 0 and Filled = 0 and conditionB then SetPosition( 1,label:="做多");
    if Position = 0 and Filled = 0 and conditionS then SetPosition( -1,label:="做空");
end;

try try see

  • 按讚來自於
  • chuhaihuei
瓜瓜 發文於   2023/03/08

謝謝iker的幫忙,我再來測試看看,感謝您❤️

XQ小幫手 發文於   2023/03/10

 Hello 瓜瓜,

 

如果您的策略有持續執行,那麼部位和庫存就會一直維持在日盤的狀況。

若有將策略中斷的話,則會視策略的設定來決定部位庫存。

細節可以參考自動交易策略參數總覽的說明。

 

關於在腳本內使用position和filled作判斷的部分,您可以參考文章說明

另外需注意的是,交易指令(ex. setposition)只會執行第一個運作到的。

所以若同時執行多個setposition的話,只有最前面的那個會實際運作。

可以利用這個特性,將比較想優先執行的交易放在腳本前方。

 

感謝 iker 的熱心回覆。

  • 按讚來自於
  • chuhaihuei
發表回覆
Close