Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 46

 
sile:

Hola.

¿Puedo pedir ayuda?

¿Cómo sé que la pérdida desde el principio del día, para las posiciones cerradas fue del 10%?

Este Asesor Experto muestra en la esquina superior izquierda el porcentaje de ganancias o pérdidas para un período determinado

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

...

Archivos adjuntos:
test02.mq4  8 kb
 
Sergey Gritsay:

Este asesor muestra en la esquina superior izquierda el porcentaje de ganancias o pérdidas para un período determinado


Gracias.

Existe una función que calcula el número de posiciones perdedoras para todo el periodo.

¿Qué puedo cambiar para ver el número de posiciones perdedoras cerradas hoy de forma consecutiva?



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:

Gracias.

Hay una función que cuenta el número de posiciones perdedoras a lo largo del tiempo.

¿Qué debo cambiar para saber el número de posiciones perdedoras cerradas hoy de forma consecutiva?



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);
}
Añada una condición más: si la hora de cierre de la orden es menor que la hora de apertura de la vela D1 actual, entonces continúe;
 
Artyom Trishkin:
Añade una condición más: si la hora de cierre de la orden es menor que la hora de apertura de la vela D1 actual, entonces continúa;

Gracias.

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

Gracias.

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


No exactamente así.

Así - OrderSymbol()

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

O así:

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

No exactamente así.

Así - OrderSymbol()


Gracias.

 
Querida. Por favor, indíquenos cómo añadir texto a la ventana de parámetros de entrada de EA.
 
Mikhail Goryunov:
Querida. Por favor, indíquenos cómo añadir texto a la ventana de parámetros de entrada de 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";

Gracias + en rep. Lo he descubierto, he leído el tutorial sobre las variables deentrada externas, no está muy bien descrito. Es más claro y obvio desde el ejemplo.

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

Gracias + en rep. Lo he descubierto, he leído el tutorial sobre las variables deentrada externas, no está muy bien descrito. El ejemplo es más claro e ilustrativo.

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

Si añades comentarios a cada línea, será más interesante:

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

y si haces una enumeración y la usas en lugar de un bool, es aún más interesante:

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

y sinput permite excluir una variable de la lista de variables para la optimización. Por ejemplo, la variable MetaQuotes4 en este contexto no es necesaria para la optimización, y puede ser excluida:

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
Razón de la queja: