Nützliche Funktionen von KimIV - Seite 18

 
rid писал (а):
MA. Ich werde den Beitrag 24 Stunden lang aufbewahren - dann werde ich ihn löschen!

Sie brauchen es nicht zu löschen! Lass es bleiben...

 

Igor, zunächst einmal vielen Dank für Ihre Funktionen und für diesen Zweig, sie helfen vielen nicht-professionellen Programmierern. Aber ich möchte Ihnen eine Frage zur Funktion NumberOfOrders() stellen. Ich kann es nicht zum Laufen bringen. Ich habe es in einen Standard-MACD Expert Advisor eingebaut, um ein Beispiel für seine Verwendung zu geben. Ich füge den Code ein:

Um es kurz zu beschreiben: Es hat sich dort etwas verändert:

// в стандартной версии  
total=OrdersTotal();
   if(total<1) 
     {
// бла бла бла ...
// в моей версии эксперта
   total=OrdersTotal(); // total я оставил т.к. он используется дальше
   if(NumberOfOrders(NULL,-1,-1)<1) 
     {
// бла бла бла ... ну и плюс сама функция NumberOfOrders() ниже
Natürlich klappt das nicht. Könnten Sie bitte erklären, was los ist? Vielen Dank im Voraus.
Dateien:
 
seifer писал (а):
Könnten Sie erklären, was los ist? Vielen Dank im Voraus.

Zwei Bemerkungen:

1. Ich würde es folgendermaßen machen:

total=NumberOfOrders(NULL);
if (total<1) {
  ...
}
2. Die Funktion NumberOfOrders() gibt die Anzahl der Orders zurück - Trades der Typen BuyLimit, BuyStop, SellLimit und SellStop. Der von Ihnen geänderte Expert Advisor arbeitet nicht mit Aufträgen. Er eröffnet Positionen zu Marktpreisen, d. h. er führt Kauf- und Verkaufsgeschäfte durch. Sie müssen die Funktion NumberOfPositions() verwenden, die ich im nächsten Beitrag vorstellen werde.
 

Die Funktion NumberOfPositions().

Diese Funktion gibt die Anzahl der derzeit offenen Stellen zurück. Eine genauere Auswahl der Zählpositionen 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   - любой магик)                    |
//+----------------------------------------------------------------------------+
int NumberOfPositions(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal(), kp=0;

  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) kp++;
          }
        }
      }
    }
  }
  return(kp);
}
Im Anhang finden Sie ein Skript zum Testen der Funktion NumberOfPositions().
Dateien:
 

Wow! Ich dachte, es sei ein Entwurf:

      ...
      ot=OrderType();
      if (ot>1 && ot<6) {
      ...
würde alle Positionen durchlaufen (einschließlich OP_SELL und OP_BUY). Jetzt funktioniert alles. Nochmals vielen Dank!
 

GetProfitFromDateInCurrency() Funktion.

Diese Funktion gibt den Gesamtgewinn in der Währung der seit einem bestimmten Datum geschlossenen Positionen zurück. Eine genauere Auswahl der zu berücksichtigenden Positionen wird über externe Parameter festgelegt:

  • sy - Bezeichnung des Marktinstruments. Wenn Sie diesen Parameter angeben, berücksichtigt die Funktion nur Positionen dieses 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.
  • dt - Datum und Zeit in Sekunden seit 1970. Standardwert - 0 bedeutet, dass alle in der Vergangenheit verfügbaren Positionen berücksichtigt werden.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает суммарный профит в валюте депозита                  |
//|             закрытых с определённой даты позиций                           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента             (""   - любой символ,         |
//|                                               NULL - текущий символ)       |
//|    op - операция                             (-1   - любая позиция)        |
//|    mn - MagicNumber                          (-1   - любой магик)          |
//|    dt - Дата и время в секундах с 1970 года  ( 0   - с начала истории)     |
//+----------------------------------------------------------------------------+
double GetProfitFromDateInCurrency(string sy="", int op=-1, int mn=-1, datetime dt=0)
{
  double p=0;
  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=="") && (op<0 || OrderType()==op)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (mn<0 || OrderMagicNumber()==mn) {
            if (dt<OrderCloseTime()) {
              p+=OrderProfit()+OrderCommission()+OrderSwap();
            }
          }
        }
      }
    }
  }
  return(p);
}

HH: Im Anhang finden Sie ein Skript zum Testen der Funktion GetProfitFromDateInCurrency().

Der i-Profit-Indikator, der die absoluten und prozentualen Gewinnwerte für verschiedene Zeiträume anzeigt, ist ein praktischeres Beispiel dafür, wie man die Verwendung dieser Funktion erlernen kann.

 

Hallo Igor.

Ich möchte mich für die Korrelation bedanken. Ich hatte einige Optionen, ich wollte sie nur klären)

Ich habe auch eine solche Frage. Ich stoße sehr oft auf den Fehler 130 - Falscher Stopp beim Testen von Expert Advisor im Echtzeitmodus. Ich analysiere sie nicht, ich verstehe nicht, warum sie in der einen oder anderen Situation auftritt. Ich habe begonnen, diese Konstruktion zu verwenden

   double md = MarketInfo(Symbol(), MODE_TICKSIZE);
   return(NormalizeDouble(Value/md, 0) * md);

Ich habe begonnen, dieses Konstrukt zu verwenden, um Stop und TP zu normalisieren, aber es hat die Situation nicht gelöst. Vielleicht haben Sie ähnliche Situationen erlebt? Sagen Sie mir, wie man damit umgeht und wie man sie am besten analysiert.

Zur Klarstellung: Dies geschieht sehr oft, wenn ich versuche, einen Stopp bei +1 p vom Eröffnungskurs zu setzen

 
scorpionk писал (а):
auf Fehler 131 - Falscher Anschlag stoßen.

131 - Falsches Volumen, Fehler bei der Volumengranulierung. Dies ist die Größe der gehandelten Partie.

 
KimIV:
scorpionk schrieb (a):
Ich stoße auf Fehler 131 - Falsche Haltestelle.

131 - Falsches Volumen, ein Fehler in der Volumengranulierung. Dies ist die Größe der gehandelten Partie.

Falscher Code, nicht 131 sondern 130

 
scorpionk:

Falscher Code, es ist nicht 131, es ist 130.

Ich verstehe...

Versuchen Sie, wie folgt zu normalisieren:

int dg=MarketInfo(Symbol(), MODE_DIGITS);
return(NormalizeDouble(Value, dg));
Ich tue dies und stoße nicht auf die Fehlermeldung 130.