請問取得進場成本後 設定停利與停損價?

  •   54 
  • 最後發表   ENGLISH4U  2 週前
ENGLISH4U 發文於   2021/06/09

小編 不好意思

想要請問,我以此篇文章當範例 移動停利語法

取得成本價後 設定50點停利 停損(台指)

等待下次進場機會

但是回測後發現出場點跟我設定不一樣

例如下圖 並沒有幫我做停利停損

無論使用連結內的寫法 或是使用filledavgprice 都是一樣的結果

請問

1.是哪邊寫錯了呢??

2.有沒辦法以20MA進場,跌破5MA做移動停利呢??

3. 另外有沒有辦法進場以後是K棒收盤才進場,但是出場是打到停利停損價就出場呢? (分鐘K)

語法如下 ######### 主要從 37行開始 ######### 

感謝小編

input: Length(9, "計算期數"), RSVt(3, "RSVt權數"), Kt(3, "Kt權數");
variable: _rsv(0), _k(0), _d(0), DI(0), nDI(0), ADX_value(0), DealPrice(0), _MarketPosition(0),period(10);

///// MA /////
value1 = EMA(close,144);
value2 = EMA(close,5);

///// KD /////
SetTotalBar(maxlist(Length,6) * 3 + 8);
Stochastic(Length, RSVt, Kt, _rsv, _k, _d);

///// MACD /////
input: FastLength(12), SlowLength(26), MACDLength(9);
SetInputName(1, "DIF短期期數");
SetInputName(2, "DIF長期期數");
SetInputName(3, "MACD天數");
variable: difValue(0), macdValue(0), oscValue(0), Forecast_DealPrice(0), profit(0), loss(0);
MACD(weightedclose(), FastLength, SlowLength, MACDLength, difValue, macdValue, oscValue);

///// SAR /////
input:AFIncrement(0.02,"加速因子");
input:AFMax(0.2,"加速因子最大值");

variable: sarValue(0);
sarValue = SAR(AFIncrement, AFIncrement, AFMax); 
/////////////////////////////////////////////////////////////////////

var: long_condition(false);         { Long Condition }
var: stop_long_profit(false);
var: stop_long_loss(false);

var: short_condition(false);        { Short Condition }
var: stop_short_profit(false);
var: stop_short_loss(false);


long_condition = close > value1 and oscValue > 0 and close > sarValue; 
short_condition = close < value1 and oscValue < 0 and close < sarValue;

///// 取得成本價 /////
once long_condition or short_condition begin
        Forecast_DealPrice = close;
//      profit = Forecast_DealPrice + 50;
//      loss = Forecast_DealPrice - 50;
    end;

///// 停損停利條件 /////
stop_long_profit = close > Forecast_DealPrice + 50;
stop_short_profit = close < Forecast_DealPrice - 50 ;
stop_long_loss = close < Forecast_DealPrice - 50;
stop_short_loss = close > Forecast_DealPrice + 50;


///// Long /////
if long_condition then begin
    setposition(1, market);
    print(Forecast_DealPrice, date, time, position, close, value1, DI, nDI);
    end;
if  position = 1 and filled = 1 then begin
    if stop_long_profit or stop_long_loss then setposition(0, market);
    print(Forecast_DealPrice, date, time, position, close, value1, DI, nDI);
    end;

///// Short /////
if short_condition then begin
    setposition(-1, market);
    print(Forecast_DealPrice, date, time, position, close, value1, DI, nDI);
    end;
if  position = -1 and filled = -1 then begin
    if stop_short_profit or stop_short_loss then setposition(0, market);
    print(Forecast_DealPrice, date, time, position, close, value1, DI, nDI);
    end;

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

 Hello ENGLISH4U,

 

1. 您的腳本用 once 來設定進場價格,所以只有第一筆交易成本會記錄,接下來 once 區間就不會再運作。

附件為小幫手修改過的交易腳本供您參考。

 

2. 小幫手不懂您的意思,需要您更詳細的說明想要的內容。

 

3. 回測是以您觸發條件以後進出場,所以並不一定會是在收盤價出場,也不會是剛好在您設的停損點出場。

舉例而言,假設您用1分鐘逐筆洗價的話,1分 bar 會被拆開成OHLC四個價格。

如果當根 bar 是 O-> H-> L-> C 排列,您在 L 時觸發停損機制的話,那麼就會在 C出場。

附加文件

ENGLISH4U 發文於   2021/06/10

Hi 小幫手

感謝您的幫忙

不過我使用您給的檔案 回測,可以看到#1053這筆2021/6/7號這天,空單並沒有停利耶,

50點應該怎麼樣都停利了吧@@? 但是拉了很多根紅K以後才做出場

感覺這個條件是我設定的做空條件消失才出場的

2. 小幫手不懂您的意思,需要您更詳細的說明想要的內容。

就是我例如我希望20MA  搭配其他條件進場

漲了一段以後只要跌破5MA就出場,

但是這樣搞不好還是進場的條件成立,會不會下一根K棒又幫我進場呢?

 

3. 回測是以您觸發條件以後進出場,所以並不一定會是在收盤價出場,也不會是剛好在您設的停損點出場。

這邊的話我希望進場是要K棒收盤才確定

但是盤中只要穿價就賣,如果設定逐筆洗價,不是有可能還沒收盤確定條件,就幫我出場了嗎??

 

另外我使用您修改的範例內

// if long_condition and position = 0 then setposition(1, market);  

// if short_condition and position = 0 then setposition(-1, market);

這兩行,可是回測發現常常停利以後,下一根還是符合條件又馬上幫我進場,

這樣不就沒有停利的效果嗎? 要如何避免這種狀況呢?

例如下圖 #1344停利後 下一根#1355馬上進場

感謝小幫手

XQ小幫手 發文於   2021/06/11

Hello ENGLISH4U,

 

1. 您可以將那三行的順序改為以下:

if filled <> 0 and (close >= (filledAvgPrice + 50) or close <= (filledAvgPrice - 50)) then setposition(0, market);

if long_condition then setposition(1, market);

if short_condition  then setposition(-1, market);

 

會發生您那樣的狀況主要是因為腳本只會執行第一個符合條件的 setposition。

所以如果是原本的狀況下,如果 long_condition 還符合的話就不會執行停損停利。

修改過後就不會發生您回測的狀況。

 

2. 確實會發生您說的狀況,只要進場條件還符合的話,那麼您出場後又會再進場。

您可以多加一些限制,例如出場後要過幾根 bar 或多久才能再進場。

 

3. 您如果只想要在 bar 結束時才作運算,那麼不要勾選逐筆洗價即可。這樣的話腳本就會在 bar 結束時才運算。

符合進出場條件的話在下根 bar 的開盤價進出場。

 

4. 這跟問題二很像,只要您的進出場條件還符合,那麼就算停利停損後還是會進場。

您可以多加些限制,小幫手舉個出場後要經過多少 bar 的範例。

input: bar_limit(10)

var: bar_count(10);

 

...進場條件...

 

bar_count += 1;

if filled <> 0 and (close >= (filledAvgPrice + 50) or close <= (filledAvgPrice - 50)) then begin

    setposition(0, market);

    bar_count = 0;

    end;

if long_condition and bar_count > 10 then setposition(1, market);

if short_condition and bar_count > 10 then setposition(-1, market);

這樣的話每次停損停利後至少要經過 bar_limit 設定的 bar 數後才能再度進場。

發表回覆
Close