またろうのシストレブログ

マネックス証券が提供しているトレードステーションと、MT4などシストレ関連について色々書きます。株と自動売買、EasyLanguageについても。

日中足で移動平均や指数加重移動平均を使う場合は改造が要るよって話



日足では特に意識する必要もないのですが
秒や分などの日中足で、移動平均などの過去データを参照するチャートを使う場合
前場寄り直後で大きめのGU(ギャップアップ)やGD(ギャップダウン)が発生すると
チャートの描写があまり宜しくない感じになります。

f:id:tsukinowaapp:20180711103037p:plain

理由は単純で、前日のデータまで平均の対象として吸い込んでしまっているからなんですね。
指数加重移動平均も同様です。

f:id:tsukinowaapp:20180711103850p:plain

なので、日付が変わったらリセットしてあげる必要がある訳です。

移動平均の改造

日付を跨いだらカウンターをリセットして
設定した本数より少ない場合はカウンターの数値で平均を出すというコードを書いてみます。

関数
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);

f:id:tsukinowaapp:20180711114952p:plain

細い水色が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
と書き換えて
後は関数名をそれぞれ書き換えるだけです。

f:id:tsukinowaapp:20180711120919p:plain


ちなみに、改造関数は日足(週足、月足も)では使用できません。