オープンポジションをグループ分けする - ページ 4

 
Alexey Viktorov:

配列を「自分の中に」コピーし、削除する配列の隣の位置から書き込みます。そして、Grigori.S.Bが提案したようにリサイズします。

興味深いことに、私の理解が正しければ、この機能を使用する必要があるのでしょうか?

int  ArrayCopy( 
   void&        dst_array[],         // куда копируем 
   const void&  src_array[],         // откуда копируем 
   int          dst_start=0,         // с какого индекса пишем в приемник 
   int          src_start=0,         // с какого индекса копируем из источника 
   int          count=WHOLE_ARRAY    // сколько элементов 
   );
 
Sergey Voytsekhovsky:

おはようございます、ご返信ありがとうございます。

お気づきでないようですが、上を見ていただければわかりますが、質問はすべてMQL5に関するものでした。

その差が決定的でない場合もあることは理解していますが、それにしても。引用した関数は配列のサイズを変更するもので、サイズを小さくすると余分な要素が削られる可能性があります。

これは必要なことではありません。要素を値で探して削除する必要があります。この機能は私も試しました、#23に書きました。とにかくありがとうございます。

私も注目したことはありません。mql5にはArrayRemove 機能があり、問題ありません。

 

この場合、ArrayRemoveが より適切で、マニュアルに例があり、まさに次のように動作 します。

//| Script program start function                                    | 
//+------------------------------------------------------------------+ 
void OnStart() 
  { 
//--- объявим массив фиксированного размера и заполним значениями 
   int array[10]; 
   for(int i=0;i<10;i++) 
     { 
      array[i]=i; 
     } 
//--- покажем массив до удаления элементов 
   Print("До вызова ArrayRemove()"); 
   ArrayPrint(array); 
//--- удалим 2 элемента из массива и покажем новый состав 
   ArrayRemove(array,4,2); 
   Print("После вызова ArrayRemove()"); 
   ArrayPrint(array); 
/* 
   Результат выполнения:  
   До вызова ArrayRemove() 
   0 1 2 3 4 5 6 7 8 9 
   После вызова ArrayRemove() 
   0 1 2 3 6 7 8 9 8 9 
*/

ただ問題は、これらの例や関数は一次元配列用に設計されており、二次元配列では動作させようとしないことです。

私は、何かとても大切で根本的なことを見失っているような気がします。しかし、それは何なのか?

言っとくけど、もう参考書なくなっちゃったよ。

 
Sergey Voytsekhovsky:

この場合、ArrayRemoveが より適切で、マニュアルに例があり、まさに次のように動作 します。

ただ問題は、これらの例や関数は一次元配列用に設計されており、二次元配列では動作させようとしないことです。

私は、とても大切で根本的なことを見逃しているように思います。しかし、それは何なのか?

もう、わからなくなっちゃったって言ってるんです。

順番は重要ですか?
最後の位置から削除する位置までコピーし、配列のサイズを 変更します。
 
Alexey Viktorov:
2次元配列の場合、削除する行数を2倍する必要があります。3次元配列の場合、3倍して...

私はこのことをよく理解していません。もっと詳しく説明してください。不便なら、ともかく、どうにかして解決しますよ。

 
Aliaksandr Hryshyn:
順番は重要ですか?
最後の位置から削除される位置までコピーし、配列のサイズを変更します。

いいえ、順番は重要ではありません。既知の(知識によって見つけられた、インデックスが既知の)エントリーを削除すればいいのです。ArrayRemoveは 素晴らしいですし、すべてがうまくいくのですが、この関数を2次元配列に適用するにはどうしたらよいでしょうか?

 
Sergey Voytsekhovsky:

いいえ、順番は重要ではありません。私たちはただ、既知の(認知によって見つけられた、インデックスが既知の)レコードを削除する必要があるだけです。ArrayRemoveは素晴らしいですし、すべてがうまくいくのですが、この関数を2次元配列に適用するにはどうしたらいいのでしょうか? マニュアルには何も書いて ありません。

だから、さっき言ったように、2次元目の配列だけがコピーされるようにしてください。
配列のサイズを 変更する場合は、第3パラメータにも32などを指定します。
 
Sergey Voytsekhovsky:

この場合、ArrayRemoveが より適切で、マニュアルに例があり、まさに次のように動作 します。

ただ問題は、これらの例や関数は一次元配列用に設計されており、二次元配列では動作させようとしないことです。

私は、とても大切で根本的なことを見逃しているように思います。しかし、それは何なのか?

参考書を紛失したと言っているんだ。

それはナンセンスだ。マニュアルを読まずにこの機能を使ってしまった。デバッガで、要素が削除され、配列のサイズが一瞬で小さくなる様子を確認しました。確認したところ、構造体の配列でも問題なく動作しています。例えば、2次元の配列から3番目のインデックスを削除したいとします。5番目と6番目の値を削除する必要があることがわかりました。コピーする際、この関数はすべての値を1次元の配列に並べ、3番目のペアはインデックス5から始まることが判明しました。一般的にこれは、何度か実験をしているうちに実感できるようになります。

ArrayRemoveについては、できる限り2-4次元の配列でテスト してみます。必要性から、私はテストしたことがなく、動作しないのではと疑ったことはありません。


追加されました。

確認しました。静的配列はリサイズできないことを忘れないでください。そのため、ドキュメントにある例では、配列のサイズはそのままで、最後の2つの文字列が繰り返されています。動的配列から 行を削除しても、問題なくサイズが変更されます。

ハンドブックはモニターの穴:))))に擦り込んでください。

/********************Script program start function*******************/
void OnStart()
 {
  double arrTest[][ 2];
  for(int i = 0; i < 10; i++)
   {
    ArrayResize(arrTest, i+1);
    arrTest[i][0] = iOpen(_Symbol, PERIOD_CURRENT, i);
    arrTest[i][1] = iClose(_Symbol, PERIOD_CURRENT, i);
   }
    Print("ArraySize ", ArraySize(arrTest));
    ArrayPrint(arrTest);
    ArrayRemove(arrTest, 3, 2);
    Print("ArraySize ", ArraySize(arrTest));
    ArrayPrint(arrTest);
         );
 }/******************************************************************/
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  ArraySize 20
2020.03.23 11:36:02.296 00 (GBPUSD,H1)          [,0]    [,1]
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [0,] 1.16465 1.16084
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [1,] 1.17094 1.16461
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [2,] 1.16878 1.17084
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [3,] 1.16525 1.16876
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [4,] 1.16467 1.16525
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [5,] 1.16491 1.16467
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [6,] 1.16186 1.16498
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [7,] 1.15985 1.16185
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [8,] 1.16156 1.15985
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [9,] 1.15447 1.16156
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  ArraySize 16
2020.03.23 11:36:02.296 00 (GBPUSD,H1)          [,0]    [,1]
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [0,] 1.16465 1.16084
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [1,] 1.17094 1.16461
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [2,] 1.16878 1.17084
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [3,] 1.16491 1.16467
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [4,] 1.16186 1.16498
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [5,] 1.15985 1.16185
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [6,] 1.16156 1.15985
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [7,] 1.15447 1.16156

以下は、3次元配列とその結果である。

2020.03.23 11:40:11.328 00 (GBPUSD,H1)  ArraySize 30
2020.03.23 11:40:11.328 00 (GBPUSD,H1)          [,0]    [,1]    [,2]
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [0,] 0.00000 1.16465 1.16255
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [1,] 1.00000 1.17094 1.16461
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [2,] 2.00000 1.16878 1.17084
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [3,] 3.00000 1.16525 1.16876
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [4,] 4.00000 1.16467 1.16525
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [5,] 5.00000 1.16491 1.16467
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [6,] 6.00000 1.16186 1.16498
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [7,] 7.00000 1.15985 1.16185
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [8,] 8.00000 1.16156 1.15985
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [9,] 9.00000 1.15447 1.16156
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  ArraySize 24
2020.03.23 11:40:11.328 00 (GBPUSD,H1)          [,0]    [,1]    [,2]
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [0,] 0.00000 1.16465 1.16255
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [1,] 1.00000 1.17094 1.16461
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [2,] 2.00000 1.16878 1.17084
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [3,] 5.00000 1.16491 1.16467
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [4,] 6.00000 1.16186 1.16498
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [5,] 7.00000 1.15985 1.16185
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [6,] 8.00000 1.16156 1.15985
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [7,] 9.00000 1.15447 1.16156
 
Alexey Viktorov:

それはゴミだ。マニュアルを読まずにこの機能を使ってしまった。デバッガを見ると、要素が削除され、配列のサイズが瞬時に小さくなっているのがわかります。確認したところ、構造体の配列でも問題なく動作しています。例えば、2次元の配列から3番目のインデックスを削除したいとします。5番目と6番目の値を削除する必要があることがわかりました。コピーする際、この関数はすべての値を1次元の配列に並べ、3番目のペアはインデックス5から始まることが判明しました。一般的にこれは、何度か実験をしているうちに実感できるようになります。

ArrayRemoveについては、できる限り2-4次元の配列でテスト してみます。必要性から、私はテストしたことがなく、動作しないのではと疑ったことはありません。


追加されました。

確認しました。静的配列はリサイズできないことを忘れないでください。そのため、ドキュメントにある例では、配列のサイズはそのままで、最後の2つの文字列が繰り返されています。動的配列から 行を削除しても、問題なくサイズが変更されます。

ディレクトリはモニターの穴:))))にスクラブする必要があります。

ここでは、3次元の配列を作成し、その結果を表示しています。

この例は非常に遅く、多くの値がある場合、これは顕著になります。
 
Aliaksandr Hryshyn:
この例は非常に遅く、多くの値がある場合、これは顕著になります。

たくさんあるのは?毎回のクリックでも埋まらない配列要素?どのように目立たせるのか?