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

 

では、変数をグローバルにしてみましたか?

int izmb=0, izms=0;

void OnTick()
   {
   double LB=0,LS=0;
   int b=0,s=0;
   
   for(int i=0; i<OrdersTotal(); i++)
      {    
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         { 
         if(OrderSymbol()==Symbol())
            { 
            if(OrderType()==OP_BUY)             
               {  
               LB+=OrderLots();
               b++; 
               }                                         
            else if(OrderType()==OP_SELL)        
               {
               LS+=OrderLots();
               s++;
               } 
            }
         }     
      }
   if(izmb!=b || izms!=s)
      { 
      izmb=b;
      izms=s 
           // далее идут условия для открытия ордера.
      }
 
scomoroh:

EAのエントリーを見つける条件を、毎ティックではなく、他のEAや手動で別の注文がオープンまたはクローズされたときだけ(処理に負荷がかからないように)チェックしたかったのです。そのため、1ティックごとに注文数が対応しているかどうかを確認する必要があるのです。

スタティック変数は使えないのでしょうか? そのような形でプログラムは 動くのでしょうか?

あるいは、最もシンプルで簡単な条件として

OnTrade() は mt4 のアナログを mt5 で実現したものです。

void OnTrade()
 {
  ... // сюда код, который будет работать только по изменению ситуации по счёту: открытие/закрытие позиций, установка/удаление ордеров
 }

static _OTotal = -1;
static _HTotal = -1;
int OT=OrdersTotal();
int HT=OrdersHistoryTotal();
  if(OT!=_OTotal || HT!=_HTotal) // если изменилось - выполняем
   {
     OnTrade(); // здесь дёргаем текущую ситуацию на счёте и заполняем структуры
     _OTotal=OrdersTotal(); // запомним текущее количество
     _HTotal=OrdersHistoryTotal(); // запомним количество в истории
   }
 
ANDREY:

ご返信ありがとうございました。あなたの書いたものはすべて理解できました。しかし、私の問題意識からすると、書いてある意味がよくわかりませんでした。

私のコードでいう水平2次元配列とは、インデックス0または1の下に2行、インデックス0から30の下に列がある場合を指します。1次元目は,[0][0],[0][1],[0][2],...と表記する.[0][30] 2次元 目は[1][0],[1][1],[1][2], ...と表記する.[1][30]

私のコードでいう垂直2次元配列とは、0から30のインデックスを持つ31行と、0と1のインデックスを持つ2 列がある場合を指します。1次元 目は、[0][0][1] [0][2][0]、...と表記する。[30][0] 2次元 目は[0][1][1][2][1] ...と表記する.[30][1]

私のコードを実行すると、配列は縦に埋まります。そして、ArraySort() 関数は、その通りに配列を並べ替 えます。

QUESTION この場合、なぜArrayFill()関数が動作 しないのでしょうか?結局、配列の1次元目(31項目)を同じ値0.5555で埋めるようにお願いしました。
ありがとうございました。

MQL4では、4次元以上の配列を扱うことはできません。したがって、arr[31][31]はエラーとなります。配列はarr[][4]よりも大きくできません。そして、1つ目の次元は、MQLではなく、何によって制限されているのか、正確にはわかりません。誰か説明してくれないかな。

関数ArrayFill() は動作しますが、配列 arr[3][2] の要素数が 6 になることを理解し、この関数に 1 次元の大きさで 3 ではなく 6 と記述する必要があります。

 

4次元次元:arr[][]またはarr[,,,].

最後の3次元は宣言時に指定し固定とする。 最初の次元は指定せず、後で変更することも可能である。

int arr[,100,200,500];

2次元配列の例では、配列内のデータは次のように配置されます。

int arr[2,5]={0,1,2,3,4,  - в нулевом элементе первого измерения 
              5,6,7,8,9}; - в первом элементе первого измерения

ソートは、1次元でソートすることで水平方向全体を移動させます。

で、ArrayFill()は、ある要素から別の要素へ、例えば3から8へ塗りつぶすその結果、混乱が生じる。

横方向にあるいくつかの値を1次元で埋めたい場合、データがどのように配置されているかを把握した上で、埋め始めと埋め終わりを制御する必要があります。

例えば、1次元の0要素の全定規。

int value=5;
int index=0;
ArrayFill(arr, index*ArrayRange(arr,1), ArrayRange(arr,1), value); 

ゼロの要素が1つだけなら、そうです。

ArrayFill(arr, index*ArrayRange(arr,1), 1, value); 

ゼロ要素が多い場合は、ループと単純な代入によって。


あまり分かりやすく説明できていなかったようだ...。プリンターを使って、ループの中のものを全部印刷して、あっちに行ったりこっちに行ったりすれば、コツがつかめるはずです。その方が早く学べますから。

printfは私の友達です!

 
Alexey Viktorov:

MQL4では4次元以上の配列は扱えません。したがって、arr[31][31]はエラーとなります。配列はarr[][4]よりも大きくはできません。そして、1つ目の次元は 、MQLではなく、何によって制限 されているのか、正確にはわかりません。誰か説明してくれないかな。


また、1次元目(つまり文字列の数)はいくつに制限されるのでしょうか?MQL4 では、多次元配列の 行数はいくつまで許容されますか?

 

4次元全てにINT_MAXという 制限があると思います。

構造について。

二次元

構造体は,1次元の配列を表し,その要素は,まず1行目,次に2行目,3行目の順で配置される.

three dimensional:

3次元でも、です。1次元の配列で、1行目が次々と、2行目、......となります。

なぜ1次元かというと、コンピュータのメモリ上では、配列に複数のセルが割り当てられているので、そこに00行目+01行目+02行目+10行目+11行目・・・と順番にすべてを書き込んでいくからだそうです。


さらに、3次元のアレイシートを積み重ねるという、4次元の追加も可能です。

行数のみプログラムの途中で変更することができます。行、列、シート、スタックはすべて、構造を理解するための慣習に過ぎない。寸法は実際に私たちの空間にあるわけではなく、単なる計測値です。

アレクセイが言うように

Alexey Viktorov:

...列......ソファに寝転がって見ているので横向き...................です。

 
Alexey Viktorov:

次のような注意 書きがあることにお気づきでしょうか。

アレイフィル

多次元 配列をArrayFill()で処理すると1次元に見える。例えば、array[2][4]はarray[8]として処理されるので、この配列を扱う場合は初期要素のインデックスを5と指定してもよい。したがって、array[2][4]に対してArrayFill(array, 5, 2, 3.14) と呼ぶと、array[1][1] と array[1][2] の要素が値3.14で埋められることになります。


ArrayFill() を除いて、すべて理解できました。

1.配列 double LoY[31][31]; を宣言すると、実質的に31行×31列のテーブルを作成することになります。2次元の(4次元ではなく)配列を作成しましたが、まだ埋めていません。

2.次に、個々の配列の要素に Bid値を入れています。
a) LoY[31][0]=Bid; - 配列の31行目と1列目をBid 値で埋める.また、2次元目(インデックス1の列)は、デフォルトで0が入力されています。そこで、このバリエーションでは、1つ目の 次元に31の要素を入れ、2つ目の次元に1を入れました。

b) LoY[0][31]=Bid - 31列目と配列の1行目をBid値で埋めて います そして、2次元目(インデックス1の下の行は、デフォルトで0が埋められる。したがって、この変形例では、2次元目は31のフィルド要素からなり、2次元目は1 である。

ArraySort() は2 次元配列を 1 次元目のみでソート します。したがって、オプションa)をソートすることになります。は、1次元目が31行で、1次元目が1行しかないオプションb)は、1行をソートできないので、ソートされません。
NowArrayFill() 2次元配列を1行にまとめてから、2次元配列の要素に必要な値を割り当てています。つまり、私の配列LoY[31][31]をサイズ961要素の1行に 引き込む必要があります。非常に長い文字列であり、ほとんどの要素が不要となる。

そこで、配列LoY[31][2] (variant a))orLoY[2][31] (variant b))を作ってみましょう。

変形例 b) では、ArrayFill() がどのように 1 行で描画するかは明らかです。2 行目は単純に 1 行目と合流し、1 行目の最後の要素LoY[0][31] の後、ArrayFill() の配列の 1 行目はLoY[0][32] で続き、最後はLoY[0][62] また ArrayFill() における配列要素の値は、 インデックス0から31までは価格値、インデックス32から末尾までは0が 入ることになります。

質問:ArrayFill() はどのようにオプションa)を1行に描画 するのですか?何しろ、このバリエーションでは28列もあるのですから。また、1行になる場合、配列の要素の値はどのような順序で格納されるのでしょうか?また、 ArrayFill() で2次元配列の要素を 1次元配列 に変換した後、Print()で表示することは できますか?この関数自体は値を返さないので、 Print() に入れても表示されません。

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

 

ここでちょっと失敗してしまった・・・恥ずかしい。

配列の要素に Bid値を入れています。
a) LoY[31][0]=Bid; - 配列の31行目と1列目をBid 値で埋める.また、2次元目(インデックス1の列)は、デフォルトで0が入力されています。そこで、このバリエーションでは、1つ目の 次元に31の要素を入れ、2つ目の次元に1を入れました。

b) LoY[0][31]=Bid - 31列目と配列の1行目をBid値で埋めて います そして、2次元目(インデックス1の下の行は、デフォルトで0が埋められる。したがって、この変形例では、2次元目は31のフィルド要素からなり、2次元目は1 である。

ArraySort() は2 次元配列を 1 次元目のみでソート します。したがって、オプションa)をソートすることになります。は、1次元目が31行で、1次元目が1行しかないオプションb)は、1行をソートできないので、ソートされません。
NowArrayFill() 2次元配列を1行にまとめてから、2次元配列の要素に必要な値を割り当てています。つまり、私の配列LoY[31][31]をサイズ961要素の1行に 引き込む必要があります。非常に長い文字列であり、ほとんどの要素が不要となる。

そこで、配列LoY[31][2] (variant a))orLoY[2][31] (variant b))を作ってみましょう。

変形例 b) では、ArrayFill() がどのように 1 行で描画するかは明らかです。2 行目は単純に 1 行目と合流し、1 行目の最後の要素LoY[0][31] の後、ArrayFill() の配列の 1 行目はLoY[0][32] で続き、最後はLoY[0][62] また ArrayFill() における配列要素の値は、 インデックス0から31までは価格値、インデックス32から末尾までは0が 入ることになります。

質問:ArrayFill() はどのようにオプションa)を1行に描画 するのですか?何しろ、このバリエーションでは28列もあるのですから。また、1行になる場合、配列の要素の値はどのような順序で格納されるのでしょうか?また、 ArrayFill() で2次元配列の要素を 1次元配列 に変換した後、Print()で表示することは できますか?この関数自体は値を返さないので、 Print()に挿入しても表示 されない。

よろしくお願いします。

理解するのに苦労しています。そのためか、うまく理解できない。LoY[5][3]配列、つまり5行3列の配列で問題を繰り返す。

ArrayFill は、初期配列の変換を一切行いません。1 次元の配列が置かれたような処理のみが行わ れる。この関数は,配列に対して必要な処理を行い,次元に影響を与えることなくフォールバックします.

ドキュメントによると、ArrayFill(LoY, 3, 6, 12) 関数は、配列LoY のインデックス 1 と 2 の行だけを値 12 で埋めるそうです。

LoY[1][0]には12が入る

LoY[1][1]は値 12と なる。

LoY[1][2]は 値12と なる。

LoY[2][0]は値 12と なる。

LoY[2][1]は値 12と なる。

LoY[2][2]は 12に 設定されます。

それ以外のものは、そのままにしておきます。

小さな配列で、わかりやすい数字で実験してみましょう。例えば、12と8の場合、どちらが大きいかは一目瞭然です。そして1.123654と1.123583はもっと複雑です

 
Alexey Viktorov:

ArrayFillは元の配列を 一切変換しない。あくまでも1次元の配列と同じように処理します。この関数は,配列に対して必要な処理を行い,次元を乱すことなく配列をダンプします.


これによって、私の誤解は大きく減り、理解も深まりました。今、新たに発見された状況を踏まえて、自分が書いたものをすべて分析し直します......。

 
Alexey Viktorov:


ドキュメントによると、関数ArrayFill(LoY, 3, 6, 12)LoY 配列のインデックス 1 と 2 の行を値 12 で埋めるだけだそうです。

LoY[1][0]の値は12と なる。

LoY[1][1]は値 12と なる。

LoY[1][2]は 値12と なる。

LoY[2][0]は値 12と なる。

LoY[2][1]の値は 12と なる。

LoY[2][2]は 12に 設定されます。


QUESTION
同じ配列の黄色の要素に値12を埋めたい場合、ArrayFill()にどのように、どのような値を入力すればよいのでしょうか?

OPTION N 1

OPTION N 2


よろしくお願いします。