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

 
Andrey F. Zelinsky:
il y a un peu d'information à ce sujet icihttps://docs.mql4.com/ru/convert/normalizedouble

DoubleToString, IMHO...

Imprimer.

 
Andrey F. Zelinsky:
il y a un peu d'information à ce sujet icihttps://docs.mql4.com/ru/convert/normalizedouble
Vous n'allez pas le croire, mais à l'origine, toutes les données étaient normalisées, et il y avait un digis après la virgule. Je sais que même les valeurs doubles doivent être normalisées. Essayez de recalculer les données statiques normalisées vous-même, je pense que c'est une erreur de compilation, mais j'espère me tromper, jusqu'à présent je l'ai résolu avec MathRound, mais c'est faux !
 
arhipov-76:
Vous n'allez pas le croire, mais à l'origine, toutes les données étaient normalisées et le digis se trouvait après la virgule. Je sais que même les valeurs doubles doivent être normalisées. Essayez de recalculer les données statiques normalisées vous-même, je pense que c'est une erreur du compilateur, mais j'espère me tromper, jusqu'à présent j'ai résolu ce problème avec la fonction MathRound, mais c'est faux !

Je ne sais pas ce qu'est le digis, essayez simplement la fonction DoubleToString(...).

Si vous faites des calculs avec ce que vous avez maintenant à l'intérieur de l'EA, les calculs sont corrects, même avecNormalizeDouble(), mais si vous voulez sortir des paramètres à l'extérieur, par exemple Print, Alert, Comment, alors utilisez la normalisation à travers DoubleToString(...)

DoubleToString - Преобразование данных - Справочник MQL4
DoubleToString - Преобразование данных - Справочник MQL4
  • docs.mql4.com
DoubleToString - Преобразование данных - Справочник MQL4
 

Quelle que soit la façon dont on normalise le nombre 0,0001, il restera une fraction périodique infinie en représentation binaire car il a une division par 5. Dans un ordinateur, cette fraction infinie doit être tronquée à une longueur convenable. En le divisant, on obtient à nouveau quelque chose de très long, qui doit également être coupé. Pour obtenir un "bon" aperçu du nombre résultant sous forme décimale, vous devez le convertir dans le programme en une chaîne de caractères avec un nombre approprié de chiffres fractionnaires. En utilisant, par exemple, DoubleToString, comme déjà écrit ici.

P.S. " les sorties de résultats sont inférieures d'un dixième à ce qu'elles devraient être " - il n'y a rien de tel, une accusation vaine. Par un cent millionième, il l'a fait...

 
Timur1988:

Bonjour, aidez-moi avec l'algorithme !
J'ai écrit un script simple, qui calcule le coefficient de corrélation de Pearson. Les tableaux sont basés sur les prix de clôture, à partir de la première barre.

Le tableau des prix est pris de la première barre à la 24ème barre.
Maintenant, je veux calculer la corrélation également pour 24 barres, mais prendre le tableau des prix de la SECONDE ( !) barre.

Ne connaissant pas l'algorithme, j'ai saisi manuellement chaque tableau de prix :

24 barres, c'est une corvée, et si je veux connaître la corrélation pour 100 barres, c'est un calvaire d'entrer chaque tableau.
Que faire, les gens ?)

Je devrais probablement corriger la racine carrée de la chaîne Koef=Edxdy/(sqrt(DoubleToString((Edx2*Edy2), w)) ;

 
Vladimir:

Nous devrions probablement aussi corriger la racine carrée du calcul de la chaîne Koef=Edxdy/(sqrt(DoubleToString((Edx2*Edy2), w))) ;

Voici une fonction fonctionnelle pour calculer la corrélation, il suffit de donner les tableaux avec les prix, et la sortie sera la valeur :

string Correlation1(double& CurOpen[], double& SubOpen[]) {
double sumXY2=0, sumX2=0, sumY2=0, sumXs2=0, sumYs2=0, res2=1;

int k=MathMin(ArraySize(CurOpen), ArraySize(SubOpen));
  if(k>2) {
   for(int i=0; i<k; i++) {
     sumXY2+=CurOpen[i]*SubOpen[i];
     sumX2 +=CurOpen[i];
     sumY2 +=SubOpen[i];
     sumXs2+=CurOpen[i]*CurOpen[i];
     sumYs2+=SubOpen[i]*SubOpen[i];    
    }
   res2 = (k*sumXY2-sumX2*sumY2) / MathSqrt( (k*sumXs2-sumX2*sumX2)*(k*sumYs2-sumY2*sumY2) );
  }
  return(DoubleToStr(res2,2));
}
 
Bonjour, j'ai mis mon robot sur un compte de démonstration et il fonctionne depuis deux mois. Aujourd'hui, j'ouvre le terminal, deux ordres ont été placés par un signal, bien qu'un ordre ait été placé auparavant. J'ai une restriction sur le nombre de commandes. Quelle peut en être la raison ?
 

Voici ce que j'utilise

Вот что я использую

if(ExistPositions(Symb)==false&&ExistOrders(Symb)==false&&Delta_Buy<Low[1]&& sar>Close[1])
{SetOrder(NULL,OP_BUYSTOP,Lts,sar,sar-SL*Point(),sar+TP*Point(),Magik_number);}
if(ExistPositions(Symb)==false&&ExistOrders(Symb)==false&&Delta_Sell>High[1] && sar<Close[1])
{SetOrder(NULL,OP_SELLSTOP,Lts,sar,sar+SL*Point(),sar-TP*Point(),Magik_number);}


//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 12.03.2008                                                     |
//|  Описание : Возвращает флаг существования ордеров.                         |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любой ордер)                    |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//|    ot - время открытия             ( 0   - любое время установки)          |
//+----------------------------------------------------------------------------+
bool ExistOrders(string sy="", int op=-1, int mn=-1, datetime ot=0) {
  int i, k=OrdersTotal(), ty;

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      ty=OrderType();
      if (ty>1 && ty<6) {
        if ((OrderSymbol()==sy || sy=="") && (op<0 || ty==op)) {
          if (mn<0 || OrderMagicNumber()==mn) {
            if (ot<=OrderOpenTime()) return(True);
          }
        }
      }
    }
  }
  return(False);
}
//--------------------------------------------------------------------------------//


bool ExistPositions(string sy="", int op=-1, datetime ot=0) {
  int i, k=OrdersTotal();

  if (sy=="0") sy=Symb;
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if ( OrderMagicNumber()==Magik_number) {
              if (ot<=OrderOpenTime()) return(True);
            }
          }
        }
      }
    }
  }
  return(False);
}
 
Neron_76:

Voici ce que j'utilise

Les cycles doivent être comptés dans l'ordre inverse, deOrdersTotal()-1 à 0.
 
Vitalie Postolache:
Les cycles doivent être comptés dans l'ordre inverse, deOrdersTotal()-1 à 0.
Merci, je vais devoir le refaire.