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

 
Alexey Viktorov:

Não há necessidade de ordenar a matriz após cada adição de um elemento da matriz. É melhor mover a triagem

A partir da referência

Mas[Blizko2] é o valor menor mais próximo na matriz

Obrigado por sua resposta! Poderia me dizer, por favor, para determinar o próximo elemento do conjunto que usei o elemento já encontrado +1, mas o testador dá um erro neste lugar.

 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_DESCEND);                           // Теперь цены открытия упорядочены по убыванию
     }
   } 
   if(ArraySize(Mas)>1)                                                         //Если массив не пустой
   
         { 
        int Blizko2=ArrayBsearch(Mas,Ask,WHOLE_ARRAY,0,MODE_DESCEND);          //Определен индекс ближайшего большего по значению елемента к текущей цене
        

        Mas[Blizko2+1]= Blizko1;     // В этой строке перед квадратной скобкой выдает ошибку!                           //Определен индекс ближайшего меньшего по значению елемента к текущей цене

        PriceBlizko1=Mas[Blizko1];
        PriceBlizko2 = Mas[Blizko2];                                      // Цена выбранного ордера   

Preciso encontrar o próximo elemento. Obviamente é +1, mas o programa me dá um erro! Talvez haja outra maneira ou talvez eu faça isso errado? Por favor, me dê uma dica)

Blizko1 = Mas[Blizko2]+1;

ou como este?

mas depois, na compilação, um aviso sobre possível perda de dados

 
vikzip:

Com esta construção

Blizko1 = Mas[Blizko2]+1;

você adiciona 1 ao valor obtido da célula de índice Blizko2, e é lá que o preço é armazenado - um valor duplo. Você está adicionando um número inteiro 1. Você precisa escrever +1,0 para evitar o aviso.

Mas isto também não vai salvar o "pai da democracia russa", porque você está adicionando 1 não ao índice, mas ao valor armazenado na matriz Mas[] pelo índice Blizko2.

Portanto, naturalmente, para obter um valor de uma célula próxima da matriz, você precisa adicionar ou subtrair 1 ao índice. Mas aqui temos um erro no qual você tropeçou: se o índice apontar para a célula mais externa de um array - seja 0 ou a última, então subtraindo 1 (em 0) ou adicionando 1 (na última) você cairá fora do array - nenhuma célula desse tipo está lá. Assim, você precisa controlar que o Blizko2+1 não é mais que o ArraySize(Mas)-1, ou que o Blizko2-1 não é menos que zero.

E... foi-lhe dito que você não precisa ordenar a matriz a cada iteração do loop - você precisa de freios?

Deve ser classificado após verificar se o tamanho da matriz é maior que 1.

E este projeto não é nada claro:

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

Mas[Blizko2+1]= Blizko1; // В этой строке перед квадратной скобкой выдает ошибку! //Определен индекс ближайшего меньшего по значению елемента к текущей цене

        PriceBlizko1=Mas[Blizko1];
        PriceBlizko2 = Mas[Blizko2];                                      // Цена выбранного ордера   

Veja: em Blizko2 você tem o índice da célula da matriz com o preço.
Então você escreve na matriz - em sua célula Blizko2+1 o valor contido na variável Blizko1 (por quê????) - você deveria ter preços lá, mas você os está enchendo com valores incompreensíveis.

Você precisa descobrir o que está fazendo em geral - basta comentar cada linha de sua função. Pensando bem.

 
Artyom Trishkin:

Com esta construção

você adiciona 1 ao valor obtido da célula de índice Blizko2, e é lá que o preço é armazenado - um valor duplo. Você está adicionando um número inteiro 1. Para evitar um aviso, você precisa escrever +1,0

Mas isto também não vai salvar o "pai da democracia russa", porque você está adicionando 1 não ao índice, mas ao valor armazenado na matriz Mas[] pelo índice Blizko2.

Portanto, naturalmente, para obter um valor de uma célula próxima da matriz, você precisa adicionar ou subtrair 1 ao índice. Mas aqui temos um erro em que você tropeçou: se o índice apontar para a célula mais externa de um array - seja 0 ou a última, então subtraindo 1 (em 0) ou adicionando 1 (na última), você cairá fora do array - nenhuma célula desse tipo está lá. Assim, você precisa controlar que o Blizko2+1 não é mais que o ArraySize(Mas)-1, ou que o Blizko2-1 não é menos que zero.

E... foi-lhe dito que você não precisa ordenar a matriz a cada iteração do loop - você precisa de freios?

Para classificá-la, temos que verificar se o tamanho da matriz é superior a 1.

E esta construção não é nada clara:

Veja: em Blizko2 você tem o índice da célula da matriz com o preço.
Então você escreve na matriz - em sua célula Blizko2+1 o valor contido na variável Blizko1 (por quê????) - você deveria ter preços lá, mas você os está enchendo com valores incompreensíveis.

Você precisa descobrir o que está fazendo em geral - basta comentar cada linha de sua função. Pensando bem.


Obrigado pela resposta informativa! O objetivo para o qual quero criar a matriz é determinar os preços dos pedidos mais próximos abaixo do preço e acima do preço, se houver algum. Se eles estiverem disponíveis e a distância entre eles e o preço exceder a distância que eu defini, então abra as ordens correspondentes. Pensei que seria assim (descrevi a lógica de minhas ações aqui o máximo que pude)

//---Создаем массив для учета всех ордеров в терминале
  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_DESCEND);                           // Теперь цены открытия упорядочены по убыванию. Я намеренно сортирую массив, потому что ордера добовляются в него в том порядке в котором появляются в 
                                                                             //терминале и не сортируются по убыванию(Верно ли это мое утверждение??)А мне необходимо позже точно определить ближайший ордер выше и ниже цены

     }
   } 
   if(ArraySize(Mas)>1)                                                         //Если массив не пустой
   
         { 
        int Blizko2=ArrayBsearch(Mas,Ask,WHOLE_ARRAY,0,MODE_DESCEND);          //Определен индекс ближайшего большего по значению елемента к текущей цене
                                                                               //Здесь я справку прочитал и если указано MODE_ASCEND тогда будет найдено ближайшее меньшее значение, но первым я намерен определить ордер выше цены и 
                                                                               // поэтому поставил MODE_DESCEND. Скажите пожалуйста - это верно?? 
         PriceBlizko1 = Mas[Blizko2]+1;                                        //!!!Вот здесь я намереваюсь определить ордер сразу ниже цены и так как я намеренно упорядочил по убыванию уже все ордера в массиве, то по логике после 
                                                                               //определения ближайшего верхнего ордера к цене Blizko2 следующим в массиве будет ордер уже ниже цены(Верно ли мое утверждение??)И вот на этом месте я не 
                                                                               //могу понять: каким же образом это сделать? Ведь мне очевидно что он следующий, но как это записать в код я не могу понять))) Пробовал и в скобках уже 
                                                                               //прибавлять еденицу)) А мне нужно что бы PriceBlizko1 была присвоена цена ордера сразу ниже цены!! Подскажите пожалуйста как определить цену ордера ниже 
                                                                               //цены PriceBlizko2 ??
         PriceBlizko2 = Mas[Blizko2];                                          // Цена выбранного ордера выше цены         

        
 

Eu ficaria algo parecido com isto

double levelDown=0;
double levelUp=DBL_MAX;

int totalOrders=OrdersTotal();


   for(int i=0;i<totalOrders;i++)
      {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         {
         double price=OrderOpenPrice();
         
         if (price-Ask>_Point && levelUp-price>_Point)
            levelUp=price;
         
         if (Bid-price>_Point && price-levelDown>_Point)
            levelDown=price;
         }
      }
 
Taras Slobodyanik:

Eu ficaria algo parecido com isto


Obrigado, o que significaDBL_MAX no nível superior?

 
vikzip:

Obrigado! O que significaDBL_MAX?

Você tem até mesmo um link inserido pelo inteligente motor do fórum. É mais fácil clicar sobre ele do que esperar por uma resposta.

 
Artyom Trishkin:

Você tem até mesmo um link inserido pelo inteligente motor do fórum. É mais fácil clicar sobre ele do que esperar por uma resposta.


Obrigado! Eu gostaria de ter um motor assim)))

 
vikzip:

Obrigado pela resposta informativa! O objetivo para o qual pretendo criar a matriz é determinar os preços dos pedidos mais próximos abaixo do preço e acima do preço, se houver algum. Se elas estiverem disponíveis e a distância entre elas e o preço exceder uma certa distância, então abra as ordens correspondentes. Pensei que seria assim (descrevi a lógica de minhas ações aqui o máximo que pude)

Há um erro neste comentário de linha.

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


Fórum sobre comércio, sistemas automatizados de comércio e teste de estratégias comerciais.

Qualquer pergunta, ajuda e discussão sobre algoritmos e códigos para iniciantes da MQL4

Alexey Viktorov, 2017.10.04 09:32


A partir da ajuda

Valor retornado

Índice de retorno do primeiro elemento encontrado. Se o valor procurado não for encontrado, ele retorna o índice do elemento menor mais próximo entre o qual o valor procurado está localizado.

Mas[Blizko2] é o valor menor mais próximo na matriz.


Resta apenas acrescentar que a referência não diz nada sobre a dependência da direção de classificação da matriz. Portanto, nenhuma manipulação é necessária após a ArrayBsearch. A tarefa já está feita.

Artyom já explicou tudo mais detalhadamente. Verificar a igualdade de um índice a zero e o tamanho de uma matriz para não saltar fora dos limites...

 

Como posso fazer o mouse começar a ser rastreado somente depois que o botão é clicado? Mas a situação acontece (na idéia de transferir uma parada em todos os pedidos para um ponto por clique do mouse da EA) quando clico no botão, uma parada em todos os pedidos ao preço em que o botão foi clicado começa a ser transferida de uma só vez. Como pode esta propriedade se(id==CHARTEVENT_CLICK)

if(ObjectGetInteger(0, "cm STOP ALL",OBJPROP_STATE))

 
Basicprof:

Como posso fazer o mouse começar a ser rastreado somente depois que o botão é clicado? Mas a situação acontece (na idéia de transferir uma parada em todos os pedidos para um ponto por clique do mouse da EA) quando clico no botão, uma parada em todos os pedidos ao preço em que o botão foi clicado começa a ser transferida de uma só vez. Como pode esta propriedade se(id==CHARTEVENT_CLICK)

if(ObjectGetInteger(0, "cm STOP ALL",OBJPROP_STATE))


if(id==CHARTEVENT_OBJECT_CLICK && sparam == "cm STOP ALL") { // код }