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

Vous manquez des opportunités de trading :
- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Inscription
Se connecter
Vous acceptez la politique du site Web et les conditions d'utilisation
Si vous n'avez pas de compte, veuillez vous inscrire
il y a un peu d'information à ce sujet icihttps://docs.mql4.com/ru/convert/normalizedouble
DoubleToString, IMHO...
Imprimer.
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 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(...)
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...
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)) ;
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 :
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));
}
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);
}
Voici ce que j'utilise
Les cycles doivent être comptés dans l'ordre inverse, deOrdersTotal()-1 à 0.