新人对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].也许这是因为当你运行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

原因: