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

 
Andrey F. Zelinsky:
ein bisschen was dazu gibt es hierhttps://docs.mql4.com/ru/convert/normalizedouble

DoubleToString, IMHO...

Drucken.

 
Andrey F. Zelinsky:
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 nach dem Komma stand ein Digis. Ich weiß, dass auch doppelte Werte normalisiert werden müssen. Versuchen Sie, die normalisierten statischen Daten selbst neu zu berechnen, ich denke, es ist ein Compilerfehler, aber ich hoffe, ich liege falsch, bisher habe ich es mit MathRound gelöst, aber es ist falsch!
 
arhipov-76:
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(...)

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

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...

 
Timur1988:

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;

 
Vladimir:

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:

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));
}
 
Hallo! Ich habe meinen Roboter auf ein Demokonto gestellt und er läuft nun schon den zweiten Monat. Wenn ich heute das Terminal öffne, wurden zwei Aufträge durch ein Signal erteilt, obwohl ein Auftrag schon vorher erteilt wurde. Ich habe eine Beschränkung für die Anzahl der Aufträge. Was könnte der Grund dafür sein?
 

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);
}
 
Neron_76:

Das verwende ich

Die Zyklen müssen in umgekehrter Reihenfolge gezählt werden, vonOrdersTotal()-1 bis 0.
 
Vitalie Postolache:
Die Zyklen sollten in umgekehrter Reihenfolge gezählt werden, vonOrdersTotal()-1 bis 0.
Danke, ich werde es noch einmal machen müssen.
Grund der Beschwerde: