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

 
Alexandr Nevadovschi:

プログラマーの皆様、この仕事の初心者を助けてください。

EAは、一定時間経過後に順次、買い注文と売り注文を開いています。以前の注文を全て修正したい(具体的には、以前の注文は全て最後の注文のTake Profitで決済すること)。すなわち、最後の買い注文と前の売り注文が同じであれば、前の注文のストップロスは、前の注文のテイクプロフィットレベルに設定されます。

もし、前回の買いが買いの場合、そのTakeProfitは前回のTakeProfitのレベルに設定されます。ポイントは、最後の注文のtakeprofitが来たときに、すべての注文を決済することです)。

どのように 実装すればいいのかわかりにくいですが、わかりやすく説明できたかと思います。よろしくお願いします。

すべての未決済注文を調べて修正することは理解できますが、最後の注文をスキップするにはどうしたらよいのでしょうか?

この中で最も重要なことは、「何が起こるべきか」を理解することです。

ラストオーダー」とは何ですか?開店時間までがラストですか?それともオープニングの価格帯で?

最後の」注文を「BUY」と見なすが、価格がめちゃくちゃになる場合はどうするか?あるいはその逆で、最後の注文はSELLになるけど、価格は北上する?では、どれが最後と考えるべきでしょうか。このことに私たちは気づかなければならないのです。

 

こんにちは。配列に入る要素の数があらかじめわからない場合、新しい要素が増えるごとに配列が増えるようにするには、どのように宣言 すればよいのでしょうか。

わかりやすくするための例です。

double HighA[]; // ??????????????????

for(int i=0; i<1000; i++)
{
if(A[i]<B[i])
HighA[i]=A[i];
}
Print(">>>>>>>>>>>..ArraySize(HighA)= ",ArraySize(HighA));
 
Nauris Zukas:

こんにちは。配列に入る要素の数があらかじめわからない場合、新しい要素が増えるごとに配列が増えるようにするには、どのように宣言 すればよいのでしょうか。

わかりやすくするための例です。

double HighA[]; // ??????????????????

for(int i=0; i<1000; i++)
{
if(A[i]<B[i])
HighA[i]=A[i];
}
Print(">>>>>>>>>>>..ArraySize(HighA)= ",ArraySize(HighA));

もっとドキュメントを読むべきですね。
ArrayResize - Операции с массивами - Справочник MQL4
ArrayResize - Операции с массивами - Справочник MQL4
  • docs.mql4.com
ArrayResize - Операции с массивами - Справочник MQL4
 
Alexey Viktorov:
もっとドキュメントを読むべきですね。

読んで試しましたが、「array out of range」エラーが出ます。例ではこのような感じでした。

      double HighA[];
      for(int i=0; i<1000; i++)
        {
         if(A[i]<B[i])
           {
            countHlines++;
            ArrayResize(HighA,countHlines);
            HighA[i]=A[i];
           }
        }
      Print(">>>>>>>>>>>..ArraySize(HighA)= ",ArraySize(HighA));
 
Nauris Zukas:

読んで試しましたが、「array out of range」エラーが出ます。例ではこのような感じでした。

      double HighA[];
      for(int i=0; i<1000; i++)
        {
         if(A[i]<B[i])
           {
            countHlines++;
            ArrayResize(HighA,countHlines);
            HighA[i]=A[i];
           }
        }
      Print(">>>>>>>>>>>..ArraySize(HighA)= ",ArraySize(HighA));

A[i] < B[i]の条件を満たさない場合,配列サイズは 変更せず,ループカウンタをインクリメントする.そのため、圏外になってしまうのです。

この方法で試してみてください。

      double HighA[];
      for(int i=0; i<1000; i++)
        {
         if(A[i]<B[i])
           {
            int size = ArraySize(HighA);
            ArrayResize(HighA, size+1);
            HighA[size]=A[i];
           }
        }
      Print(">>>>>>>>>>>..ArraySize(HighA)= ",ArraySize(HighA));
 
Alexey Viktorov:

A[i] < B[i] の条件を満たさない場合,配列のサイズは変更されず,ループカウンタがインクリメントされる.だから圏外なんです。

この方法で試してみてください。

      double HighA[];
      for(int i=0; i<1000; i++)
        {
         if(A[i]<B[i])
           {
            int size = ArraySize(HighA);
            ArrayResize(HighA, size+1);
            HighA[size]=A[i];
           }
        }
      Print(">>>>>>>>>>>..ArraySize(HighA)= ",ArraySize(HighA));


ありがとうございました。 これで全て 解決です!
 
Nauris Zukas:

読んで試しましたが、「array out of range」エラーが出ます。例ではこのような感じでした。

      double HighA[];
      for(int i=0; i<1000; i++)
        {
         if(A[i]<B[i])
           {
            countHlines++;
            ArrayResize(HighA,countHlines);
            HighA[i]=A[i];
           }
        }
      Print(">>>>>>>>>>>..ArraySize(HighA)= ",ArraySize(HighA));

まあ、その方が早いんだけどね

  int countHlines=0;
  double HighA[];
      for(int i=0; i<1000; i++)
        {
         if(A[i]<B[i])
           {
            countHlines++;
            ArrayResize(HighA,countHlines);
            HighA[countHlines-1]=A[i];
           }
        }
      Print(">>>>>>>>>>>..ArraySize(HighA)= ",ArraySize(HighA));


// Вариант №2
  int countHlines=-1;
  double HighA[];
      for(int i=0; i<1000; i++)
        {
         if(A[i]<B[i])
           {
            countHlines++;
            ArrayResize(HighA,countHlines+1);
            HighA[countHlines]=A[i];
           }
        }
      Print(">>>>>>>>>>>..ArraySize(HighA)= ",ArraySize(HighA));
 
Vitaly Muzichenko:

まあ、そのほうが早く動くでしょう

  int countHlines=0;
  double HighA[];
      for(int i=0; i<1000; i++)
        {
         if(A[i]<B[i])
           {
            countHlines++;
            ArrayResize(HighA,countHlines);
            HighA[countHlines-1]=A[i];
           }
        }
      Print(">>>>>>>>>>>..ArraySize(HighA)= ",ArraySize(HighA));


// Вариант №2
  int countHlines=-1;
  double HighA[];
      for(int i=0; i<1000; i++)
        {
         if(A[i]<B[i])
           {
            countHlines++;
            ArrayResize(HighA,countHlines+1);
            HighA[countHlines]=A[i];
           }
        }
      Print(">>>>>>>>>>>..ArraySize(HighA)= ",ArraySize(HighA));
ありがとうございます!そうなんですね。ArraySizeが あるから速くなるんだろうけど、なんか遅くなる?
 
Nauris Zukas:
ありがとうございます!そうなんですね。ArraySizeがあるから速くなるんだろうけど、なんか遅くなるのか?
あまりないですが、わかりやすく、間違えにくいです。
 
Alexey Viktorov:
あまりないですが、わかりやすく、間違えにくいです。
ありがとうございました。