[ARCHIV!] Alle Fragen von Anfängern, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Ohne dich kann ich nirgendwo hingehen - 4. - Seite 99

 
kon12:

Ich hab's... Wenn ein anderer Weg mit einem Redraw?
Zeigen Sie den Code an und Sie erhalten sofort eine Antwort.
 
Lisi4ka330:


Guten Tag, bitte helfen Sie mir mit der Funktion ArrayMo (sie liefert das Maximum der Dichtekurve).

double ArrayMo(double& x[], int d=4) {
  double e, s=0;
  double m[][2];             // временный массив:
                             //  столбец 1 - количество значений
                             //  столбец 2 - значения
  int    i, k=ArraySize(x);
  int    n;                  // номер строки временного массива m
  int    r;                  // количество строк во временном массиве m

  if (k>0) {
    for (i=0; i<k; i++) {
      e=NormalizeDouble(x[i], d);
      n=ArraySearchDouble(m, e);
      if (n<0) {
        r=ArrayRange(m, 0);
        ArrayResize(m, r+1);
        m[r][0]++;
        m[r][1]=e;
      } else m[n][0]++;
    }
    ArraySort(m, WHOLE_ARRAY, 0, MODE_DESCEND);
    s=m[0][1];
  } else Print("ArrayMo(): Массив пуст!");

  return(s);
}

Es haben sich folgende Fragen ergeben:

1. was ist der Zweck der Erstellung eines temporären Arrays

m[][2]

2. es ist nicht klar, woher die Werte des temporären Arrays genommen werden, und daher ist es nicht klar, wie dieses Array durchsucht werden kann:

n=ArraySearchDouble(m, e)

3. und dann ist die Wahrheit für mich im Allgemeinen tief verborgen))))) Nachdem wir festgestellt haben, dass es keinen Wert gibt, beginnen wir damit, die Größe des Feldes der "unklaren Werte" zu bestimmen.

Ich wäre sehr dankbar für einen Lichtblick in dieser Geschichte))))


Ich glaube, die Funktion ist doch nicht ganz richtig geschrieben. Der Hauptgrund ist, dass nach der Ankündigung.

double m[][2];

es ist notwendig

ArrayResize(m,0);

sonst(ich zitiere)

int ArrayResize( void array[], int new_size)
Setzt die neue Größe in der ersten Dimension des Arrays. Bei Erfolg gibt die Funktion die Anzahl aller im Array enthaltenen Elemente nach der Größenänderung zurück, andernfalls gibt sie -1 zurück und das Array wird nicht verkleinert.
Hinweis: Ein lokal in einer Funktion deklariertes Array, dessen Größe geändert wurde, bleibt nach der Ausführung der Funktion unverändert. Wenn die Funktion erneut aufgerufen wird, hat ein solches Array eine andere Größe als das deklarierte!!!!

Und so wird die Funktion bei mehreren Aufrufen "in die Vergangenheit fallen")

Darüber, wie der Algorithmus funktioniert. Das Array m[][2] selbst ist eine direkte Darstellung der empirischen Verteilung der Anzahl der Treffer der Variable x[i] durch ihre verschiedenen Werte. Das heißt, jedes Element des Arrays besteht aus zwei Zahlen - der Anzahl der Treffer auf einen Wert (das erste Feld) und dem Wert selbst. Die Schleife sucht für jedes x[i] nach dem gleichen Wert im Array m, und wenn er gefunden wird, wird das Zahlenfeld hinzugefügt, andernfalls wird mit ArrayResize() ein neues Element erstellt und unser x[i] dorthin geschrieben.

Sobald das Feld gefüllt ist, müssen wir nur noch das Element mit der höchsten Trefferzahl finden, d. h. per Definition den Modulus der Verteilung x.

Dies geschieht durch Zeichenketten

    ArraySort(m, WHOLE_ARRAY, 0, MODE_DESCEND);
    s=m[0][1];

Obwohl es mir so vorkommt (ich bin mir nicht sicher, was das mehrdimensionale Array angeht), könnten Sie einfach

    s=m[ArrayMaximum(m)][1];

Alles in allem kann ich sagen (bei allem Respekt für den Autor des Codes), dass dieser Algorithmus selbst bei Korrektur aller Fehler extrem ineffizient ist und oft falsche Ergebnisse liefert. Der Grund dafür ist, dass wir mit dem Typ double arbeiten, was bedeutet, dass die Wahrscheinlichkeit, dass die Werte von x[i] nahe beieinander liegen, aber dennoch unterscheidbar sind, recht hoch ist. Dies ist möglicherweise nicht so auffällig, wenn der Stichprobenumfang viel größer ist (Hunderte Male oder mehr) als die Gesamtzahl der Intervalle, in die x[i] eingeteilt ist. In den vielen Fällen, in denen diese Bedingung nicht erfüllt ist, kommt es jedoch zu einer Vielzahl von Fehlberechnungen.

Die korrektere Methode zur Berechnung des Modus ist folgende: Man konstruiert eine empirische Verteilungsfunktion (nicht zu verwechseln mit der Häufigkeitsverteilung), interpoliert sie stückweise linear bis glatt und sucht schließlich den Punkt der maximalen Ableitung. Ein solcher Algorithmus ist frei von den oben genannten Nachteilen und funktioniert auch bei kleinen Stichprobengrößen recht effektiv. Zumindest hatte ich nur die Aufgabe zu lösen, einen Modus für Stichproben von 50-100 Elementen mit einer vergleichbaren Anzahl von Intervallen mit MQL zu finden - und alles war in Ordnung. Der einzige Nachteil besteht darin, dass Interpolationen in der Regel zu einer erheblichen Verringerung der Berechnungsgeschwindigkeit führen, natürlich nur, wenn wir qualitativ glätten wollen.

 
Hallo geschätzte Forumsmitglieder, mit wem kann ich über das Schreiben eines EA sprechen. Ein EA ohne Indikatoren, der auf einer Verdopplung bei einer Bewegung basiert, die nicht in unsere Richtung geht.
 
Glazunov:
Hallo geschätzte Forumsmitglieder, mit wem kann ich über das Schreiben eines EA sprechen. Ein EA ohne Indikatoren, der auf einer Verdopplung bei einer Bewegung basiert, die nicht in unsere Richtung geht.
hier: https://www.mql5.com/ru/job
 
ilunga:
hier: https://www.mql5.com/ru/job

Ich danke Ihnen. Vielleicht gibt es mehr Möglichkeiten.
 
Glazunov:

Ich danke Ihnen. Vielleicht gibt es mehr Möglichkeiten.
Versuchen Sie, "martingale" in eine Website-Suche einzugeben - Sie werden überrascht sein
 
YOUNGA:
Versuchen Sie, "martingale" in eine Website-Suche einzugeben, und Sie werden überrascht sein

Schon gesehen! Aber das, was ich will, fehlt(
 
Glazunov:
Hallo geschätzte Forumsmitglieder, mit wem kann ich über das Schreiben eines EA sprechen. Ein EA ohne Indikatoren, der auf einer Verdopplung bei einer Bewegung basiert, die nicht in unsere Richtung geht.


Schauen Sie hier nach

https://www.mql5.com/ru/forum/136747

 

Hallo. Ich habe gerade mit MQL4 begonnen.

Bitte informieren Sie mich über die Funktion OrderModify. Die Handbücher und Beispiele zeigen, dass diese Funktion für das Trawling, d.h. die Änderung des Stop-Loss, verwendet wird. Ich muss nur den Take-Profit einer offenen Order ändern. Der Stop-Loss wird nicht gesetzt, wenn die Order geöffnet wird und muss auch während der Änderung auf 0 bleiben .

Wie soll die Berechnung und Auswahl der Aufträge aussehen?

Das endgültige Ziel sollte etwa so aussehen

if (OrderType()==OP_BUY && OrderOpenPrice()-Bid>kof*Point) // es liegt ein Kauf vor, aber er ist um kof gesunken
{
OrderModify(OrderTicket(),OrderOpenPrice(),0,OrderOpenPrice()+tpnew*Point,0,CLR_NONE);// wir verschieben den TP tiefer als den zuvor platzierten

Dasselbe gilt für den Verkauf.

Ich danke Ihnen für jede Antwort.

 

Hallo nochmal :)

Wie ich vermutet habe, sind Probleme aufgetreten. Hier ist der Code. Der Punkt ist, dass Aufträge auf dem Tester durch TP geschlossen werden, und durch die Funktion TP wird entfernt, wenn der Auftrag während des Trailing Stop geändert wird.

double my_ord[31][2];                                           //ордера советника
                                                                //[][0] Ticket
                                                                //[][1] Вид операции 
//---------------------------------------------------------------------------------

void FindMyOrders()                                             //ищем свои ордера(от советника)
   {
    for (int a = 0;a<32;a++)                                    //во избежание ошибок заполняем все нулями
      {
       my_ord[a][0]=0;
       my_ord[a][1]=0;
      }
    int pos = 0;
    for(int i=0; i<32; i++)
      {
       if (Mas_Ord_New[i][8]==1)                                //есть ли комментарий
         {
          int num = Mas_Ord_New[i][4];
          OrderSelect(SELECT_BY_TICKET, num);
          string str = OrderComment();
          if (str == "AO Day Profiter Trade")                   //наш ли это комментарий
            {
             my_ord[pos][0] = num;
             my_ord[pos][1] = Mas_Ord_New[i][6];                //если наш, записываем Ticket и вид операции
             pos++;
            }
          else { }
         }
       else { }
      }
   }
//---------------------------------------------------------------
void TrailStop(int ticket, int TStop)                           //ф-ция трейлинг стопа, TStop-расстояние в пп
   {
    int minDist = MarketInfo(symb, MODE_STOPLEVEL);
    if (TStop<minDist)
      {
       TStop = minDist;
      }
    else { }
    if (TStop>0)
      {
       OrderSelect(ticket, SELECT_BY_TICKET);
       if(OrderType()==OP_BUY)
         {
          if(Bid - OrderOpenPrice()>Point*TStop)
            {
             if(OrderStopLoss()<Bid-Point*TStop)
               {
                OrderModify(OrderTicket(), OrderOpenPrice(), 
                Bid-Point*TStop, 0, 0, Blue);
                return;
               }
             else { }
            }
            else{ }
         }
       else if (OrderType()==OP_SELL)
         {
          if(OrderOpenPrice() - Ask>Point*TStop)
            {
             if(OrderStopLoss()>Ask + TStop*Point)
               {
                OrderModify(OrderTicket(), OrderOpenPrice(), 
                Ask+Point*TStop, 0, 0, Blue);                           //ordertakeprofit!!
                return;
               }
             else { }
            }
          else { }
         }
       else { }
      }
    else { }
    }
//-----------------------------------а это кусочек Start(), отвечающий за трейлинг стоп
   for (int i = 0; i<32; i++)                                   //трейлинг стоп для наших ордеров
      {
       if (my_ord[i][0]>0)
         {
          TrailStop(my_ord[i][0], TralingStop);
         }
       else {break;}
      }
Das heißt, der Trailing-Stop wird nicht ausgeführt, und es gab keine Fehler mit falschen TP und SL im Protokoll des Testers. Was ist also los?
Grund der Beschwerde: