2009/01/23

後出しじゃんけん。

時々有能であろうと思われる指標(インジケーター)に出会う。
しかし、検証してみると、後出ジャンケンをしていることが多い。
代表的なのに【ZigZag.mq4】がある。
この指標は、確定した物を見ると確実に高値と安値を導き出している。
なぜか? それは、高値および安値が更新されるたびに、更新していくから。
少なからず【MODE_CLOSE(終値)shift=0(現在のバー)】を用いた指標は、その傾向がある。
指標のさきっぽが、値が動くたびに動く現象
これは、EAにとって致命的な現象を引き起こすことがある。
その現象とは、バックテストとリアルトレードとの成績のズレを作りだすもの。
ほとんどが、利益を削減させる原因となる。
なぜ? 原因は、終値位置の違いがあるため。
現在のバーの終値は、リアルでは、終値が確定するまで現在の値を意味する。
バックテストの場合、最少の値が利用できるとしても、1分足の初値・高値・安値・終値の計4つ。
5分足で考えるなら、【5×4=20個】リアルの平均ティック数を50としても2/5のクオリティー、 まして、急激な変動があればティック数は、200を超える。その時1/10以下のクオリティーとなる。
バックテストは、オーダーを取らなかったのに、リアルトレードでは、オーダーを取得することも考えられる。 現在よりもちょっと先のデータを利用してテストしていると考えた方がいい。
 (後出しジャンケンが発生する) では、どうすればいいか? 確定した、最も新しい値(OPEN[0]現在の初値)を利用するのがいいだろう。 しかし、チャンスが低減する可能もある。

2009/01/22

繰り返し関数

MQL4の中には、2つの繰り返し関数が収録されています。
for( )と②while( )です。
まず、 ①for()関数の説明です。
よく、【for(i=0;i<=100;i++)】というコードを見ると思います。
これは、この後に続くコードをi=0からiが100以下の間繰り返すことを意味します。
※i++とは繰り返しが終わるごとにiに1を足していくことを意味します。
コードを書き換えるならば、『i=i+1』となります。
サンプル for(i=5;i>0;i--) { k=k+i } サンプルの答えは、『K=5+4+3+2+1=15』となります。
for()の( )の中身は、決まり事があります。
それは、(;;)セミコロンを2つ入れなければならないことです。
例) for(;;) { K=K+1 } と書くことができます。
しかし、このコードを使用すると、無限ループが起こります。
終了条件がないからです。
たとえば、  if(K==5)break; という文を追加します。
この分の意味は、kが5になったら繰り返すことをやめてくれというものです。
ちなみに、繰り返し関数の中によく使われるコードとして、以下の3種類があり、よく混乱しますので覚えていた方がいいものです。
break: (繰り返しなどから)脱出する。
continue;(繰り返しなどを) スキップする。
  return(); (自作関数などを)終了し( )内の数値を返す。
  (0)の場合は、そのまま終了という意味です。
例) for(i=0;i<=10;i++) { if(i==3)continue; K=K+i if(K==6)break;  }
答えは、K=0+1+2+スキップ+4+5+6+7+8+9+10=52になります。
※kが6になることがなかったために途中で脱出しませんでした。
(例題か?) これが、for()の繰り返し関数の基本です。
次に・・・・・・ ②while( )繰り返し関数です。
この繰り返し関数は、( )内に書かれた条件が真(true)の間繰り返しを実行するというものです。
例) int i=0; while(i<5) { k=k+i; i++; }
答えは、K=0+1+2+3+4=10です。
よくやってしまうのが、『i++;』を忘れてしまい無限ループになってしまう事と、while( )の( )内の条件がはじめから偽(false)になっていることで、処理されないことです。
※上記の条件で間違いがあっても、コンパイル時にエラーが出ません。
 そのため、無限ループに陥るか、処理しないコードになります。
後は、for()繰り返し関数と同じです。
では、なぜこの2つが収録されているのでしょうか?
※これは私の経験からこのように納得しています。 繰り返し関数の中に繰り返し関数を入れる場合、for()関数の中にfor()関数を入れても処理されません。
そのため、while()関数の中にfor()関数を入れるようなことを行うためにあるのだと理解しています。 (ごめんなさいこの内容には自信がありません) 今日は、ここまでです。