Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 327

 

Olá! tenho uma pergunta sobre arrays. Eu criei uma matriz unidimensional com alguns problemas. Eu deveria estar bem, porque não tenho nenhum erro no momento da compilação, mas agora eu deveria executá-lo no testador e ver o erro EURUSD,M1: array out of range in ,, (218,12) que indica exatamente a posição do meu array de luto. Por favor, diga-me o que há de errado com isso

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];
     }
   }       
Aconselhe, talvez haja outra maneira de atribuir um preço de pedido a cada elemento da matriz?
 
vikzip:

Olá! tenho uma pergunta sobre arrays. Eu criei uma matriz unidimensional com alguns problemas. Eu deveria estar bem, porque não tenho nenhum erro no momento da compilação, mas agora eu deveria executá-lo no testador e ver o erro EURUSD,M1: array out of range in ,, (218,12) que indica exatamente a posição do meu array de luto. Por favor, diga-me o que há de errado com isso


Seu código está errado na raiz, mas o erro se deve ao fato de que o tamanho da matriz não é definido antes do enchimento

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

Seu código está fundamentalmente errado, mas o erro se deve ao tamanho da matriz não ter sido definido antes do enchimento


Muito obrigado! Você pode me dizer por favor, a seqüência não é correta? A idéia é determinar os preços dos pedidos mais próximos do preço a partir de baixo e acima. Por favor, diga-me seu ponto de vista.

 
vikzip:

Muito obrigado! Você pode me dizer se a seqüência não está correta? A idéia é determinar os preços dos pedidos mais próximos do preço a partir de baixo e de cima. Por favor, diga-me seu ponto de vista.

Você tem um monte de coisas desnecessárias em seu ciclo. Você tem que preencher a matriz com preços no laço e trabalhar com eles fora do laço

  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:

Você tem um monte de coisas desnecessárias no circuito. Você precisa preencher a matriz com preços no loop, e trabalhar com ela fora do loop.


Estou vendo. Muito obrigado!!! Eu tive a idéia correta?

 
vikzip:

Estou vendo. Muito obrigado!!! Você entendeu bem a idéia?

É possível. A mesma tarefa pode ser realizada de várias maneiras.

 
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:

Isso é possível. Uma e a mesma tarefa pode ser implementada de várias maneiras.


Eu só fiz um loop para determinar os índices de itens mais próximos e o testador mostra um erro no Mas[Blizko2]. Talvez seja porque ainda não há ordens quando eu executo o EA?

(Por favor, informe, talvez você saiba onde procurar por algo semelhante?)
 
vikzip:

Eu acabei de colocar fora de loop a definição dos índices de elementos mais próximos e no testador mostra um erro no lugar Mas[Blizko2]... Talvez seja porque quando você executa a EA ainda não há ordens?

Tente assim

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:

Tente isto


Muito obrigado!!!! Tenho outra pergunta: estou determinando corretamente o índice do elemento menor mais próximo do preço atual mudandoMODE_DESCEND paraMODE_ASCEND?

 
vikzip:

Muito obrigado!!!! Tenho outra pergunta: Estou determinando corretamente o índice do elemento menor mais próximo do preço atual, mudandoMODE_DESCEND paraMODE_ASCEND?

Sem resposta, eu nunca useio ArrayBsearch

Razão: