EA Gewinn7/8がTick値を使った勢い判定によるエントリー判断をしていますが、Tick値の配信回数によって成績が結構異なるということは、逆説的にTick値には大きな利用価値があるということを証明できた気がします。
ということで以前EMAをベースにTickによる平滑化パラメータを動的に変更するインジケータを作成していますが、ちょっともっと簡単に考え方をいろいろ応用できる形で書き換えたいと思います。
■黄色TickEMA2(21) 赤EMA(21)
考え方を単純にして、平滑化指数をTickからのみ生成しています。
Tick値が伴っているときには過敏に、伴っていないときには緩やかに動くのはTickEMAと変わりありません。
ターゲットラインをベースとしたEAの場合、ライン付近で微振動を起こすと微妙なところでとったりとらなかったりします。かといって平滑化をすると、鈍くなりすぎたり、薄い時間帯での急変で変なポジションを保持したりします。
Tick値を見ることで、平滑化と即応性を両立することを目的にしています。
ちなみに、このインジケータですが、次のEAで移動平均期間の値を2とかにして、ノイズフィルタ替わりに使う予定です。
後乖離率をごにょごにょすると、スキャ系EAのネタになるかなぁ・・・。今後の検証課題です。
//------------------------------------------------------------------
// Tick更新回数をみて変更するEMA その2 TICK値からEMAアルファを算出する。
#property copyright "Copyright 2017, Daisuke"
#property link "http://mt4program.blogspot.jp/"
#property version "1.00"
#property strict
#property indicator_chart_window
//バッファーを指定する。
#property indicator_buffers 1
//プロット数を指定する。
#property indicator_plots 1
#property indicator_label1 "MA"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrYellow
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
input int MaPeriod = 21; //移動平均期間
input int TickAvgPeriod = 100; //Tick平均期間
input int MaShift = 0;// 表示移動
input ENUM_APPLIED_PRICE MaPrice = PRICE_CLOSE;//適用価格
// 表示バッファ
double ma[];
// 平滑化指数
double alfa;
//------------------------------------------------------------------
//初期化
int OnInit()
{
SetIndexBuffer(0,ma);
alfa = 2.0 / ( MaPeriod + 1.0);
SetIndexShift(0, MaShift);
return INIT_SUCCEEDED;
}
//------------------------------------------------------------------
//計算イベント
int OnCalculate(const int rates_total, //各レート要素数
const int prev_calculated, //計算済み要素数
const datetime &time[], //要素ごとの時間配列
const double &open[], //オープン価格配列
const double &high[], //高値配列
const double &low[], //安値配列
const double &close[], //クローズ価格配列
const long &tick_volume[], //ティック数(要素の更新回数)
const long &volume[], //実ボリューム(?)
const int &spread[]) //スプレット
{
for( int i = rates_total - prev_calculated - 1; i >= 0; i-- )
{
// Tick値の単純平均を求める。
double average = 0 ;
int count = 0 ;
for( int j = 0; j < TickAvgPeriod && (i + j) < rates_total; j++ )
{
count++;
average += (double)tick_volume[i + j];
}
if( count > 0 )
{
average = average/ count / alfa;
}
//EMAを計算する。
double price = GetPrice(open[i], close[i], high[i], low[i], MaPrice);
if( average > 0 && (i + 1) < rates_total)
{
double currentAlfa = tick_volume[i] / average;
if( currentAlfa >= 1 ) currentAlfa = 1;
// 指数平滑化移動平均
ma[i] = price * currentAlfa + (1 - currentAlfa) * ma[i + 1];
}
else
{
ma[i] = price;
}
}
return rates_total - 1;
}
//------------------------------------------------------------------
// 価格を計算する。
// return 対象価格
double GetPrice(
double open, // オープン値
double close, // クローズ値
double high, // 高値
double low, // 安値
ENUM_APPLIED_PRICE maPrice //取得価格
)
{
double price = 0;
switch( maPrice )
{
case PRICE_CLOSE:
price = close;
break;
case PRICE_OPEN:
price = open;
break;
case PRICE_HIGH:
price = high;
break;
case PRICE_LOW:
price = low;
break;
case PRICE_MEDIAN:
price = (high + low) / 2;
break;
case PRICE_TYPICAL:
price = (high + low + close) / 3;
break;
case PRICE_WEIGHTED:
price = (high + low + close + close) / 4;
break;
}
return price;
}
「MT4でFXを勝ち抜く研究をするブログ」で公開している無料インジケータは、こちらの一覧から。
インジケータ一覧
Twitterもよろしくお願いします。
https://twitter.com/mt4program
ブログランキングにご協力よろしくお願いします。m(._.)m
にほんブログ村 |
お約束ですが、本ブログは、投資に対する利益を約束する物ではありません。最終的には自己責任によるご判断よろしくお願いいたします。