Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 329

 
Alexey Viktorov:

No es necesario ordenar el array después de cada adición de un elemento del array. Es mejor mover la clasificación

De la referencia

Mas[Blizko2] es el valor más pequeño de la matriz

Gracias por su respuesta. Podría decirme, para determinar el siguiente elemento del array, he utilizado el elemento +1 ya encontrado, pero el probador da un error en este 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];                                      // Цена выбранного ордера   

Necesito encontrar el siguiente elemento. ¡Obviamente es +1, pero el programa me da un error! ¿Quizás hay otra manera o quizás lo hago mal? Por favor, dame una pista)

Blizko1 = Mas[Blizko2]+1;

¿o así?

pero luego al compilar la advertencia sobre la posible pérdida de datos

 
vikzip:

Con esta construcción

Blizko1 = Mas[Blizko2]+1;

se añade 1 al valor obtenido de la celda del índice Blizko2, y ahí se almacena el precio, un valor doble. Estás añadiendo un entero 1. Para evitar una advertencia, es necesario escribir +1.0

Pero esto tampoco salvará al "padre de la democracia rusa", porque estás añadiendo 1 no al índice sino al valor almacenado en la matriz Mas[] por el índice Blizko2.

Así que, naturalmente, para obtener un valor de una celda cercana del array, hay que sumar o restar 1 al índice. Pero aquí tenemos un error con el que has tropezado: si el índice apunta a la celda más externa de un array -ya sea 0 o la última-, entonces al restar 1 (en 0) o sumar 1 (en la última) caerás fuera del array -no existe tal celda-. En consecuencia, hay que controlar que Blizko2+1 no sea mayor que ArraySize(Mas)-1, o que Blizko2-1 no sea menor que cero.

Y... te han dicho que no necesitas ordenar el array en cada iteración del bucle - ¿necesitas frenos?

Se debe ordenar después de comprobar que el tamaño del array es mayor que 1.

Y este diseño no está nada claro:

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

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

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

Mira: en Blizko2 tienes el índice de la celda del array con el precio.
Luego escribes en el array - en su celda Blizko2+1 el valor contenido en la variable Blizko1 (¿por qué??) - deberías tener precios allí, pero los estás rellenando con valores incomprensibles.

Tienes que averiguar lo que estás haciendo en general, sólo tienes que comentar cada línea de tu función. Con mucho cuidado.

 
Artyom Trishkin:

Con esta construcción

se añade 1 al valor obtenido de la celda del índice Blizko2, y ahí se almacena el precio, un valor doble. Estás añadiendo un entero 1. Para evitar una advertencia, es necesario escribir +1.0

Pero esto tampoco salvará al "padre de la democracia rusa", porque estás añadiendo 1 no al índice sino al valor almacenado en la matriz Mas[] por el índice Blizko2.

Así que, naturalmente, para obtener un valor de una celda cercana del array, hay que sumar o restar 1 al índice. Pero aquí tenemos un error con el que has tropezado: si el índice apunta a la celda más externa de una matriz -ya sea 0 o la última-, entonces al restar 1 (en 0) o sumar 1 (en la última) caerás fuera de la matriz -no existe tal celda-. En consecuencia, hay que controlar que Blizko2+1 no sea mayor que ArraySize(Mas)-1, o que Blizko2-1 no sea menor que cero.

Y... te han dicho que no necesitas ordenar el array en cada iteración del bucle - ¿necesitas frenos?

Para ordenarlo, tenemos que comprobar si el tamaño del array es mayor que 1.

Y esta construcción no está nada clara:

Ver: en Blizko2 tienes el índice de la celda del array con el precio.
Luego escribes en el array - en su celda Blizko2+1 el valor contenido en la variable Blizko1 (¿por qué??) - deberías tener precios allí, pero los estás rellenando con valores incomprensibles.

Tienes que averiguar lo que estás haciendo en general - sólo comentar cada línea de tu función. Con mucho cuidado.


Gracias por la respuesta informativa. El propósito para el que quiero crear el array es determinar los precios de las órdenes más cercanas por debajo del precio y por encima del precio, si es que las hay. Si están disponibles y la distancia entre ellos y el precio supera la distancia que he definido, entonces abre las órdenes correspondientes. Pensé que se vería así (describí la lógica de mis acciones aquí tanto como 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];                                          // Цена выбранного ордера выше цены         

        
 

Tendría un aspecto similar al siguiente

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:

Tendría un aspecto similar al siguiente


Gracias, ¿qué significaDBL_MAX en el nivel superior?

 
vikzip:

Gracias. ¿Qué significaDBL_MAX?

Incluso tienes un enlace insertado por el ingenioso motor del foro. Es más fácil hacer clic que esperar una respuesta.

 
Artyom Trishkin:

Incluso tienes un enlace insertado por el ingenioso motor del foro. Es más fácil hacer clic en él que esperar una respuesta.


Gracias. Me gustaría tener un motor así)))

 
vikzip:

Gracias por la respuesta informativa. La finalidad con la que pretendo crear el array es determinar los precios de las órdenes más cercanas por debajo del precio y por encima del precio, si es que las hay. Si están disponibles y la distancia entre ellos y el precio supera una determinada distancia, entonces se abren las órdenes correspondientes. Pensé que se vería así (describí la lógica de mis acciones aquí tanto como pude)

Hay un error en el comentario de esta línea.

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


Foro sobre trading, sistemas de trading automatizados y pruebas de estrategias de trading.

Cualquier pregunta para principiantes de MQL4, ayuda y discusión sobre algoritmos y códigos

Alexey Viktorov, 2017.10.04 09:32


De la ayuda

Valor devuelto

Devuelve el índice del primer elemento encontrado. Si no se encuentra el valor buscado, devuelve el índice del elemento menor más cercano entre los que se encuentra el valor buscado.

Mas[Blizko2] es el valor más pequeño de la matriz.


Sólo queda añadir que la referencia no dice nada sobre la dependencia de la dirección de ordenación del array. Por lo tanto, no se necesita ninguna manipulación después de ArrayBsearch. La tarea ya está hecha.

Artyom ya ha explicado todo con más detalle. Comprueba la igualdad de un índice a cero y el tamaño de un array para que no salte fuera de los límites...

 

¿Cómo puedo hacer que el ratón comience a ser rastreado sólo después de hacer clic en el botón? Pero la situación ocurre (en la idea de transferir un stop en todas las órdenes a un punto por el clic del ratón desde el EA) cuando hago clic en el botón, un stop en todas las órdenes en el precio donde se hizo clic en el botón comienza a ser transferido a la vez. ¿Cómo puede esta propiedad if(id==CHARTEVENT_CLICK)

ejecutar sólo después de hacer clic en este botón if(ObjectGetInteger(0, "cm STOP ALL",OBJPROP_STATE))

 
Basicprof:

¿Cómo puedo hacer que el ratón comience a ser rastreado sólo después de que se haga clic en el botón? Pero la situación ocurre (en la idea de transferir un stop en todas las órdenes a un punto por el clic del ratón desde el EA) cuando hago clic en el botón, un stop en todas las órdenes en el precio donde se hizo clic en el botón comienza a ser transferido a la vez. ¿Cómo puede esta propiedad if(id==CHARTEVENT_CLICK)

ejecutar sólo después de hacer clic en este botón if(ObjectGetInteger(0, "cm STOP ALL",OBJPROP_STATE))


if(id==CHARTEVENT_OBJECT_CLICK && sparam == "cm STOP ALL") { // код }
Razón de la queja: