Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 46

 
sile:

Bonjour.

Je peux vous demander de l'aide ?

Comment puis-je savoir que la perte depuis le début de la journée, pour les positions fermées, était de 10% ?

Ce conseiller expert affiche dans le coin supérieur gauche le pourcentage de profit ou de perte pour une période donnée.

//+------------------------------------------------------------------+
//|                                                       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);
  }
//+------------------------------------------------------------------+

...

Dossiers :
test02.mq4  8 kb
 
Sergey Gritsay:

Ce conseiller affiche dans le coin supérieur gauche le pourcentage de profit ou de perte pour une période donnée.


Merci.

Il existe une fonction qui calcule le nombre de positions perdantes pour l'ensemble de la période.

Que puis-je changer pour voir le nombre de positions perdantes fermées aujourd'hui d'affilée ?



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:

Merci.

Il existe une fonction qui compte le nombre de positions perdantes dans le temps.

Que dois-je changer pour connaître le nombre de positions perdantes fermées aujourd'hui d'affilée ?



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);
}
Ajoutez une condition supplémentaire : si l'heure de clôture de l'ordre est inférieure à l'heure d'ouverture de la bougie D1 actuelle, alors continuez;
 
Artyom Trishkin:
Ajoutez une condition supplémentaire : si l'heure de clôture de l'ordre est inférieure à l'heure d'ouverture de la bougie D1 actuelle, alors continuez;

Merci.

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

Merci.

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


Pas tout à fait comme ça.

Comme ceci - OrderSymbol()

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

Ou comme ça :

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

Pas tout à fait comme ça.

Comme ceci - OrderSymbol()


Merci.

 
Chéri. Veuillez m'indiquer comment ajouter du texte à la fenêtre des paramètres d'entrée de l'EA.
 
Mikhail Goryunov:
Chéri. Veuillez m'indiquer comment ajouter du texte à la fenêtre des paramètres d'entrée de l'EA.
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";

Merci + en rep. J'ai compris, j'ai lu le tutoriel sur les variables d'entrée externes, ce n'est pas très bien décrit. C'est plus clair et plus évident dans l'exemple.

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

Merci + en rep. J'ai compris, j'ai lu le tutoriel sur les variables d'entrée externes, ce n'est pas très bien décrit. C'est de plus en plus clair dans l'exemple.

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

Si vous ajoutez des commentaires à chaque ligne, ce sera plus intéressant :

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

et si vous faites une énumération et l'utilisez au lieu d'un bool, c'est encore plus intéressant :

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

et sinput vous permet d'exclure une variable de la liste des variables à optimiser. Par exemple, la variable MetaQuotes4 dans ce contexte n'est pas nécessaire pour l'optimisation, et elle peut être exclue :

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