Preguntas de los principiantes MQL5 MT5 MetaTrader 5 - página 1054

 

Igor Makanu:

El CTrade estándar no ofrece un servicio inmediato

En MT4 hay cosas de trading que se codifican en una línea. En MT5 no se puede hacer lo mismo a través de SB ni siquiera en cien líneas. En MQL5 puro es aún peor. Está bien.

 

Gracias, buen ejemplo voy a mirar en él, aquí es un script para MT4 - determinar el beneficio en pips:

//+------------------------------------------------------------------+
//|                                        LastOrderProfitInPips.mq4 |
//|                                                            IgorM |
//|                              https://www.mql5.com/ru/users/igorm |
//+------------------------------------------------------------------+
#property copyright "IgorM"
#property link      "https://www.mql5.com/ru/users/igorm"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   printf("Прибыль последнего закрытого ордера %d пунктов",LastHistoryProfit());

  }
//+------------------------------------------------------------------+
int LastHistoryProfit(int magic_=-1)
  {
   datetime t=0;
   int profit=0;
   for(int i=0; i<OrdersHistoryTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
        {
         if((OrderMagicNumber()==magic_ || magic_==-1) && (OrderSymbol()==_Symbol))
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if(OrderCloseTime()>t)
                 {
                  t=OrderCloseTime();
                  profit= (int)(fabs(OrderOpenPrice()-OrderClosePrice())/_Point);
                  profit= OrderProfit()>=0.0 ? profit : -profit;
                 }
              }
           }
        }
     }
   return(profit);
  }
//+------------------------------------------------------------------+

¿Lo escribí desde cero en 10 minutos? - Bueno, sobre eso, la lógica es simple y sencilla - se toma y se escribe, en MT5 hasta ahora sólo se habla de un caballo esférico en el vacío... si las operaciones y si hay órdenes, dejó de discutir los tipos de cuentas de compensación o hedge.... y escribiremos algo por la mañana.

 
Igor Makanu:

Gracias, buen ejemplo, lo estudiaré, hice un script para MT4 - determinar el beneficio en pips

No es necesario que le diga cómo ejecutar este script en MT5. Sin embargo, el propio script tiene errores.

Primero les mostraré la historia

y el resultado de la ejecución

Прибыль последнего закрытого ордера -259 пунктов


Estos son los errores

int LastHistoryProfit(int magic_=-1)
  {
   datetime t=0;
   int profit=0;
   for(int i=0; i<OrdersHistoryTotal(); i++) // Надо бежать в обратную сторону, т.к. последняя позиция может быть закрыта в ту же секунду, что и предпоследняя.
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
        {
         if((OrderMagicNumber()==magic_ || magic_==-1) && (OrderSymbol()==_Symbol))
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if(OrderCloseTime()>t) // В отличие от MT4, в MT5 это можно не делать - сортировка по времени закрытия есть.
                 {
                  t=OrderCloseTime();
                  profit= (int)(fabs(OrderOpenPrice()-OrderClosePrice())/_Point); // При таком вычислении легко потерять один пункт.
                  profit= OrderProfit()>=0.0 ? profit : -profit;
                 }
              }
           }
        }
     }
   return(profit);
  }
 
fxsaber:

Y los errores aquí.

При таком вычислении легко потерять один пункт.

¿Cómo se arregla? Nunca lo he pensado, el esquema parece ser estándar: 2 precios - encontrar la diferencia y dividir por puntos

Estoy de acuerdo con el resto, pero necesito pensar, el esquema de búsqueda de orden es clásico y quiero comparar el tiempo con el más alto.... por si acaso. tengo que pensar, aunque es la primera vez que tengo que hacerlo - el 99,99% de las veces nadie intenta siquiera operar con TS hft en MT4

 
Igor Makanu:

¿Cómo arreglarlo? Nunca lo había pensado, el esquema parece ser estándar: 2 precios - encontrar la diferencia y dividir por puntos

Pérdida al fundir doble -> int.

Estoy de acuerdo con el resto, pero necesito pensar, el esquema de ejecución de órdenes es clásico, y quiero comparar el tiempo con el más alto.... por si acaso. tengo que pensar, aunque es la primera vez que me encuentro con este problema - en el 99,99% de los casos nadie intenta siquiera operar con TS hft en MT4

El HFT no tiene nada que ver. El script CloseAll bien puede cerrar dos posiciones en un segundo. En MT4 hay que comparar, en MT5 es innecesario. Y probablemente sea más fácil comparar a través de ArraySort (si, por ejemplo, quieres cambiar rápidamente a la penúltima posición cerrada).

 
fxsaber:

La pérdida al fundir doble -> int.

todo esto está claro, pero ¿cómo puedo calcular correctamente la diferencia de 2 precios en puntos enteros?

 
Igor Makanu:

Todo esto está claro, pero ¿cómo puedo calcular la diferencia en pips entre 2 precios?

Foro sobre comercio, sistemas de comercio automatizados y prueba de estrategias de comercio

necesito ayuda para calcular el total de pips para la orden cerrada hoy (Mql5)

fxsaber, 2017.10.25 01:00

#include <MT4Orders.mqh> // https://www.mql5.com/en/code/16006

int PriceToInteger( const double Price, const double point )
{
  return((int)(Price / point + 0.1));
}

int GetTotalPips( const datetime From = 0 )
{
  int Res = 0;
  
  for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
      if (OrderCloseTime() < From)
        break;
      else if (OrderType() <= OP_SELL)
      {
        const double point = SymbolInfoDouble(OrderSymbol(), SYMBOL_POINT);
        
        Res += OrderType() ? PriceToInteger(OrderOpenPrice(), point) - PriceToInteger(OrderClosePrice(), point)
                           : PriceToInteger(OrderClosePrice(), point) - PriceToInteger(OrderOpenPrice(), point);
      }
        
  return(Res);
}

void OnStart()
{
  datetime Today = TimeCurrent();
  
  Today -= Today % PeriodSeconds(PERIOD_D1);
  
  Alert(GetTotalPips(Today));
}
 
fxsaber:

Gracias.

Me ha gustado especialmente.

const double point = SymbolInfoDouble(OrderSymbol(), SYMBOL_POINT);

Lo tendré en cuenta, suelo escribir todo en visibilidad global, tu ejemplo se lee mucho mejor


....


¿Y esto es correcto? En el bucle de pedido, ¿se recalcularía cada vez SymbolInfoDouble(OrderSymbol(), SYMBOL_POINT); porqueOrderSymbol() será diferente cada vez?

 

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

Preguntas de los principiantes MQL5 MT5 MetaTrader 5

Igor Makanu, 2019.06.04 18:43

Gracias, buen ejemplo voy a mirar en él, aquí es un script que redacté para MT4 - determinar el beneficio en pips:

//+------------------------------------------------------------------+
//|                                        LastOrderProfitInPips.mq4 |
//|                                                            IgorM |
//|                              https://www.mql5.com/ru/users/igorm |
//+------------------------------------------------------------------+
#property copyright "IgorM"
#property link      "https://www.mql5.com/ru/users/igorm"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   printf("Прибыль последнего закрытого ордера %d пунктов",LastHistoryProfit());

  }
//+------------------------------------------------------------------+
int LastHistoryProfit(int magic_=-1)
  {
   datetime t=0;
   int profit=0;
   for(int i=0; i<OrdersHistoryTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
        {
         if((OrderMagicNumber()==magic_ || magic_==-1) && (OrderSymbol()==_Symbol))
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if(OrderCloseTime()>t)
                 {
                  t=OrderCloseTime();
                  profit= (int)(fabs(OrderOpenPrice()-OrderClosePrice())/_Point);
                  profit= OrderProfit()>=0.0 ? profit : -profit;
                 }
              }
           }
        }
     }
   return(profit);
  }
//+------------------------------------------------------------------+

¿Escrito desde cero en 10 minutos? - Bueno, aproximadamente así, la lógica es simple y directa - se toma y se escribe, en MT5 estamos discutiendo sólo un caballo esférico en el vacío... si se negocia y si hay órdenes, se deja para discutir los tipos de cuentas de compensación o cobertura.... y escribiremos algo por la mañana.

Y puedo preguntar por qué debemos tomar el valor absoluto de la diferencia entre el precio de apertura y el de cierre y luego, si el beneficio de la posición es inferior a cero, sustituir el valor por un signo menos.
 
Alexey Viktorov:
Y puedo preguntar por qué debemos tomar el valor absoluto de la diferencia entre el precio de apertura y el de cierre, y luego, si el beneficio de la posición es inferior a cero, sustituir el valor por el signo menos.

Lo escribí sobre la marcha, como quería - quería que salieran +100 puntos o -100 puntos, era una cuestión de gusto - no tenía ninguna tarea específica, pero escribir condiciones para determinar el tipo de orden y comparar el precio de apertura y cierre, me parecía que serían demasiadas líneas extra...

ZS: Este es un foro para programadores, ¿no? - Son así. Pueden optimizar un código (especialmente el de otra persona) 10 veces, para sustituir 5 líneas por 4 )))

Razón de la queja: