Probador de guiones y asesores de MG4 - página 2

 
AlexeyVik:

Bueno, tal vez los creadores no vean el tipo de dificultades a las que se enfrentan los programadores ordinarios.

Por ejemplo, yo estudiaba BASIC en la universidad y nada más. Me gustó mql4 y tuve que estudiarlo yo mismo, así que no tengo ningún problema con él ahora. Cuando intenté usar mql5, escribí un indicador simple con menos de 100 líneas junto con un sombrero de indicador mql5. En mi opinión, hay una diferencia y la diferencia es significativa.

Esto es un mito y lo sabes.

Tomemos el ATR.mq4 estándar de MetaTrader 4. Hay 104 líneas allí:

//+------------------------------------------------------------------+
//|                                                          ATR.mq4 |
//|                   Copyright 2005-2014, MetaQuotes Software Corp. |
//|                                              https://www.mql4.com |
//+------------------------------------------------------------------+
#property copyright   "2005-2014, MetaQuotes Software Corp."
#property link        "https://www.mql4.com"
#property description "Average True Range"
#property strict

//--- indicator settings
#property indicator_separate_window
#property indicator_buffers 1
#property  indicator_color1  DodgerBlue
//--- input parameter
input int InpAtrPeriod=14; // ATR Period
//--- buffers
double ExtATRBuffer[];
double ExtTRBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit(void)
  {
   string short_name;
//--- 1 additional buffer used for counting.
   IndicatorBuffers(2);
   IndicatorDigits(Digits);
//--- indicator line
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,ExtATRBuffer);
   SetIndexBuffer(1,ExtTRBuffer);
//--- name for DataWindow and indicator subwindow label
   short_name="ATR("+IntegerToString(InpAtrPeriod)+")";
   IndicatorShortName(short_name);
   SetIndexLabel(0,short_name);
//--- check for input parameter
   if(InpAtrPeriod<=0)
     {
      Print("Wrong input parameter ATR Period=",InpAtrPeriod);
      return(INIT_FAILED);
     }
//---
   SetIndexDrawBegin(0,InpAtrPeriod);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Average True Range                                               |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   int i,limit;
//--- check for bars count and input parameter
   if(rates_total<=InpAtrPeriod || InpAtrPeriod<=0)
      return(0);
//--- counting from 0 to rates_total
   ArraySetAsSeries(ExtATRBuffer,false);
   ArraySetAsSeries(ExtTRBuffer,false);
   ArraySetAsSeries(open,false);
   ArraySetAsSeries(high,false);
   ArraySetAsSeries(low,false);
   ArraySetAsSeries(close,false);
//--- preliminary calculations
   if(prev_calculated==0)
     {
      ExtTRBuffer[0]=0.0;
      ExtATRBuffer[0]=0.0;
      //--- filling out the array of True Range values for each period
      for(i=1; i<rates_total; i++)
         ExtTRBuffer[i]=MathMax(high[i],close[i-1])-MathMin(low[i],close[i-1]);
      //--- first AtrPeriod values of the indicator are not calculated
      double firstValue=0.0;
      for(i=1; i<=InpAtrPeriod; i++)
        {
         ExtATRBuffer[i]=0.0;
         firstValue+=ExtTRBuffer[i];
        }
      //--- calculating the first value of the indicator
      firstValue/=InpAtrPeriod;
      ExtATRBuffer[InpAtrPeriod]=firstValue;
      limit=InpAtrPeriod+1;
     }
   else
      limit=prev_calculated-1;
//--- the main loop of calculations
   for(i=limit; i<rates_total; i++)
     {
      ExtTRBuffer[i]=MathMax(high[i],close[i-1])-MathMin(low[i],close[i-1]);
      ExtATRBuffer[i]=ExtATRBuffer[i-1]+(ExtTRBuffer[i]-ExtTRBuffer[i-InpAtrPeriod])/InpAtrPeriod;
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+


Tomemos ATR.mq5 de MetaTrader 5. Tiene 96 líneas.

//+------------------------------------------------------------------+
//|                                                          ATR.mq5 |
//|                        Copyright 2009, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright   "2009, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property description "Average True Range"
//--- indicator settings
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots   1
#property  indicator_type1   DRAW_LINE
#property  indicator_color1  DodgerBlue
#property  indicator_label1  "ATR"
//--- input parameters
input int InpAtrPeriod=14;  // ATR period
//--- indicator buffers
double    ExtATRBuffer[];
double    ExtTRBuffer[];
//--- global variable
int       ExtPeriodATR;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit()
  {
//--- check for input value
   if(InpAtrPeriod<=0)
     {
      ExtPeriodATR=14;
      printf("Incorrect input parameter InpAtrPeriod = %d. Indicator will use value %d for calculations.",InpAtrPeriod,ExtPeriodATR);
     }
   else ExtPeriodATR=InpAtrPeriod;
//--- indicator buffers mapping
   SetIndexBuffer(0,ExtATRBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,ExtTRBuffer,INDICATOR_CALCULATIONS);
//---
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
//--- sets first bar from what index will be drawn
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,InpAtrPeriod);
//--- name for DataWindow and indicator subwindow label
   string short_name="ATR("+string(ExtPeriodATR)+")";
   IndicatorSetString(INDICATOR_SHORTNAME,short_name);
   PlotIndexSetString(0,PLOT_LABEL,short_name);
//--- initialization done
  }
//+------------------------------------------------------------------+
//| Average True Range                                               |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   int i,limit;
//--- check for bars count
   if(rates_total<=ExtPeriodATR)
      return(0); // not enough bars for calculation
//--- preliminary calculations
   if(prev_calculated==0)
     {
      ExtTRBuffer[0]=0.0;
      ExtATRBuffer[0]=0.0;
      //--- filling out the array of True Range values for each period
      for(i=1;i<rates_total && !IsStopped();i++)
         ExtTRBuffer[i]=MathMax(high[i],close[i-1])-MathMin(low[i],close[i-1]);
      //--- first AtrPeriod values of the indicator are not calculated
      double firstValue=0.0;
      for(i=1;i<=ExtPeriodATR;i++)
        {
         ExtATRBuffer[i]=0.0;
         firstValue+=ExtTRBuffer[i];
        }
      //--- calculating the first value of the indicator
      firstValue/=ExtPeriodATR;
      ExtATRBuffer[ExtPeriodATR]=firstValue;
      limit=ExtPeriodATR+1;
     }
   else limit=prev_calculated-1;
//--- the main loop of calculations
   for(i=limit;i<rates_total && !IsStopped();i++)
     {
      ExtTRBuffer[i]=MathMax(high[i],close[i-1])-MathMin(low[i],close[i-1]);
      ExtATRBuffer[i]=ExtATRBuffer[i-1]+(ExtTRBuffer[i]-ExtTRBuffer[i-ExtPeriodATR])/ExtPeriodATR;
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+


No hay diferencia en el tamaño de 104 frente a 96 líneas, incluso la ventaja está del lado de MQL5.

Así es como la gente transfiere tonterías y mitos de un foro a otro.

 
Renat:

No significa en absoluto que el lenguaje sea el mismo.

La diferencia es sólo en un pequeño conjunto de funciones (MT5 tiene mejores) y no hay grandes costos para dominar.

En cuanto a lo de "no quiero perder el tiempo" y "lo necesito para ayer", me gustaría recordarle que una plataforma de negociación es una herramienta importante para aumentar la eficiencia de un operador. Cuando hay una solución evidentemente más eficaz y funcional, no utilizarla es un autoengaño y un autodesengaño con mitos inventados.

Es suficiente para comparar los probadores de estrategias de trading para olvidarse de MT4 para siempre. No estoy bromeando ni exagerando: es real.

El principio más estúpido de sumar posiciones en MT5 (y esto significa la imposibilidad de limitar la operación simultánea de varios MTS en un símbolo y una cuenta sin ningún tipo de trucos) ha desalentado para siempre el trading en él. Incluso cuando habrá más corredores que proporcionan MT5 en el real que hay dedos en las manos.

Y reescribir el código para MT5 sólo por el bien de un probador - lo siento, pero es absurdo.

 
evillive:

El principio más estúpido de sumar posiciones en MT5 (que significa la imposibilidad de limitar la operación simultánea de varios MTS en un símbolo y en una cuenta sin ningún tipo de trucos) ha desanimado para siempre el trading en él. Incluso cuando habrá más corredores que proporcionan MT5 en real que hay dedos en las manos.

No es absurdo en absoluto.

Las ventajas se han explicado tantas veces que no quiero repetirlas. También he explicado repetidamente por qué "la existencia de múltiples MTS en un mismo símbolo es contraproducente, una pérdida y una situación irreal para su uso masivo".


Y reescribir el código para MT5 sólo por un probador, lo siento, pero es absurdo.

No es absurdo.

Estás recortando tus propias oportunidades y perdiendo posibilidades de desarrollo. Demostrarte a ti mismo y a los demás que un sistema conscientemente mejor, más funcional y potente es peor que uno antiguo con un montón de defectos es hacerte un daño directo.

 
Renat:

No significa en absoluto que la lengua sea la misma.

La única diferencia es un pequeño conjunto de funciones (en MT5 son mejores) y no hay grandes costes que dominar.

En cuanto a lo de "no quiero perder el tiempo" y "lo necesito para ayer", me gustaría recordarle que una plataforma de negociación es una herramienta importante para aumentar la eficiencia de un operador. Cuando hay una solución a sabiendas más efectiva y funcional cerca, no usarla es perjudicarse y engañarse con mitos inventados.

Es suficiente para comparar los probadores de estrategias de trading para olvidarse de MT4 para siempre. No estoy bromeando ni exagerando: es real.

Renat, ¿qué tan difícil es equiparar un probador de mt4 con uno de mt5?
 
Renat:

Esto es un mito y lo sabes.

Tomemos el ATR.mq4 estándar de MetaTrader 4. Hay 104 líneas allí:


Tomemos ATR.mq5 de MetaTrader 5. Tiene 96 líneas.


No hay diferencia en el tamaño de 104 frente a 96 líneas, e incluso la ventaja va a MQL5.

Así es como la gente transfiere tonterías y mitos de un foro a otro.

Mi pregunta es que el mismo indicador en mql4 me tomó una hora para escribir, y me tomó una semana para dominar la escritura del mismo código en mql5... No es el número de citas, es la comprensión de los enfoques de programación...

Qué diferencia hay entre la función de obtener el valor del indicador estándar en mql4 y la misma función en mql5... Casi pierdo la cabeza cuando me enfrentaba a ello. Por supuesto, se pueden ofrecer cursos de programación, pero hay que tener en cuenta otros factores que pueden no permitir ir a esos cursos... Y el coste, y la edad, y la distancia del lugar o el coste del tráfico en el caso del aprendizaje en línea ... Nunca se sabe...

 
AlexeyVik:
Renat, ¿es difícil equiparar mt4 tester con mt5 tester?
No tocaremos la 4, sólo la parte de servicio de integración con MQL5.community.
 
Renat:
No tocaremos el Cuarteto, sólo la parte de servicio de integración con MQL5.community.
Ni siquiera te he preguntado si lo vas a hacer, así que supongo que no lo harás. He preguntado si es difícil...
 
AlexeyVik:

No es eso lo que estaba diciendo, estaba diciendo que escribí el mismo indicador en mql4 en una hora, y me llevó una semana aprender a escribir el mismo código en mql5... No es el número de citas, es la comprensión de los enfoques de programación...

Qué diferencia hay entre la función de obtener el valor del indicador personalizado en mql4 y la misma función en mql5... He estado casi loco tratando de entenderlo. Por supuesto, se pueden ofrecer cursos de programación, pero hay que tener en cuenta otros factores que pueden no permitir ir a esos cursos... Y el coste, y la edad, y la distancia del lugar o el coste del tráfico en el caso del aprendizaje en línea ... Nunca se sabe...

Compare los dos archivos y encontrará las mínimas diferencias.

Sobre lo de "una semana para cogerle el tranquillo, casi me vuelvo loco" - es una palabra roja en el foro. Así nacen los mitos.

 
AlexeyVik:
Sólo que el lenguaje en él es tan diferente que se necesita no poco tiempo para dominarlo.
A la mierda. Un mes fue suficiente.
 
Renat:

Compare los dos archivos y encontrará diferencias mínimas.

Lo de "una semana para cogerle el tranquillo, casi me vuelvo loco" es una frase en rojo en el foro. Así nacen los mitos.

No voy a demostrar que esto es la verdad. Para una persona que no esté familiarizada con la programación en C++ y en general con la programación orientada a objetos (OOP), es bastante difícil y no es para nada una cuestión de palabras rojas o de creación de un mito. Por extraño que parezca, lo entendí todo en una semana y escribí lo que necesitaba. Y esto es un mito completamente diferente; demuestra que mql5 puede ser dominado fácilmente incluso por los no profesionales, como yo.