Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 1516

 
MakarFX

Danke für die Antwort, Krücke und nicht eine schlechte Lösung, aber in Bezug auf meine Idee es funktioniert ein bisschen falsch, weil der Saldo schwebend ist, wahrscheinlich tut es nicht sofort und in einigen Fällen meine Aufträge begann mit Minus aus irgendeinem Grund zu schließen. Aber das Wachstum war so, wie es sein sollte, aber die Inanspruchnahme mit diesen Minuspunkten nahm ebenfalls zu. Ich gab alles auf und beschloss, die Pullback-Grenzen manuell zu setzen, so dass ich sie täglich anpassen musste.

 
Порт-моне тв:

Danke für die Antwort, Krücke und nicht eine schlechte Lösung, aber in Bezug auf meine Idee es funktioniert ein bisschen falsch, weil der Saldo schwebend ist, wahrscheinlich tut es nicht sofort und in einigen Fällen meine Aufträge begann mit minus aus irgendeinem Grund zu schließen. Aber das Wachstum war so, wie es sein sollte, aber die Inanspruchnahme mit diesen Minuspunkten nahm ebenfalls zu. Ich habe beschlossen, es aufzugeben und die Handelslimits manuell festzulegen und täglich anzupassen.

Die Funktion funktioniert ordnungsgemäß.

Probieren Sie es so

//+--------------------------------------------------------------------------------------------------------------------+

sb1 = StartBalance();
................

//+--------------------------------------------------------------------------------------------------------------------+
//|  Баланс на начало периода                                                                                          |
//+--------------------------------------------------------------------------------------------------------------------+
double StartBalance()
  { double b = 0;
   if(AccountBalance()>0) {b = AccountBalance()-DayProfit();}
   return(b);
  }
//+--------------------------------------------------------------------------------------------------------------------+
//|  Суммарный профит на начало периода                                                                                |
//+--------------------------------------------------------------------------------------------------------------------+
double DayProfit()
  { double p = 0; datetime st=iTime(_Symbol,PERIOD_D1,0);
   for(int pos=OrdersHistoryTotal()-1;pos>=0;pos--)
     {
      if(OrderSelect(pos,SELECT_BY_POS,MODE_HISTORY)==true)
        {
         if(OrderSymbol() == _Symbol)
           { 
            if(OrderCloseTime()>=st){p+=OrderProfit()+OrderSwap()+OrderCommission();}
           }
        }
     }
   return(p);
  }
//+--------------------------------------------------------------------------------------------------------------------+

und fügen Sie die Aktualisierung des Saldos in die Auftragsabschlussfunktion ein

   if(OrderClose(бла бла бла))
     {
      StartBalance(); Print("Order Close");
     }
 
Maxim Kuznetsov:

den Tageswechsel erfassen und den Saldowert zu diesem Zeitpunkt berechnen.

Nicht umsonst heißt es: "Besorgen Sie sich den richtigen Indikator" - das lässt sich nicht in ein paar Zeilen Code unterbringen. Es ist ein ziemlich umfangreicher Algorithmus.

Die Erkennung des Tageswechsels ist einfach, "die bekannte Tageszahl ist nicht gleich der des Vortages", aber darüber hinaus ist es schwierig


Alg. " Berechnung des Saldos zum Zeitpunkt D" (ohne Abhebungen/Auffüllungen und einige Fehler bei Swaps und Provisionen)

Saldo: = aktueller Kontostand. Das ist AccountBalance().

Für alle geschlossenen Marktaufträge in der Historie:

wenn der Schlusszeitpunkt zwischen D und aktuell liegt, Balance -= OrderProfit()+OrderSwap()+OrderCommision();

nach Abschluss der Aufzählung ist die Balance der gewünschte Wert...

ABER, die Provision wird bei der Eröffnung berechnet (d.h. sie wirkt sich auf die Bilanzlinie aus) und wir berücksichtigen sie bei der Schließung, und die Swaps werden beim Tageswechsel genommen, und wir berücksichtigen sie wiederum erst bei der Schließung

und im Falle einer großen Tiefe D besteht die Möglichkeit, dass bei einer Überschreitung nicht alle erforderlichen Aufträge eingehen

 
Порт-моне тв:

Danke für die Antwort, Krücke und nicht eine schlechte Lösung, aber in Bezug auf meine Idee es funktioniert ein bisschen falsch, weil der Saldo schwebend ist, wahrscheinlich tut es nicht sofort und in einigen Fällen meine Aufträge begann mit Minus aus irgendeinem Grund zu schließen. Aber das Wachstum war so, wie es sein sollte, aber die Inanspruchnahme mit diesen Minuspunkten nahm ebenfalls zu. Ich gab auf und beschloss, die Handelslimits manuell festzulegen, wobei ich sie täglich anpassen musste.

Ich habe mich bereits in Ihren Vorschlägen und Ratschlägen verirrt, also ist mein Rat vielleicht völlig nebensächlich, aber sorry...

Ich verstehe, was ich zu Beginn des Tages brauche, um den Saldo festzulegen und für den Tag den Gewinn/Verlust zu zählen, nach dem ich entscheiden muss, ob ich den Handel fortsetzen soll ...

Die Entscheidung lautet also wie folgt

datetime dayTime;
double dayBalance;
// Дальше в функции OnTick()
if(dayTime != iTime(_Symbol, PERIOD_D1, 0);
 {
  dayBalance = AccountInfoDouble(ACCOUNT_BALANCE));
  dayTime = iTime(_Symbol, PERIOD_D1, 0);
 }
// Дальше текущий баланс можно сравнивать с балансом на начало дня…
// В начале следующего дня в переменной dayBalance будет другое значение баланса…

Wenn der Expert Advisor im Laufe des Tages neu gestartet wird, sollten Sie die Berechnung der Gewinne/Verluste der heutigen Aufträge unter Berücksichtigung von Swaps und Provisionen in Betracht ziehen und den Saldo für den Tagesbeginn in OnInit() berechnen.

Ich glaube an Makars Fähigkeiten, er kann das alles schon im Code zeigen...

 

Hallo. Können Sie mir sagen, wie ich die aktuelle Balkenanzahl vom Beginn des Tages an ermitteln kann?

Wie bestimme ich die Nummer des aktuellen Balkens vom Tagesbeginn an?

Ich danke Ihnen.

 
prom18:

Hallo. Können Sie mir sagen, wie ich die aktuelle Balkenanzahl vom Beginn des Tages an ermitteln kann?

Wie bestimme ich die Nummer des aktuellen Balkens vom Tagesbeginn an?

Ich danke Ihnen.

      double BarNumber=NormalizeDouble((TimeCurrent()-iTime(_Symbol,PERIOD_D1,0))/60/Period()+0.5,0);

dies ist der aktuelle Balken, wenn der letzte Balken geschlossen wurde, dann -0,5

 
MakarFX:

ist der aktuelle Balken, wenn der letzte Balken geschlossen wurde, dann -0,5

Ich danke Ihnen. Ich werde es ausprobieren.

 
MakarFX:

dies ist der aktuelle Balken, wenn zuletzt geschlossen, -0,5

es funktioniert nicht bei Minuten und Exoten.

Anzahl der Balken != Anzahl der_Zählungen

Takte werden einfach übersprungen, in 15 Minuten kann es 12 Minuten-Takte geben

besser: iBarShift() verwenden

 
Maxim Kuznetsov:

ist es besser, die native Funktion iBarShift() zu verwenden

Ich weiß nicht, wie(

 
MakarFX:

Ich weiß nicht, wie(

Funktion

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 26.02.2008                                                     |
//|  Описание : Возвращает реальный номер бара от начала суток.                |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (NULL или "" - текущий символ)          |
//|    tf - таймфрейм                  (          0 - текущий таймфрейм)       |
//|    dt - дата и время открытия бара (          0 - текущее время)           |
//+----------------------------------------------------------------------------+
int iBarOfDayReal(string sy="", int tf=0, datetime dt=0) {
  if (sy=="" || sy=="0") sy=Symbol();
  if (tf<=0) tf=Period();
  if (dt<=0) dt=TimeCurrent();
  if (tf>PERIOD_D1) {
    Print("iBarOfDayReal(): Таймфрейм должен быть меньше или равен D1");
    return(0);
  }

  int cd=TimeDay(dt);                       // текущий день месяца
  int nb=iBarShift(sy, tf, dt, False);      // номер текущего бара
  int bd=0;                                 // номер бара от начала суток

  while(TimeDay(iTime(sy, tf, nb))==cd) {
    nb++;
    bd++;
  }

  return(bd);
}