Preguntas de los principiantes MQL4 MT4 MetaTrader 4 - página 250

 

Si es sencillo, para comprobarlo rápidamente, es algo así:

   double profit = 0;
   int cnt=LockTicket, i , ototal = OrdersHistoryTotal();

   for(i = ototal-1; i >=0; i--)
     {
      if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
        {
         if(OrderSymbol() == Symbol() && OrderCloseTime() > 0)
           {
            if(OrderType() == OP_BUY || OrderType() == OP_SELL)
              {
               if(OrderMagicNumber() == Magic )
                 {
                  profit += OrderProfit()+OrderCommission()+OrderSwap();
                  if(profit>max)
                    { 
                    cnt=OrdersTicket();
                    break;
                    }                  
                 }
              }
           }
        }
     }

Los pedidos suelen sucederse en el tiempo, pero esto no está garantizado. Por lo tanto, hay que comprobar la cronología. Pero para los experimentos esto servirá.

 
Aleksei Stepanenko #:

Si es sencillo, para comprobarlo rápidamente, es algo así:

Los pedidos suelen sucederse en el tiempo, pero esto no está garantizado. Por lo tanto, hay que comprobar la cronología. Pero esto servirá para los experimentos.

Estoy de acuerdo, el tiempo no está garantizado. Por eso quiero pasar por todas las órdenes cerradas en el sentido de aumentar por el billete. Conozco el ticket de pedido y estoy intentando contar a partir de él, pero algo ha fallado) ¿Cuál sería la forma correcta?

 
Aleksei Stepanenko #:

Si es sencillo, para comprobarlo rápidamente, es algo así:

Los pedidos suelen sucederse en el tiempo, pero esto no está garantizado. Por lo tanto, hay que comprobar la cronología. Pero esto servirá para los experimentos.

Si miramos el historial, sería mejor mirar las órdenes de menor a mayor que se cerrarían en el momento del recálculo ya que las órdenes de mercado se consideran de mayor a menor para poder considerar correctamente las abiertas y cerradas en el mismo tick. Creo que sí)

Aleksei Stepanenko #:

Si es sencillo comprobarlo rápidamente, entonces es algo así:

Por regla general, los pedidos se suceden en el tiempo, pero esto no está garantizado. Por lo tanto, de buena manera, la cronología debe ser revisada. Pero servirá para los experimentos.

¿El código de Alexey no lo hace bien también?

 
Valeriy Yastremskiy #:

En el historial es mejor mirar a través de las órdenes de menor a mayor para tener en cuenta las que se cerrarán en el momento del recálculo, son las órdenes de mercado las que contamos de mayor a menor para contabilizar correctamente las abiertas y cerradas en el mismo tick. Creo que sí)

¿El código de Alexey también calcula mal?

No lo he probado. Lo probaré ahora. Te lo haré saber.

 
Aleksei Stepanenko #:

Si es sencillo, para comprobarlo rápidamente, es algo así:

Los pedidos suelen sucederse en el tiempo, pero esto no está garantizado. Por lo tanto, hay que comprobar la cronología. Pero servirá para los experimentos.

Lo he comprobado y me ha dado muchos errores durante la compilación, los he arreglado todos, excepto el :

if(profit>max)

Esta línea, no la entiendo del todo. ¿Puede explicarlo?

 
makssub #:
La idea es cambiar el billete después de alcanzar un determinado beneficio

El máximo es el límite de la ganancia a partir del cual el billete cambia. El valor lo fijas tú.

 
Aleksei Stepanenko #:

El máximo es el límite de la ganancia a partir del cual el billete cambia. Su valor lo fijas tú.

El problema es diferente, si lo entiendo bien. Hay 1, 2 y 3 órdenes. No sé cómo se forman los precios abiertos. El pedido 3 está cerrado, el beneficio total es igual al beneficio del pedido 3. Es decir, tenemos que calcular el ticket de la orden abierta antes de la orden 3 . Entonces la orden 2 está cerrada. Deberíamos encontrar el ticket de la orden abierta antes de la orden 2. El beneficio total es igual al beneficio de los pedidos 2 y 3.

No entiendo por qué, pero parece ser la lógica).

 
Valery, no entiendo del todo la lógica de esas dos frases.
 
Aleksei Stepanenko #:
Valery, no he entendido bien la lógica de esas dos frases.

Foro sobre comercio, sistemas de comercio automatizados y pruebas de estrategia

FAQ de principiantes MQL4 MT4 MetaTrader 4

makssub, 2021.09.01 16:38

int FindTicket()
   {
   int oldticket;
   int tick=0;
   ticket=0;
   
   
   for(int cnt = OrdersTotal ()-1; cnt>=0; cnt--)
      {
      if(OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
         {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
            {
            oldticket = OrderTicket();
            if (oldticket > ticket)
               {
               ticket = oldticket;
               tick = OrderTicket();
               }
            }
         }
      }
   return(tick); 
   }              
int TickF = FindTicket();
int CalculateProfitHistory() 
{
  double _point;
  int    i, _ototal = OrdersHistoryTotal(), _profit=0;
  for   (i = 0; i < OrdersHistoryTotal(); i++) 
  {
    if (OrderSelect(TickF, SELECT_BY_TICKET, MODE_HISTORY)) 
    {
      if (OrderSymbol() == Symbol())
      {
        if (OrderMagicNumber() == Magic) 
        {
           _point = MarketInfo(OrderSymbol(), MODE_POINT);
           if (_point == 0) 
           {
              if (StringFind(OrderSymbol(), "") < 0) 
                 _point = 0.0001; 
              else _point = 0.01;
           }   
           if (OrderType() == OP_BUY) 
           {
              _profit += int((MarketInfo(OrderSymbol(), MODE_BID) - OrderOpenPrice())/_point);
           }
           if (OrderType()==OP_SELL) 
           {
              _profit += int((OrderOpenPrice() - MarketInfo(OrderSymbol(), MODE_ASK))/_point);
           }
         }
      }
    }
  }
  return(_profit);
}

Debería utilizar la primera función para encontrar el ticket de la orden requerida y la segunda función debería calcular el beneficio de todas las órdenes cerradas que siguen a ese ticket. No me interesan los beneficios de los anteriores. Pero el segundo no lo calcula correctamente. Cuando se abre una orden, se llaman estas 2 funciones y por lo tanto debería ser igual a 0, pero no lo es.
PS tomó su consejo, dejó las matrices)
12ª caja de arriba)


 

He pensado en todo y lo he hecho mío basándome en tus consejos)

La tarea consistía en cubrir una orden perdedora con otras órdenes con beneficios.

Lo hemos puesto en práctica. Memorizamos el ticket de la orden abierta después de la perdedora; este fue nuestro punto de informe. A partir de este momento, empezamos a calcular el beneficio de la orden con pérdidas y el beneficio de las órdenes cerradas después de ella. Te recuerdo que la primera orden está abierta y la cerramos cuando alcanza un beneficio.

si ( (CalculateProfitHistory() + FirstProfit() >= Profit)

{

CloseFirst();

Imprimir ("Cerrar la primera orden perdedora");

}


double CalculateProfitHistory() 
{
   double profit = 0;
   int cnt=Ticket, i , ototal = OrdersHistoryTotal();

   for(i = ototal-1; i >=0; i--)
   {
      if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
      {
         if(OrderSymbol() == Symbol() && OrderCloseTime() > 0)
         {
            if(OrderType() == OP_BUY || OrderType() == OP_SELL)
            {
               if(OrderMagicNumber() == Magic )
               {
                  if (Ticket !=0)
                  {
                     if (OrderTicket() >= Ticket)
                     {
                        profit += OrderProfit()+OrderCommission()+OrderSwap();
                     }                  
                  }
               }
            }
         }
      }
   }
   return(profit);
}
Razón de la queja: