Testador apoiando os scripts e consultores MG4 - página 2

 
AlexeyVik:

Bem, talvez os criadores não vejam o tipo de dificuldades que os programadores comuns enfrentam.

Por exemplo, eu costumava estudar o BASIC na universidade e nada mais. Eu tentei usar o mql4, mas agora não tenho nenhum problema com ele. Quando tentei usar mql5, escrevi um indicador simples com menos de 100 linhas junto com um chapéu indicador mql5. Na minha opinião, há uma diferença e a diferença é significativa.

Isto é um mito e você sabe disso.

Vamos pegar o ATR.mq4 padrão do MetaTrader 4. Existem 104 linhas ali:

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


Vamos tomar ATR.mq5 do MetaTrader 5. Tem 96 linhas.

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


Não há diferença no tamanho de 104 vs. 96 linhas, mesmo a vantagem está do lado da MQL5.

É assim que as pessoas transferem bobagens e mitos de fórum para fórum.

 
Renat:

Não significa de forma alguma que o idioma seja o mesmo.

A diferença está apenas em um pequeno conjunto de funções (o MT5 tem funções melhores) e não há grandes custos para dominar.

Quanto a "Não quero perder meu tempo" e "Preciso dele ontem", gostaria de lembrar que uma plataforma de negociação é uma ferramenta importante para aumentar a eficiência de um comerciante. Quando existe uma solução mais eficaz e funcional, não usá-la é uma auto-flagelação e um auto-engano com mitos inventados.

Basta comparar os testadores de estratégias comerciais para esquecer a MT4 para sempre. Eu não estou brincando e não estou exagerando - é real.

O princípio mais estúpido de somar posições no MT5 (e isto significa a impossibilidade de limitar a operação simultânea de vários MTS em um símbolo e uma conta sem nenhum truque) tem desencorajado para sempre a negociação sobre ele. Mesmo quando haverá mais corretores fornecendo MT5 no real do que quando há dedos nas mãos.

E reescrever o código para o MT5 apenas para um testador - desculpe, mas é um absurdo.

 
evillive:

O princípio mais estúpido de somar posições no MT5 (o que significa a impossibilidade de limitar a operação simultânea de vários MTS em um símbolo e em uma conta sem nenhum truque) tem desencorajado para sempre a negociação sobre ele. Mesmo quando haverá mais corretores fornecendo MT5 em real do que quando há dedos nas mãos.

Não é de forma alguma absurdo.

As vantagens já foram explicadas tantas vezes que não quero repeti-las. Também expliquei repetidamente por que "múltiplos MTS em um único símbolo é autodestrutivo, uma perda e uma situação irrealista para uso em massa".


E reescrever o código para o MT5 apenas para o bem de um testador - desculpe, mas é absurdo.

Não é um absurdo.

Você está cortando suas próprias oportunidades e perdendo as chances de desenvolvimento. Provar a si mesmo e aos outros que um sistema conscientemente melhor, mais funcional e poderoso é pior do que um sistema antigo com um monte de falhas está causando danos diretos a si mesmo.

 
Renat:

Não significa de forma alguma que o idioma seja o mesmo.

A única diferença é um pequeno conjunto de funções (em MT5 elas são melhores) e não há grandes custos para dominar.

Quanto a "Não quero perder meu tempo" e "Preciso dele ontem", gostaria de lembrar que uma plataforma de negociação é uma ferramenta importante para aumentar a eficiência de um comerciante. Quando há uma solução conscientemente mais eficaz e funcional por perto, não usá-la é prejudicar-se e enganar-se com mitos inventados.

Basta comparar os testadores de estratégias comerciais para esquecer a MT4 para sempre. Eu não estou brincando e não estou exagerando - é real.

Renat, quão difícil é equiparar um testador mt4 com um testador mt5?
 
Renat:

Isto é um mito e você sabe disso.

Vamos pegar o ATR.mq4 padrão do MetaTrader 4. Existem 104 linhas ali:


Vamos pegar ATR.mq5 do MetaTrader 5. São 96 linhas.


Não há diferença no tamanho de 104 vs 96 linhas, e até mesmo a vantagem vai para a MQL5.

É assim que as pessoas transferem bobagens e mitos de fórum para fórum.

Minha pergunta é que o mesmo indicador em mql4 me levou uma hora para escrever, e levei uma semana para dominar a escrita do mesmo código em mql5... Não é o número de citações, é o entendimento de abordagens de programação.

Quão diferente é a função de obter o valor do indicador padrão em mql4 da mesma função em mql5... Eu quase perdi a cabeça quando estava lidando com isso. É claro que você pode oferecer cursos em programação, mas você tem que considerar outros fatores que podem não permitir que você vá a tais cursos... E o custo, e a idade, e a distância do local ou o custo do tráfego no caso do aprendizado on-line ... Você nunca sabe...

 
AlexeyVik:
Renat, quão difícil é equiparar o testador mt4 com o testador mt5?
Não vamos tocar em 4, apenas na parte de serviço de integração com a MQL5.community.
 
Renat:
Não tocaremos no Quarteto, apenas na parte de serviço de integração com a MQL5.community.
Eu nem perguntei se você vai fazer isso, então eu adivinhei que não vai. Eu perguntei se é difícil...
 
AlexeyVik:

Não era isso que eu estava dizendo, estava dizendo que escrevi o mesmo indicador no mql4 em uma hora, e levei uma semana para aprender a escrever o mesmo código no mql5... Não é o número de citações, é o entendimento de abordagens de programação.

Quão diferente é a função de obter o valor do indicador personalizado em mql4 da mesma função em mql5 ... Eu tenho estado quase louco tentando descobrir. É claro que você pode oferecer cursos em programação, mas você tem que considerar outros fatores que podem não permitir que você vá a tais cursos... E o custo, e a idade, e a distância do local ou o custo do tráfego no caso do aprendizado on-line ... Você nunca sabe...

Compare os dois arquivos e você encontrará as diferenças mínimas.

Sobre o "uma semana para pegar o jeito, quase enlouqueceu" - é uma palavra vermelha no fórum. É assim que nascem os mitos.

 
AlexeyVik:
Somente o idioma nele é tão diferente que não é preciso pouco tempo para dominá-lo.
Que se lixe isso. Um mês foi suficiente.
 
Renat:

Compare os dois arquivos e você encontrará diferenças mínimas.

A frase "uma semana para apanhar o jeito, eu quase enlouqueci" é apenas uma frase de letras vermelhas no fórum. É assim que nascem os mitos.

Não vou provar que esta é a verdade. Para uma pessoa que não está familiarizada com a programação C++ e geralmente OOP, é bastante difícil e não é de todo por causa de palavras vermelhas ou da criação de um mito. Por mais estranho que pareça, entendi tudo em uma semana e escrevi o que precisava. E este é um mito completamente diferente; ele mostra que o mql5 pode ser facilmente dominado mesmo por não-profissionais, como eu.