バックテストで問題が見つかり、根本的な原因がわからない! - ページ 3

 

iHighest() は、'i' の左側または右側の期間のバーを返すのですか?

 MaxH = High[iHighest(NULL,0,MODE_HIGH,period,i)];

また、この投稿のすぐ前にある私の前回の投稿も参照して ください。

 

JollyDragonさんへ。

インジケーターの再計算をご覧いただき、ありがとうございます。

フィッシャー コードはいつも同じで、簡単に見分けることができます。

多くのインディケータがそうであるように、このコードはデータを再投入するだけです(彼らはバー1、2、3の過去の値を保存します)。

 for(i=limit-1; i>=0; i--)
     {
      MaxH = High[iHighest(NULL,0,MODE_HIGH,Solar_period,i)];
      MinL = Low[iLowest(NULL,0,MODE_LOW,Solar_period,i)];
      price = (High[i]+Low[i])/2;
      Value = 0.33*2*((price-MinL)/(MaxH-MinL)-0.5) + 0.67*Value1;
      Value=MathMin(MathMax(Value,-0.999),0.999);
      ExtBuffer0[i]=0.5*MathLog((1+Value)/(1-Value))+0.5*Fish1;
      Value1=Value;
      Fish1=ExtBuffer0[i];
     
      if(ExtBuffer0[i]>0) ExtBuffer1[i]=Solar_limit;
      else ExtBuffer1[i]=-Solar_limit;
     }
 
jollydragon:

iHighest() は、'i' の左側または右側の期間のバーを返すのですか?


左側
 

ffoorrさん、GumRaiさん、ありがとう ございます。

bar1のデータを保存するコードですが、bar0の左側のバーを再計算していないことがわかります。

そのため、bar0より前のバーを再計算するコードがないため、何が原因で再描画されたのか、まだよくわかりません。

for(i=limit-1; i>=0; i--)
     {
      MaxH = High[iHighest(NULL,0,MODE_HIGH,period,i)];
      MinL = Low[iLowest(NULL,0,MODE_LOW,period,i)];
      price = (High[i]+Low[i])/2;
      Value = 0.33*2*((price-MinL)/(MaxH-MinL)-0.5) + 0.67*Value1;
      Value=MathMin(MathMax(Value,-0.999),0.999);
      ExtBuffer0[i]=0.5*MathLog((1+Value)/(1-Value))+0.5*Fish1;
      Value1=Value;
      Fish1=ExtBuffer0[i];
      if(ExtBuffer0[i]>0) ExtBuffer1[i]=10;
      else ExtBuffer1[i]=-10;
     }
 

limitにどのような値が与えられているかはわかりません。

このインジケータを右クリックして、ビンに移動させることを強くお勧めします

      ExtBuffer0[i]=0.5*MathLog((1+Value)/(1-Value))+0.5*Fish1;
      Value1=Value;
      Fish1=ExtBuffer0[i];

Fish1がグローバル変数または静的変数で、最後のバーが再計算されると仮定すると

Fish1には、i=0のときにBar[0]のデータに基づいた値が与えられます。

そして、bar[1]が再計算されるときに、bar[0]で作られたFish1の値を使って、bar[1]の値を作成します

このインジケータが何を意図しているのか分かりませんが、i barに係るデータを使って、それをそれ以前のbarで使うようなインジケータは、悪いインジケータと言えるでしょう。

 
GumRai:

リミットにどのような価値が与えられているかはわかりません。

インジケータファイル全体が添付された投稿20を参照してください。以下、再度貼り付けます。

添付ファイル
solarjoy.mq4(6.11 KB) 削除
GumRai です。

そして、bar[1]を再計算する際に、bar[0]で作成したFish1の値を使ってbar[1]の値を作成します。

このインジケータが何を意図しているのか分かりませんが、i barに係るデータを使って、それをそれ以前のbarで使うようなインジケータは、ダメなインジケータだと思います。

i'が'limit-1'から'0'に変化しているのがわかると思いますが、これはBarsの計算では左から右へ変化しています。

つまり、bar[1]で計算されたFish1の値がbar[0]の値を作るために使われているのです。逆になぜそう考えるのか?

ということで、このインジケータは、私のコード理解では、そういう悪いインジケータではないと思うのですが。

とにかく、最終的に再描画を観察して、その種の悪いインジケータであることが認められました。

しかし、自己改善として再描画を防ぐには、どのようにコードを修正すればよいのか知りたい。

for(i=limit-1; i>=0; i--)
     { 
       ...
      }
 

solar_joyと比較すると、シグナルが1本遅れていますが、同じインジケータです。

https://www.forex-tsd.com/metatrader-4/474-fisher-14.html#post214965

問題はインジケータではなく、常に変化する市場です。

あるトレンド相場で完璧なシグナルを出すインジケータが、別の相場では誤ったシグナルを出す。

StopLossとTakeProfitのどちらを使うにしても、良いインジケーターからのシグナルをフィルターにかけなければならない。

トレンド系であろうとなかろうと。


フィッシャー・インジケータは機能すると思う、ただ1つのバーが遅れて、再計算する、それは再描画しない、これは再描画する、テスターのEAにそれを入れて、あなたは見るだろう。

https://www.forex-tsd.com/ideas-suggestions/25934-bulletproof-11.html#post351354

 
jollydragon:

つまり、bar[1]で計算されたFish1の値がbar[0]の値を作るために使われるわけです。逆に考えるのはなぜでしょうか?

しかし、私が参照したコードには指値の計算が含まれておらず、他の場所に含まれているかどうかを確認するために3ページ以上見返すつもりはありませんでした。

このインジケータは、毎ティック ごとにbar[1]の再計算をしないのですね。

しかし、それでも

 ExtBuffer0[i]=0.5*MathLog((1+Value)/(1-Value))+0.5*Fish1;
 Fish1=ExtBuffer0[i];

は、閉じたバーの最初の実行で、現在のバーで行うものとは異なる計算を許可します。

新しいバーの最初のティックで何をするかというと

ExtBuffer0[0]=0.5*MathLog((1+Value)/(1-Value))+0.5*ExtBuffer0[1];

同じバーの次のティックでは、次のように計算します。

ExtBuffer0[0]=0.5*MathLog((1+Value)/(1-Value))+0.5*ExtBuffer0[0];

これは一種の複利計算です。

 

solar_joy/fischerは、再計算しないfisherと 比較して、1小節早くシグナルを出すので、これは取引可能です。

そして、1小節目と2小節目にシグナルを出し、2小節目と3小節目にシグナルがまだあるかどうかを見に行きます。

もし、シグナルが消えていたら、注文を閉じます。

  if(Joy2 <= EA_Limit && Joy1 >= EA_Limit)  open_order( OP_BUY); 
 if( (Joy3 <= EA_Limit && Joy2 >= EA_Limit)== false ) close_order( OP_BUY); 
 
ffoorr:

solar_joyと比較すると、シグナルが1本遅れていますが、同じインジケータです。

https://www.forex-tsd.com/metatrader-4/474-fisher-14.html#post214965

フィッシャー・インジケータは動作すると思いますが、1本だけ遅れて再計算され、再描画はされません。

https://www.forex-tsd.com/ideas-suggestions/25934-bulletproof-11.html#post351354


Dear ffoorr, I can't open the pages and can't access the site, www.forex-tsd.com.多分、私のインターネット設定に問題があるのでしょう。

私のコードに注目してください。メインコンテンツのコードは10行ほどしかありません。

しかし、歴史的なバーの再描画の根本的な原因を見つけるのはまだとても難しいです。

理由: