Nützliche Funktionen von KimIV - Seite 114

 

Guten Tag.

Ich bin noch neu in der Programmierung, falls mir jemand einen Tipp geben kann.

Frage. Wir haben einen oder mehrere offene Aufträge, von denen wir wissen, dass sie mit einem Gewinn von $20 schließen werden.

Wir müssen wissen, zu welchem Preis die Aufträge mit einem Gewinn von 20 $ schließen werden.

Wir berechnen das Gesamtvolumen der offenen Lose, und dann!

Bitte beraten Sie mich, wie ich das machen kann.

Vielleicht gibt es eine fertige Funktion?

Vielen Dank im Voraus.

 
KimIV:

Beispiele für die Verwendung von DistMarketAndPos().

Wozu braucht man eine Funktion, die feststellt, wie weit der Markt von der nächstgelegenen Position entfernt ist? Ich sehe mindestens vier grundlegende Optionen:

  1. Gekauft oder verkauft. Der Markt hat sich in unsere Richtung bewegt. Und sobald er eine gewisse Strecke zurückgelegt hat, bestehende Positionen einen Gewinn erzielt haben, machen wir sofort eine Einzahlung - steigen wieder in dieselbe Richtung ein.
  2. Wir kaufen oder verkaufen. Der Markt entwickelte sich in unsere Richtung. Wenn er eine bestimmte Strecke zurückgelegt hat und die bestehenden Positionen einen bestimmten Gewinn erwirtschaftet haben, wird uns sofort klar: Das war's! Der Umschwung ist nahe! Es ist Zeit, umzukehren. Wir schließen unsere aktuellen Positionen und eröffnen in die entgegengesetzte Richtung.
  3. Wir kaufen oder verkaufen. Der Markt hat sich gegen uns gewandt. Aber aus irgendeinem Grund sind wir uns sicher, dass wir richtig liegen, und in einiger Entfernung vom nächsten Einstiegspunkt, d. h. bei einer bestimmten Verlusthöhe, bilden wir einen Durchschnitt und eröffnen in dieselbe Richtung.
  4. Wir kaufen oder verkaufen. Der Markt hat sich gegen uns gestellt. Und wir haben erkannt, dass wir den Markt falsch betreten haben. Deshalb legen wir uns auf eine bestimmte Verlusthöhe fest und öffnen uns in die andere Richtung.

Wenn Sie eine spezielle Implementierung einer dieser Optionen wünschen, schreiben Sie Ihre Wünsche hier. Ich werde alle Anfragen im Rahmen dessen, was ich oben aufgeführt habe, erfüllen.

SZY-SZY: Im Anhang finden Sie eine Vorlage zum Experimentieren mit der Funktion DistMarketAndPos().


HalloKimIV, die Funktion ist sehr gut, sie funktioniert, wenn ich sie umdrehe, funktioniert sie auch, aber ich kann die beiden Hälften nicht verbinden.

     int start()

{

      if (DistMarketAndPos()>150)

{                                     

      OrderSend(Symbol(),OP_BUY,1.0,Ask,3,0,Ask+150*Point);

   }     

      return(0);

   }

int DistMarketAndPos(string sy="", int op=OP_BUY, int mn=-1) {

  double d, p;

  int i, k=OrdersTotal(), r=1000000;


  if (sy=="" || sy=="0") sy=Symbol();

  p=MarketInfo(sy, MODE_POINT);

  if (p==0) if (StringFind(sy, "")<0) p=0.00001; else p=0.01;

  for (i=0; i<k; i++) {

    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {

      if ((OrderSymbol()==sy) && (op<0 || OrderType()==op)) {

        if (mn<0 || OrderMagicNumber()==mn) {

          if (OrderType()==OP_BUY) {

            d=MathAbs(MarketInfo(sy, MODE_ASK)-OrderOpenPrice())/p;

            if (r>d) r=NormalizeDouble(d, 0);

          }

          if (OrderType()==OP_SELL) {

            d=MathAbs(OrderOpenPrice()-MarketInfo(sy, MODE_BID))/p;

            if (r>d) r=NormalizeDouble(d, 0);

          }

        }

      }

    }

  }

return (r);

}  


 

Bitte drehen Sie es für mich um, alle sagen, es ist nicht richtig, aber es funktioniert.
 
Neuankömmlinge können ihre Fragen in dem dafür vorgesehenen Thread stellen.
 

Neue Version der Funktion Message().


Die Funktion Message() wurde seit ihrer Veröffentlichung in diesem Dokument zweimal geändert. Mit der ersten Änderung wurde die Möglichkeit hinzugefügt, die Ausgabe in das Expertenprotokoll mittels Print() zu deaktivieren und nur die erste Meldung in einer Reihe ähnlicher Meldungen auszugeben. Die zweite Änderung fügte Ausgaberichtungen hinzu, d.h. zusätzlich zu den bestehenden Comment() und Print() Funktionen wurden Alert(), SendMail() und SendNotification() verwendet. Die letztgenannte Änderung möchte ich veröffentlichen.

Die Funktion Message() dient dazu, die Textnachricht in verschiedene Richtungen auszugeben. Es kann sowohl zu Debugging-Zwecken als auch in fertigen Anwendungen zur Erläuterung der aktuellen Handelssituation, zur Protokollierung des Programmablaufs, zur rechtzeitigen Benachrichtigung eines Händlers über wichtige Änderungen usw. verwendet werden. Die Funktion akzeptiert drei Parameter, von denen die letzten beiden optional sind:
  • ms - String, auszugebende Textnachricht, übertragen.
  • nv - Eine Reihe von Flags, die die Richtung der Nachrichtenausgabe angeben. Fünf Flaggen stehen für fünf bedeutende Orte. Jede Fahnenseite mit Null schaltet eine bestimmte Ausgangsrichtung ein und eine aus. Von links nach rechts in der Reihenfolge: Alert, Comment, Print, SendMail und SendNotification. Der Standardwert ist "01100", d.h. Kommentar und Druck sind aktiviert, die anderen sind deaktiviert.
  • am - Logisch, True - alle Meldungen ausgeben, False - von einer Reihe identischer Meldungen nur die erste ausgeben. Der Standardwert ist False.

Zu den Ausgaberichtungen Alert und Print (Felder 1 und 3) ist anzumerken, dass sie die Meldung zeilenweise ausgeben können. Das heißt, wenn es einen Zeilenumbruch im Nachrichtentext gibt - Steuerzeichen "\n", dann wird jede Zeile unabhängig gedruckt. Probieren Sie das Testskript im Anhang aus, ich denke, es wird Ihnen gefallen :-)

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 08.03.2013                                                     |
//|  Описание : Вывод текстового сообщения.                                    |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    ms - текст сообщения                                                    |
//|    nv - флаги направлений вывода сообщения:   (0-выкл, 1-вкл)              |
//|           Alert, Comment, Print, SendMail, SendNotification                |
//|    am - флаг всех повторяющихся сообщений                                  |
//+----------------------------------------------------------------------------+
void Message(string ms, string nv="01100", bool am=False) {
  static string prevMessage="";
  string as[];
  int    i, k;

  if (StrToInteger(StringSubstr(nv, 1, 1))==1) Comment(ms);
  if ((StringLen(ms)>0) && (am || prevMessage!=ms)) {
    if (StrToInteger(StringSubstr(nv, 0, 1))==1) {
      k=StrSplit(ms, as, "\n");
      for (i=0; i<k; i++) Alert(as[i]);
    }
    if (StrToInteger(StringSubstr(nv, 2, 1))==1) {
      k=StrSplit(ms, as, "\n");
      for (i=0; i<k; i++) Print(as[i]);
    }
    if (StrToInteger(StringSubstr(nv, 3, 1))==1) SendMail(WindowExpertName(), ms);
    if (StrToInteger(StringSubstr(nv, 4, 1))==1) SendNotification(ms);
    prevMessage=ms;
  }
}

SZY: Im Anhang finden Sie ein Skript zum Testen der Funktion Message().

Dateien:
 
KimIV:

Neue Version der Funktion Message().


Die Funktion Message() wurde seit ihrer Veröffentlichung in diesem Dokument zweimal geändert. Mit der ersten Änderung wurde die Möglichkeit hinzugefügt, die Ausgabe in das Expertenprotokoll mittels Print() zu deaktivieren und nur die erste Meldung in einer Reihe ähnlicher Meldungen auszugeben. Die zweite Änderung fügte Ausgaberichtungen hinzu, d.h. zusätzlich zu den bestehenden Comment() und Print() Funktionen wurden Alert(), SendMail() und SendNotification() verwendet. Die letztgenannte Änderung möchte ich veröffentlichen.

Die Funktion Message() dient dazu, die Textnachricht in verschiedene Richtungen auszugeben. Es kann sowohl zu Debugging-Zwecken als auch in fertigen Anwendungen zur Erläuterung der aktuellen Handelssituation, zur Protokollierung des Programmablaufs, zur rechtzeitigen Benachrichtigung eines Händlers über wichtige Änderungen usw. verwendet werden. Die Funktion akzeptiert drei Parameter, von denen die letzten beiden optional sind:
  • ms - String, auszugebende Textnachricht, übertragen.
  • nv - Eine Reihe von Flags, die die Richtung der Nachrichtenausgabe angeben. Fünf Flaggen stehen für fünf bedeutende Orte. Jede Fahnenseite mit Null schaltet eine bestimmte Ausgangsrichtung ein und eine aus. Von links nach rechts in der Reihenfolge: Alert, Comment, Print, SendMail und SendNotification. Der Standardwert ist "01100", d.h. Kommentar und Druck sind aktiviert, die anderen sind deaktiviert.
  • am - Logisch, True - alle Meldungen ausgeben, False - von einer Reihe identischer Meldungen nur die erste ausgeben. Der Standardwert ist False.

Zu den Ausgaberichtungen Alert und Print (Felder 1 und 3) ist anzumerken, dass sie die Meldung zeilenweise ausgeben können. Das heißt, wenn es einen Zeilenumbruch im Nachrichtentext gibt - Steuerzeichen "\n", dann wird jede Zeile unabhängig gedruckt. Probieren Sie das Testskript im Anhang aus, ich denke, es wird Ihnen gefallen :-)


SZY: Im Anhang finden Sie ein Skript zum Testen der Funktion Message().

Haben Sie Ihrer OpenPosition-Funktion eine Stopplay-Prüfung hinzugefügt?
 
sv.:
Haben Sie Ihre OpenPosition-Funktion um eine Prüfung auf Stopp-Nivellierung erweitert?


Nein... auf welche Art von Überprüfung beziehen Sie sich? Nun, nehmen wir an, die Kontrolle wurde nicht bestanden, was ist dann zu tun? Es gibt verschiedene Möglichkeiten:

  1. Nicht öffnen,
  2. Stellen Sie den Anschlag und den Abzug ein.

 
KimIV:


nein... auf welche Art von Überprüfung beziehen Sie sich? Nun, nehmen wir an, dass die Anhaltung und die Mitnahme die Prüfung nicht bestanden haben, was tun Sie dann? Es gibt Optionen:

  1. Nicht öffnen,
  2. Stopp und Aufnahme anpassen.

Sie könnten einen benutzerdefinierten Schalter zwischen den Punkten 1 und 2 einführen, der dem Muster folgt:
 int           modeSetOrders = 1;      // Способ установки ордеров:
                                       //  0 - по заданной цене
                                       //  1 - скорректировать цены
                                       //  2 - вход по текущим ценам
 

Neue Version der FunktionOpenPosition() im Testskript.

Was gibt es Neues?

1. Wenn der Fehler 130 Ungültige Stops und der Wert der Variable NumberOfTry>1 gesetzt ist, wird die Funktion versuchen, die StopLoss- und TakeProfit-Kursebenen an die Werte von MODE_STOPLEVEL+MODE_SPREAD relativ zu Bid für OP_SELL und Ask für OP_BUY anzupassen.

Anmerkung:

Die globale VariableNumberOfTry mussgrößer als 1 sein, um die Korrektur der Kursniveaus auszulösen, dader erste Versuch, eine Position zu eröffnen, den Fehler 130 aufdeckt und die Kursniveaus korrigiert, während der zweite und die folgenden Versuche, eine Position zu eröffnen, mit korrigierten Niveaus erfolgen.

Dateien:
 
KimIV, schön, dass du wieder mit neuen Beiträgen dabei bist.
 

Guten Tag.

Ist es möglich, die Bibliothek der nützlichen Funktionen von KimIV durch einige einfache Funktionen wie :

1.offener Preis, ausgewählt nach bestimmten Kriterien (Symbol, Typ, Losgröße, magische Zahl). Dieser Preis kann in globalen Variablen gespeichert und als ein bestimmtes Preisniveau verwendet werden, aus dem der Algorithmus des Expert Advisors aufgebaut werden kann.

Gibt ein Ticket zurück, das nach bestimmten Kriterien einer Position oder eines Auftrags (Symbol, Typ, Losgröße, magische Zahl) ausgewählt wurde. Das Ticket ist ein wichtiges Erkennungszeichen, es kann überall und sogar als Existenzkennzeichen verwendet werden.

Je mehr solcher einfachen Funktionen es gibt, desto einfacher ist es, die besten für Sie auszuwählen, ohne Angst haben zu müssen, bei der Änderung bestehender Funktionen Fehler zu machen.

Ich danke Ihnen für Ihre Arbeit.