Простейшие методы или функции, помогающие при отсутствии стандарных встроенных в MQL
Страница 1 из 2 1 2 ПоследняяПоследняя
Показано с 1 по 10 из 16

Тема: Простейшие методы или функции, помогающие при отсутствии стандарных встроенных в MQL

  1. #1
    Jrg
    Guest

    Простейшие методы или функции, помогающие при отсутствии стандарных встроенных в MQL

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

    Начну.
    Многие задавались вопросом об отсечении лишнего знака дробной части.
    В MQL есть только округление, делается либо через http://docs.mql4.com/ru/math/MathRound либо через http://docs.mql4.com/ru/convert/NormalizeDouble

    А как сделать, чтобы просто отсечь ненужный разряд, не округляя?
    Всё просто, пример для отсечения "лишней" третьей цифры после запятой:

    x = x - 0.005;
    x = NormalizeDouble(x,2);

    Сначала вычитаем "половину" лишней цифры после запятой из числа, а затем округляем то, что получилось до заданной точности.
    Пример:
    0.109 - 0.005 == 0.104, -> 0.10
    0.102 - 0.005 == 0.097, -> 0.10
    0.100 - 0.005 == 0.095, ...

    Вы не можете благодарить!

  2. #2
    Денис Кириченко
    Guest
    Цитата Сообщение от Jrg Посмотреть сообщение
    Тема предлагается тем, кто уже в достаточной мере освоил язык MQL, но иногда теряется в способах, которые отсутствуют в наборе функций терминала.

    Начну.
    Многие задавались вопросом об отсечении лишнего знака дробной части.
    В MQL есть только округление, делается либо через http://docs.mql4.com/ru/math/MathRound либо через http://docs.mql4.com/ru/convert/NormalizeDouble ...
    Не совсем так. Есть ещё пара функций: MathCeil() и MathFloor()...

    Вы не можете благодарить!

  3. #3
    Денис Кириченко
    Guest
    Цитата Сообщение от Jrg Посмотреть сообщение
    ... Начну.
    Многие задавались вопросом об отсечении лишнего знака дробной части...
    А как сделать, чтобы просто отсечь ненужный разряд, не округляя?
    Всё просто, пример для отсечения "лишней" третьей цифры после запятой:

    x = x - 0.005;
    x = NormalizeDouble(x,2);

    Сначала вычитаем "половину" лишней цифры после запятой из числа, а затем округляем то, что получилось до заданной точности.
    Пример:
    0.109 - 0.005 == 0.104, -> 0.10
    0.102 - 0.005 == 0.097, -> 0.10
    0.100 - 0.005 == 0.095, ...
    Есть своя версия...
    Например:


    Вы не можете благодарить!

  4. #4
    Jrg
    Guest
    Цитата Сообщение от Денис Кириченко Посмотреть сообщение
    Не совсем так. Есть ещё пара функций: MathCeil() и MathFloor()...
    Денис, в МТ4 указанные функции могут сделать только int из double, применяются в зависимости от знака входного параметра.

    Цитата Сообщение от Денис Кириченко Посмотреть сообщение
    Есть своя версия...
    Например:
    Посмотрел. неплохо. буду рад посмотреть и что то еще в вашем исполнении для МТ5

    Вы не можете благодарить!

  5. #5
    Денис Кириченко
    Guest
    Цитата Сообщение от Jrg Посмотреть сообщение
    Денис, в МТ4 указанные функции могут сделать только int из double...
    Разве? Если не ошибаюсь, то указанные функции как в МТ4, так и в МТ5, принимают параметр типа double и возвращают параметр типа double.

    Вы не можете благодарить!

  6. #6
    Jrg
    Guest
    Цитата Сообщение от Денис Кириченко Посмотреть сообщение
    Разве? Если не ошибаюсь, то указанные функции как в МТ4, так и в МТ5, принимают параметр типа double и возвращают параметр типа double.
    Документация МТ4 гласит что
    double MathFloor(double x)

    Функция возвращает числовое значение, представляющее наибольшее целое число, которое меньше или равно x.


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

    Вы не можете благодарить!

  7. #7
    Новичок
    Регистрация
    17.08.2012
    Сообщений
    180
    Promo (¢)
    80
    Благодарности
    Получено: 8
    Отправлено: 15
    А можно умножить на нужный рязряд, округлить до целого, а потом обратно разделить.
    0.5678*1000=567.8
    округляем до 567
    делим на 1000
    567/1000=0.567

    Вы не можете благодарить!

  8. #8
    Денис Кириченко
    Guest
    Цитата Сообщение от dima Посмотреть сообщение
    А можно умножить на нужный рязряд, округлить до целого, а потом обратно разделить.
    0.5678*1000=567.8
    округляем до 567
    делим на 1000
    567/1000=0.567
    Можно! Что я и сделал в функции fractionCutOff() в своей версии (см. переменную factor).

    Вы не можете благодарить!

  9. #9
    Теоретик
    Регистрация
    08.06.2013
    Адрес
    Украина, Полтава
    Сообщений
    263
    Promo (¢)
    0
    Благодарности
    Получено: 8
    Отправлено: 2
    Если говорить о полезных функциях, то насколько я понимаю, в mql4 нет встроенной функции для просчета момента открытия бара.
    Для подобного случая в свое время на просторах интернета нашел функцию, которой пользуюсь до сих пор:

    PHP код:
    void Fun_New_Bar()
      {
       static 
    datetime New_Time=0;
       
    New_Bar=false;
       if(
    New_Time!=Time[0])
         {
          
    New_Time=Time[0];
          
    New_Bar=true;
         }
      } 
    Здесь переменная New_Bar объявляется рядом с внешними как "bool New_Bar".
    Если кто-то подскажет более интересный способ - буду признателен

    P.S.: простите, что код без комментов. Если что не ясно - задавайте вопросы

    Вы не можете благодарить!

  10. #10
    Теоретик
    Регистрация
    08.06.2013
    Адрес
    Украина, Полтава
    Сообщений
    263
    Promo (¢)
    0
    Благодарности
    Получено: 8
    Отправлено: 2
    Еще если работать по определенной торговой системе, включающей в себе использование свечей Heiken Ashi, которые являются действительно очень удобными и не плохо помогают в советнике (к примеру) убирать боковой тренд и тому подобные неприятности, важным есть возможность использования в НА стандартных операций с барами, таких как Close, Open, High и Low.
    PHP код:
    void HA (double opendouble closedouble crit)
       {
       
    open  iCustom(NULL,0,"Heiken Ashi",2,1);
       
    crit iCustom(NULL,0,"Heiken Ashi",0,1);
       
    close iCustom(NULL,0,"Heiken Ashi",3,1);
       } 
    ... здесь мы берем значение открытия, закрытия и критической цены (при open<close - High[1], при open<close - Low[1]) на прошлой свече. Далее можно извращаться с этими свечами как с обычными, посредством изменения последнего числа в условиях iCustom (где 1 - это предыдущий бар. Поставить 2 - это еще на бар назад, и т.д.)

    Лично я вычислял по ним таким образом локальный минимум\максимум

    ---------- Сообщение добавлено в 01:35 ----------

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

    PHP код:
    void Local (double SLowdouble SHigh)
       {
       
    int l=0;
       
    int h=0;
       
    double haOphaCl;
       
    bool lowhigh;
       while (
    low == false)
          {
          
    l++;
          
    haOp  iCustom(NULL,0,"Heiken Ashi",2,l);
          
    haCl iCustom(NULL,0,"Heiken Ashi",3,l);    
          if (
    haOp>haCl)
             {
             
    SLow Low[l]-3*Point;
             
    low=true;
             }
          }
       while (
    high == false)
          { 
          
    h++;
          
    haOp  iCustom(NULL,0,"Heiken Ashi",2,h);
          
    haCl iCustom(NULL,0,"Heiken Ashi",3,h);
          if (
    haOp<haCl)
             {
             
    SHigh High[h]+3*Point;
             
    high=true;
             }
          } 
    P.S.: снова прошу прощения за отсутствие комментариев. Есть вопросы - отвечу

    Вы не можете благодарить!

Страница 1 из 2 1 2 ПоследняяПоследняя

Метки этой темы

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •