<?php
// Minimal, PHP-only, Starter-kompatibel.
namespace Forcast;

function sma(array $arr, int $n){ $n=max(1,$n); $out=[];$sum=0;$q=[];foreach($arr as $i=>$v){$q[]=$v;$sum+=$v;if(count($q)>$n){$sum-=array_shift($q);} $out[]=$sum/count($q);} return $out; }
function rsi(array $cl, int $n=14){
  $g=$l=0;$rsis=array_fill(0,count($cl),null);
  for($i=1;$i<count($cl);$i++){ $ch=$cl[$i]-$cl[$i-1]; $up=max(0,$ch); $dn=max(0,-$ch);
	if($i<=$n){ $g+=$up; $l+=$dn; if($i==$n){ $avgU=$g/$n; $avgD=$l/$n; $rs=$avgD==0?100:$avgU/$avgD; $rsis[$i]=100-100/(1+$rs); } }
	else { $avgU=($avgU*($n-1)+$up)/$n; $avgD=($avgD*($n-1)+$dn)/$n; $rs=$avgD==0?100:$avgU/$avgD; $rsis[$i]=100-100/(1+$rs); }
  } return $rsis;
}
function atr(array $hi,array $lo,array $cl,int $n=14){
  $tr=[]; for($i=0;$i<count($cl);$i++){
	if($i==0){ $tr[]=($hi[$i]-$lo[$i]); }
	else { $tr[]=max($hi[$i]-$lo[$i], abs($hi[$i]-$cl[$i-1]), abs($lo[$i]-$cl[$i-1])); }
  }
  $out=[];$ema=0;$k=2/($n+1);
  foreach($tr as $i=>$v){ if($i==0){$ema=$v;} else {$ema=$v*$k+$ema*(1-$k);} $out[]=$ema; } return $out;
}
function pct_change(array $cl,int $n){
  $out=array_fill(0,count($cl),null);
  for($i=$n;$i<count($cl);$i++){ $prev=$cl[$i-$n]; $out[$i]=$prev!=0?($cl[$i]/$prev-1.0):null; }
  return $out;
}
function rolling_percentile(array $arr,int $win,int $lag=0){
  $out=array_fill(0,count($arr),null);
  for($i=0;$i<count($arr);$i++){
	$j=$i-$lag; if($j<0) continue; $s=max(0,$j-$win+1); $w=array_slice($arr,$s,$j-$s+1);
	if(count($w)<5) continue; $x=$arr[$j]; sort($w); $pos=array_search($x,$w); if($pos===false)$pos=0;
	$out[$i]=count($w)>1? $pos/(count($w)-1) : 0.5;
  } return $out;
}

// Erzeugt Feature-Vektor am Index i
function make_features(array $bars,int $i): ?array {
  // bars: [['t'=>..., 'o'=>, 'h'=>, 'l'=>, 'c'=>, 'v'=>], ...] (adj. preferred)
  if($i<200) return null;
  $c=array_column($bars,'c'); $h=array_column($bars,'h'); $l=array_column($bars,'l'); $v=array_column($bars,'v');
  $rsi14=rsi($c,14); $atr14=atr($h,$l,$c,14);
  $mom63=pct_change($c,63); $mom20=pct_change($c,20);
  $sma20=sma($c,20); $sma50=sma($c,50); $sma200=sma($c,200);
  $vol_sma50=sma($v,50);
  $atrpct=[]; foreach($c as $k=>$cv){ $atrpct[$k]=($cv>0 && $atr14[$k]!=null)?$atr14[$k]/$cv:null; }
  $atrpct_pctl=rolling_percentile($atrpct,250,0);
  $vol_ratio=[]; foreach($v as $k=>$vv){ $vol_ratio[$k]=($vol_sma50[$k]??null)>0? $vv/($vol_sma50[$k]):null; }
  $dist52h=[]; for($k=0;$k<count($c);$k++){ $s=max(0,$k-251); $mx=max(array_slice($c,$s,$k-$s+1)); $dist52h[$k]=$mx>0? ($c[$k]/$mx-1):null; }

  return [
	'rsi14'=>$rsi14[$i],
	'mom20'=>$mom20[$i],
	'mom63'=>$mom63[$i],
	'atrpct'=>$atrpct[$i],
	'atrpct_pctl'=>$atrpct_pctl[$i],
	'vol_ratio'=>$vol_ratio[$i],
	'trend20'=>$c[$i]>$sma20[$i]?1:0,
	'trend50'=>$c[$i]>$sma50[$i]?1:0,
	'trend200'=>$c[$i]>$sma200[$i]?1:0,
	'dist52h'=>$dist52h[$i],
  ];
}