Tester di supporto agli script e ai consulenti MG4 - pagina 2

 
AlexeyVik:

Beh, forse i creatori non vedono il tipo di difficoltà che i normali programmatori affrontano.

Per esempio, io studiavo BASIC all'università e nient'altro. Ho provato a usare mql4 ma ora non ho problemi con esso. Quando ho provato a usare mql5, ho scritto un semplice indicatore con meno di 100 linee insieme a un cappello indicatore mql5. Secondo me c'è una differenza e la differenza è significativa.

Questo è un mito e tu lo sai.

Prendiamo l'ATR.mq4 standard di MetaTrader 4. Ci sono 104 linee lì:

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


Prendiamo ATR.mq5 da MetaTrader 5. Ha 96 linee.

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


Non c'è differenza nella dimensione di 104 contro 96 linee, anche il vantaggio è dalla parte di MQL5.

È così che la gente trasferisce sciocchezze e miti da un forum all'altro.

 
Renat:

Non significa affatto che la lingua sia la stessa.

La differenza è solo in un piccolo insieme di funzioni (MT5 ne ha di migliori) e non ci sono grandi costi da padroneggiare.

Per quanto riguarda "non voglio perdere tempo" e "ne ho bisogno ieri", vorrei ricordare che una piattaforma di trading è uno strumento importante per aumentare l'efficienza di un trader. Quando c'è una soluzione ovviamente più efficace e funzionale, non usarla è un autolesionismo e un autoinganno con miti inventati.

È sufficiente per confrontare i tester di strategie di trading per dimenticare MT4 per sempre. Non sto scherzando e non sto esagerando - è reale.

Il principio più stupido della somma delle posizioni in MT5 (e questo significa l'impossibilità di limitare il funzionamento simultaneo di più MTS su un simbolo e un conto senza trucchi) ha scoraggiato per sempre il trading su di esso. Anche quando ci saranno più broker che forniscono MT5 sul reale di quante siano le dita sulle mani.

E riscrivere il codice per MT5 solo per il bene di un tester - mi dispiace, ma è assurdo.

 
evillive:

Il principio più stupido della somma delle posizioni in MT5 (che significa l'impossibilità di limitare l'operazione simultanea di più MTS su un simbolo e su un conto senza trucchi) ha scoraggiato per sempre il trading su di esso. Anche quando ci saranno più broker che forniscono MT5 sul reale di quante dita ci siano sulle mani.

Non è affatto assurdo.

I vantaggi sono stati spiegati così tante volte che non voglio ripeterli. Ho anche spiegato ripetutamente perché "più MTS su un singolo simbolo è autodistruttivo, una perdita e una situazione irrealistica per l'uso di massa".


E riscrivere il codice per MT5 solo per il bene di un tester - mi dispiace, ma è assurdo.

Non è assurdo.

State riducendo le vostre opportunità e perdendo le possibilità di sviluppo. Dimostrare a se stessi e agli altri che un sistema consapevolmente migliore, più funzionale e potente è peggiore di uno vecchio con un mucchio di difetti è fare un danno diretto.

 
Renat:

Non significa affatto che la lingua sia la stessa.

L'unica differenza è un piccolo insieme di funzioni (in MT5 sono migliori) e non ci sono grandi costi da padroneggiare.

Per quanto riguarda "non voglio perdere tempo" e "ne ho bisogno ieri", vorrei ricordare che una piattaforma di trading è uno strumento importante per aumentare l'efficienza di un trader. Quando c'è una soluzione consapevolmente più efficace e funzionale nelle vicinanze, non usarla significa farsi del male e ingannarsi con miti inventati.

È sufficiente per confrontare i tester di strategie di trading per dimenticare MT4 per sempre. Non sto scherzando e non sto esagerando - è reale.

Renat, quanto è difficile equiparare un tester mt4 a un tester mt5?
 
Renat:

Questo è un mito e tu lo sai.

Prendiamo l'ATR.mq4 standard di MetaTrader 4. Ci sono 104 linee lì:


Prendiamo ATR.mq5 da MetaTrader 5. Sono 96 linee.


Non c'è differenza nella dimensione di 104 vs 96 linee, e anche il vantaggio va a MQL5.

È così che la gente trasferisce sciocchezze e miti da un forum all'altro.

La mia domanda è che lo stesso indicatore in mql4 mi ha preso un'ora per scriverlo, e mi ci è voluta una settimana per imparare a scrivere lo stesso codice in mql5... Non è il numero di citazioni, è la comprensione degli approcci di programmazione...

Quanto è diversa la funzione di ottenere il valore dell'indicatore standard in mql4 dalla stessa funzione in mql5... Ho quasi perso la testa quando ho avuto a che fare con questo. Certo, si possono offrire corsi di programmazione, ma bisogna considerare altri fattori che possono non permettere di andare a tali corsi... E il costo, e l'età, e la distanza dalla sede o il costo del traffico nel caso di apprendimento online ... Non si sa mai...

 
AlexeyVik:
Renat, quanto è difficile equiparare mt4 tester con mt5 tester?
Non toccheremo il 4, solo la parte di servizio dell'integrazione con MQL5.community.
 
Renat:
Non toccheremo il quartetto, solo la parte di servizio di integrazione con MQL5.community.
Non ti ho nemmeno chiesto se lo farai, quindi ho intuito che non lo farai. Ho chiesto se è difficile...
 
AlexeyVik:

Non è quello che stavo dicendo, stavo dicendo che ho scritto lo stesso indicatore su mql4 in un'ora, e mi ci è voluta una settimana per imparare a scrivere lo stesso codice su mql5... Non è il numero di citazioni, è la comprensione degli approcci di programmazione...

Quanto è diversa la funzione di ottenere il valore dell'indicatore personalizzato in mql4 dalla stessa funzione in mql5 ... Sono stato quasi pazzo a cercare di capirlo. Certo, si possono offrire corsi di programmazione, ma bisogna considerare altri fattori che possono non permettere di andare a tali corsi... E il costo, e l'età, e la distanza dalla sede o il costo del traffico nel caso di apprendimento online ... Non si sa mai...

Confrontate i due file e troverete le differenze minime.

Riguardo al "una settimana per prenderci la mano, quasi impazzito" - è una parola rossa sul forum. È così che nascono i miti.

 
AlexeyVik:
Solo che il linguaggio in esso è così diverso che ci vuole non poco tempo per padroneggiarlo.
Fanculo. Un mese è stato sufficiente.
 
Renat:

Confrontate i due file e troverete differenze minime.

Il "una settimana per prenderci la mano, sono quasi impazzito" è solo una frase da bollino rosso sul forum. È così che nascono i miti.

Non proverò che questa è la verità. Per una persona che non ha familiarità con la programmazione C++ e in generale OOP è piuttosto difficile e non per il gusto di parole rosse o la creazione di un mito. Per quanto possa sembrare strano, ho capito tutto in una settimana e ho scritto quello che mi serviva. E questo è un mito completamente diverso; dimostra che mql5 può essere facilmente padroneggiato anche da non professionisti, come me.