Jede Anfängerfrage, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Nirgendwo ohne dich - 6. - Seite 640

 

Hallo Kameraden!

MT5 hat so wunderbare und sehr nützliche Werkzeuge "Impulse Elliott Wave" und "korrigierende Elliott Wave".

Die Frage ist: Kann ich diese Tools von MT5 in MT4 integrieren?

Ich handle mit MT4, und es ist nicht sehr bequem, für die Analyse auf MT5 umzusteigen.

Oder: Welche anderen Möglichkeiten gibt es, das Problem zu lösen?

 
Guten Tag, die Sprache hat einen solchen Marktparameter wie MarketInfo(Symbol(), MODE_TICKVALUE). Können Sie in allgemeiner Form beschreiben, wie dieser Wert berechnet wird?
 
mql_writer:
Guten Tag, die Sprache hat einen solchen Marktparameter wie MarketInfo(Symbol(), MODE_TICKVALUE). Können Sie in allgemeiner Form beschreiben, wie dieser Wert berechnet wird?

Dies ist der Wert der minimalen Preisänderung (1 Pip) in der Einzahlungswährung bei 1,00 Lot! Die Berechnung ist sehr einfach: 1,00(Lot)/1,36030(aktueller Kurs des Euro) = 0,7351 in Euro.
 
borilunad:

Dies ist der Wert der minimalen Preisänderung (1 Pip) in der Einzahlungswährung bei 1,00 Lot! Ganz einfach berechnet: 1,00(Lot)/1,36030(aktueller Kurs des Euro) = 0,7351 in Euro.

Außer, dass eine Anfrage über marketinfo irgendwie 10 für alle Paare außer Yen-Paare liefert ))))


Woher haben Sie diese Formel?

 
evillive:

außer, dass eine Abfrage über marketinfo irgendwie 10 für alle Paare außer Yen-Paare liefert ))))


Woher haben Sie diese Formel?


Ich mache alle Formeln selbst, und jetzt habe ich sie aus meiner Tabelle genommen.

Und das hier ist von Doki:

MODE_TICKVALUE.

16

Größe der minimalen Änderung des Symbolpreises in der Pfandwährung

Die Berechnungen werden nicht geteilt.

 
borilunad:


Ich stelle alle Formeln selbst her und habe sie jetzt aus meiner Tabelle erhalten.

Und das ist von den Docks:

MODE_TICKVALUE

16

Größe der Mindestpreisänderung des Instruments in der Einzahlungswährung

Die Berechnungen werden nicht geteilt.


Obwohl für 1 Eurodollar-Lot 1 Pip in Wirklichkeit 10 Dollar kostet, ist es also in Ordnung.

Und Berechnungen sollten nicht nur mit denen geteilt werden, die sich schämen, sie zu zeigen.

Ja, in diesem Fall sollte die Formel korrekt sein - MODE_TICKVALUE = MODE_LOTSIZE * MODE_TICKSIZE - für Euro, die Formel für Kreuze und Yen ist ein bisschen anders

 
Top2n:


Um ehrlich zu sein, habe ich noch nicht herausgefunden, wie man es anwendet. Es fehlt noch ein Millimeter, es wäre eine Schande, aufzuhören, wenn es fast fertig ist.

Aufgabe, schreibe den Preis nicht in das Array, wenn das Objekt time(2nd parameter+3600sec>current)||(1st parameter time - 2nd parameter time)<3600sec )

Warum einen Fehler emulieren?

Ein Fehler signalisiert, dass der Algorithmus aus irgendeinem Grund, der mit Systembeschränkungen/-fehlern zusammenhängt, nicht ausgeführt werden konnte und kein Ergebnis mit einigen (natürlich begrenzten, aber) Garantien liefert. Die Funktion FillAndPrint() zeigt sehr anschaulich, was eine Fehlersituation bedeutet und was sie nicht bedeutet. Wenn ein Fehler auftritt, wird nicht einmal versucht, das Ergebnis zu drucken. Liegt kein Fehler vor, kann dem Ergebnis vertraut werden. So sollte die Logik "Fehler/kein Fehler" aufgebaut sein.

Aber hier müssen wir den Algorithmus ändern: Wir müssen auch einen zusätzlichen Filter anwenden.

So sollte es auch gemacht werden:

/******************************************************************************/
bool AddValueIfFiltered(double &array[], const string name) {
#define MIN_SECS_BETWEEN_PRICE1_AND_PRICE2 3600
#define MAX_SECS_AFTER_PRICE2              3600

  const datetime dt1 = (datetime)ObjectGet(name, OBJPROP_TIME1);
  const datetime dt2 = (datetime)ObjectGet(name, OBJPROP_TIME2);
  const datetime dt = TimeCurrent();

  Print("name = ", name, ", dt = ", dt, ", dt1 = ", dt1, ", dt2 = ", dt2);

  if (dt <= dt2 + MAX_SECS_AFTER_PRICE2 && dt1 + MIN_SECS_BETWEEN_PRICE1_AND_PRICE2 <= dt2) { // Фильтруем, прежде чем попытаться добавить
    if (!AddValue(array, ObjectGetValueByShift(name, 1))) { // Пытаемся добавить
      return false; // Ошибка, значение не добавлено
    }
  }

  return true; // Нет ошибки, значение, если удовлетворило условию фильтра, добавлено к массиву
}

/******************************************************************************/
bool AddValueIfFound(double &array[], const string name) {
  const int type = ObjectType(name);

  if (type == OBJ_TREND) {
    switch ((color)ObjectGet(name, OBJPROP_COLOR)) { // Тип color допустимо использовать в switch
    case Goldenrod:
    case Gainsboro:
    case White:
      if (!AddValueIfFiltered(array, name)) { // Пропускаем через фильтр
        return false;
      }
    }
  }

  return true; // Нет ошибки, значение, если найдено, добавлено к массиву
}

Zunächst haben wir nach Objekttypen und Parametern "gefiltert", indem wir aus allen verfügbaren Objekten nur die benötigten ausgewählt haben, und dann haben wir einen zusätzlichen Filter angewendet. Es ist ungefähr so, wie ein Mensch es tun würde. Das würde ein Mensch doch tun, oder?

Für jede dieser kleinen Teilaufgaben benötigen wir eine eigene Funktion.

Zahlen sollten nicht in Ausdrücken vorkommen, außer in sehr speziellen Fällen, z. B. wenn eine Verdopplung erforderlich ist und diese Verdopplung in der Natur des Algorithmus liegt. Dann kann die Zahl 2 direkt in Ausdrücken verwendet werden. Und in anderen, sehr seltenen Fällen.

In anderen Fällen sollten Mnemotechniken verwendet werden. Erstens verbessern sie das Verständnis dessen, was an einem bestimmten Ort vor sich geht, erheblich und tragen somit dazu bei, die Wahrscheinlichkeit von Fehlern zu verringern. Und zweitens ist der Wert selbst an einer Stelle festgelegt und kann bei Bedarf leicht geändert werden, und es ist unmöglich, einen Fehler zu machen, im Gegensatz zu dem Fall, in dem die Zahl wiederholt im Algorithmus verwendet wird und ohne Verwendung von Mnemonik die Zahlen an mehreren Stellen des Algorithmus korrigiert werden müssen.

Ergebnis des Laufs:

02:08:46 Script 2 EURUSDm,H1: loaded successfully
02:08:46 2 EURUSDm,H1: initialized
02:08:46 2 EURUSDm,H1: Sell:
02:08:46 2 EURUSDm,H1: name = downtrendline1, dt = 2014.06.24 22:09:02, dt1 = 2014.06.24 10:00:00, dt2 = 2014.06.24 17:00:00
02:08:46 2 EURUSDm,H1: Найдено объектов: 0
02:08:46 2 EURUSDm,H1: Buy:
02:08:46 2 EURUSDm,H1: name = uptrendline0, dt = 2014.06.24 22:09:02, dt1 = 2014.06.23 09:00:00, dt2 = 2014.06.24 16:00:00
02:08:46 2 EURUSDm,H1: Найдено объектов: 0
02:08:46 2 EURUSDm,H1: uninit reason 0
02:08:46 Script 2 EURUSDm,H1: removed

Es wird kein einziges Objekt gefunden. Erhöhen Sie die Werte beider Mnemotechniken 10 Mal auf 36000 (10 Stunden) und führen Sie den Vorgang erneut durch:

02:09:03 Script 2 EURUSDm,H1: loaded successfully
02:09:03 2 EURUSDm,H1: initialized
02:09:03 2 EURUSDm,H1: Sell:
02:09:03 2 EURUSDm,H1: name = downtrendline1, dt = 2014.06.24 22:09:14, dt1 = 2014.06.24 10:00:00, dt2 = 2014.06.24 17:00:00
02:09:03 2 EURUSDm,H1: Найдено объектов: 0
02:09:03 2 EURUSDm,H1: Buy:
02:09:03 2 EURUSDm,H1: name = uptrendline0, dt = 2014.06.24 22:09:14, dt1 = 2014.06.23 09:00:00, dt2 = 2014.06.24 16:00:00
02:09:03 2 EURUSDm,H1: Найдено объектов: 1
02:09:03 2 EURUSDm,H1: Price[0] = 1.35869
02:09:03 2 EURUSDm,H1: uninit reason 0
02:09:03 Script 2 EURUSDm,H1: removed

Ein Trend hat die Filterung bereits "bestanden". Wir stellen nun den Wert der ersten Mnemonik auf 3600 zurück und führen aus:

02:09:12 Script 2 EURUSDm,H1: loaded successfully
02:09:12 2 EURUSDm,H1: initialized
02:09:12 2 EURUSDm,H1: Sell:
02:09:12 2 EURUSDm,H1: name = downtrendline1, dt = 2014.06.24 22:09:26, dt1 = 2014.06.24 10:00:00, dt2 = 2014.06.24 17:00:00
02:09:12 2 EURUSDm,H1: Найдено объектов: 1
02:09:12 2 EURUSDm,H1: Price[0] = 1.36152
02:09:12 2 EURUSDm,H1: Buy:
02:09:12 2 EURUSDm,H1: name = uptrendline0, dt = 2014.06.24 22:09:26, dt1 = 2014.06.23 09:00:00, dt2 = 2014.06.24 16:00:00
02:09:12 2 EURUSDm,H1: Найдено объектов: 1
02:09:12 2 EURUSDm,H1: Price[0] = 1.35869
02:09:12 2 EURUSDm,H1: uninit reason 0
02:09:12 Script 2 EURUSDm,H1: removed

Wir können sehen, dass nun beide Trendlinien die Filterung "bestanden" haben. Übrigens empfehle ich, alle Zweige (Teile) des Programms auf diese Weise zu debuggen, nicht nur einen Zweig.

Um Ihnen dabei zu helfen, es irgendwie zu formalisieren, werde ich versuchen, es auf diese Weise zu erklären. Ein Programm ist offenbar wie ein Plan.

Jeder größere Punkt des Plans kann in kleinere Teilpläne untergliedert werden. Kleinere in noch kleinere. Die Punkte der kleinsten Teilpläne werden direkt ausgeführt.

Jeder Plan, jeder Teilplan und sogar die Punkte der kleinsten Teilpläne entsprechen den Funktionen im Programm. Die Elemente in den kleinsten Teilplänen entsprechen "End"-Funktionen, die nur Systemfunktionen aufrufen oder diese gar nicht aufrufen, z. B. AddValue() oder DiffInSecs() sind Beispiele aus der obigen Diskussion. Die obigen Teilplanpositionen entsprechen den Funktionen, die die Funktionen aufrufen, die die nachfolgenden Teilplanpositionen implementieren. Bei den oben genannten sind dies MassTrendNumber(), AddValueIfFound(), AddValueIfFiltered(). "Low-Level"-Funktionen sollten keine "High-Level"-Funktionen aufrufen, und "High-Level"-Funktionen sollten grundsätzlich nicht mehrere Ebenen nach unten springen, d.h. grundsätzlich nur Funktionen auf der darunter liegenden Ebene aufrufen. Diese Regel ist für "Low-Level" viel strenger als für "High-Level".

Versuchen Sie, Ihre Programme zu erstellen, indem Sie die darin enthaltenen Aktionen als (kurze) Funktionen organisieren, die durch diese Art von Baumstruktur verbunden sind, im Sinne von "wer ruft wen auf".

Dieses Programm hat einen degenerierten Baum: einen Zweig, der sich mehrfach "verzweigt". Und sie "verzweigt" sich nicht in zwei kleine Äste, sondern in einen. Aber der Punkt, dass "High-Level"-Funktionen immer wieder "Low-Level"-Funktionen aufrufen, ist zu erkennen. In dieser Änderung habe ich eine weitere Ebene in diese Struktur eingefügt, einen weiteren "unverzweigten Zweig" - AddValueIfFiltered().

 
Tut mir leid, dass ich den Thread nicht sofort gesehen habe.
https://www.mql5.com/ru/forum/152102 Ichhabe eine Frage
 
borilunad:

Alles ist richtig! Bei einer vierstelligen Notierung war es immer 1, und beieiner fünfstelligen Notierung ist es jetzt 10, weil es 10 mal mehr (und flachere) Punkte gibt. Und der Wert eines Min.-Ticks sollte aus dem aktuellen Preis berechnet werden!

Ich habe jetzt 4 Ziffern, auf ewoldollar bei 1 Lot kostet 1 Punkt $10 und das war schon immer so. Für Kreuze werden die Kosten zwischen 8 und 16 liegen, die Formel ist hier etwas komplizierter.

Zum Beispiel hat marketinfo für das Euro-Pfund 16,984 zurückgegeben, der Pfund-Dollar-Kurs = 1,6984, d.h. 1 Euro-Pfund-Punkt ist 1 Pfund wert, multipliziert mit dem Pfund-Dollar-Punktwert, der immer 10,0 beträgt (100000 * 0,0001 = 10,0 oder 100000 * 0,00010 = 10,0 - wie man will).


Alle diese Berechnungen sind nur korrekt, wenn Ihr Konto auf Dollar lautet:

In diesem Fall für xUSD (EURUSD, GBPUSD usw.) tickvalue = lot*point = 100000*0,0001 = 10,0

für USDx (USDCHF, USDJPY usw.) tickvalue = lot*point/Bid = 100000*0.01/101.93 = 9.8107

für xUSD/yUSD (EURGBP) tickvalue = Bid(yUSD)*lot*point = 1,6980*100000*0,0001 = 16,98

für Kreuzungen xUSD/USDy (EURJPY) tickvalue = lot*point/Bid(USDy) = 100000*0.01/101.91=9.8126

 
evillive:

Ich habe jetzt 4 Ziffern, auf ewoldollar bei 1 Lot kostet 1 Punkt $10 und hat dies immer getan. Für Kreuze werden die Kosten zwischen 8 und 16 liegen, die Formel ist hier etwas komplizierter.

Zum Beispiel hat marketinfo für das Euro-Pfund 16,984 zurückgegeben, der Wechselkurs von evodollar = 1,3604, der Pfund-Dollar-Kurs = 1,6984, d.h. 1 Pip des Euro-Pfunds ist 1 Pfund wert, multipliziert mit dem Pfund-Dollar-Punktwert, der immer 10,0 beträgt (100000*0,0001 = 10,0 oder 100000*0,00010 = 10,0 - wie man will).




Meine ist einfach und praktisch! Und zu der Zeit, als es eine vierstellige Quote gab, hatte ich noch keine Programme geschrieben, ich kann das also nicht beurteilen. :)

Gute Nacht!