相変わらずの逆張り大好きっ子です。
えぇ日々逆張りに使えないかどうか考えています(笑)
移動平均に対するかい離率ですが、ラインからのかい離率というのは、どの程度まで行くのか予測が難しいところがあります。
もう少し瞬間値的なかい離なら、ある程度制限されるのではないかと思い、TEMAに対してのかい離率をグラフにしてみました。
計算式は下記の通りです。
TEMAかい離率[%]= 終値 / TEMA × 100 - 100
0を中心に上方向にかい離している場合は+、下方向にかい離している場合は-となります。
・・・まぁ裁量トレードの方はチャートを見たら一目なので、あまり必要ないかもしれません。どちらかというとシステムトレード派の方の利食いタイミングなどの測定向けかなぁとは思っています。Gewinn6でも利食いタイミングに使用しています。
で、これを使って逆張り仕掛けたらどんなもん?と思って、超単純にバックテストで実験してみました。
2011/1/1~2015/12/20 EURGBP 1Hにて、0.5%/-0.5%を超えたのち、0.5/-0.5を再び下回った際、ポジションを24時間保持した場合の結果です。ストップとか利食いとか全く考えず24時間後に閉じる単純ロジックです。
初期証拠金 10000.00 スプレッド 15
純益 802.24 総利益 1942.95 総損失 -1140.71
プロフィットファクタ 1.70 期待利得 17.44
絶対ドローダウン 203.32 最大ドローダウン 417.62 (4.05%) 相対ドローダウン 4.05% (417.62)
総取引数 46 売りポジション(勝率%) 23 (78.26%) 買いポジション(勝率%) 23 (60.87%)
勝率(%) 32 (69.57%) 負率 (%) 14 (30.43%)
最大 勝トレード 202.57 敗トレード -163.02
平均 勝トレード 60.72 敗トレード -81.48
最大 連勝(金額) 7 (331.43) 連敗(金額) 3 (-216.03)
最大 連勝(トレード数) 561.87 (5) 連敗(トレード数) -248.09 (2)
平均 連勝 3 連敗 1
おぉ。利食いも損切も全く考えてない状況で、単に24時間後にクローズするだけで+引けはなかなかです。
まぁ5年で取引回数が50回を下回ってますので、かなりサンプルが足りないですよね。ただ、EURUSD 1Hでも同じく+引けしました。うん。まぁ考え方をまとめてちゃんと組めば、もしかしてそれなり?
プロぐランキングにご協力よろしくお願いします。m(._.)m
ということで、TEMAかい離率のコードはこちらから
//------------------------------------------------------------------
// TEMA移動平均かい離率
#property copyright "Copyright 2015, Daisuke"
#property link "http://mt4program.blogspot.jp/"
#property version "1.00"
#property strict
#property indicator_separate_window
#property indicator_maximum 1
#property indicator_minimum -1
#property indicator_level2 0.5
#property indicator_level3 -0.5
//バッファーを指定する。
#property indicator_buffers 5
//プロット数を指定する。
#property indicator_plots 1
// かい離率
#property indicator_label1 "LINE1"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrAqua
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
#property indicator_type2 DRAW_NONE
#property indicator_type3 DRAW_NONE
#property indicator_type4 DRAW_NONE
#property indicator_type5 DRAW_NONE
input double Alfa = 0.1; //指数係数
input ENUM_APPLIED_PRICE MaPrice = PRICE_CLOSE; // 適用価格
// TEMA
double tema[];
// EMA
double ema1[];
// EMA EMA
double ema2[];
// EMA EMA EMA
double ema3[];
// バッファー
double lineBuffer[];
//------------------------------------------------------------------
//初期化
int OnInit()
{
//インジケーターバッファを初期化する。
SetIndexBuffer(0, lineBuffer);
SetIndexBuffer(1,tema);
SetIndexBuffer(2,ema1);
SetIndexBuffer(3,ema2);
SetIndexBuffer(4,ema3);
if( Alfa <= 0 || Alfa >= 1 ) return INIT_PARAMETERS_INCORRECT;
// 短縮名を設定
string shortName = "T KAIRI";
IndicatorShortName(shortName);
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 && !IsStopped(); i-- )
{
if( i >= rates_total - 1) continue;
double price = GetPrice(open[i], close[i], high[i], low[i], MaPrice);
if( i == (rates_total - 2) )
{
ema1[i + 1] = price;
ema2[i + 1] = price;
ema3[i + 1] = price;
tema[i + 1] = price;
continue;
}
ema1[i + 1] = Alfa * price + ( 1 - Alfa ) * ema1[i + 2];
ema2[i + 1] = Alfa * ema1[i + 1] + ( 1 - Alfa ) * ema2[i + 2];
ema3[i + 1] = Alfa * ema2[i + 1] + ( 1 - Alfa ) * ema3[i + 2];
tema[i + 1] = ema1[i + 1] * 3 - ema2[i + 1] * 3 + ema3[i + 1];
if( tema[i + 1] > 0 )
{
lineBuffer[i] = close[i] / tema[i + 1] * 100 - 100;
}
}
ema1[0] = EMPTY_VALUE;
ema2[0] = EMPTY_VALUE;
ema3[0] = EMPTY_VALUE;
tema[0] = EMPTY_VALUE;
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;
}