如何記錄觸發時期他指標的點位

  •   484 
  • 最後發表   奇怪的人  2021 十二月 14
奇怪的人 發文於   2021/11/03

 

如圖

主圖K棒疊圖ATR通道

副圖為MACD

我希望當MACD出現黃金交叉時進場

並以出現MACD出現黃金交叉當下的ATR通到下軌的點位為停損點

以圖為例

出現MACD的黃金交叉後我買入進場

並且要以17086為停利點,17054為停損點

以下為我目前寫的

//-----------ATR-----------
// 宣告參數
input:period(20,"計算TrueRange的區間"),N(2,"N倍通道");

// 資料讀取筆數設定
settotalbar(period + 3);

value1=average(truerange,period);
value2=average(close,period);
value4=value2+N*value1;
value5=value2-N*value1;


//-----------MACD-----------
// 需告參數
input: FastLength(12, "DIF短期期數"), SlowLength(26, "DIF長期期數"), MACDLength(9, "MACD期數");
variable: difValue(0), macdValue(0), oscValue(0);

// 資料讀取筆數設定
SetTotalBar((maxlist(FastLength,SlowLength,6) + MACDLength) * 3 + 8);

MACD(weightedclose(), FastLength, SlowLength, MACDLength, difValue, macdValue, oscValue);

//-----------進場-----------
if position = 0 and difValue Crosses Above macdValue then setposition(1, market, label:="做多進場");
if position = 0 and difValue Crosses below macdValue then setposition(-1, market, label:="做空進場");

//-----------出場-----------
if position > 0 and filled > 0 then begin 
    if high >= value4 then begin
        setposition(0, value4, label:="獲利出場");
        end 
    else if low <= value5 then begin
        setposition(0, value5, label:="虧損出場");
        end ;

end else if Position < 0 and Filled < 0 then begin
        if low <= value5 then begin
        setposition(0, value5, label:="獲利出場");
        end 
    else if high >= value4 then begin
        setposition(0, value4, label:="虧損出場");
        end;
end;

不過這樣寫

value4 和 value5 都是變數

隨著時間往後推它的點位都會不一樣

但我想要的是我進場時當下指標的點位當作我後面出場時的點位

我要如何修改呢?

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

Hello 奇怪的人,

 

您需要另外另兩個變數,在MACD黃金交叉時紀錄當下value4和value5。

舉例來說您用 value6 和 value7 來記錄好了:

if position = 0 and difValue Crosses Above macdValue then begin 

    setposition(1, market, label:="做多進場");

    value6 = value4;

    value7 = value5;

    end;

if position = 0 and difValue Crosses below macdValue then begin 

    setposition(-1, market, label:="做空進場");

    value6 = value4;

    value7 = value5;

    end;

然後只要把下面出場的部分改使用value6和value7即可。

奇怪的人 發文於   2021/12/11

Hello 小幫手

可以麻煩幫我看一下我寫的內容是不是哪裡有問題嗎?

1.幫我看一下我的進場這樣寫是不是構成每次進場間隔一定要60秒以上

2.我希望我出場的點為是我進場當下的前高(做空)或前低點(做多)與我進場點為的點差乘以1.75為我獲利出場點為,高於前高(做空)或低於前低(做多)違停損,我這樣寫去執行好像不太對,可是我又看不出哪邊不對,該亭都沒有停

if highest(open[1], 1) > highest(close[1], 1) then value1 = highest(open[1], 1) else value1 = highest(close[1], 1);
if lowest(open[1], 1) < lowest(close[1], 1) then value2 = lowest(open[1], 1) else value2 = lowest(close[1], 1);


if FilledRecordCount <> 0 then 
condition1 = timediff(time, FilledRecordTime(FilledRecordCount), "S") > 60
else
condition1 = True;

value4 = low[1];
value5 = high[1];
//-----------進場-----------
if position = 0 and filled = 0 and condition1 = True and (1.5*(value1-value2) < (value2-low[1])) and (1.5*(high[1]-value1) <= (value2-low[1])) then begin 
   setposition(1, market, label:="做多進場,");
   value11 = value4;
   value21 = 1.75*(filledavgprice-value11);
   end;
if position = 0 and filled = 0 and condition1 = True and (1.5*(value1-value2) < (high[1]-value1)) and (1.5*(value2-low[1]) <= (high[1]-value1)) then begin
   setposition(-1, market, label:="做空進場,");
   value12 = value5;
   value22 = 1.75*(filledavgprice-value12);
   end;

//-----------出場-----------
if position > 0 and filled > 0 then begin 
    if close >= addspread(filledavgprice, value21) then begin
        setposition(0, market, label:="獲利出場");
        end 
    else if close < value11 then begin
        setposition(0, market, label:="虧損出場");
        end ;

end else if Position < 0 and Filled < 0 then begin
        if close <= addspread(filledavgprice, value22) then begin
        setposition(0, market, label:="獲利出場");
        end 
    else if close > value12 then begin
        setposition(0, market, label:="虧損出場");
        end;
end;

再麻煩小幫手幫我看一下是哪邊出了問題

XQ小幫手 發文於   2021/12/14

Hello 奇怪的人,

 

關於您 condition1 限制60秒的部分:

if FilledRecordCount <> 0 then 

condition1 = timediff(time, FilledRecordTime(FilledRecordCount), "S") > 60

else

condition1 = True;

首先,您這樣寫是進出場都限制。

第二,您的condition1一直都會是True。(小於60秒就會進到else裡)

 

小幫手會這樣修改:

if FilledRecordCount <> 0 and position = 0 then //空手的時候才判斷

condition1 = timediff(time, FilledRecordTime(FilledRecordCount), "S") > 60

else if FilledRecordCount = 0 then condition1 = True  //如果沒作過交易的話condition1會是True

else condition1 = False;   //其他狀況下 condition1 會是False

 

關於您計算前高或前低的這一部分:

highest(open[1], 1) 其實就是 open[1],你只抓前一根的open來跟他自己比較最高值,那出來的值就會是他自己

同理其他的 highest 和 lowest 也相同。

所以前兩行可以改成:

if open[1] > close[1] then begin

    value1 = open[1];

    value2 = close[1];

    end

else if open[1] < close[1] then begin

    value1 = close[1];

    value2 = open[1];

    end;

需注意您並沒有定義 open[1] = close[1] 的狀況,這會造成 value1 和 value2 維持0或是上一次達成條件時的數值。

另外您在計算進出場點時不需使用 addspread,這計算的是點差。

舉例來說,台泥的跳動點是 0.05,所以 addspread(close, 4) 會等於 close + 0.2。

您直接使用 filledavgprice + value21 和 filledavgprice + value22 即可。

還有 value21 跟 value22 您計算出來並不保證正負,小幫手會建議您將上 absvalue 取絕對值。

接著再計算多單停利 filledavgprice + absvalue(value21) 和空單停利 filledavgprice - absvalue(value22)

發表回覆
Close