停利的錯誤

  •   208 
  • 最後發表   無情卻慈悲  2022 三月 07
無情卻慈悲 發文於   2022/03/04

想請小幫手幫我看一下出場的語法 :

我下列腳本是寫個股賺2%時自動出場,但我盤中一直看,已經賺了2%以上仍不會自動執行,不知哪裡有誤?感謝

 問題1:

//報酬率_ plratio

variable:plratio(0);

//FilledAvgPrice是「商品目前的未平倉成本」

if FilledAvgPrice <> 0 then

 plratio = absValue( 100 * (Close - FilledAvgPrice) / FilledAvgPrice )//正負幾%

else

 plratio = 0;

 

//++多單停利(股票):股票(報酬率)

input:_win(1,"股票幾%停利");

if position > 0   and SymbolType = 2  //(2為股票、3為期貨)

and Close - FilledAvgPrice > 0

and plratio > _win 

then begin

SetPosition(0, MARKET,label:="多單停利:股票");

Print(Date,Time,"多單停利(股票)+",Close - FilledAvgPrice ,"+",plratio,"%");

end;

 

 

//++空單停利(股票):股票(報酬率)

if position < 0   and SymbolType = 2  //(2為股票、3為期貨)

and FilledAvgPrice - Close  > 0

and plratio > _win 

then begin

SetPosition(0, MARKET,label:="空單停利:股票");

Print(Date,Time,"空單停利(股票):",FilledAvgPrice - close  ,"+",plratio,"%");

end;

 像今日的華晶科,3/4 11:45時符合1%停利標準,但我看已經11:50分了,理應執行卻沒執行但卻有print出來。

 

下圖的智原也是,1%到了也沒出場。

我發現有的個股會執行停利出場,但有的不會,好奇怪。

問題2:

假設在自動交易中的介面設定中有設定安控交易,例如同一商品最多擁有部位1張,如一檔股票目前已有多單1張,當再次偵到到可以做多的訊號時,此時安控會控制不讓再下單,但是此時「FilledAvgPrice」會以第1張為主,還是已經變成第2次有做多訊號時但卻被安控阻下單但FilledAvgPrice已被重新給新的值了呢?

 

 問題3:

我昨晚的夜盤也是一樣,有達停利的標準,但是沒有執行停利,可否也請幫我看一下下面的語法是否有誤?

//(夜盤)

input:_point_night(80,"夜盤賺幾點要停利");

if position > 0   and SymbolType = 3  //(2為股票、3為期貨)

and (

(currenttime >= 210001 and currenttime <= 235900)

or 

(currenttime >= 000000 and currenttime < 0500000)

)

and Close - FilledAvgPrice > 0

and Close - FilledAvgPrice  >= _point_night

then begin

SetPosition(0, MARKET,label:="多單停利:點數停利");

Print(Date,Time,"多單停利:點數停利:夜+ ",Close - FilledAvgPrice,"點");

end;

 

 附上LOG檔與策略

https://drive.google.com/drive/folders/16gCg6hMB7j00mcI2R8R8TStBrlfIm2g?usp=sharing

 

 

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

Hello 無情卻慈悲,

 

1.您可以參考 SetPosition 裡的說明。

在有複數個SetPosition同時執行時,只會執行最先執行的那一個。

小幫手推測應該是因為您進場條件同時符合,所以導致自動交易都會執行進場的SetPosition,但因為您的部位沒有調整,所以是無效的交易指令。

建議您可以多加一個 position = 0 and filled = 0 來對進場作判斷。

同樣的出場部分就是 position > 0 and filled > 0 (多方)或是 position < 0 and filled < 0 (空方)。

 

另外需注意,像這種寫法 if _stop > 0 and _stop <= 7 then condition53 = true ;

只要有一次成立,condition53就會一直是True。

如小幫手之前所說,如果您希望條件符合是為True,不符合時為False的話應該這樣寫:

if _stop > 0 and _stop <= 7 then condition53 = true else condition53 = false;

或是

condition53 = _stop > 0 and _stop <= 7;

您可以實際print出來確認。

 

2.FilledAvgPrice 是您的庫存成本,沒有下單成交庫存就不會變化,成本自然也不會改動。

 

3.如同上面所述,只要進場的SetPosition卡著,您出場的SetPosition就不會執行。

無情卻慈悲 發文於   2022/03/04

你好,

我先針對問題1再補充一下,

假如我的做空單條件是 :

  • if KD > 80 or KD <20 then 空單進場
  • if  已賺50點 then 空單停利

但若符合 已達停利點但同時 KD<20,

我上面的情形有點類似這樣,

我一開始沒有幫進場訊號加position的原因,是假如我多空腳本如下 :

  • if KD < 80 or KD >20 then 多單進場
  • if  position > 0 and 已賺50點 then 多單停利
  • if KD > 80 or KD <20 then 空單進場
  • if  position < 0 and 已賺50點 then 空單停利

假如手上目前目前是空單,但遇上KD > 20要立即平倉且立即轉多單SetPosition(1, MARKET) ,所以我就沒有幫進場訊號加position, 可是如幫進場訊號加position, 還能立即平倉並反手同時進場嗎?

感謝小幫手。

 

 

 

XQ小幫手 發文於   2022/03/07

Hello 無情卻慈悲,

 

您一樣可以使用position來判斷,舉例來說:

if position <= 0 and filled <= 0 then 多單進場;

if position < 0 and filled < 0 then 空單停利;

這樣的話當部位<0時系統只要達成條件就會多單進場或空單停利。

if position >= 0 and filled >= 0 then 空單進場;

if position > 0 and filled > 0 then 多單停利;

部位>0時就會觸發空單進場或多單停利。

 

 

發表回覆
Close