почему в MetaTrader 5 это не реализовано?

 

Здравствуйте. 

Можно ли вообще рассматривать MetaTrader как удобный терминал для ручного анализа, в особенности для скальперов?

1. Почему нет полноценного тикогого графика и производных 5сек,15 сек, 30сек?

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

2. Нельзя поставить масштабирование на колесико мыши.

3. Очень не удобно менять местоположение объектов на графике, маленькие квадратики.

4. далеко и неудобно лазить в настройки объектов, например, чтобы изменить цвет и толщину.

5. Нельзя создавать пользовательские объекты тех анализа.

Почему только через скрипты? 

Скрипт создает в списке объектов не один, а целую кучу объектов, да и управлять им сложнее.

 
Yudjin13:

Здравствуйте. 

Можно ли вообще рассматривать MetaTrader как удобный терминал для ручного анализа, в особенности для скальперов?

1. Почему нет полноценного тикогого графика и производных 5сек,15 сек, 30сек?

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

2. Нельзя поставить масштабирование на колесико мыши.

3. Очень не удобно менять местоположение объектов на графике, маленькие квадратики.

4. далеко и неудобно лазить в настройки объектов, например, чтобы изменить цвет и толщину.

5. Нельзя создавать пользовательские объекты тех анализа.

Почему только через скрипты? 

Скрипт создает в списке объектов не один, а целую кучу объектов, да и управлять им сложнее.

1. На сколько я понимаю, трансляция OHLC бара и тиков идет в разных пакетах, и на быстрых рынках компьютер может сильно подвисать, если набросать десяток индикаторов - пользователи начнут жаловаться... В итоге сделать то могут, но узким местом, как мне кажется, будет именно хотелка пользователя и претензии, что нецелесообразно. Хотя можно для подобных чартов сделать ограничение на глубину истории в пару тысяч баров...

2-4 не могу согласится - работа с объектами вполне на приемлемом уровне.

5. А как Вы себе представляете возможность создания пользовательского объекта тех анализа - как конструктор из склеек графических объектов - и где это вообще реализовано?

 
Aleksey Vyazmikin:

2-4 не могу согласится - работа с объектами вполне на приемлемом уровне.

5. А как Вы себе представляете возможность создания пользовательского объекта тех анализа - как конструктор из склеек графических объектов - и где это вообще реализовано?

Согласен, что приемлемый, но все познается в сравнении. Tradingview - совершенно другой уровень удобства.

Мне не хватает графических объектов, что есть в TV. Думал, что там есть пользовательские объекты, ошибся.

 
Aleksey Vyazmikin:

1. На сколько я понимаю, трансляция OHLC бара и тиков идет в разных пакетах, и на быстрых рынках компьютер может сильно подвисать, если набросать десяток индикаторов - пользователи начнут жаловаться... В итоге сделать то могут, но узким местом, как мне кажется, будет именно хотелка пользователя и претензии, что нецелесообразно. Хотя можно для подобных чартов сделать ограничение на глубину истории в пару тысяч баров...

На сколько известно, в мт5 OHLC бары строятся из минутных баров, а минутные бары из тиков.
Соответственно в мт5 поступают только тики. О каких разных пакетах речь? Разные пакеты как говорили в мт4.
И быстрые рынки не должны вешать программу, что это тогда за программа будет?
Вы возможно не знаете, что существует асинхронное программирование, распараллеливание потоков и т.д.
По этому узких мест для внедрения тут нет, получаем тики каждый канал в своем потоке, обрабатываем тики каждый канал в своем потоке, отправляем в историю каждый канал в своем потоке.
По сути так и поступают данные в мт5, только не реализован функционал для тиковых графиков.
Во многих биржевых терминалах есть тиковые графики, и прекрасно работают, хотя программы написаны на менее производительных языках.
Причина не реализации тиковых графиков, почему то покрыта тёмной тайной.
Хотя бы в кастомных символах добавили бы, временную разрядность для построения тиково-производных графиков, это исключило бы все просьбы о реализации тиковых графиков.
  

 
Yudjin13:

Согласен, что приемлемый, но все познается в сравнении. Tradingview - совершенно другой уровень удобства.

Мне не хватает графических объектов, что есть в TV. Думал, что там есть пользовательские объекты, ошибся.

Так и не раскрыли, что такое "Пользовательские объекты" - не понимаю.

 
Roman:

На сколько известно, в мт5 OHLC бары строятся из минутных баров, а минутные бары из тиков.

Если бы это было так, то терминал бы не закачивал тики, если требуется произвести тестирование по всем тикам. В общем сомневаюсь.

По остальным Вашим размышлениям - Вы не услышали, что я говорю о проблемах в случае использования пользовательских индикаторов.

А как известно, все индикаторы считаются в одном потоке по одному инструменту.

 
Yudjin13:

3. Очень не удобно менять местоположение объектов на графике, маленькие квадратики.


можно в настройках и увеличить линии

настраивать - навёл на линию  

URUSDH1 

а дальше советник работает. - как настроите или купит или продаст  

 
Aleksey Vyazmikin:

Если бы это было так, то терминал бы не закачивал тики, если требуется произвести тестирование по всем тикам. В общем сомневаюсь.

По остальным Вашим размышлениям - Вы не услышали, что я говорю о проблемах в случае использования пользовательских индикаторов.

А как известно, все индикаторы считаются в одном потоке по одному инструменту.

Перед тестированием, терминал проверяет наличие истории на запрошенный период тестирования.
Если данных не хватает, он их подгружает и начинает тест уже на полных данных. 

Тогда проблема не в хотелке пользователей, а в реализации архитектуры пользовательских индикаторов.
И если это является причиной не реализации тиковых графиков, из за переживания что начнут сыпаться претензии из за зависонов,
потому что пользователь навесил туеву кучу индикаторов на тиковый график, так это не пользователя проблема, это проблема разработчика, и не желание её решать.
Да, все индикаторы символа в одном потоке, это ошибочное решение. Индикатор должен рассчитываться так же как и эксперт, каждый в своём потоке.
Не пойму почему не решить проблему с потоками индикатора, тем самым открыть горизонт для дальнейшего расширения функционала, в виде тиковых графиков.
Разработчики, сделайте наконец тиковые графики! Решите проблему с потоками индикаторов!

 
Yudjin13:

2. Нельзя поставить масштабирование на колесико мыши.

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

вот код набросал, все в справке есть:

#property copyright "IgorM"
#property link      "https://www.mql5.com/ru/users/igorm"
#property version   "1.00"
#property indicator_chart_window
#property indicator_plots 0
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   ChartSetInteger(0,CHART_EVENT_MOUSE_WHEEL,1);
   ChartRedraw();
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| 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 value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
   if(id==CHARTEVENT_MOUSE_WHEEL)
     {
      int delta    = (int)dparam;
      int scale =(int)ChartGetInteger(0,CHART_SCALE);
      if(delta>0) scale++;
      if(delta<0) scale--;
      long firstbar = ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR);
      ChartSetInteger(0,CHART_SHOW,false);
      ChartSetInteger(0,CHART_SCALE,fmax(fmin(scale,5),0));
      ChartSetInteger(0,CHART_FIRST_VISIBLE_BAR,firstbar);
      ChartRedraw();
      ChartSetInteger(0,CHART_SHOW,true);
     }
  }
//+------------------------------------------------------------------+


по сабжу, ну просто нужно понимать основную концепцию МТ которую разработчики заложили в свой продукт :

вот лист бумаги и фломастеры, разукрашивайте сами 

вот нотный стан, пишите ноты и будет у Вас музыка, не умеете писать музыку, обратитесь к композиторам во фриланс!

 

масштабирование с помощью колесика мыши.

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

автопрокрутка выключена, отступ тоже. масштабирование по самой левой свече происходит.


#property copyright "123"
#property link      "123"
#property version   "1.00"
#property indicator_chart_window
#property indicator_plots 0

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   ChartSetInteger(0,CHART_EVENT_MOUSE_WHEEL,1);
   ChartSetInteger(0,CHART_AUTOSCROLL,0);
   ChartSetInteger(0,CHART_SHIFT,0);
   ChartRedraw();   
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| 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)
  {
   //Alert("123",id);
   if(id==CHARTEVENT_MOUSE_WHEEL)
     {
      ChartRedraw();
      int first_bar=(int)ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR); //номер первого бара после прокрутки мышкой
      int width_bars=(int)ChartGetInteger(0,CHART_WIDTH_IN_BARS);    //сколько свечей вмещаются на графике. нужно в формуле рассчета смещения ChartNavigate
      int scroll_shift_bars=0; //количество баров, на которое сместился график из-за скроллинга колесом мыши. При разном Scale - разное количество баров. скроллинг колесом не отключить(метатрейдовцы редиски)
      switch((int)ChartGetInteger(0,CHART_SCALE))
        { 
         case 0 :
            scroll_shift_bars = dparam>0 ? -128 : 128; break;
         case 1 :
            scroll_shift_bars = dparam>0 ? -64 : 64; break;           
         case 2 :
            scroll_shift_bars = dparam>0 ? -32 : 32; break;
         case 3 :
            scroll_shift_bars = dparam>0 ? -16 : 16; break;
         case 4 :
            scroll_shift_bars = dparam>0 ? -8 : 8; break;
         case 5 :
            scroll_shift_bars = dparam>0 ? -4 : 4; break;                                          
        }
      ChartNavigate(0,CHART_END,0+scroll_shift_bars-first_bar+(width_bars-2));  
      ChartRedraw();
      first_bar=(int)ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR);
      
      //-- Изменение масштаба      
      int delta    = (int)dparam;
      int scale =(int)ChartGetInteger(0,CHART_SCALE);
      if(delta>0) scale++;
      if(delta<0) scale--;
      ChartSetInteger(0,CHART_SHOW,false);
      ChartSetInteger(0,CHART_SCALE,fmax(fmin(scale,5),0));
      ChartRedraw();
      ChartSetInteger(0,CHART_SHOW,true);

      
      //--после изменения масштаба первый бар съезжает и нужно возвращать:
      width_bars=(int)ChartGetInteger(0,CHART_WIDTH_IN_BARS); 
      ChartNavigate(0,CHART_END,0-first_bar+(width_bars-3));
      ChartRedraw(); 
     } 
  }
//+------------------------------------------------------------------+

Причина обращения: