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

 
Taras Slobodyanik:

コメントの形式は証券会社によって異なる場合があります。

"To "と "From "の不在を確認していない
 
Artyom Trishkin:
"To "と "From "がないことに気づかなかった
Artemさん、上の私の質問を調べてみてください...。
 

皆さん、ごきげんよう。

MQL4(またはMQL5で、MQL4で 動作するもの)で、 配列 LoY[2][7]を配列LoY[7][2] に変換する、または その逆の 関数が あるか教えてください。トランスポジションのようなもの。以下は、私が必要とする変換のサンプルです。機能を持たせたい。ループの中で配列を変換する方法はすでに知っています。

よろしくお願いします。

 
ANDREY:

皆さん、ごきげんよう。

MQL4(またはMQL5で、MQL4で 動作するもの)で、 配列 LoY[2][7]を配列LoY[7][2] に変換する 関数 、またはその逆の 関数があれば教えてください。トランスポジションのようなもの。以下は、私が必要とする変換のサンプルです。

ご協力ありがとうございました。

参考までに、古典的なアルゴリズム(IT全般)では、このような操作をzipと呼びます。

そのような機能はライブラリにはありません。ひどく無駄で非効率的です。配列の全データを並べ替えるよりも、アルゴリズムやプログラムのインデックスを変更したり、間接アクセスを使用する方が簡単で高速です。

 
Maxim Kuznetsov:

配列のデータをすべて並べ替えるより、アルゴリズムやプログラムのインデックスを変更したり、間接アクセスを使用する方が簡単で早い。

ご返信ありがとうございました。残念ながら、私はあなたのようにプログラミングが高度なわけではありません。私の問題を解決するために、配列のインデックスを 変更するmql4 コードを書いていただけるとありがたいです。また、間接参照の例を挙げていただければ、二重の意味でありがたいです。

あなたの思考回路をより正確に理解し、あなたのおかげで新しい、私に役立つ何かを学ぶことができます。

 
ANDREY:

ご返信ありがとうございました。残念ながら、私はあなたのようにプログラミングが高度なわけではありません。私の問題を解決するために、配列のインデックスを 変更するmql4 コードを書いていただけると大変ありがたいです。また、間接参照の例を挙げていただければ、二重の意味でありがたいです。

あなたの思考回路をより正確に理解し、あなたのおかげで新しい、私に役立つ何かを学ぶことができます。

void Convert_7x2_2x7 (const double &src[7][2],double &dst[2][7]) {

   for(int i=0;i<7;i++)

   for(int j=0;j<2;j++) {

dst[j][i]=src[i][j];

   }

}

短いですが、最悪です :-) 2つの入れ子ループと配列の要素ごとのコピーです。

アルゴリズムの内部では、インデックスの名前を変更するだけでよいのです。コードの中でiをjに、またはその逆に変更するだけです...。

 
Maxim Kuznetsov:

void Convert_7x2_2x7 (const double &src[7][2],double &dst[2][7]) {

   for(int i=0;i<7;i++)

   for(int j=0;j<2;j++) {

dst[j][i]=src[i][j];

   }

}

短いですが、一番やっちゃいけないことです :-)

ありがとうございました。そして、最高の一例?:-)...完全に理解できるようにね。

要素ごとのコピーは時間がかかり、エネルギーを消費する......特に大きな配列の場合......私の記憶違いでなければ。

 
アンドレイ、なぜそんなことをしたいんだ?すでに配列にデータが集まっているのであれば、何も動かさずにそのまま使う方法もあります。あるいは、あらかじめ正しい順序で配列に組み立てておく。何を手に入れたいですか?
 
Aleksei Stepanenko:
アンドレイ、なぜそれが必要なんだ?すでに配列にデータが集まっているのであれば、何も動かさずにそのまま利用する方法もあります。あるいは、あらかじめ正しい順序で配列に組み立てておくこともできます。何を手に入れたいですか?

以下は、私が必要とするものを説明するための簡単なコードです。

double LoY[2][31],LoU,LoU1;
int S,S1,S2;

void OnTick()
{
//*************************************************** БЛОК 1
if (Minute()==20&&Minute()!=S1)
{
ArrayFill(LoY,0,10,0.5555);

S1=Minute();
}
//*************************************************** БЛОК 2
if (Minute()!=S)
{
LoY[0][S2]=Bid;
ArraySort(LoY,WHOLE_ARRAY,0,MODE_ASCEND);
Print("----LoY[0][1]-- Г ---  [0]  ",  LoY[0][0],"  [1] ",   LoY[0][1],"  [2] ",   LoY[0][2],"  [3] ",   LoY[0][3],"  [4] ",   LoY[0][4],"  [26] ",   LoY[0][26],"  [27] ",   LoY[0][27],"  [28] ",   LoY[0][28],"  [30] ",   LoY[0][30],"  [60] ",   LoY[0][60]);
Print("----LoY[1][0]-- В ---  [0]  ",  LoY[0][0],"  [1] ",   LoY[1][0],"  [2] ",   LoY[2][0],"  [3] ",   LoY[3][0],"  [4] ",   LoY[4][0],"  [26] ",   LoY[26][0],"  [27] ",   LoY[27][0],"  [28] ",   LoY[28][0],"  [30] ",   LoY[30][0],"  [60] ",   LoY[60][0]);
S2++;
if (S2==62)
{
S2=0;
}
S=Minute();
}
}

ブロック1では、ArrayFill(LoY,0,10,0.5555)が実行され、配列の 最初の10要素に 値0.5555を代入しています。その後、0列目から31列目までのNULL行全体をソートする必要があります。

ブロック2でArraySort(LoY,WHOLE_ARRAY,0,MODE_ASCEND);を使ってソートしたいのですが、この関数は2次元配列をその1次元目で、つまり行数でソートするので、ソートが出来ません。そして、私は1だけを並べ替えるために文字列を持っています。2次元のArraySort()、すなわち、列は2次元配列(唯一の1次元)を並べ替えません

そこで、最初のブロックの後のLoY[2][31]をLoY[31][2] に変換して、ArraySort()で2ブロック目に必要な値をソート すればいいのではないかと考えた。 そして、私はArrayFil()がそれらの最初の10を変更した後、ゼロ行からすべての値をソートする必要があります。

2次元配列を2次元目、つまり列でソートすることは、他の関数などを使って可能でしょうか?
すみません...コードの削除の仕方がわからない。そこで、180行目のLoY[S2][0]=Bidの代わりに、LoY[0][52]=Bidが必要であり、エラーがあるとだけ述べます。

ご協力ありがとうございました。

 
両方の行の値を並べ替えたいのか、それとも最初の行だけを並べ替えたいのか?