2015年9月12日土曜日

[研究中]VEMAベースでは、うまくいかないWavelet。

■ホモダインベースVEMA
HomodyneVEMA.gif
■WaveletベースVEMA
WaveletVEMA.gif

引き続きWaveletとホモダインの研究です。
以前作成したVEMAをWaveletベースに置き換えてみました。

EURUSD1Hベースの単純にクロスで売買した結果です。

こちらはWaveletの方が成績が悪くなっています。
VEMAでは高周波の動きを無視するが大きな動きと0度180度では縦に大きく動かすという考え方で組んでいます。Waveletでは高周波もカットしているため、0度と180度の発生回数そのものが少なくなってしまい、単なるEMAと1/2EMAとのクロスになってしまっているようです。



2015年9月11日金曜日

[MT4インジケータ&プログラミング]他の時間足ボリンジャーバンドを表示する。

昨日は、中心線が選べるボリンジャーバンドを作りましたので、今日は時間足が選択できるボリンジャーバンドを作成したいと思います。
■EURUSD 1Hに1D21本BBを表示。
MTBB.JPG

ここで活躍するのは
iBarShift関数です
int iBarShift(
string symbol, // シンボル
int timeframe, // タイムフレーム
datetime time, // タイム
bool exact=false // モード
);
この関数は、timeで指定された時間に一番近いバーインデックスを調べてくれます。
たとえば、9/11 10:00に一番近い1時間足のバーインデックスは2ですよっていう感じです。
一番近いという判断は切り捨てで判断しているようです。
例 時間足を調べる場合、timeに10:00~10:59を入力すると、10:00のインデックスが帰ってきます。

exactをtrueに指定するとぴったり一致する場合にだけインデックス値を返してきます。
それ以外は-1です。

現在表示しているチャートのシンボルの場合は、symbolにはNULLを指定します。
タイムフレームはバーインデックスを検索したいタイムフレームを指定します。

プログラムの流れ的には
1.iBarShiftで、表示したい時間足のバーインデックスを取得
2.1.で取得したインデックスの移動平均と標準偏差を取得
3.チャートを描画

という形です。

このように、iBarShiftは、短い時間足のチャートに長い時間足の情報を書き込むのに大変役立ちます。

なお・・個人的には、上の時間足のチャートを表示したいのであれば、その分の倍数を掛けた期間のチャートを表示すればよいのでは?と思ったりもしています・・。
たとえば、1時間足に4時間足の21本移動平均BBを出したいのであれば1時間足84本移動平均BBとほぼ同じ値となります。こんな感じです。
■UERUSD1Hに対する4時間足21本BBと1時間足84本BBの違い。滑らかなほうが84本です。
MTBB2.JPG

//------------------------------------------------------------------
// 他の時間足のボリンジャーバンド
#property copyright "Copyright 2015,  Daisuke"
#property link      "http://mt4program.blogspot.jp/"
#property version   "1.00"
#property strict
#property indicator_chart_window

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

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

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

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

#property indicator_label3  "HIGH2"
#property indicator_type3   DRAW_LINE
#property indicator_color3  clrIndianRed
#property indicator_style3  STYLE_SOLID
#property indicator_width3  1

#property indicator_label4  "LOW1"
#property indicator_type4   DRAW_LINE
#property indicator_color4  clrIndianRed
#property indicator_style4  STYLE_SOLID
#property indicator_width4  1

#property indicator_label5  "LOW2"
#property indicator_type5   DRAW_LINE
#property indicator_color5  clrIndianRed
#property indicator_style5  STYLE_SOLID
#property indicator_width5  1

// 対象タイムフレーム
extern ENUM_TIMEFRAMES TargetPeriod = PERIOD_H4;

// 入力パラメータ 移動平均期間
extern int MaPeriod = 21;

//入力パラメータ 表示移動
extern int   MaShift = 0;

//入力パラメータ 移動平均種別
extern ENUM_MA_METHOD MaMethod = MODE_SMA;

//入力パラメータ 適用価格
extern ENUM_APPLIED_PRICE MaPrice = PRICE_MEDIAN;

//標準偏差期間
extern int StdPeriod = 21;

//標準偏差算出方法
extern ENUM_MA_METHOD StdMethod = MODE_SMA;

//σ1
extern double Sigma1 = 1;

//σ2
extern double Sigma2 = 2;

double center[];
double high1[];
double high2[];
double low1[];
double low2[];

//------------------------------------------------------------------
//初期化
int OnInit()
{
//インジケーターバッファを初期化する。
SetIndexBuffer(0,center);
SetIndexBuffer(1,high1);
SetIndexBuffer(2,high2);
SetIndexBuffer(3,low1);
SetIndexBuffer(4,low2);
SetIndexDrawBegin(0, MaPeriod);
SetIndexDrawBegin(1, MaPeriod);
SetIndexDrawBegin(2, MaPeriod);
SetIndexDrawBegin(3, MaPeriod);
SetIndexDrawBegin(4, MaPeriod);

string short_name = "MyBB(" + IntegerToString(MaPeriod) + ")";
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[])            //スプレット
{
if( Period() > TargetPeriod ) return rates_total ;

for( int i = (rates_total - prev_calculated - 1); i >= 0 && !IsStopped(); i-- )
{
int shift = iBarShift(NULL, TargetPeriod, time[i], false);

center[i] = iMA(NULL, TargetPeriod, MaPeriod, 0, MaMethod, MaPrice, shift);
double std = iStdDev(NULL, TargetPeriod, StdPeriod, 0, StdMethod, MaPrice, shift);
high1[i] = center[i] + std * Sigma1;
high2[i] = center[i] + std * Sigma2;
low1[i] = center[i] - std * Sigma1;
low2[i] = center[i] - std * Sigma2;
}
//元となる値を計算する。
return(rates_total - 1);
}


2015年9月10日木曜日

[MT4インジケータ&プログラミング]初心に戻って、中心線が選べるボリンジャーバンド

FX-ONの開発者サミットで知ったのですが、皆様ボリンジャーバンドが大好きです。

抵抗線としてみた場合のボリンジャーバンドはオカルトに近いものがあるのですが、単純線形を描くと上昇トレンド時は1σ付近、下降トレンド時は-1σ付近に現在値がくるため、これをトレンドの判断として使っているかたが多いようです。

中心線が単純移動平均の場合遅延が大きい為、これをEMAはLWMAにして遅延を少なくして人より早く判断しようという方も結構いらっしゃいました。
MT4付属ボリンジャーバンドはSMAに固定されてしまっているのですよね。これを各種MAに対応できるようにします。世の中にいっぱい同じものがありますが、アラーム出したりする基礎となるため、あえて作ってみました。

■SMAを中心線にした場合
MyBBSMA.JPG

■EMAを中心線にした場合
MyBBEMA.JPG

//------------------------------------------------------------------
// 中心線が選べるボリンジャーバンド
#property copyright "Copyright 2015,  Daisuke"
#property link      "http://mt4program.blogspot.jp/"
#property version   "1.00"
#property strict
#property indicator_chart_window

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

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

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

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

#property indicator_label3  "HIGH2"
#property indicator_type3   DRAW_LINE
#property indicator_color3  clrIndianRed
#property indicator_style3  STYLE_SOLID
#property indicator_width3  1

#property indicator_label4  "LOW1"
#property indicator_type4   DRAW_LINE
#property indicator_color4  clrIndianRed
#property indicator_style4  STYLE_SOLID
#property indicator_width4  1

#property indicator_label5  "LOW2"
#property indicator_type5   DRAW_LINE
#property indicator_color5  clrIndianRed
#property indicator_style5  STYLE_SOLID
#property indicator_width5  1

// 入力パラメータ 移動平均期間
extern int MaPeriod = 21;

//入力パラメータ 表示移動
extern int   MaShift = 0;

//入力パラメータ 移動平均種別
extern ENUM_MA_METHOD MaMethod = MODE_SMA;

//入力パラメータ 適用価格
extern ENUM_APPLIED_PRICE MaPrice = PRICE_MEDIAN;

//標準偏差期間
extern int StdPeriod = 21;

//標準偏差算出方法
extern ENUM_MA_METHOD StdMethod = MODE_SMA;

//σ1
extern double Sigma1 = 1;

//σ2
extern double Sigma2 = 2;

double center[];
double high1[];
double high2[];
double low1[];
double low2[];

//------------------------------------------------------------------
//初期化
int OnInit()
{
//インジケーターバッファを初期化する。
SetIndexBuffer(0,center);
SetIndexBuffer(1,high1);
SetIndexBuffer(2,high2);
SetIndexBuffer(3,low1);
SetIndexBuffer(4,low2);
SetIndexDrawBegin(0, MaPeriod);
SetIndexDrawBegin(1, MaPeriod);
SetIndexDrawBegin(2, MaPeriod);
SetIndexDrawBegin(3, MaPeriod);
SetIndexDrawBegin(4, MaPeriod);

string short_name = "MyBB(" + IntegerToString(MaPeriod) + ")";
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-- )
{
center[i] = iMA(NULL, PERIOD_CURRENT, MaPeriod, 0, MaMethod, MaPrice, i);
double std = iStdDev(NULL, PERIOD_CURRENT, StdPeriod, 0, StdMethod, MaPrice, i);
high1[i] = center[i] + std * Sigma1;
high2[i] = center[i] + std * Sigma2;
low1[i] = center[i] - std * Sigma1;
low2[i] = center[i] - std * Sigma2;
}
//元となる値を計算する。
return(rates_total - 1);
}


2015年9月6日日曜日

FX-ON開発者懇親会に参加してきました。


IMG_2309.JPG

銀座です。
ブランドとかに興味がないため、APPLEストア以外行ったことながない街です^^;;;

9/5土曜日にFX-ONさん主催の開発者懇親会がありました。開発者さんだけではなく、業者さんやトレーダーさんも参加してわいわいがやがやの飲み会となりました。

参加して楽しかったですが、情報収集という意味では少し残念なところも。

プログラム系の飲み会だと、基本こんな技術あるよーの紹介大会になるのですが、さすがにトレーダーが基本となる集まりです。秘密主義です^^;;

・運用額は基本秘密。
 なんかすごい額を運用していることを臭わせていた方も数人いらっしゃいました。さすがです。
・開発者さんは案外少ない印象です。あくまでもトレードのついでってかんじで。
・EA/インジケータの請負開発で食べている人がいらっしゃった。
・トレーダーさんは特に自分の手法とかは話さない。まぁあたりまえですね^^;;;
 私の方はブログに情報をのせているので、ブログの内容を基本にお話していました。
 そんなかでもガチIT系企業社長さんとガチプログラマの方がいらっしゃって儲かっていそうでした。
・短期がよいっていう人と長期がよいっていう人に分かれて楽しいです。
 何となくですが、短期の人はパターンマッチングをベースに、長期の人はやっぱりトレンドフォローをベースにお話されていました。
・あの、らっこさんとお会いして握手できてうれしいです。

 今回は田舎から新幹線で3時間半かけて参加しましたが、割と近県の人たちも参加されていて、今度またあいましょうというお話になりました。地方のトレーダーさんや投資会社さんではプログラム組める人に知り合いが少ない感じでした。

 今回は会社にお願いして交通費を出してもらいました。・・ただ、会社の金だと報告書出さないといけないので、勉強会なりセッションなりライトニングトークなりのプレゼンを交えた形の会じゃないと会社の金で参加しずらい・・・^^;;;;次回企画の際は会議室かホールを借りてプレゼン→飲み会の流れだとうれしいなと感じました。あと飲み会は3次会まであったようですが、3次会カラオケらしく、参加すると間違いなく終電超えると思ったため2次会で撤退してきました。

 あ、証券業者さんにバックテストデータを公開しろーって強く押しておいたので、そのうち公開されないかなぁ。EA開発者がバックテストするときはFXDDのデータがまず基本になるのですが、このバックテストFXDDでやってますよーっていうのが、どれだけFXDDの名前を世の中に出すのに役立っていることか。なぜならまず最低限FXDDのデータで勝てるシステムを作るからです。開発する側が自由に使えるデータを出すっていうのはオープン戦略としてとても重要です。つよーくアピールしておきました(笑)

 結局食べる暇無く、お酒片手にあちこち回っていたため、すきっぱらにビールたっぷりで、ただいま大変気持ち悪いです・・・。あとN9Yのステーキおいしそうだったなぁ。少し遅れて参加したため、フライドポテトだけになっていました。TT