Nützliche Funktionen von KimIV - Seite 62

 

Danke für die Antwort, Igor, ich habe es herausgefunden. Ich verwende Ihre Funktionen auch separat, aber ich wollte die Vorteile der Bibliothek in der Phase der EA-Entwicklung nutzen.

Ich habe mir angesehen, wie die trade_lib&info_lib-Bibliothek von komposter aufgebaut ist, und habe einige Änderungen für meinen eigenen Gebrauch vorgenommen.

1. Ich habe in allen Bibliotheken #property library und #include library Querverweise entfernt und die Bibliotheken umbenannt, um Verwechslungen zu vermeiden.

2. Ich habe einen Block mit direkten Aufrufen aller Bibliotheken erstellt.

#include <b-Positions#.mqh>        // Библиотека функций для работы с позициями 
#include <b-KimIV#.mqh>            // Библиотека дополнительных функций
#include <b-Orders#.mqh>           // Библиотека функций для работы с ордерами
#include <stdlib.mqh>              // Стандартная библиотека
#include <WinUser32.mqh>           // Стандартная библиотека  

Jetzt sind alle Funktionen aller Bibliotheken verfügbar, es gibt keine Fehler und Strafmeldungen während der Kompilierung, außer dem normalen "wird nicht referenziert...".

Alle externen EAs sind verfügbar, keine Probleme.

Schreiben Sie mehr, wir werden Sie verbinden und nutzen. Zunächst einmal würde ich gerne die Trailing-Funktion nach Gesamtgewinn sehen.

 

Die Funktion WeekOfMonth().

Diese Funktion gibt die Woche des Monats nach Datum zurück. Akzeptiert nur einen optionalen Parameter:

  • dt - Datum, Uhrzeit. Standardwert - 0 - aktuelles Datum und Uhrzeit des Handelsservers.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 12.08.2008                                                     |
//|  Описание : Возвращает номер недели месяца по дате                         |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    dt - дата, время           (0 - сейчас по времени торгового сервера)    |
//+----------------------------------------------------------------------------+
int WeekOfMonth(datetime dt=0) {
  if ( dt<=0) dt=TimeCurrent();
  datetime d;
  int      i, kd=TimeDay( dt), nn=1;

  for ( i=2; i<= kd; i++) {
    d=StrToTime(TimeYear( dt)+"."+TimeMonth( dt)+"."+ i);
    if (TimeDayOfWeek( d)==1) nn++;
  }
  return( nn);
}

SZY: Im Anhang finden Sie ein Skript zum Testen der Funktion WeekOfMonth().

Dateien:
 
Igor, gibt es nicht eine Funktion, mit der alle Positionen geschlossen werden können, beginnend mit denen mit einem größeren Los?
 

Hallo, Igor! Vielen Dank für deine nützlichen Funktionen! Ich benutze sie so oft ich kann! Ich bin selbst erst seit kurzem dabei, daher eine Frage an dich... Ich benutze sie schon seit langem, also benutze ich sie schon lange. Ich verwende Ihre Funktion OpenPosition, vielleicht reagiert sie auf einen Fehler oder so? Hier ist das Log von gestern, davor war alles in Ordnung! Ich kann den Fehler 220........ nirgends finden.

07:47:28 MetaTrader 4.00 build 220 gestartet (MetaQuotes Software Corp.)
07:47:28 Expert open prob USDJPY EURUSD,M1: loaded successfully
07:47:32 '1262868': login
07:47:44 '1262868': login
07:49:40 '1262868': login
07:49:46 '1262868': login
07:54:44 '1262868': connect failed [No connection]
11:38:16 Expert open prob USDJPY EURUSD,M1: removed
11:38:18 MetaTrader 4.00 build 220 stopped
14:05:05 MetaTrader 4.00 build 220 started (MetaQuotes Software Corp.)
14:05:05 Expert open prob USDJPY EURUSD,M1: loaded successfully
14:05:10 '1262868': login
14:05:31 '1262868': login
14:06:39 '1262868': login
14:06:46 '1262868': login
15:57:06 '1262868': connect failed [No connection]
18:30:46 Expert open prob USDJPY EURUSD,M5: entfernt
18:30:49 Main pumping: timeout on stop
18:30:52 Main pumping: timeout on stop
18:30:55 Main pumping: timeout on stop
18:30:58 Main pumping: timeout on stop
18:31:01 Main pumping: timeout on stop
18:31:01 Main pumping: terminated
18:31:02 MetaTrader 4.00 build 220 stopped
18:31:02 MetaTrader 4.00 build 220 stopped because system shutdown
18:47:57 MetaTrader 4.00 build 220 started (MetaQuotes Software Corp.)
18:47:58 Expert open prob USDJPY EURUSD,M5: loaded successfully
18:48:01 '1262868': connect failed [No connection]
18:48:10 '1262868': login
18:48:20 '1262868': login
20:19:00 '1262868': login
20:19:07 '1262868': login
20:20:05 '1262868': login
20:20:13 '1262868': login
20:59:29 '1262868': login
20:59:39 '1262868': login
21:02:16 '1262868': login
21:02:41 '1262868': DataCenter connection failed [6]
22:08:40 '1262868': ping failed
22:08:43 '1262868': login
22:08:49 '1262868': DataCenter connecting failed [6]
22:1001 '1262868': login
22:10:05 '1262868': DataCenter connection failed [6]
22:14:59 '1262868': login
22:15:13 '1262868': login
22:15:22 '1262868': DataCenter connecting failed [6]
22:37:16 '1262868': login
22:37:27 '1262868': DataCenter connecting failed [6]
22:4051 '1262868': login
22:41:04 '1262868': DataCenter connecting failed [6]
23:17:14 Expert open prob USDJPY EURUSD,M5: removed
23:17:16 Expert open prob USDJPY EURUSD,M5: loaded successfully
23:25:52 Expert open prob USDJPY EURUSD,M5: removed
23:25:55 MetaTrader 4.00 build 220 stopped
23:25:59 MetaTrader 4.00 build 220 started (MetaQuotes Software Corp.)
23:26:05 '1262868': login
23:26:05 Experte offen prob USDJPY EURUSD,M5: erfolgreich geladen
23:26:15 '1262868': login
23:27:19 '1262868': login
23:27:34 '1262868': login
23:28:20 Experte offen prob USDJPY EURUSD,M5: entfernt
23:28:25 Experte offen prob USDJPY USDCHF,H4: erfolgreich geladen
23:28:33 Experte offen prob USDJPY USDCHF,H4: entfernt

Vielen Dank im Voraus!

 
khorosh писал(а) >>
Igor, gibt es keine Funktion, die alle Positionen schließt, beginnend mit denen, die ein größeres Los haben?

war nicht... schrieb...

Die Funktion ClosePosBySortLots().

Diese Funktion schließt die Positionen in der Reihenfolge der Sortierung nach Losgröße. Das heißt, mit dieser Funktion können Sie Positionen in auf- oder absteigender Reihenfolge der Losgrößen schließen. Die Funktion ClosePosBySortLots() akzeptiert die folgenden optionalen Parameter:

  • sy - Name des Handelsinstruments. "" - beliebiges Instrument, NULL - aktuelles Instrument. Der Standardwert ist "".
  • op - Art der Handelsoperation. Gültige Werte -1 - beliebige Position, OP_BUY - kaufen, OP_SELL - verkaufen. Der Standardwert ist -1.
  • mn - MagicNumber, eindeutiger Bezeichner des Handelsvorgangs. Standardwert -1 - eine beliebige magische Zahl.
  • sd - Sortierrichtung der Losgröße. Gültige Werte MODE_ASCEND - aufsteigend, MODE_DESCEND - absteigend. Der Standardwert ist MODE_DESCEND.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 11.12.2008                                                     |
//|  Описание : Закрытие позиций в порядке сортировки по размерам лотов.       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента        (    ""       - любой символ,      |
//|                                             NULL      - текущий символ)    |
//|    op - операция                        (    -1       - любая позиция)     |
//|    mn - MagicNumber                     (    -1       - любой магик)       |
//|    sd - Направление сортировки лотов    (MODE_ASCEND  - возрастание,       |
//|                                          MODE_DESCEND - убывание)          |
//+----------------------------------------------------------------------------+
void ClosePosBySortLots(string sy="", int op=-1, int mn=-1, int sd= MODE_DESCEND) {
  double a[][2];                  // Массив лотов и тикетов
  int    i, k=OrdersTotal();      // Счётчик и количество ордеров
  int    p=0;                     // Количество позиций

  if ( sy=="0") sy=Symbol();
  for ( i=0; i< k; 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) {
            p++;
            ArrayResize( a, p);
            a[ p-1][0]=OrderLots();
            a[ p-1][1]=OrderTicket();
          }
        }
      }
    }
  }

  // вдруг позиций нету, тогда и закрывать нечего
  if ( p>0) {
    ArraySort( a, WHOLE_ARRAY, 0, sd);
    for ( i=0; i< p; i++) {
      if (OrderSelect( a[ i][1], SELECT_BY_TICKET)) {
        // проверим незакрытость на всякий случай,
        // может какая-то позиция уже закрылась по стопу/тейку
        if (OrderCloseTime()==0) ClosePosBySelect();
      }
    }
  }
}

SZY: Im Anhang finden Sie ein Skript zum Testen der Funktion ClosePosBySortLots().

 

Die Funktion AddLeadingZero().

Diese Funktion fügt so viele führende (linke) Nullen "0" an die Zeichenkette an, dass die Länge der Zeichenkette einem bestimmten Wert entspricht. Die Funktion AddLeadingZero() benötigt die folgenden obligatorischen Parameter:

  • s - Die Zeichenkette, zu der die führenden Nullen hinzugefügt werden sollen.
  • k - Die Länge der resultierenden Zeichenfolge S.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.09.2005                                                     |
//|  Описание : Добавляет к строке S столько лидирующих нулей "0",             |
//|           : чтобы длина строки S стала равна K.                            |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    s - строка                                                              |
//|    k - длина строки S                                                      |
//+----------------------------------------------------------------------------+
string AddLeadingZero(string s, int k) {
  while(StringLen( s)< k) s=StringConcatenate("0", s);
  return( s);
}

SZU: Im Anhang finden Sie ein Skript zum Testen der Funktion AddLeadingZero().

Dateien:
 

Die Funktion toTime().

Diese Funktion wandelt zwei/drei Ganzzahlen in eine Zeichenkette im Zeitformat um. Wenn zwei Zahlen in die Funktion eingegeben werden, wird die erste als Stunden und die zweite als Minuten verwendet. Der zurückgegebene Formatstring ist "HH:MM". Bei drei Zahlen wird die dritte durch die Sekunden ersetzt und die Funktion gibt die Zeichenfolge "HH:MM:SS" zurück. Die Funktion toTime() akzeptiert die folgenden optionalen Parameter:

  • h - Uhr. Der Standardwert ist 0.
  • m - Protokoll. Der Standardwert ist 0.
  • s - Sekunden. 0 - Nicht verwenden. Standardwert 0.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.09.2005                                                     |
//|  Описание : Преобразует два/три целых числа в строку в формате времени     |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    h - часы                                                                |
//|    m - минуты                                                              |
//|    s - секунды           (0 - не использовать)                             |
//+----------------------------------------------------------------------------+
string toTime(int h=0, int m=0, int s=0) {
  string st="";

  if ( h==0) st="00:";
  else      st=StringConcatenate( AddLeadingZero( h, 2), ":");

  if ( m==0) st=StringConcatenate( st, "00");
  else      st=StringConcatenate( st, AddLeadingZero( m, 2));

  if ( s!=0) st=StringConcatenate( st, ":", AddLeadingZero( s, 2));

  return( st);
}

ZS: Im Anhang finden Sie ein Skript zum Testen der Funktion toTime().

Dateien:
 

Igor, könnten Sie eine Funktion vorschlagen, die ein entsprechendes Signal ausgibt, wenn der Preis mit einer der Variablen übereinstimmt, z. B. b=1,2400, s=1,2300;

Wenn b=Preis sig=1, wenn s=Preis sig=-1.

Ich entschuldige mich für die Schlampigkeit).

 
Prival >> :
Tut mir leid, ich bin nicht Igor. Aber vielleicht hilft das ja.

Ich entschuldige mich auch. >> es ist genauer.

//+------------------------------------------------------------------+
//| Функция                                                          |
//+------------------------------------------------------------------+
int Sign(double b, double s)
   {
   double var, e; var=Close[0]; e=0.000001;
   if( var< b+ e && var> b- e) return( 1);
   if( var< s+ e && var> s- e) return(-1); 
   return(0);
   }
 
Prival >> :

...ich werde meine Beiträge bis heute Abend löschen, um den Thread nicht zu überladen...

Das ist nicht nötig. Es wird nützlich sein, einen Blick darauf zu werfen, denn es wird Sie auf die Idee bringen, dass der genaue Preiswert nicht durchgängig erfasst wird.