Nützliche Funktionen von KimIV - Seite 8

 

Es gibt eine Menge Fragen...
Ich meine, sie kommen immer wieder vor, aber von Fall zu Fall.

Für die Funktionen, die jetzt veröffentlicht werden, gibt es keine Fragen, weil ich einfach ohne "Gefühl" in das Gerät schaue.
Darüber hinaus gibt es Fragen zu früheren Codes, insbesondere zum "Trailing", das etwas mit den folgenden Punkten zu tun hat
mit oben geschrieben: wie, warum zu Funktionen übergeben, zum Beispiel, diese nachgestellten Abschnitt verwirrt mich:

//+------------------------------------------------------------------+
//| Перенос уровня StopLoss                                          |
//| Параметры:                                                       |
//|   ldStopLoss - уровень StopLoss                                  |
//+------------------------------------------------------------------+
void ModifyStopLoss(double ldStopLoss) {
  bool fm;
  fm=OrderModify(OrderTicket(),OrderOpenPrice(),ldStopLoss,OrderTakeProfit(),0,CLR_NONE);
  if (fm) PlaySound("expert.wav");
}
Die Rolle von ldStopLoss ist unklar ...
 

Oooo... :-) ist eine so alte Funktion. Sie wurde entwickelt, um das Stop-Level einer offenen Position oder einer gesetzten Order zu ändern. Eine ähnliche Funktion gab es auch für die Gewinnmitnahme. Sie wurden beide durch eine bessere und funktionellere ModifyOrder() ersetzt.

kombat:
Die Rolle von ldStopLoss ist unklar ...

Hierbei handelt es sich um eine lokale Variable, mit der das Kursniveau, bei dem StopLoss gesetzt werden soll, an die Funktion ModifyStopLoss übergeben wird. Rufen wir zum Beispiel die Funktion ModifyStopLoss wie folgt auf:

ModifyStopLoss(1,5662);

Dann wird die lokale Variable ldStopLoss den Wert 1,5662 annehmen. Sie können das auf diese Weise überprüfen:

//+------------------------------------------------------------------+
//| Перенос уровня StopLoss                                          |
//| Параметры:                                                       |
//|   ldStopLoss - уровень StopLoss                                  |
//+------------------------------------------------------------------+
void ModifyStopLoss(double ldStopLoss) {
  bool fm;
 
  Print("ldStopLoss=",ldStopLoss);
 
  fm=OrderModify(OrderTicket(),OrderOpenPrice(),ldStopLoss,OrderTakeProfit(),0,CLR_NONE);
  if (fm) PlaySound("expert.wav");
}

Das Protokoll wird diesen Eintrag enthalten:

<Время> <Эксперт> <Инструмент>,<таймфрейм>: ldStopLoss=1.5662
 
KimIV:

Oooh... :-) ist eine so alte Funktion. Sie wurde entwickelt, um das Stop-Level einer offenen Position oder einer gesetzten Order zu ändern. Eine ähnliche Funktion gab es auch für die Gewinnmitnahme. Sie wurden beide durch die perfektere und funktionellere Funktion ModifyOrder() ersetzt.


Also... alte ... (irgendwie peinlich :)))
Ich habe die Ordner durchgesehen, die älteste Datei ist vom 22.01.2006.
Und es sieht so aus, als wäre es nicht einmal von meinen Kurbeln manipuliert worden...
Es tut mir leid, ich habe lange Zeit einfache Dinge geübt, z. B. das Ändern einer Zahl.
Einfache Taschenrechner, etc...

All dies begann mit einer Anfrage, einen Expertenrat in einem der PRDC-Foren zu schreiben, aber...
Meine Cents reichen nicht aus, aber ich muss sie selbst verwenden, und dann brauche ich einen Indikator, der Informationen auf Charts anzeigt.
Jetzt bin ich süchtig danach... ;) ich? Das ist praktisch... alles ist da... unitor, usw., kompakt, tragbar.

Ich erinnere mich an meinen ersten und letzten Versuch mit Delphi 6... Ich schaudere.
Ich habe noch ein paar dieser Disketten im Regal stehen... :))) Entschuldigung für das Offtop.


Was steht also in den Klammern von function(), ist es eine Art "Formular", um einige Parameter zu übergeben?


Ich habe nämlich aus irgendeinem Grund im Kopf, dass es ein Parameter ist, den die Funktion als Ergebnis der Verarbeitung zurückgibt.
Und es ist auch so, dass die Funktion Parameter erhält, die in geschweiften Klammern verarbeitet werden...{}

void TrPos() {
if (OrderType()==OP_BUY) {
    if ( (Bid-OrderOpenPrice())>TrailingStop*Point) {
      if (OrderStopLoss()<Bid-TrailingStop*Point) {
        ModifyStopLoss(Bid-TrailingStop*Point);
        return;
      }
    }
  }
// в качестве примера !!! просто выдраный кусок кода!

D.h. all diese Bid, Point usw. sind Eingabeparameter.

Ich muss mich gewaltig geirrt haben... Und das, was innerhalb der geschweiften Klammern() steht, ermöglicht die Übergabe von Parametern an eine Funktion,
, während die Funktion selbst an einer beliebigen (oder einer anderen) Stelle des eigentlichen Skriptcodes stehen kann...

Oder?

 
Es stellt sich die Frage, warum es bei ModifyOrder im Gegensatz zu OpenPosition keine Fehlerbehandlung gibt? Auch bei der Änderung treten alle möglichen Fehler auf. Ich hätte gerne getrennte Funktionen für die Installation, Änderung und Schließung und eine separate Fehlerbehandlungseinheit für alle - weniger Code, einfacher zu schreiben, und es würde schneller funktionieren... Wenn ich falsch liege, korrigieren Sie mich...
 
Guten Tag, Igor, ich habe Probleme, Ihre EAs und Skripte mit Schleppnetzen jeglicher Art auf meinem realen Konto (Alpari DC) zu verwenden. Besonders interessiert bin ich an e-News-Lucky$ (ideal für mein System), e-TFL_v2, Set2StopOrders, e-SotTrailing. Es funktioniert auf Demo (auch Alpari). Keine Fehlermeldungen. Was kann das sein? Und noch eine Frage. Wie kann man die Zeitbindung in e-News-Lucky$ deaktivieren, um jederzeit ein- und aussteigen zu können? Ich danke Ihnen!
 
ag-forex писал (а):
Guten Tag, Igor, ich habe Probleme bei der Verwendung Ihrer Expert Advisors und Skripte mit jeder Form von Trawls auf Real (Alpari DC). Besonders interessiert bin ich an e-News-Lucky$ (ideal für mein System), e-TFL_v2, Set2StopOrders, e-SotTrailing. Es funktioniert auf Demo (auch Alpari). Keine Fehlermeldungen. Was kann das sein?
Das Problem wurde bereits mehrfach durch Kontaktaufnahme mit dem technischen Support dieses Maklerunternehmens gelöst.
 
kombat писал (а):
Das, was innerhalb der Klammern von function() steht, ist also eine Art "Formular" für die Übergabe von Parametern?

Ja... wie eine Art Container :-)

kombat schrieb (a):
Denn aus irgendeinem Grund habe ich das Gegenteil im Kopf: Dies ist der Parameter, den die Funktion als Ergebnis der Verarbeitung zurückgibt.

Was die Funktion zurückgibt, ist der Rückgabewert. Hier ist ein einfaches Beispiel. Wir definieren eine Funktion, die zwei Zahlen addiert:

int f(int a, int b) {
  int x;
  x=a+b;
  return(x);
}

Wenn wir nun diese Funktion wie folgt aufrufen:

int y;
y=f(3, 5);

dann sind die Zahlen 3 und 5 die Parameter der Funktion f. Die Parameter der Funktion können Zahlen, Variablen oder Ausdrücke sein. Die Variablen a und b sind lokale Variablen, die die Werte der Parameter aufnehmen und an die Funktion weitergeben. Die Variable x ist der Rückgabewert der Funktion f, d.h. nach unserem Aufruf der Funktion f nimmt die Variable y den Wert an, der ihr durch die Variable x übergeben wurde, also 8.

kombat:

Und auch die Tatsache, dass die Funktion Parameter erhält, die in geschweiften Klammern zu behandeln sind...{}

void TrPos() {
if (OrderType()==OP_BUY) {
    if ( (Bid-OrderOpenPrice())>TrailingStop*Point) {
      if (OrderStopLoss()<Bid-TrailingStop*Point) {
        ModifyStopLoss(Bid-TrailingStop*Point);
        return;
      }
    }
  }
// в качестве примера !!! просто выдраный кусок кода!

d.h. all diese Bid, Point usw. sind die Eingabeparameter.

Nein... wird der Parameter der Funktion ModifyStopLoss der Wert des Ausdrucks Bid-TrailingStop*Point sein.

kombat:

Ich muss einen großen Fehler gemacht haben... und das, was in Klammern() steht, erlaubt die Übergabe von Parametern, die in der Funktion verarbeitet werden sollen,
die Funktion selbst kann sich an jeder (oder jeder anderen) Stelle des Skript-Codes selbst befinden...

Oder?

ja

 
sasa999:
Die Frage ist: Warum hat ModifyOrder im Gegensatz zu OpenPosition keine Fehlerbehandlung?

Ich habe irgendwo gehört, dass die Regeln der Straße mit Blut geschrieben wurden. Und es gibt nichts Überflüssiges in ihnen. Hinter jedem Wort steht fast ein Menschenleben, das durch einen Unfall verloren gegangen ist.

Ich schreibe meine Funktionen in Übereinstimmung mit meiner Erfahrung und beziehe die Verarbeitung von Fehlern ein, die in meiner Praxis aufgetreten sind, und die sich nicht vermeiden lassen. Ich versuche, so "höflich" wie möglich zu sein (Fehlerbehandlung), wenn ich versuche, den Markt zu betreten. Bei der Änderung werden die meisten Fehler durch Normalisierung der Preise und einfache Kontrollen der Werte beseitigt. Tritt bei der Änderung ein Fehler auf, ist sie beim nächsten Ticken wieder OK. Das Gleiche geschieht beim Abschluss.

 

Welchen Zweck hat das Senden von pp - Eröffnungspreis der Bestellung an diese Funktion?

void ModifyOrder(double pp=-1, double sl=0, double tp=0, color cl=CLR_NONE)

Es ist, als ob die Farbe schon am Anfang festgelegt ist ... test_ModifyOrder.mq4 (12.14 KB) ... warum verwenden Sie es nicht, sondern senden es erneut an die Funktion

color clModifyBuy = Aqua; // Цвет значка модификации покупки
color clModifySell = Tomato; // Цвет значка модификации продажи
Was ist der Vorteil von
int dg=MarketInfo(OrderSymbol(), MODE_DIGITS), er, it;
pp=NormalizeDouble(pp, dg);

vor der Kurzform

pp=NormalizeDouble(pp, Digits);

Warum müssen Sie OrderOpenPrice() normalisieren? Hat es nicht das gleiche Format wie in der Bestellung?

op=NormalizeDouble(OrderOpenPrice() , dg);
Bisher habe ich keine Fehler bemerkt, wenn das Gleiche beim Ändern eingefügt wird. Dasselbe gilt für OrderStopLoss() und OrderTakeProfit().
 
sasa999:

Welchen Zweck hat das Senden von pp - Eröffnungspreis der Bestellung an diese Funktion?

void ModifyOrder(double pp=-1, double sl=0, double tp=0, color cl=CLR_NONE)

Die Aufträge OP_BUYLIMIT, OP_BUYSTOP, OP_SELLLIMIT und OP_SELSTOP werden verschoben.

sasa999:

Die Farbe ist auch irgendwie schon am Anfang festgelegt... test_ModifyOrder.mq4 (12.14 KB) ...warum nicht verwenden, und wieder an die Funktion senden

color clModifyBuy = Aqua; // Цвет значка модификации покупки
color clModifySell = Tomato; // Цвет значка модификации продажи

Ich danke Ihnen! Ich werde es benutzen!

sasa999:
was ist der Vorteil
int dg=MarketInfo(OrderSymbol(), MODE_DIGITS), er, it;
pp=NormalizeDouble(pp, dg);

vor einer Kurzform

pp=NormalizeDouble(pp, Digits);

Die Vielseitigkeit, die es dem EA erlaubt, mit Positionen und Aufträgen nicht nur für das aktuelle Symbol, sondern auch für andere Symbole zu arbeiten. Der EA funktioniert zum Beispiel auf dem EURUSD-Chart. Eine Variante mit Ziffern erlaubt es nicht, mit auf USDJPY eröffneten Positionen zu arbeiten.

sasa999:

Warum muss der OrderOpenPrice() normalisiert werden?

op=NormalizeDouble(OrderOpenPrice() , dg);

Um Werte vom Typ double erfolgreich zu vergleichen. Wenn es nicht normalisiert ist, ist der Vergleich unmöglich oder eher sinnlos.

sasa999:
Ich habe keinen Fehler bemerkt, wenn Sie beim Ändern das Gleiche wieder einfügen. Dasselbe gilt für OrderStopLoss() und OrderTakeProfit().
Ohne Normalisierung erzeugt die Funktion den Fehler 1(OrderModify versucht, bereits gesetzte Werte mit denselben Werten zu ändern).