MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 589

 
Alexey Viktorov:

1.チェックと言ったのであって、交換ではない。iFractals はフラクタルがないときは 0 を返します。普段から使っているわけではないので、当然そんな雑学で乾いていない記憶の残骸を詰まらせることはないのだが。

2.この機能は、ひどい書き方ではありますが、今でもきちんと動作しています。

3.最後の値はCommentに表示されます。と置き換えてください。

を印刷し、何回印刷されるか見てみましょう。

たくさんありますが、決して嘘ではありません。まるで常に条件が満たされているかのように。しかし、それは偽りのものであるはずだ。

 
Ghabo:

たくさんありますが、決して嘘ではありません。まるで、常に条件が満たされているかのように。しかし、それはfalseであるべきで、スクリーンショットでは、状況は条件に矛盾するが、trueである。


スクリーンショットでは 1 番目のフラクタルと 2 番目のフラクタルに印がついています。しかし、条件に従って、この関数は最初のものの下にあるものを見つけるまでさらに検索を続けます。そして、4番目のフラクタルは1番目のフラクタルより低い...。というのが条件のようです。

という条件を補う場合。

      if(f!=0) 
        {
        fr2=NormalizeDouble(f, d);
        if(fr2<fr1)
         return(true);
          else break;
        }

これもfalseと表示されます。

 
Alexey Viktorov:

スクリーンショットでは、1つ目のフラクタルと2つ目のフラクタルに印がついています。しかし、条件に従って、この関数は最初のものの下にあるものを見つけるまでさらに検索を続けます。そして、4番目のフラクタルは1番目のフラクタルより低い...。というのが条件のようです。

条件が追加された場合

これもfalseと表示されます。

状態を反転させる
 if(fr2>fr1) return(true);
        else break;

false を表示するが、条件は満たされている。

aqa1

 

2サイクル目は必ず1サイクル目で見つけたフラクタルの価格を返します。

   for(i=nf+ num_bar; i<k; i++) 
     {
      fx=iFractals(sy,tf,MODE_UPPER,i);
      if(fx!=EMPTY_VALUE) 
        {
        fr2=NormalizeDouble(fx, d);
        return(NormalizeDouble(fr2, d));
        //if(fr2>fr1) return(true);
        //else break;
        }
     }
 
Ghabo:

2サイクル目は必ず1サイクル目で見つけたフラクタルの価格を返します。

あなたは論理に問題があるようですね。

検索する順番を簡単な言葉で表現してみる。すべて正しく書けたかどうか、考えてみてください。そして、見つかったフラクタルについて、シリアルナンバーで価格を返すような検索機能を作ってください。そうして、配列番号で指定したフラクタルの正しい価格が返ってきたら、すぐに次のフラクタルの価格を求めるロジックを作り始めましょう(このとき、すでにその価格を返す関数があるはずです)。そして、あとはその価格を比較するだけです。

そして、すべてを一度に山ほど作るのです。

 

もしかしたら、私が仕組みを誤解しているのかも?

まず、MAの上にある最初のフラクタル(スクリーンショットでは#1と表示されています)を見つけました。

int    i,k=iBars(sy,tf),kf,num_bar;

   for(i=nf+2; i<k; i++) 
     {
      f=iFractals(sy,tf,MODE_UPPER,i);
      MA=iMA(NULL,0,35,0,MODE_EMA,PRICE_CLOSE,i);
      if(f!=EMPTY_VALUE) 
        {
        // kf++;
         if(f>MA) {num_bar=i; fr1=NormalizeDouble(f, d);break;}
         
        }
     }

私はそこから、さらに歴史の中にある、最初のフラクタル(スクリーンショットでは2番と記されている)を見ている。フラクタルNo.2がフラクタルNo.1より大きければ、真を返す。

      for(i=nf+ num_bar; i<k; i++) 
     {
      fx=iFractals(sy,tf,MODE_UPPER,i);
      if(fx!=EMPTY_VALUE) 
        {
        fr2=NormalizeDouble(fx, d);
        if(fr2>fr1) return(true);
        else break;
        }
     }

すべて正しいですか?

aq11

 
Artyom Trishkin:

は、そのシーケンス番号で見つかったフラクタルの価格を返します。

数値ではなく、フラクタルがMAを上回っているという条件で検索しています。 最初のループでこのフラクタルの価格が変数「fr1」に正しく書き込まれています。

もちろん私が正しく理解していれば、問題は2番目のループにあります。フラクタル数2の価格が見つからない理由は不明である。

 
Ghabo:

数値ではなく、フラクタルがMAを上回ったという条件で検索しています。 このフラクタルが1サイクル目の価格は、変数「fr1」に正しく書き込まれます。

もちろん私が正しく理解していれば、問題は2番目のループにあります。フラクタル数2の価格が見つからないのは理解できない。

ロジックを全部言い直さないといけないんです。自分で考えられることはありますか?

1.最初のループでは、MAの上にフラクタルがあることがわかります。バーの番号はnum_bar変数に書き込まれます(スクリーンショットではバー#11)。

2.2番目のループでは、条件を満たす2番目のフラクタルの検索を開始します。num_barから検索を開始する...つまり、nfが0なので、11番のバーからです。

3.フラクタルが発見される。前の値と同じになります。条件には > と < が含まれますが、等しくないため、条件は満たされません。を設定すれば、同じようなちんぷんかんぷんな話が、向こうからやってくるのです。

おそらく、次のバーnum_bar+1あるいは+2から2番目のフラクタルが検索されるはずである。

 
Alexey Viktorov:

すべてのロジックは、あなたに語り継がれなければならないのです。自分で考えられることはありますか?

1.最初のサイクルでは、MAの上にフラクタルがあることがわかります。バーの番号はnum_bar変数に書き込まれます(スクリーンショットではバー#11)。

2.2回目のループでは、条件を満たす2つ目のフラクタルの検索を開始します。num_barから検索を開始する...すなわち、nfがゼロに等しいので、バー#11から。

3.フラクタルが発見される。前の値と同じになります。というのも、この条件では、>の次に<があり、等しくないからです。を設定すると、同じようにゴミが発生しますが、反対側から見ると。

おそらく、次のバーnum_bar+1あるいは+2から2番目のフラクタルがないか探すべきでしょう。

一般的に、最初の2段落のアクションは、私はそれを声にしています)。

num_bar+1」については、ありがとうございます。

最小値がわからない。

条件を満たさない、矢印を設定、満たすを設定しない。

条件は、MAがクロスしたローソクの最小値からiLowestの 最小値までの距離が100以上であれば、矢印をつけるというものです。

   if(limit>60)limit=60;
   for(int i=limit; i>0; i--)
     {
      M11=iMA(NULL,0,period,shift_,method,price,i+1);
      if(open[i+1]>M11 && close[i+1]<M11){time_1=time[i+1];}

      indexS1=iBarShift(NULL,PERIOD_CURRENT,time_1,false);

      if(open[i+1]<M11 && close[i+1]>M11){time_2=time[i+1];}

      indexS2=iBarShift(NULL,PERIOD_CURRENT,time_2,false);

      //
      double val=0;
      //--- расчет минимального значения цены на indexS1 последовательных барах 
      //--- с индекса indexS2 по индекс indexS1 включительно на текущем графике 
      int val_index=iLowest(NULL,0,MODE_LOW,indexS1,i+indexS2);
      if(val_index!=-1) val=Low[val_index];
      else PrintFormat("Ошибка вызова iLowest. Код ошибки=%d",GetLastError());

      if(low[indexS1]-val>=100*Point)
        {
        BufferPointDn1[i]=high[i];
        }
      //
     }

BからAに向かうとCの最小値を見つけることができる。

A-C=100pipsの地点Bで、矢印を置く必要があります。

なぜ、そうしないのか?

ローワン

 
Ghabo:

一般的に、最初の2段落のアクションは、私はそう言った)

2点目については、少し間違っています。どこから見て、いつどのような価値を得るのかが定義されていないのです。そして、もう少し遠くまで探した方がいいと思わせる内容です。

ガボ

最小値を見つけることができない。

条件を満たしていない、矢印が設定されている、条件が満たされていない。

条件としては、ローソク足がMAとクロスした最小値からiLowestの最小値までの距離が100以上であれば、矢印をつけるというものです。

BからAに向かうとCの最小値を見つけることができる。

A-C=100pipsの地点Bで、矢印を置く必要があります。

なぜ載せないのでしょうか?

このコードも何かロジックが掴みにくいですね。

最低限、変数 indexS1とindexS2がどこでどのように定義されて いるか、そしてそれらが毎ティックごとにリセットされるかどうかを知る必要があります。

また、МАの交差が隙間に挟まれるとどうなるのでしょうか?


そしてもうひとつ、デバッガの使い方はご存じですか?