Logo

Вход

Войти с помощью соц. сетей
X
 
  • Фильтр
  • Время
  • Показать
Очистить всё
новые сообщения
  • #1 Свернуть

    производительность кода на MQL4

    Доброго времени суток.
    Вопрос в том на сколько могут быть "тяжелыми" программы на MQL4.
    Идея и код был взят с учебника по MQL http://book.mql4.com/ru/special/index.
    Я добавил код, который будет показывать разницу между двумя горизонтальными линиями которые может двигать пользователь и интерактивно видеть разницу в пунктах между линиями.код корявый и простенький:
    MQL код:
    //+------------------------------------------------------------------+
    //| script program start function |
    //+------------------------------------------------------------------+
    int ti(double d) // to int
    {
    double dn = NormalizeDouble(d, 4) * 10000;
    return(StrToInteger(DoubleToStr(dn, 4)));
    }
    int start()
    {
    //----
    ObjectCreate("maxAV", OBJ_HLINE, 0, 0, High[1]);
    ObjectCreate("minAV", OBJ_HLINE, 0, 0, Low[1]);
    ObjectCreate("volumeAV", OBJ_TEXT, 0, TimeCurrent(), (High[1] + Low[1]) / 2);
    while(!IsStopped())
    {
    ObjectMove("volumeAV", 0, Time[0] + Period() * Period(), (ObjectGet("maxAV", OBJPROP_PRICE1) + ObjectGet("minAV", OBJPROP_PRICE1)) / 2);
    ObjectSetText("volumeAV", "" + (ti(ObjectGet("maxAV", OBJPROP_PRICE1)) - ti(ObjectGet("minAV", OBJPROP_PRICE1))), 15, "Arial", Gold);
    Sleep(5);
    }
    //----
    return(0);
    }
    //+------------------------------------------------------------------+


    на функцию ti можно не обращать внимания.Собственно все ЭТО со слипом 5, жрет 60% процессора! у меня 2х ядерный 2.2 гигагерца.Конечно можно слип и больше поставить, но зачем в учебнике такой пример писать?а если со слипом 5 выполнять действитель тяжелый код?Возможно есть какие то процессы оптимизации кода?На сколько я знаю процессы сравнения, математические операции с double, и работа со стрингом самые долгие и "тяжелые", но без них тут никак.
    Последний раз редактировалось ICE89; 30.07.2012, 20:28.
  • <a href="https://www.instaforex.org/ru/?x=ruforum">InstaForex</a>
  • #2 Свернуть

    Сообщение от ICE89 Посмотреть сообщение
    Доброго времени суток.
    Вопрос в том на сколько могут быть "тяжелыми" программы на MQL4.
    Идея и код был взят с учебника по MQL http://book.mql4.com/ru/special/index.
    Я добавил код, который будет показывать разницу между двумя горизонтальными линиями которые может двигать пользователь и интерактивно видеть разницу в пунктах между линиями.код корявый и простенький:
    MQL код:
    //+------------------------------------------------------------------+
    //| script program start function |
    //+------------------------------------------------------------------+
    int ti(double d) // to int
    {
    double dn = NormalizeDouble(d, 4) * 10000;
    return(StrToInteger(DoubleToStr(dn, 4)));
    }
    int start()
    {
    //----
    ObjectCreate("maxAV", OBJ_HLINE, 0, 0, High[1]);
    ObjectCreate("minAV", OBJ_HLINE, 0, 0, Low[1]);
    ObjectCreate("volumeAV", OBJ_TEXT, 0, TimeCurrent(), (High[1] + Low[1]) / 2);
    while(!IsStopped())
    {
    ObjectMove("volumeAV", 0, Time[0] + Period() * Period(), (ObjectGet("maxAV", OBJPROP_PRICE1) + ObjectGet("minAV", OBJPROP_PRICE1)) / 2);
    ObjectSetText("volumeAV", "" + (ti(ObjectGet("maxAV", OBJPROP_PRICE1)) - ti(ObjectGet("minAV", OBJPROP_PRICE1))), 15, "Times New Roman", Gold);
    Sleep(5);
    }
    //----
    return(0);
    }
    //+------------------------------------------------------------------+


    на функцию ti можно не обращать внимания.Собственно все ЭТО со слипом 5, жрет 60% процессора! у меня 2х ядерный 2.2 гигагерца.Конечно можно слип и больше поставить, но зачем в учебнике такой пример писать?а если со слипом 5 выполнять действитель тяжелый код?Возможно есть какие то процессы оптимизации кода?На сколько я знаю процессы сравнения, математические операции с double, и работа со стрингом самые долгие и "тяжелые", но без них тут никак.
    А это у Вас значит советник?

    Паузу можно смело увеличить, ну до 100 что-ли (1/10 секунды) - минимум.

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

    А это - Time[0] + Period() * Period() - не вкурил?
     

    Комментарий

    • #3 Свернуть

      еще проблемка, исходник неправильно сохраняется , жму сохранить а получается
       

      Комментарий

      • #4 Свернуть

        Сообщение от fore-x Посмотреть сообщение
        А это - Time[0] + Period() * Period() - не вкурил?
        а это текст на бар вперед , что б его лучше видно было..
           

        Комментарий

        • #5 Свернуть

          Сообщение от ICE89 Посмотреть сообщение
          а это текст на бар вперед , что б его лучше видно было..
          Хрень это вроде:

          Нажмите на изображение для увеличения.

Название:	ScreenShot00303.jpg
Просмотров:	1
Размер:	94.4 Кб
ID:	25069000

          Если смотреть на разных таймфреймам .
             

          Комментарий

          • #6 Свернуть

            да есть такая проблема, но времени и желания не было с этим разбираться, по идее Period() должен возвращать текущий тайм фрейм, и что бы на бар вперед было достаточно было Time[0] + Period() но это вообще ничего не дает.
            Кстати, рад что Вас тоже заитересовал этот вопрос, если есть предложения как сделать на бар вперед буду очень благодарен в помощи.
            PS и все таки, как на счет производительности?Вы не смотрели загрузку процессора при слип 5?
               

            Комментарий

            • #7 Свернуть

              Сообщение от ICE89 Посмотреть сообщение
              PS и все таки, как на счет производительности?Вы не смотрели загрузку процессора при слип 5?
              Загрузка процессора у Вас лишь из-за того, что цикл повторяется бесконечно и почти без паузы на отдых. Слип 5 - убивает процессор, поставьте слип = 100 и сразу ощутите разницу.
              Код - не сложный, но повторяется без остановок - от этого и все беды.

              Сообщение от ICE89 Посмотреть сообщение
              Кстати, рад что Вас тоже заитересовал этот вопрос, если есть предложения как сделать на бар вперед буду очень благодарен в помощи.
              Подсказка:

              int Period() - Возвращает значение числа минут периода для текущего графика.

              datetime Time[] - Массив-таймсерия, содержащий время открытия каждого бара текущего графика. Данные типа datetime представляют собой время в секундах, прошедшее с 00:00 1 января 1970 года.

              Клавиша F1 - в помощь!

              P.S Из руководства пользователя: "В тексте программы установить текстовый курсор на нужное слово (имя функции или переменной) и нажать комбинацию клавишь <Ctrl>+<F1>"
                 

              Комментарий

              • #8 Свернуть

                fore-x, спасибо, знаю... У Вас нету вариантов как это реализовать, что бы корректно работало на разных таймфреймах?



                все, дошло до меня, числа минут , время в секундах, нужно было всего лишь минуты в секунды перевести Time[0] + Period() * 60
                   
                Последний раз редактировалось ICE89; 30.07.2012, 22:01.

                Комментарий

                • #9 Свернуть

                  Сообщение от ICE89 Посмотреть сообщение
                  fore-x, спасибо, знаю... У Вас нету вариантов как это реализовать, что бы корректно работало на разных таймфреймах?
                  А что, к секундам минуты уже прибавить не можете? Зачем тогда вообще в код лезете (интересуюсь из любопытства)?

                  Все это можно сделать по разному, вариантов в терминале для этого множество. А почему именно по центру? А почему именно на один бар вперед? А почему, а почему, а почему...? Просто багаж знаний в программировании у Вас очень маленький, рекомендую посещать Вам тему - Несколько вопросов от начинающего, и задавать интересующие вопросы, все придет с опытом!
                   

                  Комментарий

                  • <a href="https://www.instaforex.org/ru/?x=ruforum">InstaForex</a>
                  • #10 Свернуть

                    Сообщение от fore-x Посмотреть сообщение
                    А что, к секундам минуты уже прибавить не можете? Зачем тогда вообще в код лезете (интересуюсь из любопытства)?
                    ага , учусь ездить на велосипеде без велосипеда.
                     

                    Комментарий

                    Сейчас онлайн

                    working...
                    X