Nützliche Funktionen von KimIV - Seite 110

 
Danke für die Klarstellung, ich werde jetzt weitermachen)))))
 

Funktion WritingLineInFile().

Ich habe diese Funktion neulich ein wenig umgeschrieben und den Parameter fs hinzugefügt, der dafür verantwortlich ist, dass die erste Zeile der Datei anders als die anderen Zeilen geschrieben werden kann, z.B. die Kopfzeile der Tabelle. Die erste Zeile wird nur dann in die Datei geschrieben, wenn zwei Bedingungen gleichzeitig erfüllt sind: Die Länge der Zeile ist größer als Null und die Dateigröße ist Null. Um die Kompatibilität mit der Vorgängerversion zu wahren, wurde der neue Parameter optional gemacht.

Parameter der Funktion WritingLineInFile():

  • fn - Dateiname
  • st - die in die Datei zu schreibende Zeichenkette
  • fs - erste Zeile (Tabellenkopf)

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 28.04.2012                                                     |
//+----------------------------------------------------------------------------+
//|  Описание : Запись строки в файл                                           |
//|  Параметры:                                                                |
//|    fn - имя файла                                                          |
//|    st - строка                                                             |
//|    fs - первая строка (шапка таблицы)                                      |
//+----------------------------------------------------------------------------+
void WritingLineInFile(string fn, string st, string fs="") {
  int fh=FileOpen(fn, FILE_READ|FILE_WRITE, " ");

  if (fh>0) {
    if (FileSize(fh)==0 && StringLen(fs)>0) FileWrite(fh, fs);
    FileSeek (fh, 0, SEEK_END);
    FileWrite(fh, st);
    FileClose(fh);
  }
}

ZZY: Im Anhang finden Sie ein Skript zum Testen der Funktion.

Dateien:
 
Guten Abend, Igor! Halt auf der Veranstaltung
DateBeginQuarter

Zunächst einmal versuche ich, den Text zu verstehen:

int ye=Year()-MathFloor(nq/4);
  nq=MathMod(nq, 4);

Standardmäßig ist nq = 0, so dass nicht klar ist, was der MathMod(nq/4)-Ausdruck ergibt, da das Ergebnis immer 0 ist. Auch die zweite Zeile ist nicht klar, da 0/4 keinen Rest hat, bitte klären.

 

Vielen Dank, Natasha, für Ihre Frage. Dank Ihnen habe ich die Funktion erneut überprüft und den Fehler gefunden. In der Zeile

int ye=Year()-MathFloor(nq/4);

Ich muss das Minuszeichen durch ein Pluszeichen ersetzen.

int ye=Year()+MathFloor(nq/4);

Und nun zum Inhalt Ihrer Frage. nq ist nicht immer gleich Null. Es können beliebige ganzzahlige Werte, auch negative, angegeben werden. Diese Zeilen funktionieren, wenn nq ein Vielfaches von 4 ist, d.h. wenn Sie 4 Quartale (Jahr) addieren oder subtrahieren müssen.

 
KimIV:

Vielen Dank, Natasha, für Ihre Frage. Dank Ihnen habe ich die Funktion erneut überprüft und den Fehler gefunden. In der Zeile

Ich muss das Minuszeichen durch ein Pluszeichen ersetzen.

Und nun zum Inhalt Ihrer Frage. nq ist nicht immer gleich Null. Es können beliebige ganzzahlige Werte, auch negative, angegeben werden. Die von Ihnen angegebenen Zeilen funktionieren in Fällen, in denen nq ein Vielfaches von 4 ist, d. h. wenn Sie 4 Quartale (Jahr) addieren oder subtrahieren müssen.

Danke für Ihre Antwort, Igor.... Ich habe länger als sonst gebraucht, um mich mit der Funktion zu befassen, aber ich habe es trotzdem herausgefunden))))))) in derselben Funktion scheint es mir, dass ich die Jahreszahl im Ausdruck nicht zu verringern brauche:

 if (mo<1) {
    mo+=12;
    ye--;

dann ist sie korrekt.

 
Lisi4ka330:

...in der gleichen Funktion, ich glaube nicht, dass man das Jahr im Ausdruck reduzieren muss...

Rechtfertigen, Natasha, warum nicht? Im Gegenteil, es erscheint mir logisch, das Jahr nach dem Schließen des Monatskreises in umgekehrter Richtung zu verkürzen. In Ihrem Ausdruck ist die Verkleinerung der Jahreszahl gleichbedeutend mit dem Zurückstellen des Stundenzeigers um eine Stunde, nachdem der Minutenzeiger einen vollen Kreis zurückgedreht wurde. Nennen Sie uns Ihre Version der Funktion, und wir werden sie diskutieren... Vielleicht wird Ihre Version erfolgreicher sein als meine.
 

GetDrawdownOpenPosInPoint() Funktion

Nun, ich habe die gründliche Prüfung dieser Funktion abgeschlossen. Ich habe die Streuung, wo nötig, berücksichtigt und versucht, sie zu optimieren... Die Funktion gibt den maximalen Drawdown der aktuell geöffneten Positionen in Pips zurück. Traditionell können Sie der Funktion Parameter übergeben und so Positionen herausfiltern, die Sie für die Analyse benötigen:

  • sy - Name des Instruments. Wenn dieser Parameter übergeben wird, prüft die Funktion nur die Positionen des angegebenen Instruments. NULL bedeutet das aktuelle Instrument, und "" (standardmäßig) bedeutet ein beliebiges Instrument.
  • op - Handelsoperation, Positionsart. Gültige Werte: OP_BUY, OP_SELL oder -1. Der Standardwert -1 bedeutet eine beliebige Position.
  • mn - Kennung der Position (MagicNumber). Der Standardwert von -1 bedeutet eine beliebige MagicNumber.
  • tf - Zeitrahmen des Charts, in dem die Werte der Hoch- und Tiefstwerte der Balken betrachtet werden sollen. Der Standardwert ist 0 - der aktuelle Zeitrahmen.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.05.2012                                                     |
//|  Описание : Возвращает максимальную просадку в пунктах текущих открытых    |
//|             позиций.                                                       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//|    tf - таймфрейм                  ( 0   - текущий таймфрейм)              |
//+----------------------------------------------------------------------------+
int GetDrawdownOpenPosInPoint(string sy="", int op=-1, int mn=-1, int tf=0) {
  if (sy=="0") sy=Symbol();
  if (tf==0) tf=Period();

  datetime to=TimeOpenFirstPos(sy, op, mn); // Время открытия первой позиции
  datetime tb=GetTimeOpenBar(sy, tf, to);
  int      dd, md=0;                        // Просадка
  double   po, sp;                          // Пункт, спрэд
  int      i, k=OrdersTotal();              // Номера позиций
  int      nb;                              // Номер бара

  if (tb>0) {
    while (tb<TimeCurrent()) {
      dd=0;
      for (i=0; i<k; i++) {
        if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
          if ((OrderSymbol()==sy || sy=="") && (mn<0 || OrderMagicNumber()==mn)) {
            if ((op<0 || OrderType()==op) && (OrderType()==OP_BUY || OrderType()==OP_SELL)) {
              if (tb>OrderOpenTime()) {
                nb=iBarShift(OrderSymbol(), tf, tb, True);
                if (nb>=0) {
                  po=MarketInfo(OrderSymbol(), MODE_POINT);
                  if (po==0) Message("В обзоре рынка отсутствует символ "+OrderSymbol()+". Точность расчётов не гарантируется!");
                  else {
                    if (OrderType()==OP_BUY) {
                      dd+=(OrderOpenPrice()-iLow(OrderSymbol(), tf, nb)+po)/po;
                    }
                    if (OrderType()==OP_SELL) {
                      sp=po*MarketInfo(OrderSymbol(), MODE_SPREAD);
                      dd+=(iHigh(OrderSymbol(), tf, nb)-OrderOpenPrice()+sp)/po;
                    }
                  }
                }
              }
            }
          }
        }
      }
      if (md<dd) md=dd;
      tb+=60*tf;
    }
  }
  return(md);
}

HH: Der Anhang enthält ein Skript zum Testen der Funktion GetDrawdownOpenPosInPoint().

 
KimIV:
Rechtfertigen, Natasha, warum nicht? Im Gegenteil, es erscheint mir logisch, das Jahr nach dem Schließen des Monatskreises in umgekehrter Richtung zu verkürzen. Das Verringern der Jahreszahl in dem von Ihnen erwähnten Ausdruck ist dasselbe wie das Zurückstellen des Stundenzeigers um eine Stunde, nachdem der Minutenzeiger einen vollen Kreis zurückgedreht wurde. Nennen Sie uns Ihre Version der Funktion, und wir werden sie diskutieren... Vielleicht wird Ihre Version erfolgreicher sein als meine.

Ich habe folgende Überlegung angestellt: Nehmen wir an, wir müssen den Beginn von Q7 in der Vergangenheit und in der Zukunft bestimmen, dann ist nq= -7 bzw. nq=7. Mathfloor liefert -2 für die Vergangenheit und +1 für die Zukunft (nach der Funktionsbeschreibung in der Dokumentation zu urteilen), so dass wir für die Situation in der Vergangenheit ein Jahr mehr abziehen, als wir in der Zukunft hinzufügen....., wenn wir weitere Berechnungen für die Vergangenheit durchführen, müssen wir das Jahr wieder reduzieren und wir landen bei 2009.....

Leider aufgrund von Zeitmangel (ich habe kaum Zeit, die Seite zu lesen), kann ich nicht den Code, den ich denke, ist richtig, aber ich denke, wenn nötig, wird es nicht schwierig sein, es zu korrigieren.

 
Lisi4ka330:

Ich habe folgendermaßen argumentiert: Angenommen, wir müssen den Beginn von Q7 in der Vergangenheit und in der Zukunft bestimmen, dann ist nq= -7 bzw. nq=7. Mathfloor liefert -2 für die Vergangenheit und +1 für die Zukunft (nach der Beschreibung der Funktion in der Dokumentation zu urteilen), daher werden wir für die Situation in der Vergangenheit ein Jahr mehr abziehen, als wir in der Zukunft hinzufügen....., wenn wir die Berechnungen für die Vergangenheit fortsetzen, müssen wir das Jahr wieder reduzieren und wir werden im Jahr 2009 landen...

Ich stimme mit Ihrer Argumentation überein, aber Sie vergessen die Datentypen, die an den Operationen beteiligt sind. MathFloor() kann gänzlich entfallen. Das Ergebnis des Skripts finden Sie in der Anlage.

Dateien:
test.mq4  1 kb
 
Guten Tag, Igor)))) Um ehrlich zu sein, habe ich Ihre Antwort nicht ganz verstanden, und auch das beigefügte Skript hat keine Klarheit gebracht, sondern eher das Gegenteil... )))) aber ich denke, ich werde es mit der Zeit herausfinden)))) Können Sie mir bitte sagen, warum in der Zeile return(StrToTime(ye+"."+mo+".01") Pluszeichen stehen?
Grund der Beschwerde: