請問目前找高點的Swinghighbar預設第一個參數high是否能調整自定義的參數呢? 比如說value1等,因為目前程式想找出指標MACD中柱狀體OSC上一波的高點,但好像不太能用?請問版上高手是否有其他方式能找出OSC高低點對應的位置呢?
請問如何找出指標的高低點
- 62
- 最後發表 Eddie Chuang 昨天
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最近高點");
謝謝您的回復,若還需要此指標數值高點所對應的股價該怎麼寫呢? 因為我是想要藉由目前的OSC數值與股價與前波OSC柱狀山峰做比較,不知道該怎麼寫
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最近高點當期的最高價");
我上面的寫法效率較差,比較好的寫法是直接用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;
請問依此寫出下面的選股策略為什麼有出錯選項呢?
// 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;
(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;
6 評論