どんな新人の質問でも、フォーラムを乱雑にしないように。プロフェッショナルは、通り過ぎないでください。Nowhere without you - 6. - ページ 263

 
evillive:

int Mas[];


でループを埋め、必要であれば

ArrayResize(Mas,size)。

ArrayInitialize(Mas,0)です。

"then cycle fill in".
もしご迷惑でなければ、小さな例をお願いします。
 
Leo59:
"then loop fill" もしご迷惑でなければ、小さな例ですが、よろしいでしょうか?



 double MACDBuffer[]; int x=20;       // если известен размер буфера то              
 ArrayResize( MACDBuffer,x);         // то можно и просто  MACDBuffer[20], но  MACDBuffer[] нельзя.
 double min,max;
 int start(){
    for(int i=0; i<20; i++)
      MACDBuffer[i]=iMA(NULL,0,12,0,MODE_EMA,PRICE_CLOSE,i)-iMA(NULL,0,26,0,MODE_EMA,PRICE_CLOSE,i);
    min=ArrayMinimum(MACDBuffer);
    max=ArrayMaximum(MACDBuffer);
    Print(min,"____",max);
 }

動的配列 MACDBuffer[] を埋めるには、ArrayResize()で静的にするように言われましたね(そうしないと、代入結果が常にゼロになります)。

で、計算の妥当性の安定性を確保するために、ArrayInitialize()で配列を初期化するのがよいでしょう。

 
ALXIMIKS:


動的配列MACDBuffer[] を埋めるには、ArrayResize()で静的にする必要があると言われました(そうしないと、常にゼロが代入結果として返されます)。

で、さらに、計算の妥当性を安定させるために、ArrayInitialize()で配列を初期化するのがよいでしょう。


ありがとうございました。
問題は、Expert Advisorが動作していることです。
int CD=0; //決済された取引の注文番号
double Balance=0; // 取引を終了したときの結果
double Mas[]; // 約定結果を表す値の配列


int Start()で、Mas[]にクローズしたトランザクションの結果を入れるには?

init()とdeinit()に何か書く必要があるのでは?イニシャライザーか何か?
正しいコードはどのようなものでしょうか?

 
Leo59:
本質は、稼働中のExpert Advisorがあることです。
int CD=0; // クローズしたトレードの連番
double Balance=0; // 取引を終了したときの結果
double Mas[]; // 約定結果を表す値の配列


int Start()で、Mas[]にクローズしたトレードの結果をどのように記入するのですか?

もしかして、init()とdeinit()で何か追加する必要があるのでしょうか?イニシャライザーか何か?
正しいコードはどのようなものでしょうか?

人それぞれ、「正しい」という概念は違います。

初期化時にMas[CD]=Balanceとし、CD値を変更した時にスタート時のMas[CD]=Balanceに代入したいのでは?

あるいは、各取引に必要なデータ(残高、時間、ポイント、最大持分、最小持分...)を格納する2次元配列が必要かもしれません。

 
ALXIMIKS:


動的配列MACDBuffer[] を埋めるには、ArrayResize()で静的にするように言われましたね(そうしないと、代入結果が常にゼロになります)。

で、さらに、計算の妥当性の安定性を確保するために、ArrayInitialize()で配列を初期化するのがよいでしょう。

ArrayResize() は、配列のサイズを変更 します。mql4では、デフォルトですべての配列が静的です。
 
artmedia70:
ArrayResize() は、配列のサイズを変更します。mql4では、デフォルトですべての配列が静的です。 。

私は間違っていた。チュートリアルで確認しています。

初期化する1次元配列のサイズが指定されていない場合、初期化シーケンスのサイズに基づいてコンパイラが決定する。配列の初期化は、標準のArrayInitialize()関数を使用しても行うことができます。 すべての配列は、初期化時に明示的に指定されなくても、静的な形式を持つ、つまり静的である。こ れは,配列が宣言された関数が呼び出されるまでの間,配列のすべての要素がその値を 保持することを意味します.

しかし、なぜそのような「静的」な配列は値を割り当てないのでしょうか?コンパイラからArrayResize(buffer,0)が出たため、結果は予想通りnullに?

int start(){
   double buffer[];
   for(int i=10;i>=0;i--){
      buffer[i]=i;
      Print ("buffer[i]=",buffer[i]);
   }
}
 
ALXIMIKS:

私は間違っていた。教科書で確認する。

しかし、それならなぜ、このような「静的」な配列は値を割り当てないのでしょうか?コンパイラからArrayResize(buffer,0)のため、結果は予想通りnullになる?

配列が動的であるため。1 次元でのサイズは、1 次元配列の場合は ArraySize()、多次元配列の場合は ArrayRange()で確認することができます。

スタティックは「既定のサイズ」という意味ではありません。静的」と「動的」という2つの概念を混同しないようにしましょう。反意語ではありません。ここでは、異なる分野のアプリケーションからです。例:静的配列は「静的変数」です。動的配列とは、「プログラムで設定・変更可能なサイズ」のことです。

int start(){
   double buffer[];
   for(int i=0;i<10;i++){
      ArrayResize(buffer,i+1);
      buffer[i]=i;
      Print ("Размер массива = "+(string)ArraySize(buffer)+", Значение в buffer["+(string)i+"] = ",buffer[i]);
   }
   return(0);
}
 
Leo59:

ありがとうございました。問題は、Expert Advisorが動作していることです。int CD=0; // クローズドトレードの序数 double Balance=0; // クローズドトレードの結果 double Mas[]; // クローズドトレードの結果の値の配列





int Start()で、Mas[]にクローズしたトランザクションの結果を入れるには?

init()とdeinit()に何か書く必要があるのでは?イニシャライザーか何か?
正しいコードはどのようなものでしょうか?

決済した取引の結果は、すべて口座履歴で確認することができます。ソフトウェアでしかし、それらを常にアレイに詰め込む必要があるのでしょうか?多いかもしれませんね。必要な歴史の深さを制限し、本当にそれがないと生きていけないのであれば、アレイを埋めた 方がいいのです。
 
みんな、アンドロイドのRSIに補助レベルを追加する方法を知っている人はいるかな?
 
ALXIMIKS:

私は間違っていた。教科書で確認する。

しかし、それならなぜ、このような「静的」な配列は値を割り当てないのでしょうか?コンパイラからArrayResize(buffer,0)のため、結果は予想通りnullになる?


正確には配列ではないからです。詳しくはC言語の説明をご覧ください。 私がこれを参考にしたのは、開発者が最初から「明確でないことや不完全な説明は、すべてC言語標準を参照せよ」と言っていたからです。

変数double buffer[]; を宣言すると、1つの変数のためにメモリが確保されます。この変数はCの用語では「ポインタ」と呼ばれ、整数型で、配列が始まるメモリセルの アドレスを格納します。MCLで変数の次元を確認すると、値0となる。つまり、配列自体にはメモリが割り当てられず、値を代入しようとしても書き込む場所がないのです。MCLではアドレス演算ができないので、ポインタが扱えません。C言語では書くことができますが、「未割り当て」のメモリでは通常システムクラッシュにつながります。AreiResize(array,N), (N>0)を適用すると、配列(少なくとも1つの要素)のメモリが確保され、値を書き込むためのスペースが作られます。そして、チェックすると、配列の次元が0と異なることになります。

C言語から見た静的配列の概念には、いくつかの意味があります。

1. 静的配列(静的変数/型も同様)は、コンパイル段階(MKL4ではプリコンパイル)で次元が分かっている変数/配列である。例えば、double buff[10000];と記述すると、コンパイラに変数のサイズが伝わり、すぐにメモリを確保することができる。これに対して、コンパイル時にはサイズが分からず、実行時に初めてサイズが分かるような「動的配列」という概念があり、これらはすべて可変サイズ配列である。このような配列にアクセスする場合、あらかじめメモリを確保する必要がある。メモリはスタティック・プログラム・メモリの外側に確保される。

C/C++では、ブロック内に配列が記述されている場合、静的配列であれ動的配列であれ、その可視性はブロックによって制限される。プログラムにおける「メモリリーク」などのエラーは、ローカルに定義された動的配列、すなわちメモリポインタが可視領域から外れて破壊されても、それに割り当てられたメモリは占有されたままである場合に発生する。

2 static修飾子で 記述された変数である「static」配列の概念は、ブロックのスコープを離れても破棄されず、別のメモリ領域に配置されるため、その中の値は保持されます。メモリリークのリスクを低減することができます。p.1の意味で動的と宣言された配列(すなわち、コンパイル時に配列のサイズがわからない)は、p.2の意味で静的、すなわち、修飾子 "static" を付けて宣言することも可能である。

プログラム終了時には、メモリリークを防ぐため、動的に確保されたメモリを解放する必要があります。MKLの開発者がこれに従うかどうかは知りませんが、私のプログラムでは常にメモリを解放しています - C言語からの習慣 - ArreyResize(array,0);

MKLでは、ポイント2の意味で、すべての配列は静的である。

さて、ご質問の件ですが。"静的配列double buffer[]; に値を割り 当てることができないのはなぜですか?なぜなら、そのためにメモリが割り当てられないからです(実際には、静的修飾子を持つ動的配列です)。値を代入する前に、メモリを確保する必要がある。すなわち、0より大きいサイズのArrayResizeをこの配列に適用する必要がある。アレイの場合は、メモリオーバーラン(アレイの外側)を制御する必要があります。

SZ 納得していただけたでしょうか?なるべくシンプルにすることを心がけました。