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

 
Vitaly Muzichenko #:

Ich werfe ein:)

Es gibt einen DAX30 Index = notiert von 9 bis 22

Wie kann man herausfinden, wie viele Balken in einer Sitzung auf dem Zeitrahmen M15, H1 usw. sind?

Maxim Kuznetsov #:

(22*3600-9*3600)/PeriodSeconds(M15)

sondern im Idealfall "so viele Takte sollten zwischen 9:00 und 22:00 Uhr liegen".

Je kleiner der Zeitrahmen ist, desto größer ist der Fehler, in Wirklichkeit ist er fast immer geringer. Sie können die Historie nicht verwenden, um "die nächste Sitzung alle N Bars" zu berechnen.

Es ist viel einfacher...

int  Bars( 
   string           symbol_name,     // имя символа 
   ENUM_TIMEFRAMES  timeframe,       // период 
   datetime         start_time,      // с какой даты 
   datetime         stop_time        // по какую дату 
   );
Документация по MQL5: Доступ к таймсериям и индикаторам / Bars
Документация по MQL5: Доступ к таймсериям и индикаторам / Bars
  • www.mql5.com
Bars - Доступ к таймсериям и индикаторам - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 

Guten Tag zusammen.

Ich brauche Ihre Hilfe.

Der EA hat eine eingebaute Zählfunktion für den aktuellen Gewinn:

double GetProfitFromStart()
  {
   double lp=0,cp=0;
   for(int i=0; i<OrdersHistoryTotal(); i++)
     {
      if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
        {
         if(OrderSymbol()==_Symbol && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if(Start<OrderCloseTime()) {lp+=OrderProfit()+OrderCommission()+OrderSwap();}
              }
           }
        }
     }
   for(int pos=OrdersTotal()-1;pos>=0;pos--)
     {
      if(OrderSelect(pos, SELECT_BY_POS, MODE_TRADES))
        {
         if(OrderSymbol()==_Symbol && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL) {cp=OrderProfit()+OrderCommission()+OrderSwap();}
           }
        }
     }
   return(lp+cp);
  }
void OnTick()
  {
// Получим значение индикатора
   dMA = iMA(Symbol(), 0,PeriodMA, MovingShift, MODE_SMA, PRICE_CLOSE, 0); // MODE_SMA - простое усреднение , значение 0. PRICE_CLOSE- цена закрытия, значение 0.

// Если нет открытых ордеров, то входим в условие
      if(CountOrders()==0)
     {
// Если появился сигнал на покупку, то откроем ордер на покупку
      if(bSignalBuy() == true)
         vOrderOpenBuy();

// Если появился сигнал на продажу, то откроем ордер на продажу
      if(bSignalSell() == true)
         vOrderOpenSell();
     }
// Пишем какой лот текущий и какой следующий
      DrawLABEL("nextlot"   ,1,5,0,Color1(),StringConcatenate("CURRENT LOT: ",DoubleToStr(LOT(),2)));
      DrawLABEL("currentlot",1,5,0,Color2(),StringConcatenate("NEXT LOT: ",DoubleToStr(LOT(),2))); 
       DrawLABEL("lab_Take" ,1,5,0,Color(GetProfitFromStart()>0,Lime,Red),StringConcatenate("Profit: ",DoubleToStr(GetProfitFromStart(),2)));
      TrailingOrders();
   }

void OnTick ist wie oben beschrieben aufgebaut.

Wie man den Gewinnzähler auf 0,0 zurücksetzt, wenn die Bedingungen erfüllt sind:

if(CountOrders()==0) && (GetProfitFromStart()>0

d.h. alle Aufträge sind geschlossen und der Gesamtgewinn bei Schließung des letzten Auftrags war >0?

 

Installiert MT4. Speichert die Anführungszeichen nach dem Schließen des Terminals nicht - lädt jedes Mal ein neues.

 
Maxim Kuznetsov #:

auch in 4 ist es besser, "erst zu öffnen, dann zu ändern".

Nicht jeder erlaubt es Ihnen, den Markt gleichzeitig mit einem Stop-Loss zu öffnen.

Übrigens gibt es den Stop-Loss nicht überall. Sie können es nicht überall bekommen, es ist auf dem Server des Brokers, es ist sein persönlicher Service (Kredit, Risiko, Ertrag) und nicht dort, wo Sie denken, dass es ist, es gibt keinen Handelskanal für Stop-Orders.

Danke, ja, auch die Demo bei verschiedenen Brokern zeigt zu unterschiedliche Konditionen.

 
законопослушный гражданин #:

Guten Tag zusammen.

Ich brauche Ihre Hilfe.

Der EA hat eine eingebaute Zählfunktion für den aktuellen Gewinn:

void OnTick wird wie oben ausgeführt.

Wie man den Gewinnzähler auf 0,0 zurücksetzt, wenn die Bedingungen erfüllt sind:

if(CountOrders()==0) && (GetProfitFromStart()>0

D.h., alle Aufträge werden geschlossen und der Gesamtgewinn bei Schließung des letzten Auftrags war >0?

Diese Aufgabe ist nicht ganz klar. Jedes Mal beginnt die Berechnungsfunktion, die Aufträge/Positionen durchzugehen und die Gewinne von Null an zusammenzufassen.

 double lp=0,cp=0;

Was wollen Sie abschaffen? Wenn Sie keine offenen Positionen/Marktaufträge haben, gibt die Zählfunktion Null zurück. Er wird sich selbst auf Null stellen)))

 
законопослушный гражданин #:

Guten Tag zusammen.

Ich brauche Ihre Hilfe.

Wie kann der Gewinnzähler auf 0,0 zurückgesetzt werden, wenn die Bedingungen erfüllt sind?

d.h. alle Aufträge wurden geschlossen und der Gesamtgewinn bei Schließung des letzten Auftrags war >0???

Was genau daran funktioniert nicht?

 

Guten Tag. Bitte um Hilfe.

Suche nach abgeschlossenen Aufträgen mit negativer Rendite.
Bei Summen verfehlt es, ich bekomme nicht das Ergebnis aller negativen Aufträge.

Ich lerne zu schreiben.

double Minus_profit(){
 for (int i=OrdersHistoryTotal()-1; i>=0; i--){
      if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)){
         if (OrderSymbol() == Symbol() && OrderMagicNumber()==Magic && (OrderType() == OP_BUY || OP_SELL)){
          if (OrderCloseTime()>=time && OrderTicket()>ticket){
            if (OrderProfit()+OrderSwap()+OrderCommission()<0){
             time=OrderCloseTime();
             ticket=OrderTicket();
             profit+=OrderProfit();swap+=OrderSwap(); ;comis+=OrderCommission();
             result=profit+swap+comis;   
   }}}}}return(result);
}
 
Alexander Avksentyev #:

Guten Tag. Bitte um Hilfe.

Suche nach abgeschlossenen Aufträgen mit negativer Rendite.
Bei Summen verfehlt es, ich bekomme nicht das Ergebnis aller negativen Aufträge.

Ich versuche zu lernen, wie man schreibt.

Auf den ersten Blick sehe ich, dass Sie die Positionen vom Ende her durchgehen und gleichzeitig die Schlusszeit in die Variable schreiben. Es kann sich herausstellen, dass Sie den Zeitpunkt der zuletzt geschlossenen Position erfasst haben und die nächste Bedingung nicht mehr erfüllt ist:

OrderCloseTime()>=time

da andere Positionen niedrigere Schlusszeiten haben. Das alles hängt von der Sortierung ab, aber bei der Standardsortierung ist das das Problem.


Beheben Sie auch diese Bedingung

(OrderType() == OP_BUY || OP_SELL)

zu

(OrderType() == OP_BUY || OrderType() == OP_SELL)

Wenn wir eine Position aus der Historie nehmen, speichert OrderProfit() bereits das Endergebnis mit Swaps und Provision. Bei offenen Stellen - nein, da muss man alles zusammenfassen. Aber das ist nicht sicher, überprüfen Sie es.

 
Nikita Chernyshov #:

Auf den ersten Blick sehe ich, dass Sie die Positionen vom Ende her durchgehen und die Schlusszeit in die Variable schreiben. Es kann sich herausstellen, dass Sie den Zeitpunkt der zuletzt geschlossenen Position erfasst haben und die nächste Bedingung nicht mehr erfüllt ist:

da andere Positionen niedrigere Schlusszeiten haben. Das alles hängt von der Sortierung ab, aber bei der Standardsortierung ist das das Problem.


Beheben Sie auch diese Bedingung

zu

Wenn wir eine Position aus der Historie nehmen, speichert OrderProfit() bereits das Endergebnis mit Swaps und Provision. Bei offenen Stellen - nein, da muss man alles zusammenfassen. Dies ist jedoch nicht korrekt, bitte überprüfen Sie dies.

Vielen Dank, das funktioniert gut.

double Minus_profit(){
time=TimeCurrent();
 for (int i=0; i<OrdersHistoryTotal(); i++){
      if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)){
       if (OrderSymbol() == Symbol() && OrderMagicNumber()==Magic){
        if (OrderType() == OP_BUY || OrderType() ==OP_SELL){
         if (OrderCloseTime()>=time){
          if (OrderProfit()+OrderSwap()+OrderCommission()<=0){
              time=OrderCloseTime();
              profit+=OrderProfit();swap+=OrderSwap(); ;comis+=OrderCommission();
              result=profit+swap+comis;   
   }}}}}}return(result);
}

Wenn wir auf einen Auftrag mit einem positiven Gewinn stoßen, sollten wir das Ergebnis zurücksetzen und nach negativen Aufträgen suchen.

 
Alexander Avksentyev #:

Guten Tag. Bitte um Hilfe.

Suche nach abgeschlossenen Aufträgen mit negativer Rendite.
Bei Summen verfehlt es, ich bekomme nicht das Ergebnis aller negativen Aufträge.

Ich lerne zu schreiben.

Ich empfehle für diese und ähnliche Situationen die Verwendung eines Debuggers.

Grund der Beschwerde: