日足では特に意識する必要もないのですが
秒や分などの日中足で、移動平均などの過去データを参照するチャートを使う場合
前場寄り直後で大きめのGU(ギャップアップ)やGD(ギャップダウン)が発生すると
チャートの描写があまり宜しくない感じになります。
理由は単純で、前日のデータまで平均の対象として吸い込んでしまっているからなんですね。
指数加重移動平均も同様です。
なので、日付が変わったらリセットしてあげる必要がある訳です。
移動平均の改造
日付を跨いだらカウンターをリセットして
設定した本数より少ない場合はカウンターの数値で平均を出すというコードを書いてみます。
関数
AVG_KAI
inputs: Price(NumericSeries), Avg(NumericSimple); vars: BarCount(0); if date <> date[1] or CurrentBar <= 1 then BEGIN BarCount = 1; AVG_KAI = Price; END ELSE BEGIN BarCount += 1; IF BarCount < Avg then AVG_KAI = Average(Price, BarCount) ELSE AVG_KAI = Average(Price, Avg); END;
関数AverageFCとAverageの違い
一般的に移動平均を算出する関数は、処理が速い(と言われる)AverageFCを使いますが
AverageFCは二番目の引数(本数)を動的に変更すると正確な値を出力できないという問題があります。
なのでAverageを使用しています。
インジケーター
inputs: Price(Close), AvgColor(Yellow), Avg(25); vars: Answer(0); Answer = AVG_KAI(Price, Avg); Plot1(Answer, !( "移動平均改良" ), AvgColor);
細い水色が25本、ピンクが75本です。
指数加重移動平均の改造
こちらの改造はもっと楽で、日付の切り替わりのタイミングでリセットするだけです。
関数
XAveKai
inputs: Price( numericseries ), { price to average } Length( numericsimple ) ; { this input must be a constant >= 0 } variables: intrabarpersist SmoothingFactor( 0 ) ; once begin if Length >= 0 then SmoothingFactor = 2 / ( Length + 1 ) else RaiseRuntimeError( !( "The Length input of the XAverage function must be " + "greater than or equal to 0." ) ) ; end ; if CurrentBar = 1 or Date <> Date[1] then XAveKai = Price else XAveKai = XAveKai[1] + SmoothingFactor * ( Price - XAveKai[1] ) ;
関数XAverageのソースをコピーして
if CurrentBar = 1 then
となっている箇所を
if CurrentBar = 1 or Date <> Date[1] then
と書き換えて
後は関数名をそれぞれ書き換えるだけです。
ちなみに、改造関数は日足(週足、月足も)では使用できません。