Nützliche Funktionen von KimIV - Seite 21

 

Die Funktion isCloseLastPosByStop().

Diese Funktion gibt ein Flag zurück, mit dem die letzte Position durch Stopp geschlossen wird. Flagge ist oben - Wahr - StopLoss hat ausgelöst. Flagge gesenkt - Falsch - die Position wurde aus einem anderen Grund geschlossen. Eine genauere Auswahl der zu berücksichtigenden Positionen wird über externe Parameter eingestellt:

  • sy - Bezeichnung des Marktinstruments. Wenn Sie diesen Parameter setzen, berücksichtigt die Funktion nur Positionen des angegebenen Instruments. Der Standardwert "" bedeutet ein beliebiges Marktinstrument. NULL bedeutet das aktuelle Instrument.
  • op - Handelsoperation, Positionsart. Gültige Werte: OP_BUY, OP_SELL oder -1. Der Standardwert -1 bedeutet eine beliebige Position.
  • mn - Positionsbezeichner, MagicNumber. Der Standardwert -1 bedeutet einen beliebigen Bezeichner.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.05.2008                                                     |
//|  Описание : Возвращает флаг закрытия последней позиции по стопу.           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
bool isCloseLastPosByStop(string sy="", int op=-1, int mn=-1) {
  datetime t;
  double   ocp, osl;
  int      dg, i, j=-1, k=OrdersHistoryTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderCloseTime()) {
                t=OrderCloseTime();
                j=i;
              }
            }
          }
        }
      }
    }
  }
  if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
    dg=MarketInfo(sy, MODE_DIGITS);
    if (dg==0) if (StringFind(OrderSymbol(), "JPY")<0) dg=4; else dg=2;
    ocp=NormalizeDouble(OrderClosePrice(), dg);
    osl=NormalizeDouble(OrderStopLoss(), dg);
    if (ocp==osl) return(True);
  }
  return(False);
}
P.S. Im Anhang finden Sie ein Skript zum Testen der Funktion isCloseLastPosByStop().
 
Lukyanov:
KimIV:

OpenPosition() Funktion für online.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 21.03.2008                                                     |
//|  Описание : Открывает позицию и возвращает её тикет.                       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (NULL или "" - текущий символ)          |
//|    op - операция                                                           |
//|    ll - лот                                                                |
//|    sl - уровень стоп                                                       |
//|    tp - уровень тейк                                                       |
//|    mn - MagicNumber                                                        |
//+----------------------------------------------------------------------------+
int OpenPosition(string sy, int op, double ll, double sl=0, double tp=0, int mn=0) {
//-- skip --
  string   lsComm=WindowExpertName()+" "+GetNameTF(Period());
//-- skip -- 
Plugged OpenPosition() Funktion in EA auf realen, Fehler 4059, geändert NULL zu Symbol(), verschwunden, dann Nachricht erschien
2008.05.20 04:47:41 !OBLD_EUR_S EURUSD,M30: Experte angehalten
2008.05.20 04:47:41 !OBLD_EUR_S EURUSD,M30: Expertenfunktionsaufrufe sind nicht erlaubt; 'stdlib'-'ErrorDescription'
Zurück zur Grundeinstellung, alles funktioniert... (stdlib.mqh && stderror.mqh befinden sich im Include-Ordner der MT-Basislieferung)
 
teraptor2 писал (а):
Ich habe die OpenPosition()-Funktion in meinem Expert Advisor auf die reale, den Fehler 4059 verbunden

DerFehler 4059 bedeutet, dass die Funktion im Testmodus nicht verfügbar ist. Der Fehlerbezeichner lautet ERR_FUNCTION_NOT_ALLOWED_IN_TESTING_MODE. Die folgenden Funktionen erzeugen den Fehler: MarketInfo, MessageBox, SendFTP, SendMail, WindowIsVisible, WindowFind, WindowHandle.

teraptor2 schrieb (a):
änderte NULL in Symbol(), es verschwand, dann erschien eine Meldung
2008.05.20 04:47:41 !OBLD_EUR_S EURUSD,M30: Experte angehalten
2008.05.20 04:47:41 !OBLD_EUR_S EURUSD,M30: Expertenfunktionsaufrufe sind nicht erlaubt; 'stdlib'-'ErrorDescription'
 

Die Funktion isCloseLastPosByTake().

Diese Funktion gibt ein Flag zurück, um die letzte Position bei Take Profit zu schließen. Flagge ist oben - Wahr - TakeProfit wurde ausgelöst. Flagge gesenkt - Falsch - Position wurde aus einem anderen Grund geschlossen. Eine genauere Auswahl der zu berücksichtigenden Positionen wird durch externe Parameter festgelegt:

  • sy - Bezeichnung des Marktinstruments. Wenn Sie diesen Parameter setzen, berücksichtigt die Funktion nur Positionen des angegebenen Instruments. Der Standardwert "" bedeutet ein beliebiges Marktinstrument. NULL bedeutet das aktuelle Instrument.
  • op - Handelsoperation, Positionsart. Gültige Werte: OP_BUY, OP_SELL oder -1. Der Standardwert -1 bedeutet eine beliebige Position.
  • mn - Positionsbezeichner, MagicNumber. Der Standardwert -1 bedeutet einen beliebigen Bezeichner.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.05.2008                                                     |
//|  Описание : Возвращает флаг закрытия последней позиции по тейку.           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
bool isCloseLastPosByTake(string sy="", int op=-1, int mn=-1) {
  datetime t;
  double   ocp, otp;
  int      dg, i, j=-1, k=OrdersHistoryTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderCloseTime()) {
                t=OrderCloseTime();
                j=i;
              }
            }
          }
        }
      }
    }
  }
  if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
    dg=MarketInfo(sy, MODE_DIGITS);
    if (dg==0) if (StringFind(OrderSymbol(), "JPY")<0) dg=4; else dg=2;
    ocp=NormalizeDouble(OrderClosePrice(), dg);
    otp=NormalizeDouble(OrderTakeProfit(), dg);
    if (ocp==otp) return(True);
  }
  return(False);
}
HH: Im Anhang finden Sie ein Skript zum Testen der Funktion isCloseLastPosByTake().
 

Die Funktion isLossLastPos().

Diese Funktion gibt das Verlustkennzeichen der letzten geschlossenen Position zurück. Flagge oben - Wahr - letzte Position wurde mit Verlust geschlossen. Flags down - False - die letzte Position wurde entweder mit Null oder mit Gewinn geschlossen. Bei dieser Funktion werden Swaps und Provisionen nicht berücksichtigt. Die Auswahl der Positionen wird durch externe Parameter bestimmt:

  • sy - Bezeichnung des Marktinstruments. Wenn Sie diesen Parameter angeben, berücksichtigt die Funktion nur Positionen des angegebenen Instruments. Der Standardwert "" bedeutet ein beliebiges Marktinstrument. NULL bedeutet das aktuelle Instrument.
  • op - Handelsoperation, Positionsart. Gültige Werte: OP_BUY, OP_SELL oder -1. Der Standardwert -1 bedeutet eine beliebige Position.
  • mn - Positionsbezeichner, MagicNumber. Der Standardwert -1 bedeutet einen beliebigen Bezeichner.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает флаг убыточности последней позиции.                 |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
bool isLossLastPos(string sy="", int op=-1, int mn=-1) {
  datetime t;
  int      i, j=-1, k=OrdersHistoryTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderCloseTime()) {
                t=OrderCloseTime();
                j=i;
              }
            }
          }
        }
      }
    }
  }
  if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
    if (OrderProfit()<0) return(True);
  }
  return(False);
}
P.S. Im Anhang finden Sie ein Skript zum Testen der Funktion isLossLastPos().
Dateien:
 

Die Funktion isTradeToDay().

Diese Funktion gibt das Handelskennzeichen für den heutigen Tag zurück. Die Flagge ist oben - Stimmt - es gab heute offene Positionen. Flagge unten - Falsch - heute keine Positionen eröffnet. Die Auswahl der zu berücksichtigenden Positionen wird durch externe Parameter festgelegt:

  • sy - Bezeichnung des Marktinstruments. Wenn dieser Parameter gesetzt ist, berücksichtigt die Funktion nur Positionen des angegebenen Instruments. Der Standardwert "" bedeutet ein beliebiges Marktinstrument. NULL bedeutet das aktuelle Instrument.
  • op - Handelsoperation, Positionsart. Gültige Werte: OP_BUY, OP_SELL oder -1. Der Standardwert -1 bedeutet eine beliebige Position.
  • mn - Positionsbezeichner, MagicNumber. Der Standardwert -1 bedeutet einen beliebigen Bezeichner.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает флаг торгов сегодня.                                |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
bool isTradeToDay(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersHistoryTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (TimeDay  (OrderOpenTime())==Day()
              &&  TimeMonth(OrderOpenTime())==Month()
              &&  TimeYear (OrderOpenTime())==Year()) return(True);
            }
          }
        }
      }
    }
  }
  k=OrdersTotal();
  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 (TimeDay  (OrderOpenTime())==Day()
              &&  TimeMonth(OrderOpenTime())==Month()
              &&  TimeYear (OrderOpenTime())==Year()) return(True);
            }
          }
        }
      }
    }
  }
  return(False);
}
ZZY: Im Anhang finden Sie ein Skript zum Testen der Funktion isTradeToDay().
Dateien:
 
KimIV:

Die Funktion isCloseLastPosByStop().

Diese Funktion gibt ein Flag zurück, mit dem die letzte Position durch Stopp geschlossen wird. Flagge ist oben - Wahr - StopLoss hat ausgelöst. Flagge gesenkt - Falsch - die Position wurde aus einem anderen Grund geschlossen. Eine genauere Auswahl der zu berücksichtigenden Positionen wird über externe Parameter eingestellt:

().

Nachmittag . Bei der Implementierung des Codes mit dieser Funktion ist einige Verwirrung entstanden. Ich habe diese Funktion wie folgt angewendet:

if (isCloseLastPosByStop(NULL,OP_BUY, MagicLong1))               {
//если одна из открытых позиций BUY вдруг закрылась по стоплосу   
  for ( int rb_ = OrdersTotal() - 1; rb_ >= 0; rb_ -- )                {       
      if (OrderSelect(rb_, SELECT_BY_POS, MODE_TRADES))                 { 
      //выбираем среди открытых и отложенных ордеров          
      if( (OrderSymbol()==Symbol()) && (OrderMagicNumber()==MagicLong1))  {
         //закрываем все остальные позиции BUY
        OrderClose(OrderTicket(),OrderLots(),Bid,ОтклонениеЦены,Black );
       OrderDelete(OrderTicket());// и удаляем BUY-отложки   
        //  return(0); // выходим     
        }}}}

Bis zu diesem Punkt funktioniert alles einwandfrei! Alle BUY-Positionen werden geschlossen und BUY-Positionen werden gelöscht, wie ich es definiert habe! Aber dann setzt der Expert Advisor die schwebenden Aufträge entsprechend seinen Einstiegssignalen neu fest. Wie erwartet.

Aber diese Bestellungen werden sofort gelöscht! Anscheinend hängt die Flagge immer noch dort. Aber warum hängt es? Die letzten Positionen wurden nicht durch einen Stop Loss geschlossen, sondern mit Gewalt!

Wie sollte ich mit dieser Situation umgehen? Was kann ich tun, wenn mein Expert Advisor diesen Algorithmus schließt, nachdem der entsprechende Befehl ausgeführt wurde?

 
rid писал (а):
Was sollte ich in dieser Situation tun? Damit der EA nach dem Befehl, sie zu schließen, seine nächsten Aufträge normal platzieren kann?

Diese Frage muss im Zusammenhang mit der gesamten Aufgabe behandelt werden, denn es handelt sich nicht nur um eine einzelne Handlung, sondern um eine Interaktion, und zwar in einer bestimmten Reihenfolge. Beschreiben Sie daher die Aufgabe vollständig. Sie brauchen keinen Code. Beschreiben Sie einfach die Aufgabe in Worten.

Frage zum Aufwärmen. Warum müssen Sie Aufträge löschen und neu anlegen? Ich denke, es ist besser, sie zu ändern.

 

Meine Aufträge und Positionen sind nach Gewinnen, Verlusten, Stop- und Limit-Aufträgen und anderen Gründen in Arrays gruppiert.

In diesem speziellen Fall schließe ich die Reihe der KAUFEN-Positionen, die mit Stop-Orders eröffnet wurden und einen bestimmten Gewinn erzielt haben. Und ich lösche alle anderen Stoppaufträge, die nicht funktioniert haben.

//---------------------------------------------------------------------------------------------

 

Jetzt habe ich eine Kommentarfunktion eingerichtet - Comment (isCloseLastPosByStop());

Sieh an. Zu Beginn ist die Funktion =0. Nach dem ersten Schließen eines Stop-Loss-Kommentars (isCloseLastPosByStop()); ändert sich dieser auf eins, und dann - nach erzwungenem Schließen anderer Positionen, kehrt er nicht auf null zurück, sondern bleibt weiterhin eins!