МТ4 или МТ5. Какие преимущества и недостатки? - страница 31

 
Pavel Verveyko:

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

Странно.

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

Pavel Verveyko:

примеров приводить не буду, скажу одно каждый раз приходится мудрить в 5 как там это работает(
пишу сначала на 4, потому как проверяю поэтапно каждый блок и хочу быть уверен, что если, что то не так, то это я не так написал; с 5 такой уверенности до сих пор нет(
если за "одинаковостью" нужно специально следить разве это одинаково..

Тоже странно, если КАЖДЫЙ РАЗ мудришь - то легко можешь привести пример такой разности работы. Я вот, кроме как вышеупомянутую функцию объединения строк - и припомнить ничего не могу.

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

Хотелось бы поглядеть на пример кода, который будет работать на пятерке иначе, чем на четверке.

Я уж не говорю, что писать изначально надо на пятерке, и потом - проверять на четверке (хотя, когда написаны кроссплатформенные классы - даже этого не надо).

 

я тут подумал , может я просто не занимался "кроссплатформенностью" целенаправленно отсюда такое отношение.
и я Вас ввёл в заблуждение, извините) - мелкие функции имел ввиду мои написанные функции которые за счёт разности программ работают иначе. речь не о функциях языка.
разница в том что это разные программы в которых различия: в 5 нужно специально подготавливать данные, индикаторные массивы в разную сторону, в 5 отсутствуют не которые функции которые указаны в этой статье https://www.mql5.com/ru/articles/81 , раньше было замечено что 4 не так критична воспринимает отсутствие например ChartRedrow я сейчас уже так не вспомню остальное(
я вот всерьёз задумался а может и правда продумать все различия в языках и вписать на уровне препроцессора.

я так понимаю это нужно вписать в двух вариантах- организация предопределённых переменных, направлений массивов в индикаторах если нужно конечно (я привык как в 4), получение данных из индикаторов, функции которых нет в 5, и использование одинаковых торговых классов из библиотеки. и тогда будет кросс платформенный код, верно или что то ещё нужно? и не использовать функции ObjectGet то есть без типа в имени так как в 5 такой нет.


а вот пример - код компилируется в обоих компиляторах. 
(белая рамка перемещается мышью за ней синхронно двигается чёрный квадрат)
но в MT5 так не работает расстояние нарушается  (значит где то есть разница в обработке функций)
#property strict
#property indicator_chart_window
#property indicator_plots 0
string Common_List = "Common_List";
string Other_List = "Other_List";
int x_common_list = 452;
int y_common_list = 30;
int x_other_list = 482;
int y_other_list = 70;
long x_memory = x_common_list;
long y_memory = y_common_list;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{
   ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,0,true);

   if (ObjectCreate(0,Common_List,OBJ_RECTANGLE_LABEL,0,0,0))   
   {
      ObjectSetInteger(0,Common_List,OBJPROP_XDISTANCE,x_common_list);                  
      ObjectSetInteger(0,Common_List,OBJPROP_YDISTANCE,y_common_list);                    
      ObjectSetInteger(0,Common_List,OBJPROP_XSIZE,400);              
      ObjectSetInteger(0,Common_List,OBJPROP_YSIZE,400);              
      ObjectSetInteger(0,Common_List,OBJPROP_BGCOLOR,Gray);        
      ObjectSetInteger(0,Common_List,OBJPROP_BORDER_TYPE,BORDER_FLAT); 
      ObjectSetInteger(0,Common_List,OBJPROP_CORNER,CORNER_LEFT_UPPER); // 
      ObjectSetInteger(0,Common_List,OBJPROP_COLOR,White);                   
      ObjectSetInteger(0,Common_List,OBJPROP_STYLE,STYLE_SOLID);              
      ObjectSetInteger(0,Common_List,OBJPROP_WIDTH,3);                      
      ObjectSetInteger(0,Common_List,OBJPROP_BACK,false);            
      ObjectSetInteger(0,Common_List,OBJPROP_SELECTABLE,true); 
      ObjectSetInteger(0,Common_List,OBJPROP_SELECTED,true);
   } 
      
   if (ObjectCreate(0,Other_List,OBJ_RECTANGLE_LABEL,0,0,0))    
   {
      ObjectSetInteger(0,Other_List,OBJPROP_XDISTANCE,x_other_list);                   
      ObjectSetInteger(0,Other_List,OBJPROP_YDISTANCE,y_other_list);               
      ObjectSetInteger(0,Other_List,OBJPROP_XSIZE,100);              
      ObjectSetInteger(0,Other_List,OBJPROP_YSIZE,100);            
      ObjectSetInteger(0,Other_List,OBJPROP_BGCOLOR,Black);      
      ObjectSetInteger(0,Other_List,OBJPROP_BORDER_TYPE,BORDER_FLAT); 
      ObjectSetInteger(0,Other_List,OBJPROP_CORNER,CORNER_LEFT_UPPER);   
      ObjectSetInteger(0,Other_List,OBJPROP_COLOR,White);                    
      ObjectSetInteger(0,Other_List,OBJPROP_STYLE,STYLE_SOLID);               
      ObjectSetInteger(0,Other_List,OBJPROP_WIDTH,1);                      
      ObjectSetInteger(0,Other_List,OBJPROP_BACK,false);             
   } 

   ChartRedraw(0);                                               

   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   ObjectDelete(0,Other_List);
   ObjectDelete(0,Common_List);
   ChartRedraw(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
{
   return(rates_total);
}
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
{
   switch (id)
   {
      case CHARTEVENT_MOUSE_MOVE:
      {
         if (ObjectGetInteger(0,Common_List,OBJPROP_SELECTED))
         {                   
         
            long x_div = ObjectGetInteger(0,Common_List,OBJPROP_XDISTANCE,0)-x_memory;
            long y_div = ObjectGetInteger(0,Common_List,OBJPROP_YDISTANCE,0)-y_memory;     
                  
            ObjectSetInteger(0,Other_List,OBJPROP_XDISTANCE,ObjectGetInteger(0,Other_List,OBJPROP_XDISTANCE)+x_div);
            ObjectSetInteger(0,Other_List,OBJPROP_YDISTANCE,ObjectGetInteger(0,Other_List,OBJPROP_YDISTANCE)+y_div);

            x_memory = ObjectGetInteger(0,Common_List,OBJPROP_XDISTANCE,0);
            y_memory = ObjectGetInteger(0,Common_List,OBJPROP_YDISTANCE,0);

            ChartRedraw(0);
         }      
         break;
      }
   } 
}
//+------------------------------------------------------------------+
Переход с MQL4 на MQL5
Переход с MQL4 на MQL5
  • 2010.05.11
  • Sergey Pavlov
  • www.mql5.com
Данная статья, построенная в форме справочника по функциям MQL4, призвана помочь переходу с MQL4 на MQL5. Для каждой функции языка MQL4 приведено описание и представлен способ ее реализации на MQL5, что позволит вам значительно ускорить перевод своих программ с MQL4 на MQL5. Для удобства функции разбиты на группы, как в документации по MQL4.
 

кстати, меня в последнее время очень часто просят написать кроссплатформенный код

при навыке никаких проблем

 
Alexey Volchanskiy:

кстати, меня в последнее время очень часто просят написать кроссплатформенный код

при навыке никаких проблем

это один   [ √ ]   перетекания сообщества из MQL4 в MQL5

 

думал куда написать .. решил сюда) 

в справке 4 и 5 отличается ADX : в 5 нельзя выбрать по какой цене будет построен индикатор,
1 это ошибка?
2 по какой цене строится индикатор в мт5?

мт4

double  iADX(
   string       symbol,        // имя символа
   int          timeframe,     // таймфрейм
   int          period,        // период усреднения
   int          applied_price, // используемая цена
   int          mode,          // источник данных
   int          shift          // сдвиг
   );

мт5

int  iADX( 
   string           symbol,         // имя символа 
   ENUM_TIMEFRAMES  period,         // период 
   int              adx_period      // период усреднения 
   );
 
Pavel Verveyko:

думал куда написать .. решил сюда) 

в справке 4 и 5 отличается ADX : в 5 нельзя выбрать по какой цене будет построен индикатор,
1 это ошибка?
2 по какой цене строится индикатор в мт5?

мт4

мт5


По этому поводу задавал вопрос в СД (2017.05.03 18:23#1734753). Ответа нет до сих пор.

 
Правильно ли я понимаю, что единственное (если глобально) что осталось аргументом противников 5-ки и оспаривается много лет, это то что поднималось давно в этой ветке ниже? То есть возможность создавать свои фреймы, в том числе и из тиков. Я так понимаю, что это единственная причина по которой если и уходят к менее "технологичным" конкурентам, то только из-за того что там это реализовано. Так почему бы тогда не решить этот многолетний спор окончательно подвинув конкурентов, сделав тоже самое. В чём причина принципиальности. 

  Может я чего не понимаю. И это решение нивелирует ряд других преимуществ. Или что ещё. Трата времени не считается, так как прошли уже годы, можно было внедрить не раз. 

  Понятно что всё реализуемо самим пользователем, если захотеть. Но уходят к конкурентам ведь именно потому что там это реализовано уже. Даже если вцелом качество продукта хуже.

Создание таймфрейма вручную?
Создание таймфрейма вручную?
  • 2010.06.11
  • www.mql5.com
В итоге вижу просто расширенный набор :( Есть ли какая-нибудь возможность например создать график с периодом в 288 минут?
 
ILNUR777:
Правильно ли я понимаю, что единственное (если глобально) что осталось аргументом противников 5-ки и оспаривается много лет, это то что поднималось давно в этой ветке ниже?

Нет.

Тамошний спор так, на уровне "хочется странного, а вы должны его сделать". Ничего не меняется, разве что поводов на самом деле становится меньше.

 
Renat Fatkhullin:

Нет.

Тамошний спор так, на уровне "хочется странного, а вы должны его сделать". Ничего не меняется, разве что поводов на самом деле становится меньше.

 Так я именно об этом и говорю. Осталась глобально лишь одна единственная хотелка со стороны "противников".  Если эта хотелка глобально не отменяет многие достижения в новом мт5, то может дать им то что они хотят и покончить окончательно со спорами. Только это и отличает от конкурентов, писал выше.

 Сути не могу понять. Это техническая сторона, принципиальная позиция, или есть другие причины. Ведь все биржевые конкуренты именно этим и отличаются. Ведь сложно представить биржевой терминал без этого. 
 
 В свою очередь мне интересно следующее. Возможность делать такие фреймы, которые они просят в ветке выше, которые есть у конкурентов-это атавизм, который скоро исчезнет за ненадобностью. Потому что основная масса пока не понимает что в будущем это не будет давать никакого преимущества. Или же нет. То есть Вы видите глобально будущее, в котором актуальны данные лишь с минутных фреймов и выше? Просто такое будущее для бирж немного шокирует. 
 
Pavel Verveyko:

думал куда написать .. решил сюда) 

в справке 4 и 5 отличается ADX : в 5 нельзя выбрать по какой цене будет построен индикатор,
1 это ошибка?
2 по какой цене строится индикатор в мт5?

мт4

мт5

1) Это не ошибка.

В MetaTrader 5 у стандартных индикаторов мы убрали встроенные костыли с лишними параметрами. Кроме того, индикаторные iXXX функции в MQL5 стали конструкторами и потеряли возможность выдавать фактические данные, так как возвращают хендл.

Сами данные индикаторов извлекаются через массовые CopyBuffer функции с указанием хендла индикатора и требуемых буферов. Упор делается именно на возможность сразу извлечь большой массив (100, 1000, 1000) результатов, а не лазать затратно за каждым значением вглубь iXXX функций, как это делается в МТ4.


2) ADX вычисляется на основе +DI, -DI, которые в свою очередь фиксированны по логике вычислений (high, low, close) и не имеют возможности выбирать от чего считать.

В поставке MetaTrader 5 есть полный исходный код ADX в MQL5\Indicators\Examples\ADX.mq5

Average Directional Movement Index - Трендовые индикаторы - Использование технических индикаторов - Графики котировок, технический и фундаментальный анализ - Справка по MetaTrader 5
Average Directional Movement Index - Трендовые индикаторы - Использование технических индикаторов - Графики котировок, технический и фундаментальный анализ - Справка по MetaTrader 5
  • www.metatrader5.com
Технический индикатор Индекс Среднего Направления Движения (Average Directional Movement Index, ADX) помогает определить наличие ценовой тенденции. Он построен на подходах, описанных в книге "Новые концепции технических торговых систем" Уэллса Уайлдера. Простейший метод торговли на основе системы направленного движения предполагает сравнение...
Причина обращения: