請問如何找出指標的高低點

  •   62 
  • 最後發表   Eddie Chuang  昨天
Eddie Chuang 發文於   2025/12/26

請問目前找高點的Swinghighbar預設第一個參數high是否能調整自定義的參數呢?  比如說value1等,因為目前程式想找出指標MACD中柱狀體OSC上一波的高點,但好像不太能用?請問版上高手是否有其他方式能找出OSC高低點對應的位置呢?

排序方式: 標準 | 最新
虎科大許教授 發文於   2025/12/26

var:difValue(0), macdValue(0), oscValue(0);
macd(weightedClose,12,26,9,difValue,macdValue,oscValue);
value1=swinghigh(oscValue,60,3,3,1);
plot1(value1,"OSC最近高點");

Eddie Chuang 發文於   2025/12/28

謝謝您的回復,若還需要此指標數值高點所對應的股價該怎麼寫呢? 因為我是想要藉由目前的OSC數值與股價與前波OSC柱狀山峰做比較,不知道該怎麼寫

虎科大許教授 發文於   2025/12/29

var:difValue(0), macdValue(0), oscValue(0),myH(0);
macd(weightedClose,12,26,9,difValue,macdValue,oscValue);
value1=swinghigh(oscValue,60,3,3,1);
value2=swinghighbar(oscValue,60,3,3,1);
value3=simplehighest(oscValue,value2+1);
value4=simplehighestbar(oscValue,value2+1);
myH=h[value4];
plot1(value1,"OSC最近高點");
plot2(myH,"OSC最近高點當期的最高價");

虎科大許教授 發文於   2025/12/31

我上面的寫法效率較差,比較好的寫法是直接用swinghighbar傳回的距離K棒計算該轉折高點的最高價,亦即h[value2],不過這樣寫,會出現錯誤,原因是在跑歷史K棒且還沒找到轉折高點時,value2等於-1,XQ是不允許[-1]存在,所以會出錯。解決的方法有兩種:(1)用if判斷value2,以排除-1的情況。(2)找高點只在最後一根K棒找。兩種方法的寫法如下:

var:difValue(0), macdValue(0), oscValue(0),myH(0);
macd(weightedClose,12,26,9,difValue,macdValue,oscValue);
value1=swinghigh(oscValue,60,3,3,1);
value2=swinghighbar(oscValue,60,3,3,1);
if value2 < 0 then myH = 0 else myH=h[value2];
plot1(value1,"OSC最近高點");
plot2(myH,"OSC最近高點當期的最高價");

 

var:difValue(0), macdValue(0), oscValue(0),myH(0);
macd(weightedClose,12,26,9,difValue,macdValue,oscValue);
if isLastBar then
    begin
        value1=swinghigh(oscValue,60,3,3,1);
        value2=swinghighbar(oscValue,60,3,3,1);
        myH=h[value2];
        plot1(value1,"OSC最近高點");
        plot2(myH,"OSC最近高點當期的最高價");
    end;

Eddie Chuang 發文於   2026/01/16

請問依此寫出下面的選股策略為什麼有出錯選項呢?

// XQ: MACD指標

//此更新版改由OSC的最低點與次低點來做比較

 

input: FastLength(13), SlowLength(34), MACDLength(9), ERR(95);

 

variable: price(0);

 

SetInputName(1, "DIF短天數");

SetInputName(2, "DIF長天數");

SetInputName(3, "MACD天數");

SetInputName(4, "%股價創低誤差值");

 

var: _l1b(0),_l2b(0);                 //OSC低點相對位置

var: _lo1(0),_lo2(0);                 //OSC數值

var: _L1a(0),_L2a(0);                 //股價低點

var: _upcounter(0);                   //頂背離連續次數

 

price = WeightedClose();

 

value1 = xf_EMA("D",price, FastLength) - xf_EMA("D",price, SlowLength);   //DIF

value2 = xf_EMA("D",value1, MACDLength) ;                                 //MACD

value3 = value1 - value2 ;                                                //OSC

 

// 前面區段資料變動較大, 先不繪出

//

if CurrentBar <= SlowLength then

begin

value1 = 0;

value2 = 0;

value3 = 0;

end;

 

//計算低點

_l1b = swinglowbar(value3,100,2,1,1);               //最近OSC低點K棒位置(修改左右肩請同時修改//重置與//判斷低點背離並畫圖 _l1b = 1數值)

_l2b = swinglowbar(value3,100,2,1,2);               //次一OSC低點K棒位置

_lo1 = swinglow(value3,100,2,1,1);                  //最近OSC低點數值

_lo2 = swinglow(value3,100,2,1,2);                  //次一OSC低點數值

_L1a = L[_l1b];                                   //OSC最近低點對應當期股價最低價

_L2a = L[_l2b];                                   //OSC次一低點對應當期股價最低價

if _l1b > 0 then _L1a > 0 else _L1a = -1;      //低點如找到最低OSC也得到,否則回傳該函數預設的-1(如不寫此行判斷式會造成錯誤)

if _l2b > 0 then _L2a > 0 else _L2a = -1;      //次低點如找到次低OSC也得到,否則回傳該函數預設的-1

 

//重置

if _l1b = 1 and _lo2 < 0 and  _L1a < _L2a and _lo1 < _lo2 then _upcounter=0; //當低點成立時,且OSC無背離則計數重置(_l1b = 1數值須跟著Swinghighbar右肩修改)

 

//判斷低點背離並畫圖

if _l1b = 1 and _lo2 < 0 and  _L1a < _L2a and _lo1 > _lo2 then begin         //低點背離判斷式

 _upcounter += 1;                                //連續背離計次

 

 

end; 

 

condition1 = _lo2 < 0 ;

condition2 = ((ERR*0.01))*_L1a) < _L2a;

condition3 = _lo1 > _lo2;

 

if condition1 and condition2 and condition3 then ret = 1;

虎科大許教授 發文於   2026/01/17

(1)then後面不能只用大於0的比較運算式,必須改成指定陳述式。

if _l1b > 0 then _L1a > 0 else _L1a = -1;

if _l2b > 0 then _L2a > 0 else _L2a = -1;

請改成

if _l1b > 0 then _L1a = 1 else _L1a = -1;

if _l2b > 0 then _L2a = 1 else _L2a = -1;

 

(2)condition2裡面少了一個左括號,其實這些括號是多餘的。

condition2 = ((ERR*0.01))*_L1a) < _L2a;

請改成

condition2 = ERR*0.01*_L1a < _L2a;

發表回覆
Close