2009/02/13

Mizutori_EAのパラメーターの説明


いろいろなバージョンを作ってしまったので、今回は、25.4を基本に説明します。
共通事項
各パラメータに適用する価格は、極力初値(PRICE_OPEN)を使用しています。
理由は、バックテストした時の誤作動を防止するためです。
終値(PRICE_CLOSE)は、そのバーが確定するまで更新される値です。最新の決定された数値を得ようとすると、初値となります。
トレンドフィルター
double MaSS = iMA(NULL,0,25,0,MODE_EMA,PRICE_OPEN,0);
double MaSM = iMA(NULL,0,50,0,MODE_EMA,PRICE_OPEN,0);
double MaMS = iMA(NULL,0,100,0,MODE_EMA,PRICE_OPEN,0);
double MaMM = iMA(NULL,0,200,0,MODE_EMA,PRICE_OPEN,0);
double MaLM = iMA(NULL,0,300,0,MODE_EMA,PRICE_OPEN,0);
double MaLL = iMA(NULL,0,400,0,MODE_EMA,PRICE_OPEN,0);
上記6つの指数平滑平均線(EMA)を用いてトレンドの発生を監視しています。
各平均線がクロスすることなく、虹状態になった場合に『トレンドが発生した!』としています。
問題点
※『ダマシ』に弱いため、初期でフィルターが効かないことがある。
※『トレンドが発生していない(トレンドが消えた)部分を含んでしまう。』
メインエンジン
double Ma = iMA(NULL,0,MaPeriod,MaShift,MODE_SMA,PRICE_OPEN,0);
double Bands_Ma = iMA(NULL,0,10,0,MODE_SMA,PRICE_OPEN,0);
double Bands = Bands_Ma*(Percent/100);
double MaHi = Ma+Bands;
double MaLow = Ma-Bands;
上記の5つのコードでメインエンジンを構成している。
Maが軸となる移動平均線でデフォルト状態だと、期間5シフトをした期間10の単純移動平均線(SMA)。
Bands_Maは、バンドの巾を形成するための数値を得るための、期間0シフトの期間10の単純移動平均線(SMA)。
Bandsは、Bands_Maを用いて幅を形成しています。
MaHi・MaLowは、Maを軸にした上下の巾を形成したものです。
問題点
※Percentを固定しているため、極端な値動き、値動きが少ない時などの分別が付かない。また、USDJPYM5に特化した数値のため他の通貨ペアに対応しづらい。
サブエンジン
double MaHi_Tr = Ma*(1+Percent_Tr/100);
double MaLow_Tr = Ma*(1-Percent_Tr/100);
メインエンジンに同じ。ただし、使用目的に合わせるために、Percentをメインエンジンと異なる仕様にできるようにしてあります。
期間内の高値と安値の抽出
double HiLimt = High[iHighest(NULL,0,MODE_CLOSE,LimtPeriod,0)];
double LowLimt = Low[iLowest(NULL,0,MODE_CLOSE,LimtPeriod,0)];
LimtPeriod期間内の最も高い(低い)終値がついたバーの高値(安値)をHiLimt/LowLimtに格納
※敗戦処理及びXoxの計算に使用します。
期間内の最高値(最安値)を使用しない理由は、極度に長い髭(瞬間的に付けた値)を回避するためです。
問題点
現在のところ、特にありません。
その他のパラメーター
double RSI = iRSI(NULL,0,14,PRICE_CLOSE,0);
※終値を利用した、期間14のRSI(Relative Strength Index)(相対力指数)

double Dv = iStdDev(NULL,PERIOD_H4,Dv_Period,0,MODE_EMA,PRICE_CLOSE,0);
※終値を利用した、4時間足での標準偏差で、グローバルに値が動いた時のフィルターとして使用しています。
double ATR = iATR(NULL,0,ATRPeriod,0);
※突発的な値動きがあった時のフィルターとして使用しています。
問題点
以下のようなコードの指標のため、バックテストでフィルターが作用し、リアルでは効かない可能性があります。
※ATR (Average True Range)の内部コード
double high=High[i];
double low =Low[i];
double prevclose=Close[i+1];
TempBuffer[i]=MathMax(high,prevclose)-MathMin(low,prevclose)
【高値[0]と終値[1]の高い方から安値[0]と終値の低い方を引いた数値をTempBufferに格納
AtrBuffer[i]=iMAOnArray(TempBuffer,Bars,AtrPeriod,0,MODE_SMA,i);
【TempBufferの期間(デフォルトなら2)の平均がATRの数値となります。】
double stb = iMA(NULL,0,MaLimtPeriod,MaLimtShift,MODE_SMMA,PRICE_OPEN,0);
double st=(HiLimt-LowLimt)/(stb/100);⇒100×((HiLimt-LowLimt)/stb )と置き換えます。
※変動係数(本来は、標準偏差/平均値を意味します。)を求め変動係数が小さい時は、内部エネルギーが蓄積されたと判定し、トレードを制限するために使用します。
※stbは、期間(デフォルト500)の平滑移動平均線で、軸となる価格を抽出するために使用しています。
※stは、高低差を軸となる価格で割ったものを100倍した【変動係数】を格納するものです。
参考
下記の式が上記式に近似します。(添付Bora指標参照:青が下記の指標、白が上記指標です。)
double st=MathLog(HiLimt/LowLimt)*100;
※たぶん、logを使用した方が、本来の意味に近づくと思っています。(USDJPYでは、(HiLimt-LowLimt)/(stb/100)がフィットしています。)
ちなみに LogA=e^Aです。
まとめ
大きなトレンドを避けて、逆張りを行っていけばある程度の成績が可能になると思います。
また、追加もしくは削除しなければならない指標があることでしょう。
フィルターを締め付けると、ほとんど取引をしなくなり、緩めると大きな損益が発生しますので注意してください。
それでは・・・。