2009/04/17

Mizutoriをカスタマイズ!


ご無沙汰しております。
今回の課題は、『なぜこのEAの取引数が、サーバー(取引業者)によって異なるか?』です。
※この内容は、私の憶測です。

大きく分けると4つの要因が考えられます。
①サーバー(取引業者)によって微妙にデータが違い、それが原因となり注文処理が行われずスルーするのではないか?
②サーバー(取引業者)との接続状況もしくはサーバーの処理状況が悪く、本来1Pips毎に送られてくるデータが数Pipsまとめて送られてくる場合に注文処理がスルーするのではないか?
③こちらからは、注文オーダーを出したにも関わらず、サーバー(取引業者)で受け付けてもらえなかったからではないか?(この要因は、今回対象外としておきます。)
※ちなみに『OFF QUOTES エラーについて by FXDD
④PCの処理途中にpipsの更新があり、対応できない場合に注文処理がスルーするのではないか?(この要因は、今回対象外としておきます。)

2つの要因に対する解決策(?)は?
①に対しては、オリジナルのデータを元に、パラメーターの調整をすることで対応する方法がベターかもしれません。
②を今回のテーマと位置づけて考えてみました。
A)まずこのEAの取引条件の要の2つの条件を考えてみます。
1.『上部の乖離線を売値が越えたら売り!』若しくは、『下部の乖離線を買値が下回ったら買い!』としています。
 2.上記かつ、『RSI【(期間14)終値】が(ある数値を越えたら売りorある数値を下回ったら買い)としています。
※つまり、データがまとめて配信され、その中の一部のデータが、取引条件を超えていても
まとめられたデータの最後の値が、取引条件に達していなければ取引は成立しません。
これが、接続状況及びサーバー処理状況による取引回数が減る要因だと考えました。
B)上記の対策として、以下のように取引条件を変更してみました。
1.『上部の乖離線を現在のバーの高値が越えたら売り!』若しくは、『下部の乖離線を現在のバーの安値が下回ったら買い!』
 2.上記かつ、『RSI【(期間14)終値「ただし、現在のバーのみ高値or安値」】が(ある数値を越えたら売りorある数値を下回ったら買い)
C)上記の内容にしたらどうなるか?
利点:『新しいバーが作成されるか、または、注文オーダーが通るまで注文シグナルを送り続けます。』
欠点:『注文は処理されたが、予定値と実際の注文値に開きが生じる可能性がある。』

では、どの様に実装すればよいか?を以下に掲示しておきます。
①まず、『MQL4からRSIの指標を入手し指標のフォルダーに格納』 iRSIの代わりに使用します。
②次に、EAを開き以下のコードを追加する。
【指標の計算の変更(RSI期間14の場合)】
//RSI = iRSI(NULL,0,14,PRICE_CLOSE,0); 『要らないコードの削除もしくはコメント化』
double Hi_RSI;
double Lw_RSI;
double sump=0,sumn=0,rel=0;
double positive=0;
double negative=0;
double B_positive = iCustom(NULL,0,"RSI",1,1);
double B_negative = iCustom(NULL,0,"RSI",2,1);
//Hi_RSI用
rel=High[0]-Close[1];
if(rel>0) sump=rel;
else sumn=-rel;
positive=(B_positive*13+sump)/14;
negative=(B_negative*13+sumn)/14;
if(negative==0.0) Hi_RSI=0.0;
else Hi_RSI=100.0-100.0/(1+positive/negative);
//Lw_RSI用
sump=0;sumn=0;
rel=Low[0]-Close[1];
if(rel>0) sump=rel;
else sumn=-rel;
positive=(B_positive*13+sump)/14;
negative=(B_negative*13+sumn)/14;
if(negative==0.0) Lw_RSI=0.0;
else Lw_RSI=100.0-100.0/(1+positive/negative);
【条件式記入場所】(参考)
(BUY)
if(
(!OderStop)
&&(pos1<Max_Position)
&&(st>=Xox)
&&(Lw_RSI<=RSILowLimt)【RSIをLw_RSIに変更】
&&(MaLow>=Low[0]) 【AskをLow[0]に変更】
&&(ATR<=ATRLimt)
&&((Ask<=(LastPrice-(PipStep*Point)))||pos1==0)【お好みで、ASKをLow[0]に変更】
)Buy_Flag = true;

(SELL)
if(
(!OderStop)
&&(pos2<Max_Position)
&&(st>=Xox)
&&(Hi_RSI>=RSIHiLimt)【RSIをHi_RSIに変更】
&&(ATR<=ATRLimt)
&&(MaHi<=High[0]) 【BidをHigh[0]に変更】
&&((Bid>=(LastPrice+(PipStep*Point)))||pos2==0)【お好みでBidをHigh[0]に変更】
)Sell_Flag = true;

こんな感じになります。

まとめ
本来は、フォームに掲載するような内容ですが、ブログの更新のために使用させて頂きました。
また、お決まりのように、フォワードテスト等をしておりませんので、ご使用される方は、『人柱覚悟!』でお願いします。
では!