Nützliche Funktionen von KimIV - Seite 13

 
olyakish:

Igor, ich habe dir eine Frage in der 'Bibliothek von Funktionen zur Arbeit mit INI-Dateien' gestellt, aber es kam keine Antwort :(


Danke... antwortete...

 

Die Funktion ClosePosBySelect().

Schließt eine vorausgewählte Position. Diese Funktion ist eher eine Hilfsfunktion, da sie von mehreren anderen Funktionen aufgerufen wird, die dabei helfen, die zu schließenden Positionen nach bestimmten Bedingungen auszuwählen.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия  : 19.02.2008                                                      |
//|  Описание: Закрытие одной предварительно выбранной позиции                 |
//+----------------------------------------------------------------------------+
void ClosePosBySelect() {
  bool   fc;
  color  clClose;
  double ll, 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()) Sleep(5000);
      RefreshRates();
      pa=MarketInfo(OrderSymbol(), MODE_ASK);
      pb=MarketInfo(OrderSymbol(), MODE_BID);
      if (OrderType()==OP_BUY) {
        pp=pb; clClose=clCloseBuy;
      } else {
        pp=pa; clClose=clCloseSell;
      }
      ll=OrderLots();
      fc=OrderClose(OrderTicket(), ll, pp, Slippage, clClose);
      if (fc) {
        if (UseSound) PlaySound(NameFileSound); break;
      } else {
        err=GetLastError();
        if (err==146) while (IsTradeContextBusy()) Sleep(1000*11);
        Print("Error(",err,") Close ",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());
        Sleep(1000*5);
      }
    }
  } else Print("Некорректная торговая операция. Close ",GetNameOP(OrderType()));
}
 
KimIV:

Ich danke Ihnen... beantwortet...

Auch hier eine weitere Frage (oder eher Aussage) :)

 
KimIV:

Die Funktion ClosePosBySelect().

Schließt eine vorausgewählte Position. Diese Funktion ist eher eine Hilfsfunktion, da sie von mehreren anderen Funktionen aufgerufen wird, die bei der Auswahl der zu schließenden Positionen nach bestimmten Bedingungen helfen.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия  : 19.02.2008                                                      |
//|  Описание: Закрытие одной предварительно выбранной позиции                 |
//+----------------------------------------------------------------------------+
void ClosePosBySelect() {
  bool   fc;
  color  clClose;
  double ll, 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()) Sleep(5000);
      RefreshRates();
      pa=MarketInfo(OrderSymbol(), MODE_ASK);
      pb=MarketInfo(OrderSymbol(), MODE_BID);
      if (OrderType()==OP_BUY) {
        pp=pb; clClose=clCloseBuy;
      } else {
        pp=pa; clClose=clCloseSell;
      }
      ll=OrderLots();
      fc=OrderClose(OrderTicket(), ll, pp, Slippage, clClose);
      if (fc) {
        if (UseSound) PlaySound(NameFileSound); break;
      } else {
        err=GetLastError();
        if (err==146) while (IsTradeContextBusy()) Sleep(1000*11);
        Print("Error(",err,") Close ",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());
        Sleep(1000*5);
      }
    }
  } else Print("Некорректная торговая операция. Close ",GetNameOP(OrderType()));
}

Hallo!

Entschuldigen Sie bitte!

1) Ich verstehe den Sinn der Zeile for (it=1; it<=NumberOfTry; it++) nicht.

Was für eine Art von Schleife ist das?

2) Ich verstehe auch die Bedingung if (!testing() ......) break nicht;

3) und schließlich, welche Funktion ist das? ErrorDescription(err)," ,

Wenn es Ihnen nichts ausmacht, erklären Sie es bitte.

 

1. Dies ist ein Zyklus von Handelsversuchen. Wenn der Handelsserver Fehler zurückgibt, unternimmt die Funktion NumberOfTry Versuche, die Position doch noch zu schließen. Ich stelle normalerweise NumberOfTry=5 ein.

2. diese Bedingung implementiert die Fähigkeit, den Zyklus der Versuche korrekt zu beenden, wenn der online arbeitende Expert Advisor gestoppt wird. Ohne diese Bedingung mussten wir, um z.B. Eigenschaften des EA aufzurufen, entweder warten, bis der EA alle Handelsversuche verbraucht hat, oder den EA aus dem Chart entfernen.

3. Suchen Sie in der Datei ..\experts\libraries\stdlib.mq4

 

Ich möchte fragen, wie man einen EA in einer Endlosschleife arbeiten lassen kann, während man Zugriff auf die Einstellungen seiner Parameter hat?

Ich habe den Anfang wie folgt geschrieben

while (true)
{
  // проверка на останов и прочее
      if (IsStopped()) 
        return(-1);
  while (isRefresh == false)
       isRefresh = RefreshRates();
      
  // некий код
  // задержка
  Sleep(G_Period);   
}

Aber in diesem Fall bleibt der Expert Advisor hängen und ich kann nichts mit ihm machen, außer ihn aus dem Diagramm zu entfernen

 

Valera, mach es so:


while (IsExpertEnabled() && !IsStopped())
{
  while (!RefreshRates()) Sleep(500);
      
  // некий код
  // задержка
  Sleep(G_Period);   
}
 

Die Funktion ClosePosBySizeProfitInCurrency().

Mit dieser Funktion werden nur die Positionen geschlossen, bei denen der Gewinn in der Einzahlungswährung einen bestimmten Wert übersteigt. Über die Funktionsparameter können Sie festlegen, welche Positionen geschlossen werden müssen:

  • sy - Name des Instruments. Wenn Sie diesen Parameter setzen, prüft die Funktion nur die Positionen des angegebenen Instruments. NULL bedeutet das aktuelle Instrument, während "" (standardmäßig) ein beliebiges Instrument bedeutet.
  • op - Handelsoperation, Positionsart. Gültige Werte: OP_BUY, OP_SELL oder -1. Der Standardwert -1 bedeutet eine beliebige Position.
  • mn - Kennung der Position (MagicNumber). Standardwert -1 - bedeutet eine beliebige MagicNumber.
  • pr - Gewinnhöhe in der Einzahlungswährung. Standardwert - 0.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Закрытие тех позиций, у которых профит в валюте депозита       |
//|             превысил некоторое значение                                    |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//|    pr - профит                                                             |
//+----------------------------------------------------------------------------+
void ClosePosBySizeProfitInCurrency(string sy="", int op=-1, int mn=-1, double pr=0) {
  int i, k=OrdersTotal();

  if (sy=="0") sy=Symbol();
  for (i=k-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (mn<0 || OrderMagicNumber()==mn) {
            if (OrderProfit()+OrderSwap()>pr) ClosePosBySelect();
          }
        }
      }
    }
  }
}
 
KimIV:

Valera, mach es so:


while (IsExpertEnabled() && !IsStopped())
{
  while (!RefreshRates()) Sleep(500);
      
  // некий код
  // задержка
  Sleep(G_Period);   
}

Leider wird dadurch auch der ekspert übertragen und gibt keinen Zugriff auf seine Parameter, bis Sie ihn aus dem Diagramm entfernen

 
scorpionk:

Leider überträgt dies auch den EA und gibt keinen Zugriff auf seine Parameter, bis Sie ihn aus dem Diagramm entfernen

Sie haben jedoch die Möglichkeit, den EA durch Drücken der Schaltfläche "EAs" in der Symbolleiste zu stoppen.