Новая версия платформы MetaTrader 5 build 4230: больше встроенных приложений и расширение поддержки ONNX - страница 6

 

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

Почему в свойствах финансового инструмента невозможно задать нулевой спред?

Если Мы ставим значение 0 оно заменяется на плавающий.

Так быть не должно. Прошу предоставить возможность ставить четко спред 0.

Разобрался, указывать спред в ручную бесполезно оно просто не работает.

Пробовал поставить 1 и 500 спред все равно рыночный из истории...

 
A100 #:

Далее:

Нажимаем Ctrl

Результат: GetKeyState меняет значение, а TERMINAL_KEYSTATE_CONTROL - нет

Ожидалось: одинаковое поведение

В справке написано, что TERMINAL_KEYSTATE_CONTROL  возвращает состояние клавиши "Ctrl"

там же в справке: вызов TerminalInfoInteger(TERMINAL_KEYSTATE_XXX) возвращает такой же код состояния клавиши, как и функция GetKeyState() из MSDN.

Значит и сравнивать нужно состояние, а не значение.

#import "User32.dll"
short GetKeyState(int);
#import
void OnChartEvent(const int id, const long&, const double&, const string&)
  {
   if(id == CHARTEVENT_KEYDOWN)
      Print((TerminalInfoInteger(TERMINAL_KEYSTATE_CONTROL) < 0) == (GetKeyState(0x11) < 0)); // true
  }

В справке из  MSDN  написано:

Возвращаемое значение определяет состояние указанного виртуального ключа следующим образом:

  • Если старший бит равен 1, клавиша находится в нижнем положении; в противном случае она находится в верхнем.

Старший бит равен 1 у отрицательных чисел.

 
Aleksandr Slavskii #:

сравнивать нужно состояние, а не значение.

Из свежего - TAB-состояние все время "нажатое".

 

Билд 4209 

2024.03.02 06:08:17.952 Terminal        MetaTrader 5 x64 build 4209 started for MetaQuotes Software Corp.
2024.03.02 06:08:17.952 Terminal        Windows 7 Service Pack 1 build 7601, 8 x AMD FX-8350 Eight-Core, AVX, 19 / 31 Gb memory, 169 / 1794 Gb disk, admin, GMT+3
2024.03.04 19:59:36.863 LiveUpdate      check for release version
2024.03.04 19:59:37.018 LiveUpdate      you are using the latest version
2024.03.04 19:59:50.208 LiveUpdate      check for beta version

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

В своих проектах получаю ошибку 4102.

Визуализируй это! Графическая библиотека в MQL5 как аналог plot из R
Визуализируй это! Графическая библиотека в MQL5 как аналог plot из R
  • www.mql5.com
При исследовании и изучении закономерностей важную роль играет визуальное отображение с помощью графиков. В популярных среди научного сообщества языках программирования, таких как R и Python, для визуализации предназначена специальная функция plot. С её помощью можно рисовать линии, точечные распределения и гистограммы для наглядного представления закономерностей. В MQL5 вы можете делать всё то же самое с помощью класса CGraphics.
 
Aleksandr Slavskii #:

    Старший бит равен 1 у отрицательных чисел.

    Про биты TERMINAL_KEYSTATE_XXX в Документации ничего не сказано, при том что

    старший бит у TERMINAL_KEYSTATE_XXX - 31й, а у GetKeyState() - 15й - т.е. Вы сравниваете заведомо разные биты

     
    A100 #:

    Про биты TERMINAL_KEYSTATE_XXX в Документации ничего не сказано.

    В документации сказано, что  TERMINAL_KEYSTATE_XXX возвращает такой же код состояния клавиши, как и функция GetKeyState(), а какой код возвращает  GetKeyState() сказано в  MSDN.

    Значит можно считать, что в справке сказано про старший бит, но опосредованно.

    A100 #:

    при том что, старший бит у TERMINAL_KEYSTATE_XXX - 31й, а у GetKeyState() - 15й - т.е. Вы сравниваете заведомо разные биты

    Я в побитовых операциях полнейший ноль, но в гугле меня ещё не забанили.

    Давайте проверим какой по счёту будет старший бит в отрицательном числе.

    #import "User32.dll"
    short GetKeyState(int);
    #import
    //+------------------------------------------------------------------+
    void OnChartEvent(const int id, const long&, const double&, const string&)
      {
       if(id == CHARTEVENT_KEYDOWN)
         {
          int a = TerminalInfoInteger(TERMINAL_KEYSTATE_CONTROL);
          Print(a); // -32767
          int res = 1;
          int p = 0;
          while(res < a)
            {
             p ++;
             res <<= 1;
            }
          Print("Старший бит TerminalInfoInteger ", p); // 0
    
          a = GetKeyState(0x11);
          Print(a); // -127 или -128
          res = 1;
          p = 0;
          while(res < a)
            {
             p ++;
             res <<= 1;
            }
          Print("Старший бит GetKeyState ", p); // 0
         }
      

    Поправьте, если я, что то не правильно понял.

     
    Aleksandr Slavskii #:

    Поправьте, если я, что то не правильно понял.

    Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

    Бета-версия платформы MetaTrader 5 build 4210: больше встроенных приложений и расширение поддержки ONNX

    Aleksandr Slavskii, 2024.03.04 19:46

    Давайте проверим какой по счёту будет старший бит в отрицательном числе.

          int a = TerminalInfoInteger(TERMINAL_KEYSTATE_CONTROL);
          Print(a); // -32767
          Print("Старший бит TerminalInfoInteger ", p); // 0 

    У Вас получился нулевой по счету "старший бит", при том что нулевой - это младший бит - по определению

    Каким по счету будет старший бит (нумерация с нуля) в произвольном значении - можно так например определить:

    #import "User32.dll"
        short GetKeyState( int );
    #import
    template<typename T> int nnn( T ) { return sizeof(T)*8 - 1; }
    void OnChartEvent( const int id, const long &, const double&, const string& )
    {
        if (id == CHARTEVENT_KEYDOWN) {                                 //Результат:
            Print(nnn(TerminalInfoInteger(TERMINAL_KEYSTATE_CONTROL))); //31
            Print(nnn(GetKeyState(0x11)));                              //15
        }
    }
     
    Aleksandr Slavskii #:
    Поправьте, если я, что то не правильно понял.
    У вас while не работает. Ни первый, ни второй. У вас сравнение единицы с отрицательным числом, а 1 не может быть меньше отрицательного числа. 🥴
     
    Если надо посмотреть биты.

    Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

    Особенности языка mql5, тонкости и приёмы работы

    fxsaber, 2023.11.14 21:09

    template <typename T>
    string ToBits( const T Value )
    {
      string Str = NULL;
      
      for(uint i = sizeof(T) << 3; (bool)i--;)
        Str += (string)(int)(!!(Value & (1 << i)));
        
      return(Str);
    }
     
    fxsaber #:
    Если надо посмотреть биты.
    ulong test_val = 9223372036854775808;   
    string res_str = ToBits(test_val);
    ::PrintFormat("Result value = %s", res_str);
    Result value = 1000000000000000000000000000000010000000000000000000000000000000
    

    ???


    //+------------------------------------------------------------------+
    //| Show bits                                                        |
    //+------------------------------------------------------------------+
    template <typename T>
    string BinaryRepresentation(const T _val, const int _start_bit_idx = 15,
                                bool _to_tab = true)
       {
       string res_binary_representation = NULL;
    //---
       T k, andmask, cnt;
       cnt = 0;
       for(int i = _start_bit_idx; i >= 0; i--)
          {
          andmask = (T)1 << i;
          k = _val & andmask;
          if(k == 0)
             res_binary_representation += "0";//::Print("0");
          else
             res_binary_representation += "1";//::Print("1");
          if(_to_tab)
             if(++cnt == 4)
                {
                res_binary_representation += " ";
                cnt = 0;
                }
          }
       if(_to_tab)
          ::StringTrimRight(res_binary_representation);
    //---
       return res_binary_representation;
       }


    res_str = BinaryRepresentation(test_val, 63);
    ::PrintFormat("Result value = %s", res_str);
    Result value = 1000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000