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

 
sile:

Hallo.

Kann ich um Hilfe bitten?

Woher weiß ich, dass der Verlust seit Beginn des Tages bei geschlossenen Positionen 10 % beträgt?

Dieser Expert Advisor zeigt in der oberen linken Ecke den Prozentsatz des Gewinns oder Verlusts für einen bestimmten Zeitraum an

//+------------------------------------------------------------------+
//|                                                       test02.mq4 |
//|                                                   Sergey Gritsay |
//|                         https://www.mql5.com/ru/users/sergey1294 |
//+------------------------------------------------------------------+
#property copyright "Sergey Gritsay"
#property link      "https://www.mql5.com/ru/users/sergey1294"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
enum mode_type
  {
   BUY=OP_BUY,
   SELL=OP_SELL,
   ALL = -1
  };
input string Symbols=NULL;
input int Magic=-1;//Identification number
input mode_type ModeType=ALL;
input ENUM_TIMEFRAMES TimeFrame=PERIOD_D1;

double procent=0.0;
double prev_balans=0.0;
double Profit=0.0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   Profit=LastProfit(iTime(_Symbol,TimeFrame,0),Symbols,Magic,ModeType);
   prev_balans=Balans(0,iTime(_Symbol,TimeFrame,0));
   if(prev_balans!=0.0)procent=Profit/prev_balans*100.0;
   Comment(
           "\nTime = ",iTime(_Symbol,TimeFrame,0),
           "\nProfit = ",DoubleToStr(Profit,2),
           "\nprev_balans = ",DoubleToStr(prev_balans,2),
           "\nprocent = ",DoubleToStr(procent,4)," %"
           );
  }
//+------------------------------------------------------------------+
double LastProfit(
                  datetime time,      // Дата, представленная в виде количества секунд, прошедших после 00:00 1 января 1970 года.
                  string symbol=NULL, // символ, если NULL то любой символ
                  int magic=-1,       // идентификатор, если -1 то любой идентификатор
                  int cmd=-1          // торговая операция, если -1 любая торговая операция
                  )
  {
   double profit=0;
   int total=OrdersHistoryTotal();
   for(int i=total-1;i>=0;i--)
     {
      if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))continue;
      if(OrderSymbol()==symbol || symbol!=NULL)
        {
         if(OrderMagicNumber()==magic || magic==-1)
           {
            if(OrderType()==cmd || cmd==-1)
              {
               if(OrderCloseTime()<time)continue;
               profit+=OrderProfit()+OrderCommission()+OrderSwap();
              }
           }
        }
     }
   return(profit);
  }
//+------------------------------------------------------------------+
double Balans(
              datetime start_time,// C какой даты. Дата, представленная в виде количества секунд, прошедших после 00:00 1 января 1970 года.
              datetime stop_time,// По какую дату. Дата, представленная в виде количества секунд, прошедших после 00:00 1 января 1970 года.
              )
  {
   double profit=0;
   int total=OrdersHistoryTotal();
   for(int i=0; i<total; i++)
     {
      if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))continue;
      if(OrderCloseTime()<start_time || OrderCloseTime()>stop_time)continue;
      profit+=OrderProfit()+OrderCommission()+OrderSwap();
     }
   return(profit);
  }
//+------------------------------------------------------------------+

...

Dateien:
test02.mq4  8 kb
 
Sergey Gritsay:

Dieser Berater zeigt in der oberen linken Ecke den Prozentsatz des Gewinns oder Verlusts für einen bestimmten Zeitraum an.


Ich danke Ihnen.

Es gibt eine Funktion, die die Anzahl der Verlustpositionen für den gesamten Zeitraum berechnet.

Was kann ich ändern, um die Anzahl der heute geschlossenen Verlustpositionen in Folge zu sehen?



int GetLastNegativeOrdersCount()
{
  int PosCnt = 0;
  int cnt = HistoryTotal();
  for (int i = cnt-1; i >=0; i--) {
    
    if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) continue;
    if (OrderSymbol() != Symbol()) continue;
    if (OrderMagicNumber() != Magic) continue;

      
    int type = OrderType();
    if (type != OP_BUY && type != OP_SELL) continue;
      
    if (OrderProfit()+OrderSwap()+OrderCommission() > 0) break;

    PosCnt++;
  }

  return (PosCnt);
}
 
sile:

Ich danke Ihnen.

Es gibt eine Funktion, die die Anzahl der Verlustpositionen im Laufe der Zeit zählt.

Was sollte ich ändern, um die Anzahl der heute hintereinander geschlossenen Verlustpositionen herauszufinden?



int GetLastNegativeOrdersCount()
{
  int PosCnt = 0;
  int cnt = HistoryTotal();
  for (int i = cnt-1; i >=0; i--) {
    
    if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) continue;
    if (OrderSymbol() != Symbol()) continue;
    if (OrderMagicNumber() != Magic) continue;

      
    int type = OrderType();
    if (type != OP_BUY && type != OP_SELL) continue;
      
    if (OrderProfit()+OrderSwap()+OrderCommission() > 0) break;

    PosCnt++;
  }

  return (PosCnt);
}
Fügen Sie eine weitere Bedingung hinzu: Wenn die Schlusszeit der Order kleiner ist als die Eröffnungszeit der aktuellen D1-Kerze, dann fahren Sie fort;
 
Artyom Trishkin:
Fügen Sie eine weitere Bedingung hinzu: Wenn die Schlusszeit der Order kleiner ist als die Eröffnungszeit der aktuellen D1-Kerze, dann fahren Sie fort;

Ich danke Ihnen.

if (iTime(Symbol(),1440,0)>OrderCloseTime()) continue;
 
sile:

Ich danke Ihnen.

if (iTime(Symbol(),1440,0)>OrderCloseTime()) continue;


Nicht ganz so.

Etwa so - OrderSymbol()

if(iTime(OrderSymbol(),PERIOD_D1,0)>=OrderCloseTime()) continue;

Oder so:

if(OrderCloseTime()<iTime(OrderSymbol(),PERIOD_D1,0)) continue;
 
Artyom Trishkin:

Nicht ganz so.

Etwa so - OrderSymbol()


Ich danke Ihnen.

 
Lieber. Bitte teilen Sie mir mit, wie ich dem EA-Eingabeparameterfenster Text hinzufügen kann.
 
Mikhail Goryunov:
Lieber. Bitte teilen Sie mir mit, wie ich dem EA-Eingabeparameterfenster Text hinzufügen kann.
input int    MetaQuotes = 30;
input bool   MetaQuotes = true;
input double MetaQuotes = 20.3;
input string MetaQuotes = "Corp";
 
Vitaly Muzichenko:
input int    MetaQuotes = 30;
input bool   MetaQuotes = true;
input double MetaQuotes = 20.3;
input string MetaQuotes = "Corp";

Danke + in Vertretung. Ich habe es herausgefunden, ich habe das Tutorial über externeEingabevariablen gelesen, es ist nicht sehr gut beschrieben. Das Beispiel macht es klarer und deutlicher.

sinput string MetaQuotes = "бла бла текс";
 
Mikhail Goryunov:

Danke + in Vertretung. Ich habe es herausgefunden, ich habe das Tutorial über externeEingabevariablen gelesen, es ist nicht sehr gut beschrieben. In dem Beispiel wird das immer deutlicher.

sinput string MetaQuotes = "бла бла текс";

Interessanter wäre es, wenn Sie jeder Zeile Kommentare hinzufügen würden:

input    int      MetaQuotes1    =  30;         // Описание входного параметра 1
input    bool     MetaQuotes2    =  true;       // Описание входного параметра 2
input    double   MetaQuotes3    =  20.3;       // Описание входного параметра 3
input    string   MetaQuotes4    =  "Corp";     // Описание входного параметра 4

und wenn Sie eine Aufzählung machen und diese anstelle von bool verwenden, wird es noch interessanter:

enum enumYN
  {
   enYes =  1,    // Да
   enNo  =  0,    // Нет
  };

input    int      MetaQuotes1    =  30;         // Описание входного параметра 1
input    enumYN   MetaQuotes2    =  enYes;      // Описание входного параметра 2
input    double   MetaQuotes3    =  20.3;       // Описание входного параметра 3
input    string   MetaQuotes4    =  "Corp";     // Описание входного параметра 4

und sinput ermöglicht es Ihnen, eine Variable aus der Liste der zu optimierenden Variablen auszuschließen. Zum Beispiel ist die Variable MetaQuotes4 in diesem Zusammenhang für die Optimierung nicht notwendig und kann ausgeschlossen werden:

enum enumYN
  {
   enYes =  1,    // Да
   enNo  =  0,    // Нет
  };

input    int      MetaQuotes1    =  30;         // Описание входного параметра 1
input    enumYN   MetaQuotes2    =  enYes;      // Описание входного параметра 2
input    double   MetaQuotes3    =  20.3;       // Описание входного параметра 3
sinput   string   MetaQuotes4    =  "Corp";     // Описание входного параметра 4
Grund der Beschwerde: