Полезно MQL4: примеры и готовые рецепты

Тема в разделе "В помощь трейдеру", создана пользователем loopsider, 7 Сентябрь 2014.

  1. loopsider

    loopsider Эксперт Команда форума Модератор

    Регистрация:
    13 Ноябрь 2013
    Сообщения:
    5.323
    Симпатии:
    4.874
    Баллы:
    585
    Пол:
    Мужской
    Как программно закрыть терминал?
    Следующий скрипт при перетаскивании на любой график закрывает терминал
    Код:
    //+------------------------------------------------------------------+
    //| Находит дескриптор главного окна и закрывает терминал            |
    //+------------------------------------------------------------------+
    #include <WinUser32.mqh>
    #property strict
    void OnStart() {
       // Дескриптор окна графика, на который брошен скрипт
       int hwnd=WindowHandle(Symbol(),Period());
       int hwnd_parent=0;
       while(!IsStopped())      // Поиск главного окна
       {
          hwnd=GetParent(hwnd); // Дескриптор предыдущего окна
          if(hwnd==0) break;    // Если предыдущий отсутствует
          hwnd_parent=hwnd;     // Запомнить
       }
       PostMessageA(hwnd_parent,WM_CLOSE,0,0);
    }
    -------------------
    Добавлено:
    В новом MQL есть специальная функция закрытия терминала
    Код:
    The function commands the terminal to complete operation.
    bool  TerminalClose(
       int ret_code      // closing code of the client terminal
       );
    
     
    Последнее редактирование: 19 Февраль 2017
  2. loopsider

    loopsider Эксперт Команда форума Модератор

    Регистрация:
    13 Ноябрь 2013
    Сообщения:
    5.323
    Симпатии:
    4.874
    Баллы:
    585
    Пол:
    Мужской
    Как проверить, разрешена ли торговля советнику?
    Код:
    if(!AccountInfoInteger(ACCOUNT_TRADE_EXPERT))
       {Print("Automated trading is forbidden at the trade server side");Error=133;return;}
    if(!AccountInfoInteger(ACCOUNT_TRADE_ALLOWED))
       {Print("Trading is forbidden!");Error=64;return;}
    if (!TerminalInfoInteger(TERMINAL_TRADE_ALLOWED)) 
       {Print("Check if automated trading is allowed in the terminal settings!");Error=4109;return;}
    if(!IsTradeAllowed(Symbol(),TimeLocal()))
       {Error=132; Print("Trading on the symbol "+symb+" is forbidden!");return;}
    Обращаем внимание на то, что в IsTradeAllowed передается TimeLocal, а не TimeCurrent. В противном случае на выходных TimeCurrent имеет значение времени последней котировки, так что IsTradeAllowed возвратит true.
     
  3. loopsider

    loopsider Эксперт Команда форума Модератор

    Регистрация:
    13 Ноябрь 2013
    Сообщения:
    5.323
    Симпатии:
    4.874
    Баллы:
    585
    Пол:
    Мужской
    Как разобраться с закрытием встречными ордерами и частичным закрытием по истории сделок
    Полезные функции от Ihor Herasko
    Код:
    //+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    //| Определение наличия родительского ордера для текущего ордера (по итогам встречного или частичного закрытия)                                                                                       |
    //+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    int GetSignOfPartialOrCloseByClose()
    {
       string comment = OrderComment();
       if (comment == "")
          return 0;
     
       // Ордер образовался вследствии частичного закрытия
       int fromStart = StringFind(comment, "from #");
       if (fromStart >= 0)
          return GetTicketByPartialClose(comment, fromStart, OrderType(), OrderOpenTime());
     
       // Ордер образовался вследствии встречного закрытия
       if (StringFind(comment, "partial close") >= 0)
       {
          datetime openTime = OrderOpenTime();
          int type = OrderType();
          for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)
          {
             if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
                continue;
               
             if (OrderOpenTime() != openTime)
                continue;
               
             if (OrderType() != type)
                continue;
               
             if (StringFind(OrderComment(), "partial close") < 0)
                continue;
               
             return OrderTicket();
          }
       }
     
       return 0;
    }
    //+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    //| Получение тикета родительского ордера после частичного закрытия                                                                                                                                   |
    //+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    int GetTicketByPartialClose(string comment, int fromStart, int orderType, datetime openTime)
    {
       string sTicket = StringSubstr(comment, fromStart + 6);
       int iTicket = (int)StringToInteger(sTicket);
       int type = OrderType();
       if (!OrderSelect(iTicket, SELECT_BY_TICKET))
          return 0;
         
       if (OrderType() == type)                                                                        // Дочерний ордер указывает на родителя - уходим
          return iTicket;
         
       // Дочерний ордер указывает на противоположный ордер. Необходимо искать родительский
       for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)
       {
          if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
             continue;
           
          if (OrderType() != orderType || OrderOpenTime() != openTime)
             continue;
           
          int iFind = StringFind(OrderComment(), "close hedge by #");
          if (iFind < 0)
             continue;
           
          sTicket = StringSubstr(OrderComment(), iFind + 16);
          int iNewTicket = (int)StringToInteger(sTicket);
          if (iNewTicket != iTicket)
             continue;
           
          return OrderTicket();
       }
     
       return 0;
    }
    .... и комментарий от автора:

    К сожалению, в тестере и в онлайн МТ4 разный алгоритм расстановки комментариев. Приведенный мною код работает именно в онлайн. В онлайн у закрытого ордера buy 0.41 будет комментарий "partial close", если первым в OrderCloseBy будет указан его тикет, и "close hedge by", если вторым. А вот у оставшегося ордера sell 0.13 в любом случае (и в тестере тоже) будет комментарий "from #".

    В тестере отличие от онлайн только в комментариях ордеров, оказавшихся в истории. Так, если указать в OrderCloseBy первым ордер с бОльшим объемом, то у этого ордера в истории счета не будет вообще никакого комментария. В истории он будет выглядеть как просто закрытый ордер. То есть узнать о встречном закрытии можно будет только при сопоставлении данных от трех ордеров:

    1. Рабочий ордер sell 0.13 указывает в комментарии (from #2) на закрытый ордер sell 0.41.

    2. Закрытый ордер buy 0.00 указывает в комментарии (close hedge by #2) на тот же ордер.

    Другая история, если в OrderCloseBy первым указать ордер с меньшим объемом. Тогда у закрытого ордера buy появится объем (0.41) и комментарий "to #2".
     
    Последнее редактирование: 19 Февраль 2017
    iew и Dmitri нравится это.
  4. loopsider

    loopsider Эксперт Команда форума Модератор

    Регистрация:
    13 Ноябрь 2013
    Сообщения:
    5.323
    Симпатии:
    4.874
    Баллы:
    585
    Пол:
    Мужской
    Как обеспечить подгрузку истории по различным таймфремам в советнике/индикаторе?

    Пожалуйста, войдите или зарегистрируйтесь для просмотра ссылок от авторов МТ4:
    Пример: индикатор, который регулярно подгружает историю по ВСЕМ таймфреймам символа
    Код:
    //+------------------------------------------------------------------+
    //|                                           iRefreshTimeFrames.mq4 |
    //|                                      Copyright © 2017, komposter |
    //|                                          http://www.komposter.me |
    //+------------------------------------------------------------------+
    #property copyright "Copyright © 2017, komposter"
    #property link      "http://www.komposter.me"
    #property version   "1.00"
    #property strict
    #property indicator_chart_window
    
    //--- input parameters
    input int IntervalMinutes = 2;    // Refresh interval (minutes)
    
    ENUM_TIMEFRAMES TimeFramesList[] = { PERIOD_M1, PERIOD_M5, PERIOD_M15, PERIOD_M30, PERIOD_H1, PERIOD_H4, PERIOD_D1, PERIOD_W1, PERIOD_MN1 };
    
    int OnInit()
    {
        //---
       return(INIT_SUCCEEDED);
    }
    
    int OnCalculate(const int rates_total,
                    const int prev_calculated,
                    const datetime &time[],
                    const double &open[],
                    const double &high[],
                    const double &low[],
                    const double &close[],
                    const long &tick_volume[],
                    const long &volume[],
                    const int &spread[])
    {
        //---
        static datetime last_check = 0;
        if ( TimeCurrent() - last_check >= 60*IntervalMinutes )
        {
            last_check = TimeCurrent();
            for ( int i = ArraySize( TimeFramesList )-1; i >= 0; i -- ) iTime( _Symbol, TimeFramesList[i], 0 );
        }
    
        //--- return value of prev_calculated for next call
       return(rates_total);
    }
    
     

    Вложения:

    Последнее редактирование: 14 Июль 2017
  5. loopsider

    loopsider Эксперт Команда форума Модератор

    Регистрация:
    13 Ноябрь 2013
    Сообщения:
    5.323
    Симпатии:
    4.874
    Баллы:
    585
    Пол:
    Мужской
    Использование MQL5 библиотек в MQL4
    От fxsaber
    Код:
    // После этого в MQL4 будут компилироваться все библиотеки из MQL5\Include\Math
    #property strict
    
    #ifdef __MQL4__
      #include <Math\Alglib\bitconvert.mqh>
     
      #define TEMP_MACROS(A) double A( double ) { return(0); }
        TEMP_MACROS(MathLog1p)
        TEMP_MACROS(MathExpm1)
        TEMP_MACROS(MathArcsinh)
        TEMP_MACROS(MathArccosh)
        TEMP_MACROS(MathArctanh)
      #undef TEMP_MACROS
    #endif
    Код:
    #property strict
    
    // https://www.mql5.com/ru/docs/standardlibrary/graphics/cgraphic
    #include <Graphics\Graphic.mqh> // MQL5\Include\Graphics\Graphic.mqh
    
    void OnStart()
    {
      double Y[] = {1, 2};
     
      GraphPlot(Y);
    }
     
    Последнее редактирование: 4 Август 2017
  6. loopsider

    loopsider Эксперт Команда форума Модератор

    Регистрация:
    13 Ноябрь 2013
    Сообщения:
    5.323
    Симпатии:
    4.874
    Баллы:
    585
    Пол:
    Мужской
    Скрипт разворачивает и сворачивает окно любого графика финансового инструмента.
    Код:
    //+------------------------------------------------------------------+
    //|                                                          max.mq4 |
    //|                                      Copyright 2014, GoldenMoney |
    //|                                              http://www.mql5.com |
    //+------------------------------------------------------------------+
    #property copyright "Copyright 2014, GoldenMoney"
    #property link      "http://www.mql5.com"
    #property version   "1.00"
    #property strict
    
    #import "user32.dll"
    int GetParent(int hWnd);
    int SendMessageW(int hWnd,int Msg,int wParam,int lParam);
    bool IsZoomed(int hWnd);
    #import
    
    #define WM_MDIMAXIMIZE 0x0225
    #define WM_MDIRESTORE  0x0223
    //+------------------------------------------------------------------+
    //| Maximize Window                                                  |
    //+------------------------------------------------------------------+
    int WindowMaximize(int hwnd)
      {
       int Parent=GetParent(hwnd);
       return SendMessageW(GetParent(Parent), WM_MDIMAXIMIZE, Parent, 0);
      }
    //+------------------------------------------------------------------+
    //| Restore Window size                                              |
    //+------------------------------------------------------------------+
    int WindowRestore(int hwnd)
      {
       int Parent=GetParent(hwnd);
       return SendMessageW(GetParent(Parent), WM_MDIRESTORE, Parent, 0);
      }
    //+------------------------------------------------------------------+
    //| Get Window handle                                                |
    //+------------------------------------------------------------------+
    int WindowGetHwnd()
      {
       return WindowHandle(Symbol(),Period());
      }
    //+------------------------------------------------------------------+
    //| Check Window is maximized                                        |
    //+------------------------------------------------------------------+ 
    bool IsWondowZoomed(int hWnd)
      {
       int Parent=GetParent(hWnd);
       int Result=IsZoomed(Parent);
       if(Result!=0)
          return(True);
       return(False);
      }
    //+------------------------------------------------------------------+
    //| Script program start function                                    |
    //+------------------------------------------------------------------+
    void OnStart()
      {
       int hWnd=WindowGetHwnd();
       if(IsWondowZoomed(hWnd))
          WindowRestore(hWnd);
       else
          WindowMaximize(hWnd);
      }
    //+------------------------------------------------------------------+
    Источник: Пожалуйста, войдите или зарегистрируйтесь для просмотра ссылок
     

    Вложения:

    Сергей Иванов нравится это.
  7. Alekseyb

    Alekseyb Интересующийся - ARGOLab.net -

    Регистрация:
    27 Август 2017
    Сообщения:
    6
    Симпатии:
    6
    Баллы:
    23
    Пол:
    Мужской
    /*список всех символов*/
    Код:
    int GetSymbols(string &SymbolsList[])
    {
     int SymbolsNumber = SymbolsTotal(false);
     ArrayResize(SymbolsList, SymbolsNumber);
     for(int i = 0; i < SymbolsNumber; i++)
     {
      SymbolsList = SymbolName(i,false);
     }
     return(SymbolsNumber);
    }
     
    Последнее редактирование модератором: 28 Август 2019
    loopsider нравится это.
  8. loopsider

    loopsider Эксперт Команда форума Модератор

    Регистрация:
    13 Ноябрь 2013
    Сообщения:
    5.323
    Симпатии:
    4.874
    Баллы:
    585
    Пол:
    Мужской
    Скрипт, удаляющий рамку окна графиков и снова ее восстанавливающий
    Код:
    #import "user32.dll"
      int SetWindowLongA(int hWnd,int nIndex, int dwNewLong);
      int GetWindowLongA(int hWnd,int nIndex);
      int SetWindowPos(int hWnd, int hWndInsertAfter,int X, int Y, int cx, int cy, int uFlags);
      int GetParent(int hWnd);
      int GetTopWindow(int hWnd);
      int GetWindow(int hWnd, int wCmd);
    #import
    
    #define GWL_STYLE         -16
    #define WS_CAPTION        0x00C00000
    #define WS_BORDER         0x00800000
    #define WS_SIZEBOX        0x00040000
    #define WS_DLGFRAME       0x00400000
    #define SWP_NOSIZE        0x0001
    #define SWP_NOMOVE        0x0002
    #define SWP_NOZORDER      0x0004
    #define SWP_NOACTIVATE    0x0010
    #define SWP_FRAMECHANGED  0x0020
    #define GW_CHILD          0x0005
    #define GW_HWNDNEXT       0x0002
    
    //+------------------------------------------------------------------+
    //| script program start function                                    |
    //+------------------------------------------------------------------+
    int start()
    {
       int hChartParent = GetParent(WindowHandle(Symbol(),0));  
       int hMDIClient = GetParent(hChartParent);
       int hChildWindow = GetTopWindow(hMDIClient);
       while (hChildWindow > 0)
       {
          RemoveBorderByWindowHandle(hChildWindow);
          hChildWindow = GetWindow(hChildWindow, GW_HWNDNEXT);
       }
     
     
       return(0);
    }
    void RemoveBorderByWindowHandle(int hWindow)
    {
       int iNewStyle = GetWindowLongA(hWindow, GWL_STYLE) & (~(WS_BORDER | WS_DLGFRAME | WS_SIZEBOX));  
       if (hWindow>0 && iNewStyle>0)
       {
          SetWindowLongA(hWindow, GWL_STYLE, iNewStyle);
          SetWindowPos(hWindow,0, 0, 0, 0, 0, SWP_NOZORDER | SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE | SWP_FRAMECHANGED);
       }
    }
     

    Вложения:

  9. loopsider

    loopsider Эксперт Команда форума Модератор

    Регистрация:
    13 Ноябрь 2013
    Сообщения:
    5.323
    Симпатии:
    4.874
    Баллы:
    585
    Пол:
    Мужской
    Рисуем горизонтальную линию
    Код:
    //--------------------------------------------------------------------
    bool DoHLine(const long             chart_ID=0,               // ID графика
                         const string           name="HLine",         // имя метки
                         const int              sub_window=0,             // номер подокна
                         const double           P=0,                      // цена
                         const ENUM_LINE_STYLE  style=STYLE_SOLID,        //
                         const int              line_width=1,             // толщина плоской границы
                         const color            clr=clrBlack,             // цвет текста
                         const bool             back=false,               // на заднем плане
                         const bool             selection=false,          // выделить для перемещений
                         const bool             hidden=true              // скрыт в списке объектов
                            )   {
       ResetLastError();
       if (P == 0) {
          if (ObjectFind(chart_ID,name)>=0) ObjectDelete(name);
       } else {
          if (ObjectFind(chart_ID,name)==-1)   {
             ObjectCreate(chart_ID,name,OBJ_HLINE,sub_window,Time[1],P);
             ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
             ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);                //--- установим цвет текста
             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,selection);
             ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
          }
          ObjectSetDouble(chart_ID,name,OBJPROP_PRICE1,P);
       }
       return(true);
    }
    
    Вертикальную линию
    Код:
    ObjectCreate(chart_id,name,OBJ_VLINE,sub_window,TimeCurrent(),0)
     
    Последнее редактирование: 30 Август 2019
    ys72 нравится это.
  10. loopsider

    loopsider Эксперт Команда форума Модератор

    Регистрация:
    13 Ноябрь 2013
    Сообщения:
    5.323
    Симпатии:
    4.874
    Баллы:
    585
    Пол:
    Мужской
    Простейший пример советника с окном ввода (объект OBJ_EDIT).
    Вводим в окошко текст, а советник его читает и повторяет в комменте в левом верхнем углу.
    [​IMG]
    Код:
    string           InpName="Edit";              // Имя объекта
    
    void OnInit() {
       int x = 100;
       int y = 100;
       int x_size = 100;
       int y_size = 100;
       EditCreate(0,InpName,0,x,y,x_size,y_size,"Type here");
       EventSetMillisecondTimer(100);
    }
    
    
    void OnTimer() {
       string text;
       EditTextGet(text,0,InpName);
       Comment("text = ",text);
    }
    
    void deinit() {
       EditDelete(0,InpName);
       EventKillTimer();
    }
    
    
    //+------------------------------------------------------------------+
    //| Возвращает текст объекта "Поле ввода"                            |
    //+------------------------------------------------------------------+
    bool EditTextGet(string      &text,        // текст
                     const long   chart_ID=0,  // ID графика
                     const string name="Edit") // имя объекта
      {
    //--- сбросим значение ошибки
       ResetLastError();
    //--- получим текст объекта
       if(!ObjectGetString(chart_ID,name,OBJPROP_TEXT,0,text))
         {
          Print(__FUNCTION__,
                ": не удалось получить текст! Код ошибки = ",GetLastError());
          return(false);
         }
    //--- успешное выполнение
       return(true);
      }
    
    //+------------------------------------------------------------------+
    //| Создает объект "Поле ввода"                                      |
    //+------------------------------------------------------------------+
    bool EditCreate(const long             chart_ID=0,               // ID графика
                    const string           name="Edit",              // имя объекта
                    const int              sub_window=0,             // номер подокна
                    const int              x=0,                      // координата по оси X
                    const int              y=0,                      // координата по оси Y
                    const int              width=50,                 // ширина
                    const int              height=18,                // высота
                    const string           text="Text",              // текст
                    const string           font="Arial",             // шрифт
                    const int              font_size=10,             // размер шрифта
                    const ENUM_ALIGN_MODE  align=ALIGN_CENTER,       // способ выравнивания
                    const bool             read_only=false,          // возможность редактировать
                    const ENUM_BASE_CORNER corner=CORNER_LEFT_UPPER, // угол графика для привязки
                    const color            clr=clrBlack,             // цвет текста
                    const color            back_clr=clrWhite,        // цвет фона
                    const color            border_clr=clrNONE,       // цвет границы
                    const bool             back=false,               // на заднем плане
                    const bool             selection=false,          // выделить для перемещений
                    const bool             hidden=true,              // скрыт в списке объектов
                    const long             z_order=0)                // приоритет на нажатие мышью
      {
    //--- сбросим значение ошибки
       ResetLastError();
    //--- создадим поле ввода
       if(!ObjectCreate(chart_ID,name,OBJ_EDIT,sub_window,0,0))
         {
          Print(__FUNCTION__,
                ": не удалось создать объект \"Поле ввода\"! Код ошибки = ",GetLastError());
          return(false);
         }
    //--- установим координаты объекта
       ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x);
       ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y);
    //--- установим размеры объекта
       ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width);
       ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height);
    //--- установим текст
       ObjectSetString(chart_ID,name,OBJPROP_TEXT,text);
    //--- установим шрифт текста
       ObjectSetString(chart_ID,name,OBJPROP_FONT,font);
    //--- установим размер шрифта
       ObjectSetInteger(chart_ID,name,OBJPROP_FONTSIZE,font_size);
    //--- установим способ выравнивания текста в объекте
       ObjectSetInteger(chart_ID,name,OBJPROP_ALIGN,align);
    //--- установим (true) или отменим (false) режим только для чтения
       ObjectSetInteger(chart_ID,name,OBJPROP_READONLY,read_only);
    //--- установим угол графика, относительно которого будут определяться координаты объекта
       ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner);
    //--- установим цвет текста
       ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
    //--- установим цвет фона
       ObjectSetInteger(chart_ID,name,OBJPROP_BGCOLOR,back_clr);
    //--- установим цвет границы
       ObjectSetInteger(chart_ID,name,OBJPROP_BORDER_COLOR,border_clr);
    //--- отобразим на переднем (false) или заднем (true) плане
       ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
    //--- включим (true) или отключим (false) режим перемещения метки мышью
       ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
       ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
    //--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
       ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
    //--- установим приоритет на получение события нажатия мыши на графике
       ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
    //--- успешное выполнение
       return(true);
      }
    
    
    //+------------------------------------------------------------------+
    //| Удаляет объект "Поле ввода"                                      |
    //+------------------------------------------------------------------+
    bool EditDelete(const long   chart_ID=0,  // ID графика
                    const string name="Edit") // имя объекта
      {
    //--- сбросим значение ошибки
       ResetLastError();
    //--- удалим метку
       if(!ObjectDelete(chart_ID,name))
         {
          Print(__FUNCTION__,
                ": не удалось удалить объект \"Поле ввода\"! Код ошибки = ",GetLastError());
          return(false);
         }
    //--- успешное выполнение
       return(true);
      }  
     
  11. loopsider

    loopsider Эксперт Команда форума Модератор

    Регистрация:
    13 Ноябрь 2013
    Сообщения:
    5.323
    Симпатии:
    4.874
    Баллы:
    585
    Пол:
    Мужской
    Набор функции для работы с окном ввода OBJ_EDIT
    Код:
    //+------------------------------------------------------------------+
    //| Создает объект "Поле ввода"                                      |
    //+------------------------------------------------------------------+
    bool EditCreate(const long             chart_ID=0,               // ID графика
                    const string           name="Edit",              // имя объекта
                    const int              sub_window=0,             // номер подокна
                    const int              x=0,                      // координата по оси X
                    const int              y=0,                      // координата по оси Y
                    const int              width=50,                 // ширина
                    const int              height=18,                // высота
                    const string           text="Text",              // текст
                    const string           font="Arial",             // шрифт
                    const int              font_size=10,             // размер шрифта
                    const ENUM_ALIGN_MODE  align=ALIGN_CENTER,       // способ выравнивания
                    const bool             read_only=false,          // возможность редактировать
                    const ENUM_BASE_CORNER corner=CORNER_LEFT_UPPER, // угол графика для привязки
                    const color            clr=clrBlack,             // цвет текста
                    const color            back_clr=clrWhite,        // цвет фона
                    const color            border_clr=clrNONE,       // цвет границы
                    const bool             back=false,               // на заднем плане
                    const bool             selection=false,          // выделить для перемещений
                    const bool             hidden=true,              // скрыт в списке объектов
                    const long             z_order=0)                // приоритет на нажатие мышью
      {
    //--- сбросим значение ошибки
       ResetLastError();
    //--- создадим поле ввода
       if(!ObjectCreate(chart_ID,name,OBJ_EDIT,sub_window,0,0))
         {
          Print(__FUNCTION__,
                ": не удалось создать объект \"Поле ввода\"! Код ошибки = ",GetLastError());
          return(false);
         }
    //--- установим координаты объекта
       ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x);
       ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y);
    //--- установим размеры объекта
       ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width);
       ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height);
    //--- установим текст
       ObjectSetString(chart_ID,name,OBJPROP_TEXT,text);
    //--- установим шрифт текста
       ObjectSetString(chart_ID,name,OBJPROP_FONT,font);
    //--- установим размер шрифта
       ObjectSetInteger(chart_ID,name,OBJPROP_FONTSIZE,font_size);
    //--- установим способ выравнивания текста в объекте
       ObjectSetInteger(chart_ID,name,OBJPROP_ALIGN,align);
    //--- установим (true) или отменим (false) режим только для чтения
       ObjectSetInteger(chart_ID,name,OBJPROP_READONLY,read_only);
    //--- установим угол графика, относительно которого будут определяться координаты объекта
       ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner);
    //--- установим цвет текста
       ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
    //--- установим цвет фона
       ObjectSetInteger(chart_ID,name,OBJPROP_BGCOLOR,back_clr);
    //--- установим цвет границы
       ObjectSetInteger(chart_ID,name,OBJPROP_BORDER_COLOR,border_clr);
    //--- отобразим на переднем (false) или заднем (true) плане
       ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
    //--- включим (true) или отключим (false) режим перемещения метки мышью
       ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
       ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
    //--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
       ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
    //--- установим приоритет на получение события нажатия мыши на графике
       ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
    //--- успешное выполнение
       return(true);
      }
    //+------------------------------------------------------------------+
    //| Перемещает объект "Поле ввода"                                   |
    //+------------------------------------------------------------------+
    bool EditMove(const long   chart_ID=0,  // ID графика
                  const string name="Edit", // имя объекта
                  const int    x=0,         // координата по оси X
                  const int    y=0)         // координата по оси Y
      {
    //--- сбросим значение ошибки
       ResetLastError();
    //--- переместим объект
       if(!ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x))
         {
          Print(__FUNCTION__,
                ": не удалось переместить X-координату объекта! Код ошибки = ",GetLastError());
          return(false);
         }
       if(!ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y))
         {
          Print(__FUNCTION__,
                ": не удалось переместить Y-координату объекта! Код ошибки = ",GetLastError());
          return(false);
         }
    //--- успешное выполнение
       return(true);
      }
    //+------------------------------------------------------------------+
    //| Изменяет размеры объекта "Поле ввода"                            |
    //+------------------------------------------------------------------+
    bool EditChangeSize(const long   chart_ID=0,  // ID графика
                        const string name="Edit", // имя объекта
                        const int    width=0,     // ширина
                        const int    height=0)    // высота
      {
    //--- сбросим значение ошибки
       ResetLastError();
    //--- изменим размеры объекта
       if(!ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width))
         {
          Print(__FUNCTION__,
                ": не удалось изменить ширину объекта! Код ошибки = ",GetLastError());
          return(false);
         }
       if(!ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height))
         {
          Print(__FUNCTION__,
                ": не удалось изменить высоту объекта! Код ошибки = ",GetLastError());
          return(false);
         }
    //--- успешное выполнение
       return(true);
      }
    //+------------------------------------------------------------------+
    //| Изменяет текст объекта "Поле ввода"                              |
    //+------------------------------------------------------------------+
    bool EditTextChange(const long   chart_ID=0,  // ID графика
                        const string name="Edit", // имя объекта
                        const string text="Text") // текст
      {
    //--- сбросим значение ошибки
       ResetLastError();
    //--- изменим текст объекта
       if(!ObjectSetString(chart_ID,name,OBJPROP_TEXT,text))
         {
          Print(__FUNCTION__,
                ": не удалось изменить текст! Код ошибки = ",GetLastError());
          return(false);
         }
    //--- успешное выполнение
       return(true);
      }
    //+------------------------------------------------------------------+
    //| Возвращает текст объекта "Поле ввода"                            |
    //+------------------------------------------------------------------+
    bool EditTextGet(string      &text,        // текст
                     const long   chart_ID=0,  // ID графика
                     const string name="Edit") // имя объекта
      {
    //--- сбросим значение ошибки
       ResetLastError();
    //--- получим текст объекта
       if(!ObjectGetString(chart_ID,name,OBJPROP_TEXT,0,text))
         {
          Print(__FUNCTION__,
                ": не удалось получить текст! Код ошибки = ",GetLastError());
          return(false);
         }
    //--- успешное выполнение
       return(true);
      }
    //+------------------------------------------------------------------+
    //| Удаляет объект "Поле ввода"                                      |
    //+------------------------------------------------------------------+
    bool EditDelete(const long   chart_ID=0,  // ID графика
                    const string name="Edit") // имя объекта
      {
    //--- сбросим значение ошибки
       ResetLastError();
    //--- удалим метку
       if(!ObjectDelete(chart_ID,name))
         {
          Print(__FUNCTION__,
                ": не удалось удалить объект \"Поле ввода\"! Код ошибки = ",GetLastError());
          return(false);
         }
    //--- успешное выполнение
       return(true);
      }
     

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