Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 14

Sie verpassen Handelsmöglichkeiten:
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Registrierung
Einloggen
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
ein bisschen was dazu gibt es hierhttps://docs.mql4.com/ru/convert/normalizedouble
DoubleToString, IMHO...
Drucken.
ein bisschen was dazu gibt es hierhttps://docs.mql4.com/ru/convert/normalizedouble
Sie werden es nicht glauben, aber ursprünglich waren alle Daten normalisiert und die Ziffer stand nach dem Komma. Ich weiß, dass auch doppelte Werte normalisiert werden müssen. Versuchen Sie, normalisierte statische Daten selbst neu zu berechnen, ich denke, es ist ein Compiler-Fehler, aber ich hoffe, ich liege falsch, bisher habe ich dieses Problem mit der MathRound-Funktion gelöst, aber es ist falsch!
Ich weiß nicht, was digis ist, versuchen Sie einfach DoubleToString(...) Funktion.
Wenn Sie Berechnungen mit dem machen, was Sie jetzt innerhalb des EA haben, sind die Berechnungen korrekt, auch mitNormalizeDouble(), aber wenn Sie Parameter außerhalb ausgeben wollen, zum Beispiel Print, Alert, Comment, dann verwenden Sie Normalisierung durch DoubleToString(...)
Egal, wie man die Zahl 0,0001 normalisiert, sie bleibt in der binären Darstellung ein unendlicher periodischer Bruch, weil sie eine Division durch 5 hat. In einem Computer muss dieser unendliche Bruch auf eine passende Länge gekürzt werden. Teilt man durch sie, erhält man wieder etwas sehr Langes, das ebenfalls gekürzt werden muss. Um einen "guten" Blick auf die resultierende Zahl in dezimaler Form zu erhalten, müssen Sie sie im Programm in eine Zeichenkette mit einer geeigneten Anzahl von Nachkommastellen umwandeln. Zum Beispiel mit DoubleToString, wie hier bereits geschrieben.
P.S. " das Ergebnis gibt ein Zehntel weniger aus, als es sein sollte" - das gab es nicht, eine eitle Anschuldigung. Um ein Hundertmillionstel schon...
Hallo! Bitte helfen Sie mir mit dem Algorithmus!
Ich habe ein einfaches Skript geschrieben, das den Korrelationskoeffizienten von Pearson berechnet. Die Arrays basieren auf den Schlusskursen, beginnend mit dem ersten Balken.
Das Preisfeld wird vom ersten bis zum 24. Balken genommen.
Nun möchte ich die Korrelation auch für 24 Balken berechnen, aber das Preisfeld aus dem ZWEITEN(!) Balken nehmen.
Da ich den Algorithmus nicht kannte, habe ich jedes Preisfeld manuell eingegeben:
24 Balken sind mühsam, und wenn ich die Korrelation für 100 Balken wissen will, ist es mühsam, jedes Feld einzugeben.
Was ist zu tun, Leute?)
Ich sollte wahrscheinlich die Quadratwurzel der Zeichenfolge Koef=Edxdy/(sqrt(DoubleToString((Edx2*Edy2), w)) korrigieren;
Wahrscheinlich sollten wir auch die Quadratwurzel der Stringberechnung Koef=Edxdy/(sqrt(DoubleToString((Edx2*Edy2), w))) korrigieren;
Hier ist eine funktionierende Funktion zur Berechnung der Korrelation, geben Sie einfach die Arrays mit Preisen, und die Ausgabe wird der Wert sein:
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));
}
Das verwende ich
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);
}
Das verwende ich
Die Zyklen sollten in umgekehrter Reihenfolge gezählt werden, vonOrdersTotal()-1 bis 0.