Новая версия платформы MetaTrader 5 build 2650: Фоновая загрузка графиков и улучшения в профилировщике MQL5-кода - страница 38

 
fxsaber:

Это правильное поведение?

Если и правильное в смысле "так и задумано", но неправильное по логике, ИМХО. Слишком во многих нужных случаях выдаётся Expression could not be evaluated.

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

 
Vladimir Karputov:


Запускаю и как скрипт в редакторе MetaEditor и в jupyter notebook. 


Не получается распечатать первые пять строк объекта DataFrame.

Беру скрипт из поставки 'data folder'\Scripts\Python\copy_rates_from.py' и добавляю строки:

# выведем пять первых строк (метод 'head' pandas)
print("\nВыведем пять первых строк")
rates_frame.head()

а метод ничего не выводит:

Попробуй

# выведем пять первых строк (метод 'head' pandas)
print("\nВыведем пять первых строк")
print(rates_frame.head())

Результат

Выведем пять первых строк
         time     open     high      low    close  tick_volume  spread  real_volume
0  1578484800  1.11384  1.11386  1.11110  1.11200        12101       0            0
1  1578499200  1.11200  1.11308  1.11087  1.11180        13243       0            0
2  1578513600  1.11180  1.11180  1.11018  1.11041         5709       0            0
3  1578528000  1.11053  1.11194  1.11033  1.11174         4409       0            0
4  1578542400  1.11174  1.11190  1.11126  1.11183         2964       0            0

Такие вопросы нужно задавать в соответствующей ветке. Например в  https://www.mql5.com/ru/forum/306688/page78

MetaTrader 5 Python User Group - как использовать Python в Метатрейдере
MetaTrader 5 Python User Group - как использовать Python в Метатрейдере
  • 2020.11.07
  • www.mql5.com
Мы готовим модуль MetaTrader 5 для Python...
 

Смена свойств чарта привела к жутким тормозам Терминала. Загружено стало только одно ядро на полную катушку - 13% от 8-ми ядер.

GUI очень сильно тормозило. Сохранил шаблон для воспроизведения и перезагрузил Терминал.

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


ЗЫ Получилось воспроизвести на боевом советнике. Совсем не входило в планы тратить время на выяснение причин. Похоже, придется.

 
fxsaber:

ЗЫ Получилось воспроизвести на боевом советнике. Совсем не входило в планы тратить время на выяснение причин. Похоже, придется.

Для воспроизведения запустить на тикающем чарте этот советник.

class CHART_BASE
{
public:  
  static const ENUM_CHART_PROPERTY_INTEGER IndexInteger[];
};

static const ENUM_CHART_PROPERTY_INTEGER CHART_BASE::IndexInteger[] = {CHART_SHOW_OHLC, CHART_SHOW_GRID, CHART_SHOW_VOLUMES,
                                                                       CHART_SHOW_DATE_SCALE, CHART_SHOW_PRICE_SCALE, CHART_SCALEFIX};

class CHART : private CHART_BASE
{  
private:      
  bool FlagOn;
  
  long PropertyInteger[sizeof(CHART_BASE::IndexInteger) / sizeof(ENUM_CHART_PROPERTY_INTEGER)];

  void Remember( void )
  {
    for (int i = sizeof(CHART::IndexInteger) / sizeof(ENUM_CHART_PROPERTY_INTEGER) - 1; i >= 0; i--)
      this.PropertyInteger[i] = ::ChartGetInteger(this.ChartId, CHART::IndexInteger[i]);
      
    this.FlagOn = true;
      
    return;
  }

public:
  const long ChartId;
  
  CHART( const int iChartId = 0 ) : ChartId(iChartId)
  {
    this.Remember();
  }
  
  ~CHART( void )
  {
    this.On();
  }
  
  void On( void )
  {
    for (int i = sizeof(CHART::IndexInteger) / sizeof(ENUM_CHART_PROPERTY_INTEGER) - 1; i >= 0; i--)
      ::ChartSetInteger(this.ChartId, CHART::IndexInteger[i], this.PropertyInteger[i]);
      
    ::ChartRedraw(this.ChartId);
    
    this.FlagOn = true;
      
    return;  
  }
  
  void Off( void )
  {
    this.Remember();

    ::ChartSetInteger(this.ChartId, CHART_SHOW_OHLC, false);    
    ::ChartSetInteger(this.ChartId, CHART_SHOW_GRID, false);    
    ::ChartSetInteger(this.ChartId, CHART_SHOW_VOLUMES, false);    
    ::ChartSetInteger(this.ChartId, CHART_SHOW_DATE_SCALE, false);    
    ::ChartSetInteger(this.ChartId, CHART_SHOW_PRICE_SCALE, false);    
    
    ::ChartSetInteger(this.ChartId, CHART_SCALEFIX, true);    
    ::ChartSetDouble(this.ChartId, CHART_FIXED_MAX, ::ChartGetDouble(this.ChartId, CHART_PRICE_MAX) * 1e3);
    ::ChartSetDouble(this.ChartId, CHART_FIXED_MIN, ::ChartGetDouble(this.ChartId, CHART_PRICE_MIN) * 1e3);

    ::ChartRedraw(this.ChartId);
    
    this.FlagOn = false;
        
    return;
  }
  
  void Swap( void )
  {
    if (this.FlagOn)
      this.Off();
    else
      this.On();
      
    return;
  }
};

#include <fxsaber\Expert.mqh> // https://www.mql5.com/ru/code/19003

#define KEY_R 82
#define KEY_C 67

void OnChartEvent( const int id, const long &lparam, const double&, const string& ) 
{
  static CHART Chart;
      
  if (id == CHARTEVENT_KEYDOWN) 
  { 
    if (lparam == KEY_R)
      EXPERT::Reopen();
    else if (lparam == KEY_C)
      Chart.Swap();
  }
}


Шаги для воспроизведения.

  1. После запуска в англоязычной раскладке нажать на чарте клавишу 'C' - чарт погаснет.
  2. Нажать 'R' - советник перегрузится.
  3. Дождаться нового тика по символу чарта.
  4. Около десяти раз нажать на клавишу 'C'.

После этих действий Диспетчер задач будет показывать полную нагрузку одного ядра. GUI-Терминала будет тормозить (например, нажатия ПКМ) до тех пор, пока не будет закрыт чарт.

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



Напишите о результатах воспроизведения. На моей конфигурации используется интегрированная в CPU-Intel видеокарта.

Строка для поиска: Oshibka 014.

 
Bug spotted.

Steps:

1. Create an indicator with a failing initialization code. ie: INIT_FAILED
2. Launch the indicator on chart, then wait for the init to fail. If it does, launch it again.

There you go! The return codes don't imply a thing. Tested on builds 2651 and build 2670.

NB: Tested while offline. I don't know if connection status might change a thing.
The Indicator stayed on chart and performed an action on a relaunch. Clearly, it's initialization suceeded.
 
Nelson Wanyama:
Bug spotted.

Steps:

1. Create an indicator with a failing initialization code. ie: INIT_FAILED
2. Launch the indicator on chart, then wait for the init to fail. If it does, launch it again.

There you go! The return codes don't imply a thing. Tested on builds 2651 and build 2670.

NB: Tested while offline. I don't know if connection status might change a thing.
The Indicator stayed on chart and performed an action on a relaunch. Clearly, it's initialization suceeded.

Где MQL5 код? Как воспроизвести? Покажите MQL5 код.

 

Как и панель инструментов и тестер, его окно можно свести к одной экономящей место строке, при этом на панели инструментов будет отображаться важная информация.

Редактор показывает только и всегда Терминал - Терминал?

Невозможно ли отобразить первую строку ошибок компилятора?

Like the Toolbox and the Tester, its window can be reduced to one space-saving line, with the Toolbox displaying important information.

The editor shows only and always Terminal - Terminal?

Couldn't you display the first line of the compiler errors?


 

Версия 2670

2020.11.11 09:21:14.553 Terminal        MetaTrader 5 x64 build 2670 started for MetaQuotes Software Corp.
2020.11.11 09:21:14.553 Terminal        Windows 7 Service Pack 1 build 7601, AMD FX-4170 Quad-Core Processor, 9 / 11 Gb memory, 112 / 465 Gb disk, IE 11, Admin, GMT+3

не отключается автопрокрутка ленты всех сделок. Точнее при отключенной автопрокрутке строки продолжают бежать. Это баг или так задумано?


 
fxsaber:

Для воспроизведения запустить на тикающем чарте этот советник.

    После этих действий Диспетчер задач будет показывать полную нагрузку одного ядра. GUI-Терминала будет тормозить (например, нажатия ПКМ) до тех пор, пока не будет закрыт чарт.

    Напишите о результатах воспроизведения. На моей конфигурации используется интегрированная в CPU-Intel видеокарта.

    Надеюсь, руки дошли проверить.

     

    Build 2675

    Создание скрипта по шаблону. Что за строчка?

    //+------------------------------------------------------------------+
    //|                                                  test_script.mq5 |
    //|                                             Copyright 2020, MQL5 |
    //|                                            https://www.mql5.com/ |
    //+------------------------------------------------------------------+
    #property copyright "Copyright 2020, MQL5"
    #property link      "https://www.mql5.com/"
    #property version   "1.00"
    #strict#
    //+------------------------------------------------------------------+
    //| Script program start function                                    |
    //+------------------------------------------------------------------+
    void OnStart()
      {
    //---
       
      }
    //+------------------------------------------------------------------+