2012-08-31 3 views
0

aapl 주식형 차트의 누적 스윙 지수를 얻으려고합니다. 이 계산을 참조 용으로 사용하고 있습니다.Welle의 Wilder Accumulative Swing Index PHP 계산 - 적절한 값을 반환 할 수 없음

http://www.barchart.com/education/std_studies.php?what=int_swing&hideheader=true#study

이것은 내가 지금까지 쓴 것입니다. 이 252.09 반환해야하지만 작동하도록 가져올 수 없습니다.

$asi[0] = -78.75 
$ht = 584; // High today 
$lt = 574.25; // low 
$ct = 584.00; // close 
$ot = 578; // open 

$hy = 574; // High yesterday 
$ly = 565.61; 
$cy = 569.05; 
$oy = 571.67; 


$k = max(($hy-$ct),($ly-$ct)); 

$abc = array(($ht-$cy), ($lt-$cy), ($ht-$lt)); 
$max = max($abc); 
$r = 0; 
if($max == $abc[0]){ 
    $r = ($ht-$cy)-.5*($lt-$cy)+.25*($cy-$oy); 
}elseif($max == $abc[1]){ 
    $r = ($lt-$cy)-.5*($ht-$cy)+.25*($cy-$oy); 
}elseif($max == $abc[2]){ 
    $r = ($ht-$lt)+.25*($cy-$oy); 
}else{ 
    echo "Error in welles accumulative swing index"; 
    exit; 
} 

$l = 3 //period; 

$val = 50 * (($cy - $ct) + .5 *($cy - $oy) + .25*($ct-$ot))/$r * $k/$l; 

$asi[] = $asi[$i-1] + $val; 

모든 도움을 주시면 감사하겠습니다.

+0

짧은 모양을했지만, $ k = max (...)에 대해 abs() (+ 잘못된 전쟁)가 누락되었습니다. 당신의 링크는'abs ($ ht- $ ct-1), abs ($ lt- $ ct-1))'이어야한다고 알려줍니다.' – ccKep

+0

'abs()' 그것은 보인다. – ccKep

+0

안녕하세요. 고마워요. 올바른 절대 값을 추가한다고해서 실제로 함수가 수정되지는 않습니다. 나는 화요일에 그 기능을 대신 할 것이다. 노동절 주말! – styks

답변

2

나는이 기호를 기호에 의해 새롭게 구현하려고 시도했으며 다른 결과 (스윙 : -248.7032967033)를 얻었다. 통제 값이 잘못 될 수 있습니까?

내 코드 즉 :

class Swing 
{ 
    public function calculate($high_price, $low_price, $close_price, $open_price, $t) 
    { 
     // (Ct-1 - Ct) 
     $summand0 = ($close_price[$t-1] - $close_price[$t]); 
     // 0.5(Ct-1 - Ot-1) 
     $summand1 = 0.5 * ($close_price[$t-1] - $open_price[$t-1]); 
     // 0.25(Ct - Ot) 
     $summand2 = 0.25 * ($close_price[$t] - $open_price[$t]); 

     $limit_move_default = 3.0; 

     $r = $this->get_r_value($high_price, $low_price, $close_price, $open_price, $t); 
     $k = $this->get_k_value($high_price, $low_price, $close_price, $t); 

     $factor0 = 50.0 * ($summand0 + $summand1 + $summand2)/$r; 
     $factor1 = $k/$limit_move_default; 

     // SWING = 50 * ((Ct-1 - Ct)+ 0.5(Ct-1 - Ot-1)+ 0.25(Ct - Ot))/ R * K/M 
     return $factor0 * $factor1; 
    } 

    public function get_k_value($high_price, $low_price, $close_price, $t) 
    { 
     // K= MAX(| Ht-Ct-1|, | Lt-Ct-1|) 
     return max(
      abs($high_price[$t] - $close_price[$t-1]), 
      abs($low_price[$t] - $close_price[$t-1])); 
    } 

    public function get_r_value($high_price, $low_price, $close_price, $open_price, $t) 
    { 
     // A. |Ht-Ct-1| 
     $a = abs($high_price[$t] - $close_price[$t-1]); 
     // B. |Lt-Ct-1| 
     $b = abs($low_price[$t] - $close_price[$t-1]); 
     // C. |Ht-Lt| 
     $c = abs($high_price[$t] - $low_price[$t]); 

     $max_value = max($a, $b, $c); 

     $d = abs($high_price[$t] - $low_price[$t]); 

     if($a == $max_value) 
      // R= (| Ht-Ct-1|)-.5(| Lt-Ct-1|)+.25(| Ct-1-Ot-1|) 
      return $a - 0.5 * $b + 0.25 * $d; 

     if($b == $max_value) 
      // R= (| Lt-Ct-1|)-.5(| Ht-Ct-1|)+.25(| Ct-1-Ot-1|) 
      return $b - 0.5 * $a + 0.25 * $d; 

     if($c == $max_value) 
      // R= (| Ht-Lt|)+.25(| Ct-1-Ot-1|) 
      return $c + 0.25 * $d; 
    } 
}; 

$swing = new Swing(); 

$high_price = array(574.0, 584.0); 
$low_price = array(565.61, 574.25); 
$close_price = array(569.05, 584.0); 
$open_price = array(571.67, 578.0); 

$value = $swing->calculate($high_price, $low_price, $close_price, $open_price, 1); 
echo("swing: $value \n"); 
+0

자세한 답변을 보내 주셔서 감사합니다. QA 출력물에 대한 확인을 기다리고 있으며 진행 상황을 알려줍니다. 감사! – styks

0

$ d를 잘못 보인다.

abs ($ close_price [$ t-1] - $ open_price [$ t-1]);이어야합니다.

+1

이것은 답변이 아니라 [답변을 추가하려면 [평판이 충분하다] (http://stackoverflow.com/help/privileges)를 가지고 있어야합니다.) 코멘트 여야합니다. 평판을 얻고 논평 할 수있는 방법을 배우려면 [Help Section] (http://stackoverflow.com/help/whats-reputation)을 참조하십시오. – mathielo