BBR2_Expert.mq4の結果

比較しやすいようにBBR_Expert.mq4と同じロジックにタイムフィルターを追加したものBBR2_Expert.mq4でバックテストしてみました。勝率利益率ともに改善されタイムフィルターが有効なことが明確になったと思います。
24時間市場は開いていますが、時間帯によって動きに特徴があるのでロジックにあった時間帯だけでトレードした方が有利だということだと思います。24時間ポとポチすりょり毎日同じ時間帯を決めてトレードしたほうが有利なんだと思います。

BBR2_Expert.mq4

#include "../Libraries/LibEA4.mqh"
extern int bb_period = 38; //ボリンジャーバンドの周期
extern double bb_deviation = 2.0; //ボリンジャーバンドの偏差
extern int rsi_period = 22; //RSIの周期
extern int StartHour = 14; //開始時刻(時)
extern int StartMin = 30; //開始時刻(分)
extern int TradeMin = 360; //フィルタ期間(分)
extern double Lots = 0.1; //売買ロット数
//ティック時実行関数
void OnTick()
{
int sig_entry = EntrySignal(); //仕掛けシグナル
int sig_filter = FilterSignal(sig_entry); //タイムフィルタ
//成行売買
MyOrderSendMarket(sig_filter, sig_entry, Lots);
}
//仕掛けシグナル関数
int EntrySignal()
{
//1本前のBBとRSI
double bbU_value = iBands(_Symbol,0,bb_period,bb_deviation,0,PRICE_CLOSE,MODE_UPPER,1);
double bbL_value = iBands(_Symbol,0,bb_period,bb_deviation,0,PRICE_CLOSE,MODE_LOWER,1);
double rsi_value = iRSI(_Symbol,0,rsi_period,PRICE_CLOSE,1);
int ret = 0; //シグナルの初期化
//買いシグナル
if(bbU_value > Low[0] && rsi_value < 30) ret = 1;
//売りシグナル
if(bbL_value < High[0] && rsi_value > 70) ret = -1;
return ret; //シグナルの出力
}
//フィルタ関数
int FilterSignal(int signal)
{
//開始時刻の作成
MqlDateTime dt;
TimeToStruct(TimeCurrent(), dt);
dt.hour = StartHour;
dt.min = StartMin;
dt.sec = 0;
datetime StartTime = StructToTime(dt);
int ret = 0; //シグナルの初期化
//売買シグナルのフィルタ
if(TimeCurrent() >= StartTime && TimeCurrent() < StartTime+TradeMin*60) ret = signal;
return ret; //シグナルの出力
}

BBR_Expert.mq4

#include "../Libraries/LibEA4.mqh"
#property copyright "Copyright 2018, WIZSYS Networks Corp."
#property link "https://www.wizsys.net"
#property version "1.00"
#property strict
extern int bb_period = 38; //ボリンジャーバンドの周期
extern double bb_deviation = 2.0; //ボリンジャーバンドの偏差
extern int rsi_period = 22; //RSIの周期
extern double Lots = 0.1; //売買ロット数
//ティック時実行関数
void OnTick()
{
int sig_entry = EntrySignal(); //仕掛けシグナル
//成行売買
MyOrderSendMarket(sig_entry, sig_entry, Lots);
}
//仕掛けシグナル関数
int EntrySignal()
{
double bbH_value = iBands(_Symbol,0,bb_period,bb_deviation,0,PRICE_CLOSE,MODE_UPPER,1);
double bbL_value = iBands(_Symbol,0,bb_period,bb_deviation,0,PRICE_CLOSE,MODE_LOWER,1);
double rsi_value = iRSI(_Symbol,0,rsi_period,PRICE_CLOSE,1);
int ret = 0; //シグナルの初期化
//売りシグナル
if(bbH_value < High[0] && rsi_value > 70) ret = -1;
//買いシグナル
if(bbL_value > Low[0] && rsi_value < 30) ret = 1;
return ret; //シグナルの出力
}

EAの作成が簡単になるライブラリー

豊嶋久道氏のKindle版で出版されている「新MT4対応ライブラリーによるメタトレーダーEA実践プログラミング」にある例題と練習問題でEAプログラミングがじっくり学べます。しかし、バックテストをしてみるとほとんどのEAは利益を出すレベルのものではないことがわかります。EAの作成が単純な形式に従うだけで簡単になるライブラリーとしては大変便利だと思うのでおすすめです。

BBR_Indicator.mq4

#property copyright "Copyright 2017, WIZSYS Networks Corp."
#property link "https://www.wizsys.net/"
#property version "1.01"
#property strict
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 clrBlue
#property indicator_color2 clrRed
#property indicator_width1 1
#property indicator_width2 1
//--- input parameters
extern int bb_period = 38; //ボリンジャーバンドの周期
extern double bb_deviation = 2.0; //ボリンジャーバンドの偏差
extern int rsi_period = 22; //RSIの周期
double up[];
double down[];
// Custom indicator initialization function
int OnInit()
{
//--- indicator buffers mapping
SetIndexBuffer(0,up);
SetIndexStyle(0,DRAW_ARROW);
SetIndexArrow(0,233);
SetIndexLabel(0,"Up Arrow");
SetIndexBuffer(1,down);
SetIndexStyle(1,DRAW_ARROW);
SetIndexArrow(1,234);
SetIndexLabel(1,"Down Arrow");
//---
return(INIT_SUCCEEDED);
}
// Custom indicator iteration function
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[])
{
//---
int limit = rates_total - prev_calculated;
if(prev_calculated==0)limit--;
for(int i=0;i<limit;i++)
{
double bbU_value = iBands(_Symbol,0,bb_period,bb_deviation,0,PRICE_CLOSE,MODE_UPPER,i);
double bbL_value = iBands(_Symbol,0,bb_period,bb_deviation,0,PRICE_CLOSE,MODE_LOWER,i);
double rsi_value = iRSI(_Symbol,0,rsi_period,PRICE_CLOSE,i);
if(bbL_value < High[i] && rsi_value > 70)
down[i]=High[i];
else if(bbU_value > Low[i] && rsi_value < 30)
up[i]=Low[i];
}
//--- return value of prev_calculated for next call
return(rates_total-1);
}
//+------------------------------------------------------------------+

リペイントする指標にGood bye!

後から見て素晴らしいと思う指標は殆どがリペイントする。実際のトレードにリペイントする指標は使えない。判断を誤らせる。ということでこのサイト自体をリペイントしてリペイントするインジのコードを削除しました。

メリーゴーランドのに乗るのは楽しいけれどトレンド系の景色に飽きたので、次なるメリーゴーランドに進むべくオシレーター指標を探索したいと思います。聖杯探しの旅は続く。

<MT4でのテクニカル分析指標の分類>

  • トレンド系…Bollinger Bands,Moving Average,Ichimoku Kinko Hyo,Average Directional Movemaent Index
  • オシレーター系…Bears Power,Commodity Cannel Index,DeMarker,Force Index,MACD,Momentaum,Moving Average of Oscillator,Relative Strength  Index,Relative Vigor Index,Stochastic Osillator,Williams’Percent Range
  • ボリューム系…Accumulation/Distribution,Money Flow Index,On Balance Volume,Volumes
  • ビル・ウィリアム系…Awesome Oscillator,Accelerator Oscillator,Alligator,Fractals,Gator Oscillator,Market Facillitation Index

間違わないインジケーター

には手品の種がやっぱりあるようです。MetaEditerの図書館でコード漁りしていたら1本めからまけたなあと思わせる3_Level_ZZ_Semafor.mq4というインジケーターを見つけて自作の気持ちが折れそうになったんだけど、カキコ見たらやっぱりリペイントするみたいです。後から見ると完璧なインジケーターにリペイントはつきものなのかも知れません。1,2,3のレベルを書き変えるようなのです。

追記:良く見てたらレベルだけじゃなく。バー超えて移動もするようでやっぱりこれは手品ですね。間違わないインジケーターより時々間違う手品なしのインジケーターの方が有用性あると思います。2018年1月22日

BBインジケーター

同じところをぐるぐる回って目が回る。メリーゴーランド回ってるだけじゃどこにも行けないけれど乗ってるだけで結構楽しい。自分の感覚としっくりこないインジケーターは作りたくない。いろいろと試みるがうまくいかない。下手な考え休むに似たり。なんのことないシンプルなボリンジャーバンドの上下を超えた時にサインを出すインジケーターだけが実践で使えそうです。小さきことは良きことかな。サインを判断するのは結局人間ということで良いような気がしますが、やっぱりEA化出来るようなものを作りたいものです。

 

BB_Indicator.mq4

#property copyright "Copyright 2017, WIZSYS Networks Corp."
#property link "https://www.wizsys.net/"
#property version "1.01"
#property strict
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 clrBlue
#property indicator_color2 clrRed
#property indicator_width1 1
#property indicator_width2 1
//--- input parameters
extern int bb_peirod = 38; //ボリンジャーバンドの周期
extern double bb_deviation = 2.0; //ボリンジャーバンドの偏差
double up[];
double down[];
// Custom indicator initialization function
int OnInit()
{
//--- indicator buffers mapping
SetIndexBuffer(0,up);
SetIndexStyle(0,DRAW_ARROW);
SetIndexArrow(0,233);
SetIndexLabel(0,"Up Arrow");
SetIndexBuffer(1,down);
SetIndexStyle(1,DRAW_ARROW);
SetIndexArrow(1,234);
SetIndexLabel(1,"Down Arrow");
//---
return(INIT_SUCCEEDED);
}
// Custom indicator iteration function
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[])
{
//---
int limit = rates_total - prev_calculated;
if(prev_calculated==0)limit--;
for(int i=0;i<limit;i++)
{
double bBU_value = iBands(_Symbol,0,bb_peirod,bb_deviation,0,PRICE_CLOSE,MODE_UPPER,i);
double bBL_value = iBands(_Symbol,0,bb_peirod,bb_deviation,0,PRICE_CLOSE,MODE_LOWER,i);
if(bBU_value < High[i]) up[i]=Low[i]; else if(bBL_value > Low[i])
down[i]=High[i];
}
//--- return value of prev_calculated for next call
return(rates_total-1);
}