Вопросы по MQL

Тема в разделе "В помощь трейдеру", создана пользователем ddos1, 20 Декабрь 2014.

  1. Trader 007

    Trader 007 Новичок

    Регистрация:
    4 Декабрь 2015
    Сообщения:
    3
    Симпатии:
    0
    Баллы:
    1
    Пол:
    Мужской
    Я на Forex с:
    2005
    Никто вообще ничего не сказал, в том числе что и не выполнит.
    Меня скорее интересовал момент практического использования приводимых кодов, чем реальный продукт для применения в трейдинге.
    В чём с вами согласен, так это в том, что если хочешь что-то сделать, то проще и легче сделать это самому. ))
     
  2. loopsider

    loopsider Бывалый Команда форума Модератор

    Регистрация:
    13 Ноябрь 2013
    Сообщения:
    4.608
    Симпатии:
    4.246
    Баллы:
    435
    Пол:
    Мужской
    Именно так. А еще, гораздо интересней и полезней :)
    Программирование - экспериментальное занятие. Надо пробовать и смотреть, что получается.
    Ваша просьба - тривиальна с одной стороны, и не имеет особого смысла с другой (вы меняете нажатие двух клавиш на один клик мышкой, т.е. шило на мыло). Годится только в качестве упражнения. Упражняйтесь, и все получится.
     
    Klaus Lebentz нравится это.
  3. Klaus Lebentz

    Klaus Lebentz Постоялец Аргонавт

    Регистрация:
    18 Январь 2015
    Сообщения:
    106
    Симпатии:
    91
    Баллы:
    50
    Пол:
    Мужской
    Я на Forex с:
    2011
    Есть ли какая-нибудь недокументированная альтернатива Sleep в тестере стратегий? Понимаю, что тестирование затянется, но очень нужно.
     
  4. loopsider

    loopsider Бывалый Команда форума Модератор

    Регистрация:
    13 Ноябрь 2013
    Сообщения:
    4.608
    Симпатии:
    4.246
    Баллы:
    435
    Пол:
    Мужской
    Sleep тоже в тестере не работает. Делайте все программно - в чем проблемы? Засечка времени, потом проверка - если прошло меньше секунд чем нужно, курим бамбук.
     
    Dmitri и Klaus Lebentz нравится это.
  5. Klaus Lebentz

    Klaus Lebentz Постоялец Аргонавт

    Регистрация:
    18 Январь 2015
    Сообщения:
    106
    Симпатии:
    91
    Баллы:
    50
    Пол:
    Мужской
    Я на Forex с:
    2011
    Про то, что в тестере можно засечь время и не подумал?! Спасибо за наводку.
     
    loopsider и Dmitri нравится это.
  6. esa_vn

    esa_vn Новичок - ARGOLab.net -

    Регистрация:
    19 Декабрь 2016
    Сообщения:
    8
    Симпатии:
    4
    Баллы:
    3
    Пол:
    Мужской
    Я на Forex с:
    2013
    У меня на рабочем чарте присутствует информер, выводящий данные в несколько строк о некоторых параметрах текущего инструмента. Информер докручивал сам, переделывая готовую разработку на схожую тему. Строки формируются операторами вида
    ObjectCreate(BlockName,OBJ_LABEL,.....
    ObjectSetText("BlockName",BlockInfo,...
    в место экрана, задаваемое входными параметрами информера. И бывает так, что на этот информер наезжает график и инфу становится неудобно читать. Есть идея привязать положение последующих строк к положению первой строки, а её ведь по мере необходимости можно через двойной клик мышью переместить в любое место экрана. Как реализовать эту привязку средствами MQL4 ? Заранее благодарен, если сможете ответить !
     
  7. loopsider

    loopsider Бывалый Команда форума Модератор

    Регистрация:
    13 Ноябрь 2013
    Сообщения:
    4.608
    Симпатии:
    4.246
    Баллы:
    435
    Пол:
    Мужской
    Это обычно делается так.
    1. Если объекта на графике нет, создаем его с какими-то начальными координатами X,Y. Разрешаем его перетаскивать по графику. Обычно делают подложку, на которую выводят текст и которую можно перетаскивать.
    2. Если объект уже существует, считываем его координаты X,Y.
    Код:
       if (ObjectFind(name)==0)   { // если объект есть, считываем его координаты
          ObjectGetInteger(0,name,OBJPROP_XDISTANCE,0,X);
          ObjectGetInteger(0,name,OBJPROP_YDISTANCE,0,Y);
       }   else   { // если объекта нет, создаем его
          RectLabelCreate(....);
       }
    
    Все остальные объекты перетаскивать не разрешаем, их координаты отсчитываем от X,Y.
     
  8. esa_vn

    esa_vn Новичок - ARGOLab.net -

    Регистрация:
    19 Декабрь 2016
    Сообщения:
    8
    Симпатии:
    4
    Баллы:
    3
    Пол:
    Мужской
    Я на Forex с:
    2013
    Спасибо ! А как это делается ?
     
    Dmitri нравится это.
  9. loopsider

    loopsider Бывалый Команда форума Модератор

    Регистрация:
    13 Ноябрь 2013
    Сообщения:
    4.608
    Симпатии:
    4.246
    Баллы:
    435
    Пол:
    Мужской
    Код:
          ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
    
     
  10. esa_vn

    esa_vn Новичок - ARGOLab.net -

    Регистрация:
    19 Декабрь 2016
    Сообщения:
    8
    Симпатии:
    4
    Баллы:
    3
    Пол:
    Мужской
    Я на Forex с:
    2013
    А эту функцию надо создавать ?
    У меня ее в редакторе вроде бы нет ... upload_2016-12-19_11-55-1.png
     
  11. loopsider

    loopsider Бывалый Команда форума Модератор

    Регистрация:
    13 Ноябрь 2013
    Сообщения:
    4.608
    Симпатии:
    4.246
    Баллы:
    435
    Пол:
    Мужской
    Да, тут вы создаете тот объект который вам нужен.
    Код:
    //--------------------------------------------------------------------
    bool RectLabelCreate(const long             chart_ID=0,               // ID графика
                         const string           name="RectLabel",         // имя метки
                         const int              sub_window=0,             // номер подокна
                         const long              x=0,                     // координата по оси X
                         const long              y=0,                     // координата по оси y
                         const int              width=50,                 // ширина
                         const int              height=18,                // высота
                         const color            back_clr=clrNONE,         // цвет фона
                         const color            clr=clrNONE,              //цвет плоской границы (Flat)
                         const ENUM_LINE_STYLE  style=STYLE_SOLID,        // стиль плоской границы
                         const int              line_width=1,             // толщина плоской границы
                         const bool             back=false,               // на заднем плане
                         const bool             selection=false,          // выделить для перемещений
                         const bool             hidden=true,              // скрыт в списке объектов
                         const long             z_order=0,                // приоритет на нажатие мышью
                         const bool             selected=false)           // выделен
      {
       ResetLastError();
       if (ObjectFind(chart_ID,name)==-1)
       {
          ObjectCreate(chart_ID,name,OBJ_RECTANGLE_LABEL,sub_window,0,0);
          ObjectSetInteger(chart_ID,name,OBJPROP_BORDER_TYPE,BORDER_FLAT);
          ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,CORNER_LEFT_UPPER);
          ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
          ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,line_width);
          ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
          ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
          ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selected);
          ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
          ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
       }
       ObjectSetInteger(chart_ID,name,OBJPROP_BGCOLOR,back_clr);
       ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
       ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width);
       ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height);
       ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x);
       ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y);
       return(true);
    }
     
  12. esa_vn

    esa_vn Новичок - ARGOLab.net -

    Регистрация:
    19 Декабрь 2016
    Сообщения:
    8
    Симпатии:
    4
    Баллы:
    3
    Пол:
    Мужской
    Я на Forex с:
    2013
    А вот ещё хочу спросить - нет ли решения в MQL4 для быстрого доступа к свойствам одного из установленных на чарте индикаторов, типа создания нужной кнопки ? Не очень удобно клацать Ctrl-I , затем ещё выбрать нужный индикатор из списка ... А если их многовато ? Вобщем, хочется слегка облегчить себе трейдерские будни
     
  13. loopsider

    loopsider Бывалый Команда форума Модератор

    Регистрация:
    13 Ноябрь 2013
    Сообщения:
    4.608
    Симпатии:
    4.246
    Баллы:
    435
    Пол:
    Мужской
    В индикаторе вы можете прописать создание любых объектов и какие угодно кнопки.
    Вот тут еще хорошая тема на эту тему Пожалуйста, войдите или зарегистрируйтесь для просмотра ссылок.
     
    Последнее редактирование: 19 Декабрь 2016
    esa_vn нравится это.
  14. Treader7000

    Treader7000 Постоялец Аргонавт

    Регистрация:
    9 Август 2015
    Сообщения:
    30
    Симпатии:
    12
    Баллы:
    35
    Пол:
    Мужской
    Здравствуйте. В индикаторе, при достижении ценой обозначенного уровня срабатывает алерт и после повторяется с необходимой частотой.
    Проблема в том, что при переключении на другой период графика, алерт срабатывает немедленно, и так при каждой смене ТФ, что очень не приятно.

    Что можно сделать, чтобы при смене ТФ алерт срабатывал после паузы, а не сразу?

    Код:
    #property indicator_chart_window
    
    extern bool Mx_L = true;
    extern bool Mn_L = true;
    extern bool Alert_on = true;
    extern int pause = 7;
    datetime mint, maxt;
    double Min, Max;
    
    void init()
      {
      
      if(Mx_L == true && Mn_L == false)
      {ObjectCreate("Max",OBJ_HLINE, 0, 0, WindowPriceMax());
      ObjectSet   ("Max", OBJPROP_STYLE, STYLE_DOT);
      ObjectSet   ("Max", OBJPROP_COLOR, Aqua);}
     
      if(Mx_L == false && Mn_L == false)
      {PlaySound("timeout.wav");}
     
      else
      if(Mx_L == false && Mn_L == true)
      {ObjectCreate("Min",OBJ_HLINE, 0, 0, WindowPriceMin());
      ObjectSet   ("Min", OBJPROP_STYLE, STYLE_DOT);
      ObjectSet   ("Min", OBJPROP_COLOR, Red);}
     
      else
      {if(Mx_L == true && Mn_L == true)
      ObjectCreate("Min",OBJ_HLINE, 0, 0, WindowPriceMin());
      ObjectSet   ("Min", OBJPROP_STYLE, STYLE_DOT);
      ObjectSet   ("Min", OBJPROP_COLOR, Red);
     
      ObjectCreate("Max",OBJ_HLINE, 0, 0, WindowPriceMax());
      ObjectSet   ("Max", OBJPROP_STYLE, STYLE_DOT);
      ObjectSet   ("Max", OBJPROP_COLOR, Aqua);}
    
      }
    
    void start()
      {
     
      if(ObjectFind("Min")>=0) Min = ObjectGet("Min",OBJPROP_PRICE1); else Min = EMPTY;
      if(ObjectFind("Max")>=0) Max = ObjectGet("Max",OBJPROP_PRICE1); else Max = EMPTY_VALUE;
     
     
      if(mint < TimeLocal() && Alert_on == true && Bid < Min)
        {Alert("Support ",Symbol()," ",DoubleToStr (Min, 5)); mint = TimeLocal() + pause; maxt = 0;}
        
        
      if(maxt < TimeLocal() && Alert_on == true && Ask > Max)
        {Alert("Resistance ",Symbol()," ",DoubleToStr (Max, 5)); maxt = TimeLocal() + pause; mint = 0;}
          
      }
     

    Вложения:

    • Alert.zip
      Размер файла:
      8,4 КБ
      Просмотров:
      0
  15. loopsider

    loopsider Бывалый Команда форума Модератор

    Регистрация:
    13 Ноябрь 2013
    Сообщения:
    4.608
    Симпатии:
    4.246
    Баллы:
    435
    Пол:
    Мужской
    В индикаторах при смене ТФ переменные mint, maxt сбрасываются, поэтому срабатывает алерт. Чтобы они не сбрасывались, надо использовать глобальные переменные (GlobalVariableSet, GlobalVariableGet). Альтернативный вариант - сделать из индикатора советник (убрать строчку #property indicator_chart_window и положить в папку с советниками) - в советнике переменные при смене ТФ сбрасываться не будут.
     
    Treader7000 и Сергей Иванов нравится это.
  16. Treader7000

    Treader7000 Постоялец Аргонавт

    Регистрация:
    9 Август 2015
    Сообщения:
    30
    Симпатии:
    12
    Баллы:
    35
    Пол:
    Мужской
    Спасибо, loopsider. С советником не вариант, нужен алерт в виде индикатора. Вообще это болезнь многих подобных индикаторов. Может поможете с реализацией?
     
  17. loopsider

    loopsider Бывалый Команда форума Модератор

    Регистрация:
    13 Ноябрь 2013
    Сообщения:
    4.608
    Симпатии:
    4.246
    Баллы:
    435
    Пол:
    Мужской
    Если за вас сделать, вы ничему не научитесь. Пробуйте - если будут проблемы, поможем. Программирование - наука экспериментальная :)
     
    Treader7000 нравится это.
  18. Treader7000

    Treader7000 Постоялец Аргонавт

    Регистрация:
    9 Август 2015
    Сообщения:
    30
    Симпатии:
    12
    Баллы:
    35
    Пол:
    Мужской
    Согласен полностью. Просто приходится заниматься mql раз в полгода или год и обычно все решается самостоятельно, поскольку уровень моих требований не превышает моих поверхностных познаний в mql. Прежде чем ответить в теме я провел много экспериментов с индикатором, но результата естественно нет. Вы порекомендовали использовать GlobalVariableSet, GlobalVariableGet, но чтобы прикрутить глобальные переменные к моему индикатору, мне нужен пример реализации в другом индикаторе, чтобы понять логику. Подобного примера или разбора применения глобальных переменных в индикаторе я не нашел. Методом тыка тоже многого не добьешся, я уже опробовал множество разных вариантов с GlobalVariableSet, GlobalVariableGet - результата нет.

    Никто же не говорит - дайте мне рабочий индикатор и я ушел. Дело в том, что на базе этого индикатора назревает другой, более интересный индикатор, который постараюсь выложить здесь в первую очередь, но эта проблема с переменными ставит его в тупик. Самокопание может занять неоправданное кол-во времени, а время самое дорогое из того, что у нас есть.

    Давайте попробуем разобраться в ситуации, может кому также это пригодится.
    Мне кажется, что в первую очередь сбрасывание mint, maxt происходит в условии
    if(mint < TimeLocal() && Alert_on == true && Bid < Min)
    if(maxt < TimeLocal() && Alert_on == true && Ask > Max)
     
  19. loopsider

    loopsider Бывалый Команда форума Модератор

    Регистрация:
    13 Ноябрь 2013
    Сообщения:
    4.608
    Симпатии:
    4.246
    Баллы:
    435
    Пол:
    Мужской
    Вы пока не поняли почему возникает ваша проблема. Что происходит при смене таймфрейма? Переинициализация. В частности, значения mint и maxt устанавливаются в 0. Вы можете это увидев, добавив оператор Print в функцию init. Так что ваша задача сделать так, чтобы значения этих переменных "переживали" переинициализацию.
     
    Treader7000 нравится это.
  20. Treader7000

    Treader7000 Постоялец Аргонавт

    Регистрация:
    9 Август 2015
    Сообщения:
    30
    Симпатии:
    12
    Баллы:
    35
    Пол:
    Мужской
    Да понял я, что во время переинициализации :). Да mint и maxt устанавливаются в 0. Мне не ясно как GlobalVariableSet, GlobalVariableGet прикрутить.
     

.

Поделиться этой страницей

translate