Тестер, поддерживающий МГ4-скрипты и советников - страница 2

 
AlexeyVik:

Ну может создателям и не видно таких трудностей с которыми сталкиваются рядовые программисты.

Например я когда-то в институте изучал бейсик и больше ничего... А mql4 пришлось изучать самостоятельно, в нём у меня сейчас проблем нет никаких. А попытался разобраться в mql5 так один простейший индикатор, меньше 100 строк вместе с шапкой, писал почти неделю. На мой взгляд разница есть и разница существенная.

Это миф и вы это знаете.

Берем штатный ATR.mq4 из MetaTrader 4. Там 104 строки:

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


Берем такой же ATR.mq5 из MetaTrader 5. там 96 строк.

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


Разницы в размерах нет 104 vs 96 строк, даже преимущество на стороне MQL5.

Вот так люди и переносят из форума в форум глупости и мифы.

 
Renat:

Нисколько означает, что язык один и тот же.

Различие только в небольшом наборе функций (в МТ5 они лучше) и никаких серьезных расходов на освоение нет.

Про "не хочу тратить время" и "надо вчера" хочу напомнить, что торговая платформа - это важный инструмент повышения эффективности трейдера. Когда рядом есть заведомо более эффективное и функциональное решение, то не пользоваться им - это вредить себе и обманывать себя придуманными мифами.

Достаточно сравнить тестеры торговых стратегий, чтобы навегда забыть про МТ4. Я не шучу и не перегибаю палку - это реально так.

Глупейший принцип суммирования позиций в МТ5 (а это значит невозможность безо всяких ухищрений огранизовать одновременную работу нескольких МТС на одном символе и на одном счёте) навсегда отбил желание на нём торговать. Даже когда брокеров, предоставляющих МТ5 на реале будет побольше, чем пальцев на руках.

А переписывать код под МТ5 только ради тестера - уж извините, но это абсурд.

 
evillive:

Глупейший принцип суммирования позиций в МТ5 (а это значит невозможность безо всяких ухищрений огранизовать одновременную работу нескольких МТС на одном символе и на одном счёте) навсегда отбил желание на нём торговать. Даже когда брокеров, предоставляющих МТ5 на реале будет побольше, чем пальцев на руках.

Нисколько не глупейший.

Столько раз объяснялись преимущества, что повторять не хочу. Также неоднократно я объяснял, почему "несколько МТС на одном символе - это самообман, убытки и нереальная ситуация для массового использования".


А переписывать код под МТ5 только ради тестера - уж извините, но это абсурд.

Это не абсурд.

Вы сами себе урезаете возможности и упускаете шансы на развитие. Доказывать самому себе и окружающим, что заведомо более качественная, функциональная и мощная система хуже старой с кучей недостатков - это нанесение себе прямого вреда.

 
Renat:

Нисколько означает, что язык один и тот же.

Различие только в небольшом наборе функций (в МТ5 они лучше) и никаких серьезных расходов на освоение нет.

Про "не хочу тратить время" и "надо вчера" хочу напомнить, что торговая платформа - это важный инструмент повышения эффективности трейдера. Когда рядом есть заведомо более эффективное и функциональное решение, то не пользоваться им - это вредить себе и обманывать себя придуманными мифами.

Достаточно сравнить тестеры торговых стратегий, чтобы навегда забыть про МТ4. Я не шучу и не перегибаю палку - это реально так.

Ренат, а на сколько сложно тестер мт4 приравнять к тестеру мт5?
 
Renat:

Это миф и вы это знаете.

Берем штатный ATR.mq4 из MetaTrader 4. Там 104 строки:


Берем такой же ATR.mq5 из MetaTrader 5. там 96 строк.


Разницы в размерах нет 104 vs 96 строк, даже преимущество на стороне MQL5.

Вот так люди и переносят из форума в форум глупости и мифы.

Да не об этом я писал, а о том, что тот-же самый индикатор на mql4 я написал за час, а на освоение написания того-же кода на mql5 мне понадобилась неделя... Не в количестве сток дело, а в понимании подходов программирования...

На сколько отличается получение значения штатного индикатора в mql4 от того-же действа в mql5... Пока я с этим разобрался чуть с ума не спятил. Конечно можно предложить курсы по программированию, но надо ведь учитывать ещё и другие факторы которые могут не позволить пойти на такие курсы... И стоимость, и возраст, и удалённость от места проведения или стоимость трафика в случае онлайн обучения... Да мало-ли что...

 
AlexeyVik:
Ренат, а на сколько сложно тестер мт4 приравнять к тестеру мт5?
Четверку трогать не будем, только сервисную часть интеграции с MQL5.community.
 
Renat:
Четверку трогать не будем, только сервисную часть интеграции с MQL5.community.
Да я и не спрашивал будете-ли делать, так догадался что не будете. Спросил сложно-ли...
 
AlexeyVik:

Да не об этом я писал, а о том, что тот-же самый индикатор на mql4 я написал за час, а на освоение написания того-же кода на mql5 мне понадобилась неделя... Не в количестве сток дело, а в понимании подходов программирования...

На сколько отличается получение значения штатного индикатора в mql4 от того-же действа в mql5... Пока я с этим разобрался чуть с ума не спятил. Конечно можно предложить курсы по программированию, но надо ведь учитывать ещё и другие факторы которые могут не позволить пойти на такие курсы... И стоимость, и возраст, и удалённость от места проведения или стоимость трафика в случае онлайн обучения... Да мало-ли что...

Сравните два файла и найдете минимум отличий.

Про "неделю на освоение, чуть с ума не сошел" - это для красного словца на форуме. Так мифы и рождаются.

 
AlexeyVik:
Только язык в нём на столько отличается, что освоить его надо не малое количество времени.
Да ну нафиг. Месяца за глаза хватило.
 
Renat:

Сравните два файла и найдете минимум отличий.

Про "неделю на освоение, чуть с ума не сошел" - это для красного словца на форуме. Так мифы и рождаются.

Ну не стану я доказывать что это истинная правда. Для человека который не знаком с программированием на С++ и вообще ООП это достаточно сложно и совсем не для красного словца или рождения мифа. Как ни странно, я за неделю в этом разобрался и написал то что было надо. И это совсем другой миф, это говорит о том, что освоение mql5 доступно даже не профессионалам, таким как я.
Причина обращения: