Nützliche Funktionen von KimIV - Seite 49

 
KimIV писал (а) >>

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

5. Prüfen Sie alle Aufträge mit einer Abbindezeit von 2 Stunden oder mehr vor

ExistOrders("", -1, -1, TimeCurrent()-2*60*60);

Guten Abend, ich bin etwas verwirrt über diesen Kommentar. Ich sitze hier und denke darüber nach! Ich weiß nicht, wie ich meine Bedingung richtig formulieren soll - "nicht früher als 5 Minuten" oder "nicht später als 5 Minuten"! (Das war mir klar, bevor ich anfing, darüber nachzudenken!)

Ich muss einen schwebenden Auftrag löschen, wenn er nicht innerhalb einer bestimmten Zeit ausgelöst wurde. Zum Beispiel innerhalb von 5 Minuten nach der Einstellung !

Ich habe dies getan:

if (ExistOrders(NULL, OP_BUYSTOP, Magic,TimeCurrent()-5*60) >0) //ЕСЛИ ЕСТЬ ОРДЕР BUYSTOP > 5 min 
                 DeleteOrders(NULL, OP_BUYSTOP, Magic);
if (ExistOrders(NULL, OP_SELLSTOP, Magic,TimeCurrent()-5*60) >0) //ЕСЛИ ЕСТЬ ОРДЕР SELLSTOP > 5 min  
                 DeleteOrders(NULL, OP_SELLSTOP, Magic);

Ist dies richtig? Aber im Testgerät funktioniert es nicht. Bestellungen werden aufgegeben und sofort gelöscht.

Bitte beraten Sie, wie man ExistOrders() Funktion richtig zu schreiben ?

 
rid писал (а) >>
Ich bin ein wenig verwirrt...

Ich scheine auch verwirrt zu sein. Lassen Sie uns gemeinsam enträtseln... :-)

Der ot-Parameter (Zeitpunkt der Auftragserteilung) wurde in die Funktion ExistOrders aufgenommen, um die Fehler 128, 142 und 143 korrekt zu behandeln. Der Zweck der Fehlerbehandlung besteht darin, doppelte (in praktischen Fällen sogar dreifache) Einstellungen der gleichen Reihenfolge auszuschließen. Zu diesem Zweck wird der Zeitpunkt des Absendens eines Handelsauftrags gespeichert und die Handelsversuche werden angehalten. Nach der Pause wird das Vorhandensein des Auftrags mit der eingestellten Zeit nach der gespeicherten Zeit geprüft. Liegt ein Auftrag vor, wird festgestellt, dass das Ziel erreicht wurde (der Auftrag wurde erteilt), und die Handelsversuche werden abgebrochen. Mit anderen Worten: Die Zeit, nach der die Einstellung der Reihenfolge geprüft wird, wird an den Parameter ot übergeben. Später = nicht früher.

rid schrieb (a) >>
Ich muss einen schwebenden Auftrag löschen, wenn er nicht innerhalb einer bestimmten Zeit ausgelöst wurde. Zum Beispiel, innerhalb von 5 Minuten nach dem Einstellen von !

Der Parameter ot der Funktion ExistOrders ist hier nicht hilfreich. Es funktioniert in umgekehrter Richtung. Sie wirkt in Richtung einer größeren Nähe zur Gegenwart. Sie müssen rückwärts arbeiten. Der expiration-Parameter der OrderSend-Funktion (oder der ex-Parameter der SetOrder-Funktion) eignet sich hierfür hervorragend.

 

Die Funktion ClosePosBySelect() für das Prüfgerät.

Führt die Schließung einer vorgewählten Position aus. Dies ist eine Light-Version der gleichnamigen Funktion, die bereits auf Seite 13 vorgestellt wurde. Nichts Besonderes. Keine zusätzlichen Funktionen. In meiner Praxis habe ich noch nie eine Position gehabt, die im Tester nicht geschlossen wurde. Deshalb gibt es in dieser Funktion auch keine Prüfungen. Sie sind im Prüfgerät nicht erforderlich.

//+----------------------------------------------------------------------------+
//|  Автор   : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                    |
//+----------------------------------------------------------------------------+
//|  Версия  : 13.06.2007                                                      |
//|  Описание: Закрытие одной предварительно выбранной позиции                 |
//+----------------------------------------------------------------------------+
void ClosePosBySelect() {
  double pp;

  if (OrderType()==OP_BUY) {
    pp=MarketInfo(OrderSymbol(), MODE_BID);
    OrderClose(OrderTicket(), OrderLots(), pp, Slippage, clCloseBuy);
  }
  if (OrderType()==OP_SELL) {
    pp=MarketInfo(OrderSymbol(), MODE_ASK);
    OrderClose(OrderTicket(), OrderLots(), pp, Slippage, clCloseSell);
  }
}

SZY: Ein Beispiel für die Verwendung der Funktion ClosePosBySelect() werde ich später geben, zusammen mit der Funktion OpenPosition() für den Prüfer.

 

Hallo zusammen. Um zu vermeiden, dass ich mich jedes Mal durch die Seiten wühlen muss, musste ich den Inhalt verzweigungsweise erstellen.

Ich habe die Funktionen ähnlicher Themen hier und dort zusammengefasst. Inhalt von 1 bis 40 Seiten.

Wer möchte, kann weitere Seiten hinzufügen und sie hier einstellen.

Dateien:
 

Hallo Igor, ich brauche deine Hilfe. Ich habe mich entschieden, die Schließfunktion in e-CloseByProfit EA ähnlich wie e-CloseByPercentProfit zu implementieren.

Alles funktioniert einwandfrei, der Expert Advisor arbeitet ordnungsgemäß und das Terminal wird geschlossen. Aber wenn ich das Terminal wieder öffne, wird es sofort wieder geschlossen.

Bitte helfen Sie mir, den Code zu ändern, um dieses Problem zu beheben.

//+----------------------------------------------------------------------------+
//| e-CloseByProfit.mq4 |
//| Kim Igor V. alias KimIV |
//| http://www.kimiv.ru |
//| |
//| 22.10.2006 Der Expert Advisor schließt alle Positionen, sobald der angegebene Wert erreicht ist.
//| Gewinnstufe.
//| 20.06.2008 Fehler bei der Berechnung des Gewinns in Punkten behoben.
//+----------------------------------------------------------------------------+
#property copyright "Kim Igor V. alias KimIV"
#Eigenschaftslink "http://www.kimiv.ru"
#define MAGIC 20061022

//------- Externe Parameter des Expert Advisors ------------------------------------------
externer String _P_Expert = "---------- EA-Parameter";
extern bool CurSymbolOnly = false; // Nur das aktuelle Symbol
extern intProfit = 100; // Gewinnmitnahme
extern bool CloseTerminal = False; // Terminal schließen
extern bool ShowComment = True; // Kommentar anzeigen
extern int NumberAccount = 0; // Nummer des Handelskontos
extern bool UseSound = True; // Tonsignal verwenden
extern string NameFileSound = "manycoin.wav"; // Name der Sounddatei
extern int Slippage = 3; // Kursabweichung
extern inttern NumberOfTry = 5; // Anzahl der Versuche

//------- Globale Variablen des Expert Advisors --------------------------------------
Farbe clCloseBuy = Blau; // Farbe clCloseSell = Rot; // Farbe des Schlussverkaufssymbols
color clCloseSell = Red; // Farbe der Verkaufsschlussmarkierung
int CurProfit;

//------- Anschluss von externen Modulen -------------------------------------------
#include <stdlib.mqh>.
#include <WinUser32.mqh>

//+----------------------------------------------------------------------------+
//| Experten-Initialisierungsfunktion |
//+----------------------------------------------------------------------------+
void init() { if (!IsTesting()) Kommentar(""); }

//+----------------------------------------------------------------------------+
//| Experten-Deinitialisierungsfunktion |
//+----------------------------------------------------------------------------+
void deinit() { if (!IsTesting()) Kommentar("); }

//+----------------------------------------------------------------------------+
//| Expertenstartfunktion |
//+----------------------------------------------------------------------------+
void start() {
if (!IsTesting()) {
if (AnzahlKonto>0 && AnzahlKonto!=KontoNummer()) {
Meldung("Der Handel mit diesem Konto ist VERBOTEN" +Kontonummer());
Rückkehr;
} else Comment(");
}

CloseByProfit();
if (ShowComment) {
Kommentar(IIFs(CurSymbolOnly, "CurSymbolOnly ","),
"Aktueller Gewinn=",CurProfit," p."
"Close Profit=",TakeProfit," p."
);
}
}


//+----------------------------------------------------------------------------+
//| Autor: Kim Igor V. alias KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Version : 19.02.2008 |
//| Beschreibung : Schließen einer vorgewählten Position |
//+----------------------------------------------------------------------------+
void ClosePosBySelect() {
bool fc;
clClose;
Doppel-L, pa, pb, pp;
int err, it;

if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
for (it=1; it<=NumberOfTry; it++) {
if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;
while (!IsTradeAllowed()) Schlaf(5000);
RefreshRates();
pa=MarketInfo(OrderSymbol(), MODE_ASK);
pb=MarketInfo(OrderSymbol(), MODE_BID);
if (Auftragsart()==OP_BUY) {
pp=pb; clClose=closeBuy;
} sonst {
pp=pa; clClose=closeSell;
}
ll=OrderLots();
fc=OrderClose(OrderTicket(), ll, pp, Slippage, clClose);
wenn (fc) {
if (UseSound) PlaySound(NameFileSound); break;
} sonst {
err=GetLastError();
if (err==146) while (IsTradeContextBusy()) Schlaf(1000*11);
Print("Fehler(",err,") Schließen ",GetNameOP(OrderType())," ",
ErrorDescription(err),", try ",it);
Print(OrderTicket()," Ask=",pa," Bid=",pb," pp=",pp);
Print("sy=",OrderSymbol()," ll=",ll," sl=",OrderStopLoss(),
" tp=",OrderTakeProfit()," mn=",OrderMagicNumber());
Schlaf(1000*5);
}
}
} else Print("Ungültige Handelsoperation. Schließen ",GetNameOP(OrderType()));
}

//+----------------------------------------------------------------------------+
//| Autor: Kim Igor V. alias KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Version : 19.02.2008 |
//| Beschreibung : Positionen zum Marktpreis schließen, die zuerst profitabel sind |
//+----------------------------------------------------------------------------+
Parameter: //|
//| sy - Name des Instruments (" - beliebiges Symbol, |
//| NULL - aktuelles Symbol) |
| //| op - Operation (-1 - beliebige Position) |
//| mn - MagicNumber (-1 - beliebige Magie) |
//+----------------------------------------------------------------------------+
void ClosePosFirstProfit(string sy="", int op=-1, int mn=-1) {
int i, k=AufträgeGesamt();
if (sy=="0") sy=Symbol();

// Erste gewinnbringende Positionen schließen
for (i=k-1; i>=0; i--) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
wenn ((OrderSymbol()==sy || sy==") && (op<0 || OrderType()==op)) {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (mn<0 || OrderMagicNumber()==mn) {
wenn (OrderProfit()+OrderSwap()>0) ClosePosBySelect();
}
}
}
}
}
// dann der ganze Rest
k=AufträgeGesamt();
for (i=k-1; i>=0; i--) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
wenn ((OrderSymbol()==sy || sy==") && (op<0 || OrderType()==op)) {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (mn<0 || OrderMagicNumber()==mn) ClosePosBySelect();
}
}
}
}
}

//+----------------------------------------------------------------------------+
//| Alle Positionen mit Gewinn schließen.
//+----------------------------------------------------------------------------+
void CloseByProfit() {
Doppel-PA, pb, pp;
int i, k=OrdersTotal(), pr=0;

for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (!CurSymbolOnly || OrderSymbol()==Symbol()) {
pa=MarketInfo(OrderSymbol(), MODE_ASK);
pb=MarketInfo(OrderSymbol(), MODE_BID);
pp=MarketInfo(OrderSymbol(), MODE_POINT);
if (pp==0) if (StringFind(OrderSymbol(), "JPY")<0) pp=0,0001; sonst pp=0,01;
if (Auftragsart()==OP_BUY) {
pr+=NormalizeDouble((pb-OrderOpenPrice())/pp, 0);
}
if (OrderType()==OP_SELL) {
pr+=NormalizeDouble((OrderOpenPrice()-pa)/pp, 0);
}
}
}
}
CurProfit=pr;
wenn (CurProfit>=TakeProfit) ClosePosFirstProfit();
if (CloseTerminal && !ExistPositions()) CloseTerminal();
}
//+----------------------------------------------------------------------------+
//| Schließen Sie das Handelsterminal.
//+----------------------------------------------------------------------------+
void CloseTerminal() {
Print("CloseTerminal() hat ausgelöst;)
int hwnd=WindowHandle(Symbol(), Period());
int hwnd_parent=0;

while(!IsStopped()) {
hwnd=GetParent(hwnd);
if (hwnd==0) break;
hwnd_parent=hwnd;
}
if (hwnd_parent!=0) PostMessageA(hwnd_parent, WM_CLOSE, 0, 0);
}

//+----------------------------------------------------------------------------+
//| Gibt das Flag der Existenz zurück |
Parameter: //|
//| sy - Name des Instruments (" - beliebiges Symbol, |
//| NULL - aktuelles Symbol) |
| //| op - Operation (-1 - beliebige Position) |
//| mn - MagicNumber (-1 - beliebige Magie) |
//+----------------------------------------------------------------------------+
bool ExistPositions(string sy="", int op=-1, int mn=-1) {
int i, k=AuftragSumme();

if (StringLen(sy)==1 && StringGetChar(sy, 0)==48) sy=Symbol();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
wenn (OrderSymbol()==sy || sy==") {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (op<0 || OrderType()==op) {
if (mn<0 || OrderMagicNumber()==mn) return(True);
}
}
}
}
}
return(False);
}
//+----------------------------------------------------------------------------+
//| Autor: Kim Igor V. alias KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Version : 01.09.2005 |
//| Beschreibung : Gibt den Namen der Handelsoperation zurück |
//+----------------------------------------------------------------------------+
|| Parameter: ||
//| op - Kennung der Handelsoperation |
//+----------------------------------------------------------------------------+
string GetNameOP(int op) {
switch (op) {
case OP_BUY : return("Kaufen");
case OP_SELL : return("Verkaufen");
case OP_BUYLIMIT : return("BuyLimit");
case OP_SELLLIMIT : return("SellLimit");
case OP_BUYSTOP : return("BuyStop");
case OP_SELLSTOP : return("SellStop");
default : return("Unbekannte Operation");
}
}

//+----------------------------------------------------------------------------+
//| Autor: Kim Igor V. alias KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Version : 01.02.2008 |
//| Beschreibung: Gibt einen von zwei Werten zurück, abhängig von der Bedingung.
//+----------------------------------------------------------------------------+
string IIFs(bool Bedingung, string ifTrue, string ifFalse) {
if (Bedingung) return(ifTrue); else return(ifFalse);
}

//+----------------------------------------------------------------------------+
//| Anzeige einer Meldung im Kommentar und im Logbuch |
//+----------------------------------------------------------------------------+
void Message(string m) {
Kommentar(m);
if (StringLen(m)>0) Print(m);
}
//+----------------------------------------------------------------------------+

 
Vkorch писал (а) >>
Hallo Igor, ich brauche deine Hilfe. Ich habe beschlossen, die Terminal-Close-Funktion in e-CloseByProfit EA ähnlich wie e-CloseByPercentProfit zu schreiben.

Alles funktioniert gut, der EA funktioniert, das Terminal wird geschlossen. Aber wenn ich das Terminal wieder öffne, wird es vom Expert Advisor sofort geschlossen.
Helfen Sie mit, den Code so zu ändern, dass dieser Mangel beseitigt wird.

Machen Sie es so:

CurProfit=pr;
if (CurProfit>=TakeProfit) {
  ClosePosFirstProfit();
  if (CloseTerminal && !ExistPositions()) CloseTerminal();
}
 
KimIV писал(а) >>

Machen Sie es so:

Vielen Dank, Igor. Es wurde korrigiert. Aber wenn ich kompiliere, habe ich einen Fehler

'(' - Funktionsdefinition unerwartet C:\Programmdateien\MetaTrader - Alpari\experts\e-CloseByProfit.mq4 (180, 19)

Was sollte ich tun?

 

Igor, könnten Sie bitte eine Bibliothek mit Funktionen für die Arbeit mit Aufträgen und Positionen erstellen? Die Bibliothek wurde entwickelt und getestet für mehr als 2 Jahren, ich habe die Dateien beigefügt, vielleicht einige Ideen kommen in praktisch.

In Bezug auf

OpenPosition("GBPJPY", OP_SELL, 0.1, pb+23*po, pb-44*po);

Vielleicht wäre es besser, OpenPosition("GBPJPY", OP_SELL, 0.1, 23, 44) aufzurufen;

а

double pa=MarketInfo("USDCAD", MODE_ASK);
double pb=MarketInfo("USDCAD", MODE_BID);
double po=MarketInfo(
"USDCAD", MODE_POINT);
und diese einfügen 
  
 
double lot_min =MarketInfo(Symbol(),MODE_MINLOT)
; 
if(Lots<lot_min) return;

innerhalb der Funktion berechnen, d.h. den sl-Wert an und tp übergeben, und alles innerhalb der Funktion korrekt berechnen und normalisieren.


	          
Dateien:
 

Hallo Igor!

Wenn ich eine 0,3-Lot-Position offen habe, muss ich das tun:

1. einen Teil einer Position von 0,1 Lots schließen.

Ändern (Stopp-Loss auf ein anderes Niveau verschieben)

2.1 Schließen Sie einen Teil der Position 0,1 Lot.

Ändern (Stopp-Loss auf ein anderes Niveau setzen).

3. die Position schließen.

Noch eine Frage? Wenn die Teilposition geschlossen ist.

OrderClose(OrderTicket(),NormalizeDouble(OrderLots()/3,2),Ask,3,Violet);

Ich erhalte den Fehler 131 (falsche Lautstärke). Wie kann ich ihn korrigieren?

Antwort bitte für einen Neuling. kann in Worten sein.

.

 
Prival писал (а) >>
Igor, könntest du bitte die Funktionen , die mit Aufträgen und Positionen arbeiten, in eine Bibliothek einbinden?

Nein, das ist es nicht... Im Prinzip ist es schon so eingerichtet, wie es sein sollte... Ich poste sie nicht, weil noch nicht alle Funktionen dieser Bibliothek veröffentlicht wurden... Es gibt noch ein paar oder drei, die seit Beginn dieses Threads erschienen sind.

Und den Rest werde ich überdenken...