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

 

1.こんな質問があります、メモリを通して配列の要素を 削除するにはどうしたらいいでしょうか、今のところ私はループを通して数学的に配列をシフトして要素を削除していますが、mql4では可能でしょうか。もし可能であれば、1次元の配列でどのように行うか、例を挙げてください。

2.また、どちらの方法がより高性能になるかを考慮すると、私はメモリを介して削除する場合、不要な要素を持つセグメントを切り出し、配列が減少し、その数は、削除項目の値によって減少し、配列の次の使用では、我々は元の状態に配列を復元する必要があります、私は数学的方法を介して削除した場合、サイクルの処理は、変数に値を割り当てるために一定の計算が含まれて、これは、プログラムに影響を与える?

 
Seric29:

1.こんな質問があります、メモリを通して配列の要素を 削除するにはどうしたらいいでしょうか、今のところ私はループを通して数学的に配列をシフトして要素を削除していますが、mql4では可能でしょうか。もし可能であれば、1次元の配列でどのように行うか、例を挙げてください。

2.また、メモリ経由で削除する場合、不要な要素で配列を切り出すと、配列が減少し、その数は削除項目の値によって減少し、配列の次の使用で、我々は元の状態に配列を復元する必要があることを考慮して、より高性能になる方法は、数学的手法、変数に値を割り当てるために一定の計算を含むサイクルの処理、順番にプログラムに影響しますか?

配列を「自分自身に」コピーし、不要な要素の数だけサイズを小さくするだけです。

1つの要素を挿入するには、サイズを大きくして、再度「自分自身」にコピーし、空いたスペースに希望の値を貼り付けるだけです。

 
Alexey Viktorov:

配列を「自分自身に」コピーし、不要な要素の数だけ配列のサイズを小さくすればよいのです。

1つの要素を挿入するには、サイズを大きくして、再度「自分自身」にコピーし、空いたスペースに目的の値を挿入するだけです。

3次元の配列をコピー関数に挿入してみましたが、エラーは出ませんので、この関数は異次元の配列でも動作するか、単に異次元用の複製を持つだけです。結論から言うと、この関数はシフト関数の代わりに使える、自分で書く必要はない、もっと早く思いつけばよかった、配列を 自分自身にコピー するのはいかにも危険だ、結果が定義されていない可能性があると書かれているのである。

 
Seric29:

コピー関数に3次元の配列を挿入してみましたが、エラーは出ませんでしたので、この関数は異次元の配列でも動作するか、単に異次元用の複製を持つだけです。結論から言うと、この関数はシフト関数の代わりに使える、自分で書く必要はない、もっと早く思いつけばよかった、配列を自分自身にコピーするのはいかにも危険だ、結果が定義されていない可能性があると書かれているのである。

多次元配列を コピーする場合、2次元目以降の次元を考慮する必要があります。これは、コピーするときにどれだけずらすかを決めるものです。簡単に言うと、実験で理解したように、多次元配列のすべての値は、"1行 "に並んだ後、"列ごとに "また並べられるということです。

すべてにおいて、今さら理論を語りつくせない。使う必要があれば、もう一度確認する必要がありますね。

 
Alexey Viktorov:

多次元配列を コピーする場合、2次元目以降の次元を考慮する必要があります。これは、コピー時のシフト量を決定するものです。簡単に言うと、実験で理解したように、多次元配列のすべての値は「1行」に並び、「列ごとに...」にまた並びます。

一般論としては、今さら語りつくせません。ここでも使う必要性があるかどうか確認する必要があります。

C++では、このような違いはありません。

   вывести в консоль massiv[0][0][0]
   или так
   вывести в консоль massiv[0]

のいずれかに該当する場合は、出力されます。なぜなら、それらは1つのメモリブロックにあり、C++はそれらに直接アクセスするからです。一方、私たちのシェルではメモリアクセスは閉じており、異なる次元の配列を関数に正しく渡す方法はありませんし、この方法でアドレス指定もできません。唯一のニュアンスは、C++の多次元配列は動的メモリに配置されており、おそらく散在していますが、誰も電子地図を見たことがない、ということです。では、多次元配列を概念でコピーすること自体が微妙な問題なのか、それとも正しく動作しないのか。

 
投資用パスワードでログインしたのか、取引用パスワードでログインしたのかをプログラムで判断するにはどうしたらいいですか?
 

MQL5で実行されないコードがインジケータにあります。

void KValues(int i)
  {
   vhigh = 0; vlow = High[i];
   int limit = i + (int)kperiod;
   for(int a = i; a < limit; a++)
     {
      vhigh = ((price == STO_LOWHIGH ? High[a] : Close[a]) > vhigh ? (price == STO_LOWHIGH ? High[a] : Close[a]) : vhigh);
      vlow  = ((price == STO_LOWHIGH ? Low[a] : Close[a]) < vlow ? (price == STO_LOWHIGH ? Low[a] : Close[a]) : vlow);
     };
  }

つまり、価格 == STO_LOWHIGH の場合はすべて正しく動作しますが、価格 == STO_CLOSECLOSE の場合は、スタティック変数にのみ 代入されます。

vhigh = 0; vlow = High[i];

...ループ回避

 
Alexandr Sokolov:

MQL5で実行されないコードがインジケータにあります。

ポイントは、price == STO_LOWHIGHの 場合はすべて正しく動作しますが、price == STO_CLOSECLOSEの場合はスタティック変数にのみ 代入される点です。

...ループ回避

括弧が何かおかしい。私見ですが、ここでは全く必要ありません。どれも全く必要ありません。

せめてクエスチョンマークの前にあるハイライトされたものを左に移動してください。

void KValues(int i)
  {
   vhigh = 0; vlow = High[i];
   int limit = i + (int)kperiod;
   for(int a = i; a < limit; a++)
     {
      vhigh = ((price == STO_LOWHIGH ? High[a] : Close[a]) > vhigh ? (price == STO_LOWHIGH ? High[a] : Close[a]) : vhigh);
      vlow  = ((price == STO_LOWHIGH ? Low[a] : Close[a]) < vlow ? (price == STO_LOWHIGH ? Low[a] : Close[a]) : vlow);
     };
  }

一般的には、?:演算子はif elseと同等であることを理解すればよいでしょう。

1つの条件が2回ありますね。このような条件であれば、十分です

vhigh = price == STO_LOWHIGH ? High[a] : Close[a];
vlow  = price == STO_LOWHIGH ? Low[a] : Close[a];
あるいは、何を言いたいのか理解できない。
 
Alexey Viktorov:

ブラケットがおかしい。私見ですが、ここでは全く必要ありません。どれもこれも、です。

せめてハイライトされているものをクエスチョンマークの前に左に移動してください。

一般的には、?:演算子はif elseと同等であることを理解すればよいでしょう。

1つの条件が2回ありますね。そのような条件であれば十分です。

あるいは、何を言いたいのか理解できない。

K期間内にLow/HighとClose/Closeで通常のmaxHighとminLowストキャスティクスを取得したい。

初期化中のLow/Highは正常に動作するが、Close/Closeは正常に動作しない

 
Alexey Viktorov:

ブラケットがおかしい。私見ですが、ここでは全く必要ありません。どれもこれも、です。

せめてハイライトされているものをクエスチョンマークの前に左に移動してください。

一般的には、?:演算子はif elseと同等であることを理解すればよいでしょう。

1つの条件が2回ありますね。そんな条件で十分です。

あるいは、何を言いたいのか理解できない。

すぐには理解できなかったけど、このことなら

void KValues(int i)
  {
   vhigh = 0; vlow = High[i];
   int limit = i + (int)kperiod;
   for(int a = i; a < limit; a++)
     {
      vhigh = ((price == STO_LOWHIGH) ? High[a] : Close[a] > vhigh ? (price == STO_LOWHIGH) ? High[a] : Close[a] : vhigh);
      vlow  = ((price == STO_LOWHIGH) ? Low[a] : Close[a] < vlow ? (price == STO_LOWHIGH) ? Low[a] : Close[a] : vlow);
     };
  }

私の問題を解決してくれない。