Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 329

 
Alexey Viktorov:

Il n'est pas nécessaire de trier le tableau après chaque ajout d'un élément du tableau. Il est préférable de déplacer le tri

De la référence

Mas[Blizko2] est la plus petite valeur la plus proche dans le tableau.

Merci pour votre réponse ! Pourriez-vous me dire, pour déterminer l'élément suivant du tableau, j'ai utilisé l'élément +1 déjà trouvé, mais le testeur donne une erreur à cet endroit.

 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];                                      // Цена выбранного ордера   

Je dois trouver l'élément suivant. C'est évidemment +1, mais le programme me donne une erreur ! Peut-être y a-t-il un autre moyen ou peut-être que je m'y prends mal ? S'il vous plaît, donnez-moi un indice)

Blizko1 = Mas[Blizko2]+1;

ou comme ça ?

mais ensuite à la compilation l'avertissement sur la perte possible de données

 
vikzip:

Avec cette construction

Blizko1 = Mas[Blizko2]+1;

vous ajoutez 1 à la valeur obtenue à partir de la cellule de l'indice Blizko2, et c'est là que le prix est stocké - une valeur double. Vous ajoutez un nombre entier de 1. Pour éviter un avertissement, vous devez écrire +1.0

Mais cela ne sauvera pas non plus le "père de la démocratie russe", car vous ajoutez 1 non pas à l'index mais à la valeur stockée dans le tableau Mas[] par l'index Blizko2.

Donc, naturellement, pour obtenir une valeur d'une cellule voisine du tableau, vous devez ajouter ou soustraire 1 à l'index. Mais nous avons ici une erreur sur laquelle vous avez buté : si index pointe vers la cellule la plus extérieure d'un tableau - soit 0, soit la toute dernière, alors en soustrayant 1 (à 0) ou en ajoutant 1 (à la toute dernière), vous tomberez en dehors du tableau - il n'y a pas de telle cellule. En conséquence, vous devez contrôler que Blizko2+1 n'est pas supérieur à ArraySize(Mas)-1, ou que Blizko2-1 n'est pas inférieur à zéro.

Et... on vous a dit que vous n'aviez pas besoin de trier le tableau à chaque itération de la boucle - avez-vous besoin de freins ?

Il doit être trié après avoir vérifié que la taille du tableau est supérieure à 1.

Et cette conception n'est pas du tout claire :

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

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

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

Regardez : dans Blizko2 vous avez l'index de la cellule du tableau avec le prix.
Puis vous écrivez dans le tableau - dans sa cellule Blizko2+1 la valeur contenue dans la variable Blizko1 (pourquoi ? ??) - vous devriez avoir des prix à cet endroit, mais vous les bourrez de valeurs incompréhensibles.

Vous devez comprendre ce que vous faites en général - commentez simplement chaque ligne de votre fonction. De manière réfléchie.

 
Artyom Trishkin:

Avec cette construction

vous ajoutez 1 à la valeur obtenue à partir de la cellule de l'indice Blizko2, et c'est là que le prix est stocké - une valeur double. Vous ajoutez un nombre entier de 1. Pour éviter un avertissement, vous devez écrire +1.0

Mais cela ne sauvera pas non plus le "père de la démocratie russe", car vous ajoutez 1 non pas à l'index mais à la valeur stockée dans le tableau Mas[] par l'index Blizko2.

Donc, naturellement, pour obtenir une valeur d'une cellule voisine du tableau, vous devez ajouter ou soustraire 1 à l'index. Mais nous avons ici une erreur sur laquelle vous avez buté : si index pointe vers la cellule la plus extérieure d'un tableau - soit 0, soit la toute dernière, alors en soustrayant 1 (à 0) ou en ajoutant 1 (à la toute dernière), vous tomberez en dehors du tableau - il n'y a pas de telle cellule. En conséquence, vous devez contrôler que Blizko2+1 n'est pas supérieur à ArraySize(Mas)-1, ou que Blizko2-1 n'est pas inférieur à zéro.

Et... on vous a dit que vous n'aviez pas besoin de trier le tableau à chaque itération de la boucle - avez-vous besoin de freins ?

Pour le trier, nous devons vérifier si la taille du tableau est supérieure à 1.

Et cette construction n'est pas du tout claire :

Voir : dans Blizko2 vous avez l'index de la cellule du tableau avec le prix.
Puis vous écrivez dans le tableau - dans sa cellule Blizko2+1 la valeur contenue dans la variable Blizko1 (pourquoi ? ??) - vous devriez avoir des prix à cet endroit, mais vous les bourrez de valeurs incompréhensibles.

Vous devez comprendre ce que vous faites en général - commentez simplement chaque ligne de votre fonction. De manière réfléchie.


Merci pour cette réponse instructive ! Le but pour lequel je veux créer le tableau est de déterminer les prix des ordres les plus proches au-dessous du prix et au-dessus du prix, s'il en existe. S'ils sont disponibles et que la distance entre eux et le prix dépasse la distance que j'ai définie, alors ouvrez les ordres correspondants. Je pensais que cela ressemblerait à ceci (j'ai décrit la logique de mes actions ici autant que je le pouvais)

//---Создаем массив для учета всех ордеров в терминале
  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];                                          // Цена выбранного ордера выше цены         

        
 

J'aurais l'air de quelque chose comme ça

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:

J'aurais l'air de quelque chose comme ça


Merci, mais que signifieDBL_MAX dans le niveau supérieur?

 
vikzip:

Merci ! Que signifieDBL_MAX?

Un lien a même été inséré par l'ingénieux moteur du forum. Il est plus facile de cliquer dessus que d'attendre une réponse.

 
Artyom Trishkin:

Un lien a même été inséré par l'ingénieux moteur du forum. Il est plus facile de cliquer dessus que d'attendre une réponse.


Merci ! J'aimerais avoir un tel moteur))))

 
vikzip:

Merci pour cette réponse instructive ! Le but pour lequel j'ai l'intention de créer le tableau est de déterminer les prix des ordres les plus proches au-dessous du prix et au-dessus du prix, s'il en existe. S'ils sont disponibles et que la distance entre eux et le prix dépasse une certaine distance, alors ouvrez les ordres correspondants. Je pensais que cela ressemblerait à ceci (j'ai décrit la logique de mes actions ici autant que je le pouvais)

Il y a une erreur dans le commentaire de cette ligne.

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


Forum sur le trading, les systèmes de trading automatisés et les tests de stratégies de trading.

Toutes les questions des débutants de MQL4, l'aide et la discussion sur les algorithmes et les codes

Alexey Viktorov, 2017.10.04 09:32


De l'aide

Valeur retournée

Renvoie l'indice du premier élément trouvé. Si la valeur recherchée n'est pas trouvée, elle renvoie l'indice du plus petit élément le plus proche entre lequel se trouve la valeur recherchée.

Mas[Blizko2] est la plus petite valeur la plus proche dans le tableau.


Il ne reste plus qu'à ajouter que la référence ne dit rien sur la dépendance au sens de tri du tableau. Ainsi, aucune manipulation n'est nécessaire après la recherche dans les tableaux. La tâche est déjà accomplie.

Artyom a déjà tout expliqué plus en détail. Vérifier l'égalité d'un index à zéro et la taille d'un tableau pour ne pas sauter hors des limites...

 

Comment faire pour que la souris ne commence à être suivie qu'après avoir cliqué sur le bouton ? Mais la situation se produit (dans l'idée de transférer un stop sur tous les ordres à un point par un clic de souris depuis l'EA) lorsque je clique sur le bouton, un stop sur tous les ordres au prix où le bouton a été cliqué commence à être transféré en une fois. Comment faire pour que cette propriété if(id==CHARTEVENT_CLICK)

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

 
Basicprof:

Comment faire pour que la souris ne commence à être suivie qu'après avoir cliqué sur le bouton ? Mais la situation se produit (dans l'idée de transférer un stop sur tous les ordres à un point par un clic de souris depuis l'EA) lorsque je clique sur le bouton, un stop sur tous les ordres au prix où le bouton a été cliqué commence à être transféré en une fois. Comment faire pour que cette propriété if(id==CHARTEVENT_CLICK)

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


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