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

 

こんにちは!配列について質問です。悩みに悩んで一次元配列を作成しました。コンパイル時にエラーが出ないので大丈夫なはずですが、テスターで実行するとエラー EURUSD,M1: array out of range in ,, (218,12) が出て、まさに私の悲しみの配列の位置を示していることがわかります。どこが悪いか教えてください

int Totall=OrdersTotal();
  double Price;                                                               // Цена выбранного ордера
  double Mas[];                                                                //массив для упорядочивания всех ордеров
  for(int i=0; i<OrdersTotal(); i++)                                           // Цикл перебора ордер
   {
    if(OrderSelect(i,SELECT_BY_POS))                                           // Если есть следующий
     {
       Price=OrderOpenPrice();
       Mas [i] = Price;                                                        //Как раз перед квадратной скобкой и есть ошибка  array out of range in ,, (218,12)
         
         ArraySort (Mas,WHOLE_ARRAY,0,MODE_ASCEND);                           // Теперь цены открытия упорядочены по убыванию
          
        int Blizko2=ArrayBsearch(Mas,Ask,WHOLE_ARRAY,0,MODE_DESCEND);          //Определен индекс ближайшего большего по значению елемента к текущей цене
             PriceBlizko2 = Mas[Blizko2];                                      // Цена выбранного ордера

          ArraySort (Mas,WHOLE_ARRAY,0,MODE_ASCEND);                           // Теперь цены открытия упорядочены по убыванию
          
        int Blizko1=ArrayBsearch(Mas,Bid,WHOLE_ARRAY,0,MODE_ASCEND);           //Определен индекс ближайшего меньшего по значению елемента к текущей цене
            PriceBlizko1=Mas[Blizko1];
     }
   }       
アドバイスお願いします。多分、配列の各要素に 注文価格を割り当てる他の方法があるのでしょうか?
 
vikzip:

こんにちは!配列について質問です。悩みに悩んで一次元配列を作成しました。コンパイル時にエラーが出ないので大丈夫なはずですが、テスターで実行するとエラー EURUSD,M1: array out of range in ,, (218,12) が出て、まさに私の悲しみの配列の位置を示していることがわかります。どこが悪いか教えてください


あなたのコードは根本的に間違っていますが、エラーは配列のサイズが 充填される前に設定 されていなかったことに起因しています

if(OrderSelect(i,SELECT_BY_POS))                                           // Если есть следующий
     {
       Price=OrderOpenPrice();
       ArrayResize(Mas, i+1);
       Mas [i] = Price; 
 
Vitaly Muzichenko:

あなたのコードは根本的に間違っていますが、エラーは配列のサイズが 充填前に設定 されていないことが原因です


ありがとうございました。順序が正しくないのか、教えてください。下から上へ最も近い注文の価格を決定することである。あなたの視点を教えてください。

 
vikzip:

ありがとうございました。配列がおかしいのか、教えてください。下から、そして上から、最も近い注文の価格を決定することです。ぜひ、あなたの意見を聞かせてください。

ループの中に不要なものがたくさんあるんですね。ループの中で配列に価格を入れ、ループの外で価格を操作する必要があります。

  for(int i=0; i<OrdersTotal(); i++)                                           // Цикл перебора ордер
   {
    if(OrderSelect(i,SELECT_BY_POS))                                           // Если есть следующий
     {
       ArrayResize(Mas, i+1);
       Mas[i] = OrderOpenPrice();                                                        //Как раз перед квадратной скобкой и есть ошибка array out of range in ,, (218,12)
   /*
         ArraySort (Mas,WHOLE_ARRAY,0,MODE_ASCEND);                           // Теперь цены открытия упорядочены по убыванию
          
        int Blizko2=ArrayBsearch(Mas,Ask,WHOLE_ARRAY,0,MODE_DESCEND);          //Определен индекс ближайшего большего по значению елемента к текущей цене
             PriceBlizko2 = Mas[Blizko2];                                      // Цена выбранного ордера

          ArraySort (Mas,WHOLE_ARRAY,0,MODE_ASCEND);                           // Теперь цены открытия упорядочены по убыванию
          
        int Blizko1=ArrayBsearch(Mas,Bid,WHOLE_ARRAY,0,MODE_ASCEND);           //Определен индекс ближайшего меньшего по значению елемента к текущей цене
            PriceBlizko1=Mas[Blizko1];
   */
     }
   }       
 
Vitaly Muzichenko:

ループの中に不要なものがたくさんあるんですね。ループの中では配列に価格を入れ、ループの外ではそれを操作する必要があります。


なるほど、ありがとうございました!!!ちゃんと理解できたかな?

 
vikzip:

なるほど、ありがとうございました!!!ちゃんと理解できましたか?

可能なんです。同じ作業でも、いくつかの方法で実現することができます。

 
double Price;                                                               // Цена выбранного ордера
  double Mas[];                                                                //массив для упорядочивания всех ордеров
  for(int i=0; i<OrdersTotal(); i++)                                           // Цикл перебора ордер
   {
    if(OrderSelect(i,SELECT_BY_POS))                                           // Если есть следующий
     {
       Price=OrderOpenPrice();
       ArrayResize(Mas, i+1);
       Mas [i] = Price; 
     }
   } 
          ArraySort (Mas,WHOLE_ARRAY,0,MODE_ASCEND);                           // Теперь цены открытия упорядочены по убыванию
          
        int Blizko2=ArrayBsearch(Mas,Ask,WHOLE_ARRAY,0,MODE_DESCEND);          //Определен индекс ближайшего большего по значению елемента к текущей цене
             PriceBlizko2 = Mas[Blizko2];                                      // Цена выбранного ордера                                                             Вот в этой строке

          ArraySort (Mas,WHOLE_ARRAY,0,MODE_ASCEND);                           // Теперь цены открытия упорядочены по убыванию
          
        int Blizko1=ArrayBsearch(Mas,Bid,WHOLE_ARRAY,0,MODE_ASCEND);           //Определен индекс ближайшего меньшего по значению елемента к текущей цене
            PriceBlizko1=Mas[Blizko1];


Vitaly Muzichenko:

可能です。同じタスクでも、いくつかの方法で実装することができます。


今、最も近いアイテムインデックスを決定するループを作りましたが、テスターではMas[Blizko2]でエラーが表示されます。EAを実行してもまだ注文がないからでしょうか?

(アドバイスお願いします。もしかしたら、似たようなものがどこにあるかご存知ですか?)
 
vikzip:

私はちょうどループのうち、最も近い要素のインデックスの定義を入れているとテスターでは、場所Mas[Blizko2] .MaybeそれはあなたがEAを実行したときに、まだ注文がないので、エラーを示しています?

このように試してみてください。

if(ArraySize(Mas)>0) { // если массив не пустой, то

         ArraySort (Mas,WHOLE_ARRAY,0,MODE_ASCEND);                           // Теперь цены открытия упорядочены по убыванию
          
        int Blizko2=ArrayBsearch(Mas,Ask,WHOLE_ARRAY,0,MODE_DESCEND);          //Определен индекс ближайшего большего по значению елемента к текущей цене
             PriceBlizko2 = Mas[Blizko2];                                      // Цена выбранного ордера

          ArraySort (Mas,WHOLE_ARRAY,0,MODE_ASCEND);                           // Теперь цены открытия упорядочены по убыванию
          
        int Blizko1=ArrayBsearch(Mas,Bid,WHOLE_ARRAY,0,MODE_ASCEND);           //Определен индекс ближайшего меньшего по значению елемента к текущей цене
            PriceBlizko1=Mas[Blizko1];

 }
 
Vitaly Muzichenko:

お試しください


本当にありがとうございました!!!MODE_DESCENDをMODE_ASCENDに 変更することで、現在の価格に最も近い小さい要素のインデックスを正しく決定することができるのでしょうか?

 
vikzip:

ありがとうございました!!!MODE_DESCENDをMODE_ASCENDに 変更することで、現在の価格に最も近い下位要素のインデックスを正しく決定できているのでしょうか?

ArrayBsearchを 使ったことがないので、回答なし