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

 

Hola, tengo un comportamiento extraño de la función del sistema OrderCalcProfit, tengo la sensación de que el parámetro de volumen se ignora en el cálculo, es decir, el tamaño de las ganancias siempre se calcula para el volumen 1.0

Estoy tratando de comprobarlo en el probador para diferentes pares de divisas en diferentes cuentas demo.

1. El cálculo es correcto para 1.0, véase calc_profi101.png.

2. La segunda y cualquier llamada posterior de la función devuelve un resultado de beneficio basado en un volumen de 1,0, el valor del volumen se ignora, ver una captura de pantalla (calc_profit02.png) - pasó el volumen 0,5, pero el resultado sigue siendo el mismo que para 1,0

¿Puede decirme cuál puede ser el problema? Gracias

Archivos adjuntos:
 
aveshoff:

Hola, tengo un comportamiento extraño de la función del sistema OrderCalcProfit, tengo la sensación de que el parámetro del volumen se ignora en el cálculo, es decir, el beneficio se calcula siempre para el volumen 1.0

Estoy tratando de comprobarlo en el probador para diferentes pares de divisas en diferentes cuentas demo.

1. El cálculo es correcto para 1.0, véase calc_profi101.png.

2. La segunda y cualquier llamada posterior de la función devuelve un resultado de beneficio basado en un volumen de 1,0, el valor del volumen se ignora, ver una captura de pantalla (calc_profit02.png) - pasó el volumen 0,5, pero el resultado sigue siendo el mismo que para 1,0

¿Puede decirme cuál puede ser el problema? Gracias

Creo que la respuesta está en la ayuda:

"... beneficio

[out] Variable que contendrá el valor del beneficio calculado si la función tiene éxito. El valor de la estimación de beneficios depende de muchos factores y puede cambiar según el entorno del mercado. ... "


Añadido: aunque esto es sólo una suposición.

 
aveshoff:

Hola, tengo un comportamiento extraño de la función del sistema OrderCalcProfit, tengo la sensación de que el parámetro del volumen se ignora en el cálculo, es decir, el valor de la ganancia siempre se calcula para el volumen 1.0

Estoy tratando de comprobarlo en el probador para diferentes pares de divisas en diferentes cuentas demo.

1. El cálculo es correcto para 1.0, véase calc_profi101.png.

2. La segunda y cualquier llamada posterior de la función devuelve un resultado de beneficio basado en un volumen de 1,0, el valor del volumen se ignora, ver una captura de pantalla (calc_profit02.png) - pasó el volumen 0,5, pero el resultado sigue siendo el mismo que para 1,0

¿Puede decirme cuál puede ser el problema? Gracias

Aquí está el examinador de prueba - todo funciona correctamente:

//+------------------------------------------------------------------+
//|                                             OrderProfitCheck.mq5 |
//|                              Copyright © 2019, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2019, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
#include <Trade\AccountInfo.mqh>
CAccountInfo      m_account;                    // object of CAccountInfo class
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   string symbol=Symbol();
   ENUM_ORDER_TYPE trade_operation=ORDER_TYPE_BUY;
   double volume=1.0;
   double price_open=1.09350;
   double price_close=1.0930;
   double profit=m_account.OrderProfitCheck(symbol,trade_operation,volume,price_open,price_close);
   Print("Volume 1.0, profit -> ",DoubleToString(profit,2));
   volume=0.5;
   profit=m_account.OrderProfitCheck(symbol,trade_operation,volume,price_open,price_close);
   Print("Volume 0.5, profit -> ",DoubleToString(profit,2));
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---

  }
//+------------------------------------------------------------------+

y el resultado:

2019.09.30 07:47:21.688 OrderProfitCheck (EURUSD,H1)    Volume 1.0, profit -> -50.00
2019.09.30 07:47:21.688 OrderProfitCheck (EURUSD,H1)    Volume 0.5, profit -> -25.00
Archivos adjuntos:
 
¿Puedes decirme? ¿Es posible y cómo se puede conocer el idioma del terminal en uso mediante programación?
 
Uladzimir Izerski:
¿Puedes darme una pista? ¿Es posible y cómo puedo averiguar mediante programación el idioma del terminal en uso?

Determino esto o el idioma ruso de la terminal o si otro - la salida es en Inglés.

   if(InpTrailingStop!=0 && InpTrailingStep==0)
     {
      string err_text=(TerminalInfoString(TERMINAL_LANGUAGE)=="Russian")?
                      "Трейлинг невозможен: параметр \"Trailing Step\" равен нулю!":
                      "Trailing is not possible: parameter \"Trailing Step\" is zero!";
      //--- when testing, we will only output to the log about incorrect input parameters
      if(MQLInfoInteger(MQL_TESTER))
        {
         Print(__FILE__," ",__FUNCTION__,", ERROR: ",err_text);
         return(INIT_FAILED);
        }
      else // if the Expert Advisor is run on the chart, tell the user about the error
        {
         Alert(__FILE__," ",__FUNCTION__,", ERROR: ",err_text);
         return(INIT_PARAMETERS_INCORRECT);
        }
     }


Añadido: pensé que había guardado todos los idiomas de la enumeración TERMINAL_LANGUAGE - pero no lo encuentro. Debe haber perdido ...

 
Buenas tardes a todos, puede alguien ayudar a añadir aquí que en SL no sólo se volcaría, sino que también se añadiría mucho o más. Y cuando se activa el TP se retrocede un lote.
input double   Lot=1;
input int      TakeProfit = 6;
input int      Stoploss   = 6;

int TP;
int SL;

CTrade trader;
bool Invertor;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {

   TP = TakeProfit;
   SL = Stoploss;

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

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {

   double points;

   if(!PositionSelect(_Symbol))
     {
      if(Invertor)
         trader.Buy(Lot);
      else trader.Sell(Lot);
     }
   else
     {
      if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
        {
         points=(SymbolInfoDouble(_Symbol,SYMBOL_BID)-PositionGetDouble(POSITION_PRICE_OPEN))/_Point;
         if(points>=TP)
           {
            trader.PositionClose(_Symbol);
            Invertor=true;
           }

         if(points<=-SL)
           {
            trader.PositionClose(_Symbol);
            Invertor=false;
           }
        }
      if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
        {
         points=(PositionGetDouble(POSITION_PRICE_OPEN)-SymbolInfoDouble(_Symbol,SYMBOL_ASK))/_Point;
         if(points>=TP)
           {
            trader.PositionClose(_Symbol);
            Invertor=false;
           }
         if(points<=-SL)
           {
            trader.PositionClose(_Symbol);
            Invertor=true;
           }
        }
     }   
  }
 
Andrey990:
Buenos días a todos, puede alguien ayudar a añadir aquí que en SL no sólo sería un rollover sino que además sumaría mucho o más. Y cuando el TP se dispara devolvería un lote.

1. Desaconsejo categóricamente el uso de funciones que seleccionen una posición por un carácter. Utilice una función que seleccione una posición por un índice en una lista.

2. Para saber cómo se cerró una posición, hay que ver la enumeraciónENUM_DEAL_REASON en OnTradeTransaction.

Ejemplo con ENUM_DEAL_REASON:

Stop Loss Take Profit

Si se cierra por Stop loss - duplicar el volumen, si por Take Profit - establecer el volumen mínimo. Para detectar que la operación ha tenido lugar como resultado de la activación de Stop Loss o Take Profit, utilice OnTradeTransaction. A partir de la versión 1625 existe una bonita enumeración ENUM_DEAL_REASON: ENUM_DEAL_REASON Descripción DEAL_REASON_SL Operación realizada como resultado de la activación de Stop Loss DEAL_REASON_TP Operación realizada como resultado de la activación de Take Profit... que puede ser rastreada en OnTradeTransaction. En otras palabras, ahora puede determinar fácilmente y, lo que es más importante, de forma fiable, que esta operación fue el resultado de la activación de Take Profit o Stop Loss. Por el momento (build 1626), este EA sólo puede ser probado en vivo - ya sea en un gráfico o en el modo de depuración utilizando datos reales (F5 en MetaEditor). También he aplicado una solución por ahora: Determinar qué ha activado: Take Profit o Stop Loss en el procedimiento OnTradeTransaction: if (deal_symbol==m_symbol...

CodeBase | 2017.07.13 07:42 |Vladimir Karputov| EAs | MetaTrader 5

 

¿Es posible introducir los datos de acceso a la cuenta en un programa de terceros y gestionar la cuenta y, ya sabes, abrir/cerrar posiciones?

¿O es sólo a través de un robot que se instala en la cuenta?

 

Estoy transfiriendo indicadores de MQL4 a MQL5, pregunta sobre los buffers y "plots". El indicador tiene 2 tampones y 1 parcela:

#property indicator_buffers 2
#property indicator_plots 1

SetIndexBuffer(0,Array1,INDICATOR_CALCULATIONS);
SetIndexBuffer(1,Array2,INDICATOR_DATA);


Si la primera memoria intermedia se utiliza para los cálculos, etc., y la segunda debe ser trazada, entonces

En primer lugar, ¿es necesario establecer DRAW_NONE para el primer búfer si ya está establecido como INDICATOR_CALCULATIONS en la función SetIndexBuffer()?

PlotIndexSetInteger(?,PLOT_DRAW_TYPE,DRAW_NONE);

En segundo lugar, ¿qué índice debo establecer en PlotIndexSetInteger() en lugar del signo de interrogación (?) si sólo se debe dibujar el segundo búfer?

PlotIndexSetInteger(?,PLOT_DRAW_TYPE,DRAW_HISTOGRAM);


En tercer lugar, si utilizo dos estilos de tipo DRAW_HISTOGRAM, puedo establecer el color para cada uno de ellos y obtener un histograma como en el indicador de Volúmenes, donde se alternan las barras verdes y rojas, pero si utilizo DRAW_HISTOGRAM2, ¿puedo establecer dos colores para una barra también o sólo se establece un color para este estilo?

 
The_Sheikh:

Estoy transfiriendo indicadores de MQL4 a MQL5, pregunta sobre los buffers y "plots". El indicador tiene 2 tampones y 1 parcela:

#property indicator_buffers 2
#property indicator_plots 1

SetIndexBuffer(0,Array1,INDICATOR_CALCULATIONS);
SetIndexBuffer(1,Array2,INDICATOR_DATA);


Si la primera memoria intermedia se utiliza para los cálculos, etc., y la segunda debe ser trazada, entonces

En primer lugar, ¿es necesario establecer DRAW_NONE para el primer búfer si ya está establecido como INDICATOR_CALCULATIONS en la función SetIndexBuffer()?

PlotIndexSetInteger(?,PLOT_DRAW_TYPE,DRAW_NONE);

En segundo lugar, ¿qué índice debo establecer en PlotIndexSetInteger() en lugar del signo de interrogación (?) si sólo se debe dibujar el segundo búfer?

PlotIndexSetInteger(?,PLOT_DRAW_TYPE,DRAW_HISTOGRAM);


En tercer lugar, si utilizo dos estilos de tipo DRAW_HISTOGRAM, puedo establecer el color para cada uno de ellos y obtener un histograma como en el indicador de Volúmenes, donde se alternan las barras verdes y rojas, pero si utilizo DRAW_HISTOGRAM 2, ¿puedo establecer dos colores para una barra también o sólo se establece un color para este estilo?

¿Por qué eres tan duro contigo mismo? ¿Qué problema hay en asignar primero las memorias de visualización y luego las auxiliares?

Para DRAW_HISTOGRAМ2 se definen 3 buffers y la secuencia es obligatoria, 2 buffers de valor primero, seguidos de un buffer de color. Pero hay una diferencia entre DRAW_HISTOGRAM y DRAW_HISTOGRAM2 en que DRAW_HISTOGRAM se dibuja desde cero hasta el valor del buffer, mientras que DRAW_HISTOGRAM2 se dibuja desde el valor de un buffer hasta el valor de otro buffer.

Razón de la queja: