Nützliche Funktionen von KimIV - Seite 4

 

Weitere Beispiele für die Verwendung der Funktion SetOrder().

Um Klarheit zu schaffen, sollten wir ein Symbol mit einem großen zulässigen Mindestniveau von Stop Loss/Stake Profit in Pips wählen. Ich habe AUDCAD gewählt, bei dem dieses Niveau in meinem ausgewählten Brokerage-Unternehmen zum Testen 10 Punkte beträgt.

1. Einstellen eines BuyLimit-Auftrags mit Lot 0,1, 5 Pips unter dem aktuellen Kurs. Ich habe absichtlich ein niedrigeres Orderlevel als das minimal zulässige Level gewählt, um den Fehler 130 (Falsche Stops) zu erhalten und zu zeigen, wie die SetOrder-Funktion das Problem lösen wird.

SetOrder(NULL, OP_BUYLIMIT, 0.1, Ask-5*Point);

Inhalt des Protokolls (von unten nach oben gelesen):
2008.03.17 09:06:24 test_SetOrder AUDCAD,M5: entfernt
2008.03.17 09:06:24 stdlib AUDCAD,M5: entfernt
2008.03.17 09:06:24 stdlib AUDCAD,M5: uninit Grund 0
2008.03.17 09:06:24 test_SetOrder AUDCAD,M5: uninit Grund 0
2008.03.17 09:06:24 test_SetOrder AUDCAD,M5: Eröffnung #21616412 Kauflimit 0.10 AUDCAD bei 0.9180 ok
2008.03.17 09:06:15 test_SetOrder AUDCAD,M5: SetOrder(): Korrigierte Kursstände
2008.03.17 09:06:15 test_SetOrder AUDCAD,M5: Ask=0.919 Bid=0.918 sy=AUDCAD ll=0.1 op=Buy Limit pp=0.9185 sl=0 tp=0 mn=0
2008.03.17 09:06:15 test_SetOrder AUDCAD,M5: Error(130) set order: ungültige Stops, versuche 1
2008.03.17 09:06:15 stdlib AUDCAD,M5: erfolgreich geladen
2008.03.17 09:06:14 test_SetOrder AUDCAD,M5: erfolgreich geladen

Das Protokoll zeigt, dass diese Funktion versucht hat, eine 0,9185-Order (pp=0,9185) zu platzieren, aber der Handelsserver hat diese Order nicht akzeptiert und Fehler 130 zurückgegeben. Dann korrigiert die Funktion die Ordereinstellung entsprechend dem zulässigen Mindestniveau und führt den nächsten erfolgreich abgeschlossenen Handelsversuch durch. Der Auftrag wird bei 0,9180 erteilt.

2. Setzen eines BuyStop-Auftrags mit Lot 0.3 bei 6 Pips über dem aktuellen Kurs mit einem Stop von 9 Pips

SetOrder(NULL, OP_BUYSTOP, 0.3, Ask+6*Point, Ask+(6-9)*Point);

Inhalt des Protokolls (von unten nach oben gelesen):
2008.03.17 09:27:36 test_SetOrder AUDCAD,M5: entfernt
2008.03.17 09:27:36 stdlib AUDCAD,M5: entfernt
2008.03.17 09:27:36 stdlib AUDCAD,M5: uninit Grund 0
2008.03.17 09:27:36 test_SetOrder AUDCAD,M5: uninit Grund 0
2008.03.17 09:27:36 test_SetOrder AUDCAD,M5: open #21617419 buy stop 0.30 AUDCAD bei 0.9209 sl: 0.9195 ok
2008.03.17 09:27:26 test_SetOrder AUDCAD,M5: SetOrder(): Korrigierte Kursstände
2008.03.17 09:27:26 test_SetOrder AUDCAD,M5: Ask=0.9198 Bid=0.9188 sy=AUDCAD ll=0.3 op=Buy Stop pp=0.9204 sl=0.9195 tp=0 mn=0
2008.03.17 09:27:26 test_SetOrder AUDCAD,M5: Error(130) set order: ungültige Stops, versuche 1
2008.03.17 09:27:26 stdlib AUDCAD,M5: erfolgreich geladen
2008.03.17 09:27:25 test_SetOrder AUDCAD,M5: erfolgreich geladen

Dieses Beispiel zeigt, wie sich die Auftragseinstellungsebene von 0,9204 auf 0,9209 geändert hat. Gleichzeitig ist das Niveau des Stopps unverändert bei sl=0,9195 geblieben. Das heißt, der Stopp in Pips hat sich von 9 auf 14 erhöht.

 

3. Einstellen einer SellLimit-Order mit 0,5 Lot bei 8 Punkten über dem aktuellen Kurs mit einem Stop von 9 Punkten und einer Take-Order von 7 Punkten

SetOrder(NULL, OP_SELLLIMIT, 0.5, Bid+8*Point, Bid+(8-9)*Point, Bid-(8+7)*Point);

Inhalt des Protokolls:
2008.03.17 10:38:50 test_SetOrder AUDCAD,M5: entfernt
2008.03.17 10:38:50 stdlib AUDCAD,M5: entfernt
2008.03.17 10:38:50 stdlib AUDCAD,M5: uninit Grund 0
2008.03.17 10:38:50 test_SetOrder AUDCAD,M5: uninit Grund 0
2008.03.17 10:38:49 test_SetOrder AUDCAD,M5: open #21620553 sell limit 0.50 AUDCAD bei 0.9190 sl: 0.9201 tp: 0.9179 ok
2008.03.17 10:38:40 test_SetOrder AUDCAD,M5: SetOrder(): Korrigierte Kursstände
2008.03.17 10:38:40 test_SetOrder AUDCAD,M5: Ask=0.919 Bid=0.918 sy=AUDCAD ll=0.5 op=Sell Limit pp=0.9188 sl=0.9197 tp=0.9179 mn=0
2008.03.17 10:38:40 test_SetOrder AUDCAD,M5: Error(130) set order: ungültige Stops, versuche 1
2008.03.17 10:38:40 stdlib AUDCAD,M5: erfolgreich geladen
2008.03.17 10:38:39 test_SetOrder AUDCAD,M5: erfolgreich geladen

In diesem Beispiel wird erneut versucht, einen Limitauftrag zu nahe am Markt zu platzieren. Das Order-Setting-Level wurde um 2 Pips von 0,9188 auf 0,9190 nach oben angepasst. Die Stoppmarke wurde ebenfalls angepasst, allerdings um 4 Punkte von 0,9197 auf 0,9201. Nur das Take-Niveau ist unverändert geblieben, das sich von 9 auf 11 Pips erhöht hat.

Ich denke, das sind genug Beispiele. Sie sind schon ziemlich schwer zu verstehen. Welche Schlussfolgerungen können gezogen werden?
1. Die Funktion wird ihr Bestes tun, um ihre Aufgabe zu erfüllen, d.h. sie wird versuchen, eine Reihenfolge festzulegen. Es wird die Niveaus an den sich verändernden Markt anpassen und immer wieder versuchen, seine Aufgabe zu erfüllen.
2. Die Anpassung des Niveaus der Stop-Order-Einstellung führt zu einer Erhöhung des Stop-Niveaus in Punkten gegenüber dem Einstellungskurs. Dies ist darauf zurückzuführen, dass das Stop-Level des Stop-Auftrags bestehen bleibt und das Order-Setting-Level vom Stop-Level wegbewegt wird. Das Niveau der BuyStop-Order wird nach oben und das der SellStop-Order nach unten verschoben. Diese Manipulationen mit der Auftragseinstellungsebene erhöhen die Stoppgröße in Punkten um den Wert der Einstellung der Auftragseinstellungsebene.
3. Die Anpassung des Limit-Order-Setting-Levels führt zu einer Erhöhung des Take-Line-Levels in Punkten relativ zum Setting-Preis. Dies wird auf folgende Weise umgesetzt. Die Abschläge bleiben bestehen, während die Stopps und Einstellwerte für BuyLimit nach oben und für SellLimit nach unten verschoben werden. Die Größe der Take-In-Punkte erhöht sich um den Wert der Korrektur der Auftragseinstellungsebene.

Warnung! Ich habe den Code der SetOrder-Funktion geändert, indem ich ein paar Zeilen ausgetauscht habe. Der alte Beitrag kann nicht bearbeitet werden, daher füge ich die korrigierte Funktion hier ein. Ebenfalls beigefügt ist ein Skript zum Online-Test der Funktion SetOrder.


Dateien:
 

Um die Veröffentlichung der Funktion ModifyOrder zu beschleunigen, beschloss ich, für eine Weile zu den Positionsfunktionen zu wechseln, um dann zu den Bestellfunktionen zurückzukehren und mit ihnen fertig zu werden.

Achtung!
Ich definierePositionen als OP_BUY und OP_SELL Handelsoperationen. Positionen werden geöffnet und geschlossen.
Ich nenne die Handelsoperationen OP_BUYLIMIT, OP_BUYSTOP, OP_SELLLIMIT und OP_SELLSTOPals Aufträge. Aufträge werden erteilt und gelöscht. Wenn ein Auftrag ausgelöst wird, wird er zu einer Position.

Die Funktion ExistPositions().

Mit dieser Funktion können Sie überprüfen, ob es offene Positionen zum Kauf oder Verkauf gibt. Ähnlich wie bei der Funktion ExistOrders. Standardmäßig werden alle Positionen geprüft: aktuelle und andere. Sie können die Auswahl mit einer Kombination von Filtern - Funktionsparametern - verfeinern:

  • sy - Schränkt den Namen des Instruments ein. Der Standardparameter ist "" - keine Einschränkung, d. h. ein beliebiges Instrument. Wenn Sie NULL übergeben, wird die Positionsauswahl auf das aktuelle Instrument beschränkt.
  • op - schränkt die Positionsart ein (Kauf/Verkauf). Standardmäßig gibt es keine Einschränkung, d. h. jede Positionsart wird geprüft. Gültige Werte für diesen Parameter sind -1, OP_BUY und OP_SELL.
  • mn - Wendet eine Beschränkung auf die Identifikationsnummer ("magische" Nummer) der Position an. Standardmäßig gibt es keine Einschränkung, d.h. die Position mit einer beliebigen magischen Zahl wird geprüft.
  • ot - Wendet eine Beschränkung der Öffnungszeit der Position an. Es wird geprüft, ob die Position später als der Wert dieses Parameters geöffnet wird. Standardmäßig keine Einschränkung, d. h. Positionen mit beliebiger offener Zeit werden geprüft.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 06.03.2008                                                     |
//|  Описание : Возвращает флаг существования позиций                          |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//|    ot - время открытия             ( 0   - любое время открытия)           |
//+----------------------------------------------------------------------------+
bool ExistPositions(string sy="", int op=-1, int mn=-1, datetime ot=0) {
  int i, k=OrdersTotal();
 
  if (sy=="0") sy=Symbol();
  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 (mn<0 || OrderMagicNumber()==mn) {
              if (ot<=OrderOpenTime()) return(True);
            }
          }
        }
      }
    }
  }
  return(False);
}
 

Beispiele für die Verwendung der Funktion ExistPositions().

1. Prüfen Sie das Vorhandensein einer Position

ExistPositions();

2. Prüfen, ob eine beliebige Position auf dem aktuellen Kartensymbol vorhanden ist

ExistPositions(NULL);

3. Überprüfung der Existenz des Kaufs eines beliebigen Instruments

ExistPositions("", OP_BUY);

4. Prüfen Sie, ob es einen Verkauf mit der magischen Zahl 123456 auf EURUSD gibt

ExistPositions("EURUSD", OP_SELL, 123456);

5. Prüfen Sie das Vorhandensein einer Position, deren Öffnungszeit nicht länger als 15 Minuten zurückliegt

ExistPositions("", -1, -1, TimeCurrent()-15*60);

Der Trailer enthält ein Skript zum Testen der Funktion ExistPositions. Die ersten vier Beispiele sind auskommentiert.

Dateien:
 
Sorry, aber weder OrderSet_1 noch OrderSet_2 funktionieren! Er erzeugt Fehler - er lässt sich nicht kompilieren! Was muss ich tun?
 
SoloEgoist:
Sorry, aber weder OrderSet_1 noch OrderSet_2 funktionieren! Er erzeugt Fehler - er lässt sich nicht kompilieren! Was muss ich tun?
Die Dateien OrderSet_1 oder OrderSet_2 sind Quellcodes für die OrderSet-Funktion in verschiedenen Versionen. Nur der Quellcode, das ist alles. Sie lassen sich nicht kompilieren oder ordnungsgemäß (ohne Fehler) ausführen. Um zumindest einige Ergebnisse zu erhalten, müssen Sie auch eine Arbeitsumgebung schaffen, die die Funktion OrderSet verwendet. Ich habe ein Beispiel für eine solche Arbeitsumgebung in test_SetOrder erstellt.
 
Danke. Ich verstehe - ich werde es versuchen, ich kann nur nicht viel von der Sprache.
 

Funktionen und Möglichkeiten, mit Datum und Uhrzeit zu arbeiten, wären sehr hilfreich...

Zum Beispiel:
- 2 Stunden von der aktuellen Zeit subtrahieren
- X Tage bis zum Verfall...

Außerdem... Ich weiß nicht, ob das relevant ist... :(

Funktionen für die Statistik. Zum Beispiel:
- wie viele stündliche Kerzen um 21:00 Uhr jeden Montag
- von denen: 215 bullish, 245 bearish
- der bullischen Kerzen: min. 12 Pips max. 54 Pips
- usw...

oder
- der Tiefstwert jeder ersten 15-Stunden-Kerze des Tages ist X-mal höher/niedriger als der der zweiten

Es sind nicht die Funktionen selbst, die wichtig sind, sondern wie sie erstellt werden, und es ist einfacher, eigene Funktionen zu implementieren,
während ich programmieren lerne...
Ich beschwere mich mal wieder :))) Manchmal sind viele Dinge nicht ganz klar, und Bücher über C können helfen.
Sie können sie natürlich lesen, aber müssen Sie wirklich Ihren Kopf mit unnötigen Informationen füllen und sich nur auf µl4 konzentrieren?
Welche Art von Unklarheit? zum Beispiel diese: ||

 
kombat:

Funktionen und Möglichkeiten, mit Datum und Uhrzeit umzugehen, wären sehr nützlich...

Zum Beispiel:
- 2 Stunden von der aktuellen Zeit subtrahieren
- Noch X Tage bis zum Verfall...

...


brauchen Sie eine solche Funktion nicht zu schreiben - es gibt eine sehr einfache Lösung!


int gHour = 2;
datetime gTwoHour ;


gTwoHourTime = TimeCorrent() - ((86400)/24) * gHour ); // 2 Stunden
gTwoHourTime = TimeCorrent() - 7200; // dasselbe, aber ohne Lastberechnungen

d.h. wir erhalten 86400 Ticks an einem Tag

also 2 Stunden = 7200 Ticks, d.h. 86400/24 * 2 = 7200
1 Stunde = 3600; usw.
 
kombat:

Funktionen und Möglichkeiten zur Arbeit mit Datum und Uhrzeit wären nützlich.

Funktionen für die Statistik. Zum Beispiel:
- wie viele Kerzenständer um 21:00 Uhr jeden Montag
- von denen: 215 bullish, 245 bearish
- der bullischen Kerzen: min. 12 Pips max. 54 Pips
- usw...

oder
- der Tiefstwert jeder ersten 15-Stunden-Kerze des Tages ist X-mal höher/niedriger als der der zweiten

Es sind nicht die Funktionen selbst, die wichtig sind, sondern wie sie erstellt werden, und es ist einfacher, eigene Funktionen zu implementieren,
während ich programmieren lerne...

Ordnungsgemäß notiert... :-)

kombat schrieb (a):
Ich werde mich wieder beschweren :))) manchmal ist vieles nicht ganz klar, und man sagt, dass C-Bücher helfen werden.
Sie weisen darauf hin, dass viele C-Bücher hilfreich sind. Natürlich können Sie sie lesen, aber müssen Sie wirklich Ihren Kopf mit unnötigen Informationen füllen und sich nur auf µl4 konzentrieren?
Welche Art von Unklarheit? zum Beispiel diese: ||

Es ist eine logische ODER-Verknüpfung. Lassen Sie es mich an einem Beispiel erklären. Der Ausdruck "Wenn x>2 oder x<-3, dann x=5" hat in MQL4 die folgende Form

if (х>2 || х<-3) х=5;