2015年8月7日金曜日

[MT4インジケータ]13本高値安値に中心線を追加する。

highlowCenter.png

昨日の記事の続きです。
[MT4インジケータ]21本高値安値には意味がある?周期高値安値インジケータ

昨日のインジケータに中心線を追加してみましょう。
上昇トレンドの場合は、中心線より上に値が来ますし、下降トレンドの際には中心線より下にきます。レンジのばあいには中心線を間に行ったり来たりという感じですね。高値安値の中心線は短期波形成分をキャンセルした線としても捉えることができます。高値・安値更新中の際には、移動平均より機敏に反応しますので、トレンドの変化点としても移動平均より早めに検知できる可能性があります。

しっかり波形が出ている相場の場合は、中間値を超えた時点で高値ラインまでの上昇を見込めます。
また、次の動き出しに前に、高値安値が同時に狭まる現象が発生します。三角持合い時などに発生します。このように単純ですが、高値安値ラインはいろいろ見どころのあるインジケータです。

//------------------------------------------------------------------
// 高値 安値ライン表示インジケータ
#property copyright "Copyright 2015,  Daisuke"
#property link      "http://mt4program.blogspot.jp/"
#property version   "1.00"
#property strict
#property indicator_chart_window

// 円周率
#define PI 3.14159265359

//バッファーを指定する。
#property indicator_buffers 3

//プロット数を指定する。
#property indicator_plots   3

#property indicator_label1  "HIGH"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrAqua
#property indicator_style1  STYLE_SOLID
#property indicator_width1  2

#property indicator_label2  "LOW"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrIndianRed
#property indicator_style2  STYLE_SOLID
#property indicator_width2  2

#property indicator_label3  "CENTER"
#property indicator_type3   DRAW_LINE
#property indicator_color3  clrYellow
#property indicator_style3  STYLE_SOLID
#property indicator_width3  2

extern int Period = 13;

double highBuffer[];
double lowBuffer[];
double centerBuffer[];

//------------------------------------------------------------------
//初期化
int OnInit()
{
//インジケーターバッファを初期化する。
SetIndexBuffer(0,highBuffer);
SetIndexBuffer(1,lowBuffer);
SetIndexBuffer(2,centerBuffer);
SetIndexDrawBegin(0, Period);
SetIndexDrawBegin(1, Period);
SetIndexDrawBegin(2, Period);

string short_name = "HIGHLOW(" + IntegerToString(Period) + ")";
IndicatorShortName(short_name);

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 - Period ) continue;

int highest = iHighest( NULL, PERIOD_CURRENT, MODE_HIGH, Period, i + 1);
int lowest = iLowest( NULL, PERIOD_CURRENT, MODE_LOW, Period, i + 1);

highBuffer[i] = high[highest];
lowBuffer[i] = low[lowest];
centerBuffer[i] = (highBuffer[i] + lowBuffer[i] ) / 2;
}
//元となる値を計算する。
return(rates_total);
}
//+------------------------------------------------------------------+


2015年8月6日木曜日

[MT4インジケータ]21本高値安値には意味がある?周期高値安値インジケータ

周期解析によると、大体21本周期で価格が動くことが多いことはわかります。ということは21本における高値安値を表示して、その範囲内はレンジ、更新したらトレンドと判別することはできないでしょうか?
Excelで視覚化してみます。
sinhighlow.png
ある期間の波形内で上下する場合にはレンジ相場です。その高値と安値を抵抗線として描くことが可能です。

これに線形のトレンド成分を付加すると、次のようになります。
sinhighlowtrend.png
この図形は上げトレンドですが、上側の線を更新しながら上昇していきます。
下げの線にはタッチせずに上昇しますが、安値抵抗線と離れすぎていて少々シグナルとしては大雑把すぎます。なお高値のラインが、実際の価格より後に描画されているのは、1本前までの高値を表示しているためです。

波形ですので、基本的には周期の1/2期間で高値と安値が表れます。そこで、高値安値の判定範囲を1/2+1としたらどうでしょうか?
sinhighlowtrend2.png
前回安値のラインで跳ね返されて上昇していく図形となります。

これを描いたのが次のインジケータです。
highlow.png

通常インジケータを組む時には最新値を常に更新しますが、このインジケータでは確定した値のみ描画しています。現在高値安値を超えている場合はラインを超えてチャートが表示されるようにしています。

//------------------------------------------------------------------
// 高値 安値ライン表示インジケータ
#property copyright "Copyright 2015,  Daisuke"
#property link      "http://mt4program.blogspot.jp/"
#property version   "1.00"
#property strict
#property indicator_chart_window

//バッファーを指定する。
#property indicator_buffers 2

//プロット数を指定する。
#property indicator_plots   2

#property indicator_label1  "HIGH"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrAqua
#property indicator_style1  STYLE_SOLID
#property indicator_width1  2

#property indicator_label2  "LOW"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrIndianRed
#property indicator_style2  STYLE_SOLID
#property indicator_width2  2

extern int Period = 13;

double highBuffer[];
double lowBuffer[];

//------------------------------------------------------------------
//初期化
int OnInit()
{
//インジケーターバッファを初期化する。
SetIndexBuffer(0,highBuffer);
SetIndexBuffer(1,lowBuffer);
SetIndexDrawBegin(0, Period);
SetIndexDrawBegin(1, Period);

string short_name = "HIGHLOW(" + IntegerToString(Period) + ")";
IndicatorShortName(short_name);

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 - Period ) continue;

int highest = iHighest( NULL, PERIOD_CURRENT, MODE_HIGH, Period, i + 1);
int lowest = iLowest( NULL, PERIOD_CURRENT, MODE_LOW, Period, i + 1);

highBuffer[i] = high[highest];
lowBuffer[i] = low[lowest];
}
//元となる値を計算する。
return(rates_total);
}
//+------------------------------------------------------------------+


正弦波という形にモデルを単純化して考えています。これは単純モデルでも役にたたないものは実際には役に立つわけがないからです。あといったん単純化して見える化すると考えがまとまりやすい事が多いです。
今回の場合は、波長の1/2をとったほうが、インジケータとして役立つ可能性があるという点などですね。

特定期間の高値安値は抵抗線として意識されやすい為、みなさまもこのプログラムを基本に高値安値を描画してみてください。何か見えてくるかもしれませんよー?




2015年8月4日火曜日

MT4で高値安値更新タイミングを表示するインジ&サブチャートの高さをプログラムから設定する。

highlowcount.PNG

高値や安値を更新した場合にはついていった方がいい場合ってありますよね?前回高値位置を表示することで、高値安値の更新タイミングをサブウィンドウに出すプログラムです。

チャートの見方は、青い線が高値、赤い線が安値です。0になったタイミングが更新されたタイミングとなります。基本的には高値安値のチャートは反対に動きます。基本的に線が下にある方が更新タイミングが近いことになります。時間が近い方が影響が大きいと考えると、赤の線と青の線がクロスした際、下にいった線の色で売買シグナルとすることも可能だと考えています。

プログラムそのものはものすごく単純です。

着目点は IndicatorSetDouble(INDICATOR_MAXIMUM, Period);
です。
これは、チャートウィンドウのDouble値のプロパティに値を設定する関数です。
今回は最大値の値を期間によって変えたかったため、この関数を使用して設定しています。

設定可能なプロパティは下記ページに書いてあります。
https://www.mql5.com/en/docs/constants/indicatorconstants/customindicatorproperties


//------------------------------------------------------------------
// 高値安値 インデックス幅
#property copyright "Copyright 2015,  Daisuke"
#property link      "http://mt4program.blogspot.jp/"
#property version   "1.00"
#property strict
#property indicator_separate_window
#property indicator_separate_window
#property indicator_maximum   +500
#property indicator_minimum   0

//バッファーを指定する。
#property indicator_buffers 2

//プロット数を指定する。
#property indicator_plots   2

#property indicator_label1  "LINE1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrAqua
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1

#property indicator_label2  "LINE2"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrIndianRed
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1

// 入力パラメータ 移動平均期間
input int Period = 250;

// バッファー
double highBuffer[];
double lowBuffer[];

//------------------------------------------------------------------
//初期化
int OnInit()
{
// 短縮名を設定
string shortName = "HIGHLOW (" +  IntegerToString(Period) +")";
IndicatorShortName(shortName);

SetIndexBuffer(0, highBuffer);
SetIndexBuffer(1, lowBuffer);
SetIndexDrawBegin(0, Period);

IndicatorSetDouble(INDICATOR_MAXIMUM, Period);

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-- )
{
highBuffer[i] = iHighest(Symbol(), PERIOD_CURRENT, MODE_HIGH, Period, i) - i;
lowBuffer[i] = iLowest(Symbol(), PERIOD_CURRENT, MODE_LOW, Period, i) - i;
}

return(rates_total - 1);
}

2015年8月3日月曜日

EA戦略の考え方 勝率100%を達成する方法(ネタ)

雑記です。
本当に雑記ですw

EAにて勝率100%を達成することは不可能ではありません。
アルゴリズムは簡単です。

まず、何処でもいいのでポジションをとります。
まぁあえて言うならスワップが+になる方向がいいでしょう。
あぁ、できれば買いポジションがいいです。
あとは目標の利益が出たところでクローズします。

以上

つまり損切さえしなければ、買いポジションなら通貨価格まで、売りポジションなら無限大の評価損を受け入れることができる前提なら、勝率100%を達成できます。
いやー勝率100%のEAって簡単に作れますねー。素晴らしいです。
いや、ネタ記事ですからね?

ということで、勝率っていうのは、案外あてにならない数字ですよね。
同じ考え方で勝率0%も簡単に達成できます。
で0と100以外の勝率ってなると、途端に難しくなります。

で結局のところ、勝率ってどうなんでしょうか?

上記の流れから、では勝率はあまり重要ではないですよね!と言い切る事は実はできません。

勝率を考える上で重要なのは、連敗の可能性です。
単純ですが、勝率50%のシステムがあったとして、
��連敗する確率は25%もあります。
��連敗も3%ほどの確率です。

どの程度は見込んでおきましょうか?10%切るぐらいまでは見込んでおきましょう。
ということで勝率50%だと4連敗ぐらいは普通にありえます。

その際のドローダウンは平均負けトレード額*4です。

もちろん勝率があがると連敗の可能性が下がっていきます。
勝率というのは、この連敗の可能性というところに最大の重点が置かれると感じています。

勝率が低いと連敗の可能性が高くなります。その分荒波型のEAとなりやすいです。
Gewinn2が不調ですが、やはり勝率の低さが影響しているようです。

今、私が目標とするところは、
・平均勝トレード > 平均負けトレード
・勝率50%

勝率50%は達成できたのですが、この状態で平均勝トレード>平均負けトレードの実現はなかなか難しいですね。考えどころです。