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

 

Avez-vous essayé de rendre les variables globales ?

int izmb=0, izms=0;

void OnTick()
   {
   double LB=0,LS=0;
   int b=0,s=0;
   
   for(int i=0; i<OrdersTotal(); i++)
      {    
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         { 
         if(OrderSymbol()==Symbol())
            { 
            if(OrderType()==OP_BUY)             
               {  
               LB+=OrderLots();
               b++; 
               }                                         
            else if(OrderType()==OP_SELL)        
               {
               LS+=OrderLots();
               s++;
               } 
            }
         }     
      }
   if(izmb!=b || izms!=s)
      { 
      izmb=b;
      izms=s 
           // далее идут условия для открытия ордера.
      }
 
scomoroh:

Nous voulions vérifier les conditions pour trouver une entrée EA non pas à chaque tick, mais seulement lorsqu'un autre ordre est ouvert ou fermé par un autre EA ou manuellement (afin que le processeur ne soit pas surchargé). C'est pourquoi nous devons vérifier si le nombre d'ordres correspond à chaque tick.

Peut-on utiliser une variable statique ? Le programme fonctionnera-t-il sous cette forme ?

Alternativement, la condition la plus simple et la plus facile

OnTrade() est un analogue pour mt4 avec mt5

void OnTrade()
 {
  ... // сюда код, который будет работать только по изменению ситуации по счёту: открытие/закрытие позиций, установка/удаление ордеров
 }

static _OTotal = -1;
static _HTotal = -1;
int OT=OrdersTotal();
int HT=OrdersHistoryTotal();
  if(OT!=_OTotal || HT!=_HTotal) // если изменилось - выполняем
   {
     OnTrade(); // здесь дёргаем текущую ситуацию на счёте и заполняем структуры
     _OTotal=OrdersTotal(); // запомним текущее количество
     _HTotal=OrdersHistoryTotal(); // запомним количество в истории
   }
 
ANDREY:

Merci de votre réponse. J'ai compris tout ce que vous avez écrit. Mais je n'ai pas compris le sens de ce que vous avez écrit par rapport à mon problème.

Par tableau horizontal à deux dimensions dans mon code, je veux dire lorsqu'il y a 2 lignes sous l'indice 0 ou 1 et des colonnes sous les indices de 0 à 30. La première dimension est désignée par[0][0],[0][1],[0][2], ...[0][30] La deuxième dimension est désignée par[1][0],[1][1],[1][2], ...[1][30]

Par tableau vertical à deux dimensions dans mon code, je veux dire quand il y a 31 lignes indexées de 0 à 30 et 2 colonnes indexées de 0 et 1. La première dimension est désignée par[0][0],[1[0],[2][0], ...[30][0] La deuxième dimension est désignée par[0][1],[1][1],[2][1], ...[30][1]

Si vous exécutez mon code, le tableau se remplira verticalement. Et la fonction ArraySort() triera le tableau comme il se doit.

QUESTION Pourquoi la fonction ArrayFill() ne fonctionne-t-elle pas dans ce cas ? Après tout, je lui ai demandé de remplir la première dimension du tableau (31 éléments) avec les mêmes valeurs 0,5555.
Merci pour votre aide.

MQL4 ne peut travailler qu'avec des tableaux à 4 dimensions. Par conséquent, arr[31][31] est une erreur. Un tableau ne peut pas être plus grand que arr[][4]. Et la première dimension est limitée non pas par MQL, mais par quoi, je ne sais pas exactement. Peut-être que quelqu'un peut expliquer.

La fonction ArrayFill() fonctionnera, mais nous devons comprendre que le nombre d'éléments dans le tableau arr[3][2] sera de 6, et nous devons écrire 6 dans cette fonction, et non 3 par la taille de la première dimension.

 

Dimension quadridimensionnelle : arr[][][][] ou arr[,,,].

Les dimensions des trois dernières dimensions doivent être spécifiées dans la déclaration et fixées, tandis que la première peut être laissée non spécifiée et modifiée ultérieurement :

int arr[,100,200,500];

Dans l'exemple d'un tableau à deux dimensions, les données du tableau sont disposées comme suit :

int arr[2,5]={0,1,2,3,4,  - в нулевом элементе первого измерения 
              5,6,7,8,9}; - в первом элементе первого измерения

Sort déplace l'ensemble de l'horizontale en triant par la première dimension,

et ArrayFill() remplit d'un élément à l'autre, par exemple de 3 à 8. Il en résulte un désordre.

Si vous voulez remplir certaines valeurs dans l'horizontale par la première dimension, vous devez contrôler le début et la fin du remplissage, en sachant comment les données sont disposées.

Par exemple, la règle entière de l'élément zéro de la première dimension :

int value=5;
int index=0;
ArrayFill(arr, index*ArrayRange(arr,1), ArrayRange(arr,1), value); 

Si un seul élément zéro, alors oui :

ArrayFill(arr, index*ArrayRange(arr,1), 1, value); 

Si plusieurs éléments nuls, alors par bouclage et affectation simple.


Je n'ai pas dû l'expliquer très clairement... Utilisez l'imprimante, imprimez tout dans la boucle, d'une façon ou d'une autre, et vous aurez le coup de main. Vous apprendrez plus vite de cette façon.

printf est mon ami !

 
Alexey Viktorov:

MQL4 ne peut pas gérer plus de tableaux à 4 dimensions. Par conséquent, arr[31][31] est une erreur. Un tableau ne peut pas être plus grand que arr[][4]. Et la première dimension est limitée non pas par MQL, mais par quoi, je ne sais pas exactement. Peut-être que quelqu'un peut expliquer.


Et la première dimension (c'est-à-dire le nombre de chaînes de caractères) est limitée par combien ? Quel est le nombre de lignes maximum autorisé par MQL4 dans un tableau multidimensionnel ?

 

Je pense que les quatre dimensions ont une limite :INT_MAX

À propos de la structure.

bidimensionnel :

Cette structure représente un tableau unidimensionnel dans lequel les éléments sont disposés comme suit : d'abord la première ligne, puis la deuxième, puis la troisième.

tridimensionnel :

En trois dimensions, également. Il s'agit d'un tableau à une dimension, où les premières lignes sont l'une après l'autre, puis les secondes,......

Pourquoi unidimensionnel ? Parce que plusieurs cellules dans une rangée sont allouées pour le tableau dans la mémoire de l'ordinateur, donc on y écrit tout dans l'ordre : rang00+rang01+rang02+rang10+rang11....


Et il est également possible d'ajouter une quatrième dimension - des piles de feuilles de tableau tridimensionnelles.

Seul le nombre de lignes peut être modifié en cours de programme. Toutes les lignes, colonnes, feuilles et piles ne sont qu'une convention pour comprendre la structure. Les dimensions ne sont pas réellement dans notre espace, ce ne sont que des mesures.

Comme le dit Alexei :

Alexey Viktorov:

... la colonne ... est ... à l'horizontale car je la regarde couchée sur le canapé.........

 
Alexey Viktorov:

Avez-vous remarquéla note suivante

ArrayFill

Un tableaumultidimensionnel, lorsqu'il est traité avec ArrayFill(), estreprésenté comme un tableau unidimensionnel, par exemple, un tableau [2][4] est traité comme un tableau [8], donc lorsqu'on travaille avec ce tableau, il est acceptable de spécifier un index de l'élément initial égal à 5. Ainsi, l'appel à ArrayFill(array, 5, 2, 3.14) pour array[2][4] remplira les éléments array[1][1] et array[1][2] avec la valeur 3.14.


J'ai tout compris sauf ArrayFill().

1. Lorsque je déclare un tableau double LoY[31][31] ; je crée essentiellement un tableau de 31 lignes par 31 colonnes. J'ai créé un tableau à deux dimensions (plutôt qu'à quatre dimensions), mais je ne l'ai pas encore rempli.

2. Ensuite, dans le code, je remplis chaque élément individuel du tableau avec une valeur Bid. Je peux le remplir avec 2 options
a) LoY[31][0]=Bid ; - Je remplis la ligne 31 et la première colonne du tableau avec les valeurs Bid. Et la deuxième dimension (colonne sous l'index 1, est remplie de 0 par défaut, car je ne la remplis pas. Ainsi, dans cette variante, j'aila première dimension avec 31 éléments remplis et la deuxième dimension avec 1.

b) LoY[0][31]=Bid - Je remplis la colonne 31 et la première ligne du tableau avec les valeurs Bid. Et la deuxième dimension (ligne sous l'indice 1, est remplie de 0 par défaut, car je ne la remplis pas. Ainsi, dans cette variante, la deuxième dimension est constituée de 31 éléments remplis, la deuxième dimension est constituée de 1.

ArraySort() trie le tableau bidimensionnel par la première dimension seulement. Il s'agit donc de l'option a). L'option a), dans laquelle la première dimension comporte 31 lignes, ne sera pas triée. L'option b), dans laquelle la première dimension ne comporte qu'une seule ligne, ne pourra pas être triée.
MaintenantArrayFill() Il tire le tableau bidimensionnel sur une seule ligne avant d'attribuer les valeurs requises aux éléments du tableau bidimensionnel. C'est-à-dire qu'il devra tirer mon tableau LoY[31][31] en une seule ligne de taille 961 éléments. Il s'agit d'une très longue chaîne et la plupart des éléments seront inutiles.

Faisons donc un tableau LoY[31][2] (variante a))ou LoY[2][31] (variante b))

On voit clairement commentArrayFill() va dessiner en 1 ligne dans la variante b) . La deuxième ligne rejoindra simplement la première et après le dernier élément de la première ligne LoY[0][31], la première ligne du tableau dans ArrayFill() continuera avecLoY[0][32] et se terminera parLoY[0][62] Et les valeurs des éléments du tableau dans ArrayFill() iront dans l'ordre suivant : de l'indice 0 à 31 les éléments du tableau seront remplis avec des valeurs de prix et de l'indice 32 à la fin seront remplis avec 0 .

QUESTION : CommentArrayFill() dessine-t-il l'option a) en 1 ligne ? Après tout, il y a 28 rangées dans cette variante. Et s'il s'agit d'une seule ligne, dans quel ordre contiendra-t-il les valeurs des éléments du tableau ? Et, puis-je utiliser Print() pour imprimer les éléments de mon tableau bidimensionnel après que ArrayFill() les ait convertis en un tableau unidimensionnel ? Cette fonction elle-même ne renvoie aucune valeur, donc Print() ne l'imprimera pas si elle y est insérée.

Merci pour votre aide.

 

J'ai un peu foiré ici... J'ai honte de moi.

élément individuel du tableau avec une valeur Bid. Je peux le remplir avec 2 options
a) LoY[31][0]=Bid ; - Je remplis la ligne 31 et la première colonne du tableau avec les valeurs Bid. Et la deuxième dimension (colonne sous l'index 1, est remplie de 0 par défaut, car je ne la remplis pas. Ainsi, dans cette variante, j'aila première dimension avec 31 éléments remplis et la deuxième dimension avec 1.

b) LoY[0][31]=Bid - Je remplis la colonne 31 et la première ligne du tableau avec les valeurs Bid. Et la deuxième dimension (ligne sous l'indice 1, est remplie de 0 par défaut, car je ne la remplis pas. Ainsi, dans cette variante, la deuxième dimension est constituée de 31 éléments remplis, la deuxième dimension est constituée de 1.

ArraySort() trie le tableau bidimensionnel par la première dimension seulement. Il s'agit donc de l'option a). L'option a), dans laquelle la première dimension comporte 31 lignes, ne sera pas triée. L'option b), dans laquelle la première dimension ne comporte qu'une seule ligne, ne pourra pas être triée.
MaintenantArrayFill() Il tire le tableau bidimensionnel sur une seule ligne avant d'attribuer les valeurs requises aux éléments du tableau bidimensionnel. C'est-à-dire qu'il devra tirer mon tableau LoY[31][31] en une seule ligne de taille 961 éléments. Il s'agit d'une très longue chaîne et la plupart des éléments seront inutiles.

Faisons donc un tableau LoY[31][2] (variante a))ou LoY[2][31] (variante b))

On voit clairement commentArrayFill() va dessiner en 1 ligne dans la variante b) . La deuxième ligne rejoindra simplement la première et après le dernier élément de la première ligne LoY[0][31], la première ligne du tableau dans ArrayFill() continuera avecLoY[0][32] et se terminera parLoY[0][62] Et les valeurs des éléments du tableau dans ArrayFill() iront dans l'ordre suivant : de l'indice 0 à 31 les éléments du tableau seront remplis avec des valeurs de prix et de l'indice 32 à la fin seront remplis avec 0 .

QUESTION : CommentArrayFill() dessine-t-il l'option a) en 1 ligne ? Après tout, il y a 28 rangées dans cette variante. Et s'il s'agit d'une seule ligne, dans quel ordre contiendra-t-il les valeurs des éléments du tableau ? Et, puis-je utiliser Print() pour imprimer les éléments de mon tableau bidimensionnel après que ArrayFill() les ait convertis en un tableau unidimensionnel? Cette fonction elle-même ne renvoie aucune valeur, donc Print() ne l'imprimera pas si elle est insérée.

Merci pour votre aide.

J'ai du mal à vous comprendre. C'est peut-être la raison pour laquelle je ne peux pas le comprendre correctement. Répétez la question avec le tableau LoY[5][3], c'est-à-dire 5 lignes et 3 colonnes.

ArrayFill ne convertit pas le tableau initial de quelque manière que ce soit. Il ne traite le tableau que comme s'il s'agissait d'un tableau unidimensionnel. La fonction effectue les actions nécessaires sur le tableau et se replie sans affecter la dimensionnalité.

Selon la documentation, la fonctionArrayFill(LoY, 3, 6, 12) ne remplira que les lignes d'index 1 et 2 du tableau LoY avec la valeur 12.

LoY[1][0] sera rempli de 12.

LoY[1][1] aura la valeur 12.

LoY[1][2] aura la valeur 12.

LoY[2][0] aura la valeur 12.

LoY[2][1] aura la valeur 12 .

LoY[2][2] sera réglé sur 12 .

Tous les autres seront laissés intacts.

Expérimentez avec un petit tableau et des chiffres faciles à comprendre. Par exemple 12 et 8, vous remarquerez facilement lequel est le plus grand. Et 1.123654 et 1.123583 est plus compliqué.

 
Alexey Viktorov:

ArrayFill ne convertit en aucune façon le tableau original. Il ne traite le tableau que comme s'il s'agissait d'un tableau unidimensionnel. La fonction a effectué les actions nécessaires sur le tableau et l'a vidé sans perturber la dimensionnalité.


Cela a considérablement réduit mon incompréhension et augmenté ma compréhension. Je vais maintenant réanalyser tout ce que j'ai écrit en tenant compte de la circonstance.... nouvellement découverte.

 
Alexey Viktorov:


D'après la documentation, la fonctionArrayFill(LoY, 3, 6, 12) ne remplira que les lignes d'index 1 et 2 du tableau LoY avec la valeur 12.

LoY[1][0] aura une valeur de 12.

LoY[1][1] aura la valeur 12.

LoY[1][2] aura la valeur 12.

LoY[2][0] aura la valeur 12.

LoY[2][1] aura une valeur de 12 .

LoY[2][2] sera réglé sur 12 .


QUESTION
Comment et quelles valeurs dois-je entrer dansArrayFill() si je dois remplir les éléments jaunes du même tableau avec la valeur 12 ?

OPTION N 1

OPTION N 2


Merci pour votre aide.
Raison: