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

 
andrey46:
Je ne sais pas pourquoi le conseiller expert dans le testeur de stratégie fonctionne bien, passe des ordres, etc., mais dans le compte réel, bien que le robot soit actif, les ordres ne sont pas passés.

Vous devez lire le magazine, il y a peut-être une réponse.

 

Pouvez-vous me dire comment l'obtenir -

double w = 18.2

obtenir ce -

int w = 18
 
TrederMT5:

Pouvez-vous me dire comment l'obtenir -

obtenir ce -

int w1;
double w = 18.2;
w1=(int)w;
w=round (w);

Une conversion de type explicite.

Vous pouvez également arrondir un entier à partir d'un non-entier, mais le double sera 18,0.

 
scomoroh:

Alors je vais répéter la question.

L'expression

if (izmb>b ||izmb<b || izms>s || izms<s)

est identique à celui-ci :

if (izmb!=b || izms!=s)

Et si vous voulez stocker quelque chose, faites-le dans une variable globale.

C'est celui qui est déclaré en dehors du corps de la fonction.

int izmb=0, izms=0;


void OnTick()
   {
   .........
 
Valeriy Yastremskiy:


Merci.
 

Bonne journée à vous tous !

Question sur MQL4. Voici un code simple

double LoY[31][31],LoU,LoU1;
int S,S1,S2;
void OnTick()
{
if (Minute()==20&&Minute()!=S1)
{
ArrayFill(LoY,0,31,0.5555);
S1=Minute();
}
//***************************************************************
if (Minute()!=S)
{
LoY[0][0]=Bid;
ArraySort(LoY,WHOLE_ARRAY,0,MODE_ASCEND);
Print("----LoY[0][1]-- Горизонтально ---  [0}  ",  LoY[0][0],"  [1] ",   LoY[0][1],"  [2] ",   LoY[0][2],"  [3] ",   LoY[0][3],"  [4] ",   LoY[0][4],"  [26] ",   LoY[0][26],"  [27] ",   LoY[0][27],"  [28] ",   LoY[0][28],"  [29] ",   LoY[0][29],"  [30] ",   LoY[0][30]);
Print("----LoY[1][0]-- Вертикалььно ---  [0}  ",  LoY[0][0],"  [1] ",   LoY[1][0],"  [2] ",   LoY[2][0],"  [3] ",   LoY[3][0],"  [4] ",   LoY[4][0],"  [26] ",   LoY[26][0],"  [27] ",   LoY[27][0],"  [28] ",   LoY[28][0],"  [29] ",   LoY[29][0],"  [30] ",   LoY[30][0]);
S=Minute();
}
}

Elle crée un tableau à deux dimensions et le remplit de valeurs. Deux fonctions du code m'intéressent - ArrayFill(LoY,0,31,0.5555) ; et ArraySort(LoY,WHOLE_ARRAY,0,MODE_ASCEND) ; Selon le manuel de référence, ces deux fonctions fonctionnent avec des tableaux à deux dimensions.ArrayFill() fonctionne strictement sur des tableaux remplis horizontalement, le livre de référence précise qu'elle remplit le tableau avec des valeurs strictement de gauche à droite (et non de haut en bas ou de bas en haut). ArraySort() trie un tableau à deux dimensions par la première dimension. La référence ne précise pas si elle trie des tableaux remplis horizontalement ou verticalement. A en juger par l'exécution de mon code, ArraySort() ne trie que les tableaux remplis verticalement . Il semble que ces deux fonctions ne peuvent pas gérer un seul et même tableau dans un programme.

Q. Il est important pour moi que la fonction ArraySort() fonctionne correctement . Ainsi, ArraySort() peut-elle être configurée pour trier les tableaux remplis horizontalement, avec lesquels ArrayFill() fonctionne ? Ou la fonction de tri de MQL5, qui fonctionne dans MQL4, peut-elle m'aider à la place ? Ou existe-t-il une fonction qui convertit un tableau rempli horizontalement avec toutes ses valeurs en un tableau vertical ? En bref, comment faire pour que mon programme trie un tableau horizontalement?

Note. L'utilisation d'une boucle au lieu de ArrayFill() ne fonctionne pas pour moi.

Merci pour votre aide.

 
ANDREY:

Bonne journée à vous tous !

Question sur MQL4. Voici un code simple

Elle crée un tableau à deux dimensions et le remplit de valeurs. Deux fonctions du code m'intéressent - ArrayFill(LoY,0,31,0.5555) ; et ArraySort(LoY,WHOLE_ARRAY,0,MODE_ASCEND) ; Selon le manuel de référence, ces deux fonctions fonctionnent avec des tableaux à deux dimensions.ArrayFill() fonctionne strictement sur les tableaux remplis horizontalement, le livre de référence précise qu'elle remplit le tableau avec des valeurs strictement de gauche à droite (et non de haut en bas ou de bas en haut). ArraySort() trie un tableau à deux dimensions par la première dimension. La référence ne précise pas si elle trie des tableaux remplis horizontalement ou verticalement. A en juger par l'exécution de mon code, ArraySort() ne trie que les tableaux remplis verticalement . Il semble que ces deux fonctions ne peuvent pas gérer un seul et même tableau dans un programme.

Q. Il est important pour moi que la fonction ArraySort() fonctionne correctement . Ainsi, ArraySort() peut-elle être configurée pour trier les tableaux remplis horizontalement, avec lesquels ArrayFill() fonctionne ? Ou la fonction de tri de MQL5, qui fonctionne dans MQL4, peut-elle m'aider à la place ? Ou existe-t-il une fonction qui convertit un tableau rempli horizontalement avec toutes ses valeurs en un tableau vertical ? En bref, comment faire pour que mon programme trie un tableau horizontalement?

Note. L'utilisation d'une boucle au lieu de ArrayFill() ne fonctionne pas pour moi.

Merci pour votre aide.

Avez-vous remarqué

note

ArrayFill

Untableau multidimensionnel, lorsqu'il est traité avec ArrayFill(), apparaît comme un tableau unidimensionnel, par exemple, le tableau [2][4] est traité comme un tableau [8], donc lorsque vous travaillez avec ce tableau, il est acceptable de spécifier l'index de l'élément initial égal à 5. Ainsi, appeler ArrayFill(array, 5, 2, 3.14) pour array[2][4] remplira array[1][1] et array[1][2] avec 3.14.


Cette chaîne

ArrayFill(LoY,0,31,0.5555);

remplira le tableau avec exactement une ligne.

En ce qui concerne la verticalité/horizontalité, c'est la façon dont vous tenez votre tête en regardant l'entrée. Regardez le tableau Excell et tout deviendra clair. Si la colonne "A" est remplie de valeurs, vous obtenez un tableau unidimensionnel. Comment est-elle organisée ? Bien... horizontalement, parce que je le regarde couché sur le canapé..........

 
Alexey Viktorov:

Avez-vous remarqué

note

Cette ligne

remplira le tableau avec exactement une ligne.

Quant à la verticalité/horizontalité, c'est la façon dont vous tiendrez votre tête en regardant l'entrée. Regardez le tableau Excell et tout deviendra clair. Si la colonne "A" est remplie de valeurs, vous obtenez un tableau unidimensionnel. Comment est-elle organisée ? Bien... horizontalement, parce que je le regarde allongé sur le canapé..........

Merci pour la réponse. J'ai compris tout ce que tu as é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 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 notée[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 à la vingtième minute.
Merci pour votre aide.

 
MakarFX:

J'essaierais ça.

Merci pour votre aide. Je vais essayer.

 
Aleksei Stepanenko:

l'expression

est identique à celui-ci :

Et si vous voulez stocker quelque chose, faites-le dans une variable globale.

C'est celui qui est déclaré en dehors du corps de la fonction.

Nous voulions vérifier les conditions de recherche pour entrer dans l'EA non pas à chaque tick, mais seulement si un autre ordre est ouvert ou fermé par un autre EA ou manuellement (afin d'éviter une charge inutile sur le processeur). 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 ?

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