Вопросы по вебинару "Программирование на языке MQL5"

Результаты опроса: Как Вы считаете, за какой период можно научиться основам MQL-программирования?

Голосовавшие
30. Вы ещё не участвовали в этом опросе
  • 1-2 недели

    2 6.67%
  • 2-4 недели

    4 13.33%
  • 1-3 месяца

    12 40.00%
  • 3-6 месяцев

    3 10.00%
  • полгода-год

    9 30.00%
Страница 1 из 2 1 2 ПоследняяПоследняя
Показано с 1 по 10 из 16

Тема: Вопросы по вебинару "Программирование на языке MQL5"

  1. #1
    Денис Кириченко
    Guest

    Lightbulb Вопросы по вебинару "Программирование на языке MQL5"

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

    ---------- Сообщение добавлено в 11:18 ----------

    На Лекции 5 речь шла о торговых операциях.

    Прилагаю пример скрипта, в котором используются торговые операции. А также рекомендую обратиться к документации по данной проблематике:
    • Типы торговых операций: _http://www.mql5.com/ru/docs/constants/tradingconstants/enum_trade_request_actions
    • Торговые функции: _http://www.mql5.com/ru/docs/trading/ordersend



    Скрытый текст

    PHP код:
    //+------------------------------------------------------------------+
    //|                                       Script_TradeOperations.mq5 |
    //|                                           Copyright 2013, denkir |
    //|                           https://login.mql5.com/ru/users/denkir |
    //|                                                                  |
    //|------------------------------------------------------------------|
    //| Цель скрипта: 
    //|   продемонстрировать примеры работы с торговым операциями
    //| 
    //| * Пример 1 (продать немедленно по рынку)
    //| * Пример 2 (поставить отложенный buy limit)
    //| * Пример 3 (изменить отложенный buy limit)
    //| * Пример 4 (открыть несколько позиций)
    //| 
    //| Примечания: учебный материал к Лекции 5
    //|
    //+------------------------------------------------------------------+
    #property copyright "Copyright 2013, denkir"
    #property link      "https://login.mql5.com/ru/users/denkir"
    #property version   "1.00"
    //+------------------------------------------------------------------+
    //| Script program start function                                    |
    //+------------------------------------------------------------------+
    void OnStart()
      {

    //======= Пример 1 (продать немедленно по рынку)
    /*
    //--- 1. Создать запрос
       MqlTradeRequest Trade_reqst={0};            // Инициализация структуры торгового запроса
       Trade_reqst.action=TRADE_ACTION_DEAL;       // Тип: немедленное совершение сделки
       Trade_reqst.symbol=_Symbol;                 // Инструмент: текущий
       Trade_reqst.volume=0.1;                     // Объём: 0.1 лота
       Trade_reqst.type=ORDER_TYPE_SELL;           // Тип ордера: на продажу
       Trade_reqst.type_filling=ORDER_FILLING_FOK; // Политика исполнения: FOK
    //--- 2. Отправить торговый приказ
       MqlTradeResult Trade_reslt={0};             // Инициализация структуры результата торгового запроса
       OrderSend(Trade_reqst,Trade_reslt);         // Отправка торгового запроса на сервер
    */
    //======= Пример 2 (поставить отложенный buy limit)
    /*
    //--- 1. Создать запрос
       string curr_symbol="GBPUSD.m";                // Символ: "GBPUSD.m"
       double curr_point=SymbolInfoDouble(curr_symbol,SYMBOL_POINT); // размер пункта
       MqlTradeRequest Trade_reqst={0};              // Инициализация структуры торгового запроса
       Trade_reqst.action=TRADE_ACTION_PENDING;      // Тип: отложенный ордер
       Trade_reqst.symbol=curr_symbol;               // Инструмент: curr_symbol
       Trade_reqst.volume=0.12;                      // Объём: 0.12 лота   
       Trade_reqst.price=SymbolInfoDouble("GBPUSD.m",SYMBOL_ASK)-1000*curr_point; // Цена исполнения
       Trade_reqst.sl=Trade_reqst.price-500*_Point;  // Stop Loss
       Trade_reqst.tp=Trade_reqst.price+1500*_Point; // Take Profit
       Trade_reqst.type=ORDER_TYPE_BUY_LIMIT;        // Тип ордера: buy limit
       Trade_reqst.type_filling=ORDER_FILLING_FOK;   // Политика исполнения: FOK
       Trade_reqst.expiration=ORDER_TIME_GTC;        // Срок действия ордера: пока не будет снят
    //--- 2. Отправить торговый приказ
       MqlTradeResult Trade_reslt={0};               // Инициализация структуры результата торгового запроса
       OrderSend(Trade_reqst,Trade_reslt);           // Отправка торгового запроса на сервер
    */

    //======= Пример 3 (изменить отложенный buy limit)
    /*
    //--- 1. Создать запрос
       string curr_symbol="GBPUSD.m";                // Символ: "GBPUSD.m"
       double curr_point=SymbolInfoDouble(curr_symbol,SYMBOL_POINT); // размер пункта
       MqlTradeRequest Trade_reqst={0};              // Инициализация структуры торгового запроса
       Trade_reqst.action=TRADE_ACTION_MODIFY;       // Тип: Изменить параметры ордера
       Trade_reqst.order=18521733;                   // указать тикет предыдущего ордера!
       Trade_reqst.price=SymbolInfoDouble("GBPUSD.m",SYMBOL_ASK)-1250*curr_point; // Цена исполнения
       Trade_reqst.sl=Trade_reqst.price-600*_Point;  // Stop Loss
       Trade_reqst.tp=Trade_reqst.price+1700*_Point; // Take Profit
       Trade_reqst.type=ORDER_TYPE_BUY_LIMIT;        // Тип ордера: buy limit
       Trade_reqst.type_time=ORDER_TIME_GTC;         // Срок действия ордера: пока не будет снят
    //--- 2. Отправить торговый приказ
       MqlTradeResult Trade_reslt={0};               // Инициализация структуры результата торгового запроса
       OrderSend(Trade_reqst,Trade_reslt);           // Отправка торгового запроса на сервер
    */

    //======= Пример 4 (открыть несколько позиций)

       
    string Symbols[]={"USDJPY.m","USDCHF.m","EURGBP.m","CADCHF.m"}; // Массив инструментов
       
    double Volumes[]={0.15,0.07,0.03,0.11};                 // Массив объёмов
       
    ENUM_SYMBOL_INFO_DOUBLE Price_types[]={SYMBOL_BID,SYMBOL_ASK};  // Массив типов цен
       
    ENUM_ORDER_TYPE Order_types[]={ORDER_TYPE_SELL,ORDER_TYPE_BUY}; // Массив типов ордеров
       
    MqlTradeRequest Trade_reqst[4]={0};                     // Массив структур торгового запроса
       
    MqlTradeResult Trade_reslt[4]={0};                      // Массив структур результата торгового запроса
       
    for(int i=0;i<4;i++) // цикл для заполнения массива Trade_reqst
         
    {                  // и отправки торгового приказа
          //--- 1. Создать запрос   
          
    Trade_reqst[i].action=TRADE_ACTION_DEAL// Тип: немедленное совершение сделки
          
    Trade_reqst[i].symbol=Symbols[i];        // i-тый инструмент
          
    Trade_reqst[i].volume=Volumes[i];        // i-тый объём
          
    Trade_reqst[i].price=NormalizeDouble(SymbolInfoDouble(Symbols[i],Price_types[i%2]),
                                               (int)
    SymbolInfoInteger(Symbols[i],SYMBOL_DIGITS)); // Цена
          
    if(Order_types[i%2]==ORDER_TYPE_SELL)// если продажа
            
    {
             
    Trade_reqst[i].sl=Trade_reqst[i].price+500*SymbolInfoDouble(Symbols[i],SYMBOL_POINT);  // Stop Loss
             
    Trade_reqst[i].tp=Trade_reqst[i].price-1500*SymbolInfoDouble(Symbols[i],SYMBOL_POINT); // Take Profit
            
    }
          else 
    // если покупка
            
    {
             
    Trade_reqst[i].sl=Trade_reqst[i].price-500*SymbolInfoDouble(Symbols[i],SYMBOL_POINT);  // Stop Loss
             
    Trade_reqst[i].tp=Trade_reqst[i].price+1500*SymbolInfoDouble(Symbols[i],SYMBOL_POINT); // Take Profit
            
    }
          
    Trade_reqst[i].type=Order_types[i%2];          // i-тый тип ордера
          
    Trade_reqst[i].type_filling=ORDER_FILLING_FOK// Политика исполнения: Fill or Kill (FOK)   
          //--- 2. Отправить торговый приказ
          
    OrderSend(Trade_reqst[i],Trade_reslt[i]);      // Отправка торгового запроса на сервер
          
    Sleep(5000);                                   // Пауза 5 сек
         
    }
      }
    //+------------------------------------------------------------------+ 
    [свернуть]

    Вы не можете благодарить!
    Последний раз редактировалось qwezz; 26.12.2013 в 18:35.

  2. #2
    Денис Кириченко
    Guest

    Post Лекция 6

    На Лекции 6 речь шла о свойствах позиций и отложенных ордеров.

    Прилагаю пример скрипта, в котором используются функции доступа к указанным свойствам.

    Документация по данной проблематике:
    • _http://www.mql5.com/ru/docs/trading
    • _http://www.mql5.com/ru/articles/211


    Script_PositionOperations.mq5

    PHP код:
    //+------------------------------------------------------------------+
    //|                                    Script_PositionOperations.mq5 |
    //|                                           Copyright 2013, denkir |
    //|                           https://login.mql5.com/ru/users/denkir |
    //|                                                                  |
    //|------------------------------------------------------------------|
    //| Цель скрипта: 
    //|   продемонстрировать пример работы со свойствами отложенного
    //|   ордера и рыночной позиции.
    //| 
    //| * На счету предварительно должны быть открыты позиции и установлены
    //|   отложенные ордера.
    //| 
    //| Примечания: учебный материал к Лекции 6
    //|
    //+------------------------------------------------------------------+
    #property copyright "Copyright 2013, denkir"
    #property link      "https://login.mql5.com/ru/users/denkir"
    #property version   "1.00"
    //+------------------------------------------------------------------+
    //| Script program start function                                    |
    //+------------------------------------------------------------------+
    void OnStart()
      {
       
    int  all_orders=0;               // всего активных ордеров
       
    int  all_positions=0;            // всего позиций
       
    all_orders=OrdersTotal();        // получить количество активных ордеров
       
    all_positions=PositionsTotal();  // получить количество позиций
    //--- проход по свойствам ордера
       
    for(int i=all_orders-1;i>=0;i--)
         {
          
    ulong ticket=OrderGetTicket(i);                               // Тикет выбранного ордера
          
    double  vol_initial=OrderGetDouble(ORDER_VOLUME_INITIAL);     // Первоначальный объём
          
    double  price_open=OrderGetDouble(ORDER_PRICE_OPEN);          // Цена, указанная в ордере
          
    double  price_sl=OrderGetDouble(ORDER_SL);                    // Уровень Stop Loss
          
    double  price_tp=OrderGetDouble(ORDER_TP);                    // Уровень Take Profit
          
    double  price_cur=OrderGetDouble(ORDER_PRICE_CURRENT);        // Текущая цена
          
    double  price_stoplimit=OrderGetDouble(ORDER_PRICE_STOPLIMIT);// Цена постановки Limit ордера
          
    string  order_symbl=OrderGetString(ORDER_SYMBOL);             // Символ ордера
          
    datetime  order_time_stp=OrderGetInteger(ORDER_TIME_SETUP);   // Время постановки ордера
          
    ENUM_ORDER_TYPE  order_type=OrderGetInteger(ORDER_TYPE);      // Тип ордера
          
    ENUM_ORDER_STATE  order_st=OrderGetInteger(ORDER_STATE);      // Статус ордера
          
    datetime  order_time_exp=OrderGetInteger(ORDER_TIME_EXPIRATION); // Время истечения ордера
          
    datetime  order_time_done=OrderGetInteger(ORDER_TIME_DONE);   // Время исполнения или снятия ордера
          
    ENUM_ORDER_TYPE_FILLING order_type_fil=OrderGetInteger(ORDER_TYPE_FILLING); // Тип исполнения по остатку
          
    ENUM_ORDER_TYPE_TIME order_type_time=OrderGetInteger(ORDER_TYPE_TIME);      // Время жизни ордера
          
    long order_magic=OrderGetInteger(ORDER_MAGIC);                // Идентификатор эксперта выставившего ордер
          
    long order_pos_id=OrderGetInteger(ORDER_POSITION_ID);         // Идентификатор позиции
         
    }
    //--- проход по свойствам позиции     
       
    for(int k=all_positions-1;k>=0;k--)
         {
          
    PositionGetSymbol(k);
          
    double  pos_vol=PositionGetDouble(POSITION_VOLUME);               // Объём позиции
          
    double  pos_price_open=PositionGetDouble(POSITION_PRICE_OPEN);    // Цена позиции
          
    double  pos_sl=PositionGetDouble(POSITION_SL);                    // Уровень Stop Loss
          
    double  pos_tp=PositionGetDouble(POSITION_TP);                    // Уровень Take Profit
          
    double  pos_price_cur=PositionGetDouble(POSITION_PRICE_CURRENT);  // Текущая цена
          
    double  pos_prft=PositionGetDouble(POSITION_PROFIT);              // Текущая прибыль
          
    string  pos_smbl=PositionGetString(POSITION_SYMBOL);              // Символ
          
    datetime  pos_time=PositionGetInteger(POSITION_TIME);             // Время открытия позиции
          
    ENUM_POSITION_TYPE  pos_type=PositionGetInteger(POSITION_TYPE);   // Тип позиции
          
    long  pos_mag=PositionGetInteger(POSITION_MAGIC);                 // Magic number для позиции
          
    long  pos_id=PositionGetInteger(POSITION_IDENTIFIER);             // Идентификатор позиции
         
    }
      }
    //+------------------------------------------------------------------+ 
    [свернуть]

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

  3. #3
    Денис Кириченко
    Guest

    Post Лекция 7

    На Лекции 7 речь шла о пользовательском техническом индикаторе.

    Прилагаю пример индикатора, который отражает волатильность на каждом баре.

    Документация и статьи по теме индикаторов:
    • _http://www.mql5.com/ru/docs/customind
    • _http://www.mql5.com/ru/articles/indicators



    PointsVolatility.mq5

    PHP код:
    //+------------------------------------------------------------------+
    //|                                             PointsVolatility.mq5 |
    //|                                           Copyright 2013, denkir |
    //|                           https://login.mql5.com/ru/users/denkir |
    //|                                                                  |
    //+------------------------------------------------------------------+                                                                  |
    //| Цель индикатора:                                                  
    //|    1)отобразить абсолютную волатильность за указанный период               
    //|      в пунктах;                                                   
    //|    2)отметить горизонтальными уровнями 3 пользовательских         
    //|      значения волатильности;       
    //|                                
    //| Примечания: учебный материал к Лекции 7
    //|
    //+------------------------------------------------------------------+
    #property copyright "Copyright 2013, denkir"
    #property link      "https://login.mql5.com/ru/users/denkir"
    #property version   "1.00"

    //--- Базовые параметры индикатора
    #property indicator_separate_window      // в отдельном окне
    #property indicator_buffers 1            // индикаторные буферы
    #property indicator_plots   1            // графические серии

    #property indicator_type1 DRAW_HISTOGRAM // тип линии
    #property indicator_width1 20
    #property indicator_color1  clrCadetBlue // цвет линии

    //--- Пользовательские переменные
    input int val1=25// Значение первого уровня
    input int val2=50// Значение второго уровня
    input int val3=80// Значение третьего уровня

    //--- Глобальные переменные
    double buf_vol[];  // массив волатильности
    //+------------------------------------------------------------------+
    //| Custom indicator initialization function                         |
    //+------------------------------------------------------------------+  
    void OnInit()
      {
    //--- Общие параметры индикатора

       
    SetIndexBuffer(0,buf_vol,INDICATOR_DATA);         // первый буфер индикатора
       
    IndicatorSetInteger(INDICATOR_DIGITS,0);          // точность отображения значений
       
    IndicatorSetInteger(INDICATOR_LEVELS,3);          // количество уровней
       
    IndicatorSetString(INDICATOR_SHORTNAME,"Абс. волатильность, пп."); // короткое наименование
       
    PlotIndexSetInteger(0,PLOT_SHOW_DATA,1);          // показать значения построения в окне DataWindow
       
    PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);         // пустое значение равно 0
       
    PlotIndexSetString(0,PLOT_LABEL,"Волатильность"); // имя серии

    //--- Параметры линий индикатора 
                                                      
       
    IndicatorSetInteger(INDICATOR_LEVELCOLOR,0,clrDimGray);       // цвет линии 1-го уровня
       
    IndicatorSetInteger(INDICATOR_LEVELSTYLE,0,STYLE_SOLID);      // стиль линии 1-го уровня
       
    IndicatorSetInteger(INDICATOR_LEVELWIDTH,0,3);                // толщина линии 1-го уровня
       
    IndicatorSetInteger(INDICATOR_LEVELCOLOR,1,clrRed);           // цвет линии 2-го уровня
       
    IndicatorSetInteger(INDICATOR_LEVELSTYLE,1,STYLE_DASHDOTDOT); // стиль линии 2-го уровня
       
    IndicatorSetInteger(INDICATOR_LEVELWIDTH,1,5);                // толщина линии 2-го уровня
       
    IndicatorSetInteger(INDICATOR_LEVELCOLOR,2,clrGreenYellow);   // цвет линии 3-го уровня
       
    IndicatorSetInteger(INDICATOR_LEVELSTYLE,2,STYLE_DASH);       // стиль линии 3-го уровня
       
    IndicatorSetInteger(INDICATOR_LEVELWIDTH,2,2);                // толщина линии 3-го уровня

       
    IndicatorSetDouble(INDICATOR_LEVELVALUE,0,val1);              // значение линии 1-го уровня
       
    IndicatorSetDouble(INDICATOR_LEVELVALUE,1,val2);              // значение линии 2-го уровня
       
    IndicatorSetDouble(INDICATOR_LEVELVALUE,2,val3);              // значение линии 3-го уровня

       
    IndicatorSetString(INDICATOR_LEVELTEXT,0,"Уровень 1");        // описание 1-го уровня
       
    IndicatorSetString(INDICATOR_LEVELTEXT,1,"Уровень 2");        // описание 2-го уровня
       
    IndicatorSetString(INDICATOR_LEVELTEXT,2,"Уровень 3");        // описание 3-го уровня
      
    }
    //+------------------------------------------------------------------+
    //| Обработчик события деинициализации                               |
    //+------------------------------------------------------------------+
    void OnDeinit(const int _reason)
      {

      }
    //+------------------------------------------------------------------+
    //| Обработчик события инициализации                                 |
    //+------------------------------------------------------------------+
    int OnCalculate(const int rates_total,const int prev_calculated,
                    const 
    int begin,const double &price[])
      {
       
    MqlRates rates[];                                    // массив структур ценовых данных
       
    int copied=CopyRates(_Symbol,0,0,rates_total,rates); // получить исторические данные
       
    int first,                                           // стартовый номер
       
    bar;                                                 // номер бара
       
    if(prev_calculated==0)        // если на предыдущем вызове не было баров
          
    first=begin;               // расчёт с начала
       
    else first=prev_calculated-1// расчёт с нового бара
       
    for(bar=firstbar<rates_totalbar++) // цикл расчёта
          
    buf_vol[bar]=NormalizeDouble((rates[bar].high-rates[bar].low)*pow(10.,_Digits),0); // заполнение буфера волатильности                                    
       
    return(rates_total);              // возврат баров с вычисленными значениями
      
    }
    //+------------------------------------------------------------------+ 
    [свернуть]

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

  4. #4
    Новичок Аватар для ssn5810
    Регистрация
    19.09.2013
    Сообщений
    35
    Promo (¢)
    415
    Благодарности
    Получено: 0
    Отправлено: 19
    Цитата Сообщение от Денис Кириченко Посмотреть сообщение
    На Лекции 7 речь шла о пользовательском техническом индикаторе.

    Прилагаю пример индикатора, который отражает волатильность на каждом баре.

    Документация и статьи по теме индикаторов:
    • _http://www.mql5.com/ru/docs/customind
    • _http://www.mql5.com/ru/articles/indicators



    PointsVolatility.mq5

    PHP код:
    //+------------------------------------------------------------------+
    //|                                             PointsVolatility.mq5 |
    //|                                           Copyright 2013, denkir |
    //|                           https://login.mql5.com/ru/users/denkir |
    //|                                                                  |
    //+------------------------------------------------------------------+                                                                  |
    //| Цель индикатора:                                                  
    //|    1)отобразить абсолютную волатильность за указанный период               
    //|      в пунктах;                                                   
    //|    2)отметить горизонтальными уровнями 3 пользовательских         
    //|      значения волатильности;       
    //|                                
    //| Примечания: учебный материал к Лекции 7
    //|
    //+------------------------------------------------------------------+
    #property copyright "Copyright 2013, denkir"
    #property link      "https://login.mql5.com/ru/users/denkir"
    #property version   "1.00"

    //--- Базовые параметры индикатора
    #property indicator_separate_window      // в отдельном окне
    #property indicator_buffers 1            // индикаторные буферы
    #property indicator_plots   1            // графические серии

    #property indicator_type1 DRAW_HISTOGRAM // тип линии
    #property indicator_width1 20
    #property indicator_color1  clrCadetBlue // цвет линии

    //--- Пользовательские переменные
    input int val1=25// Значение первого уровня
    input int val2=50// Значение второго уровня
    input int val3=80// Значение третьего уровня

    //--- Глобальные переменные
    double buf_vol[];  // массив волатильности
    //+------------------------------------------------------------------+
    //| Custom indicator initialization function                         |
    //+------------------------------------------------------------------+  
    void OnInit()
      {
    //--- Общие параметры индикатора

       
    SetIndexBuffer(0,buf_vol,INDICATOR_DATA);         // первый буфер индикатора
       
    IndicatorSetInteger(INDICATOR_DIGITS,0);          // точность отображения значений
       
    IndicatorSetInteger(INDICATOR_LEVELS,3);          // количество уровней
       
    IndicatorSetString(INDICATOR_SHORTNAME,"Абс. волатильность, пп."); // короткое наименование
       
    PlotIndexSetInteger(0,PLOT_SHOW_DATA,1);          // показать значения построения в окне DataWindow
       
    PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);         // пустое значение равно 0
       
    PlotIndexSetString(0,PLOT_LABEL,"Волатильность"); // имя серии

    //--- Параметры линий индикатора 
                                                      
       
    IndicatorSetInteger(INDICATOR_LEVELCOLOR,0,clrDimGray);       // цвет линии 1-го уровня
       
    IndicatorSetInteger(INDICATOR_LEVELSTYLE,0,STYLE_SOLID);      // стиль линии 1-го уровня
       
    IndicatorSetInteger(INDICATOR_LEVELWIDTH,0,3);                // толщина линии 1-го уровня
       
    IndicatorSetInteger(INDICATOR_LEVELCOLOR,1,clrRed);           // цвет линии 2-го уровня
       
    IndicatorSetInteger(INDICATOR_LEVELSTYLE,1,STYLE_DASHDOTDOT); // стиль линии 2-го уровня
       
    IndicatorSetInteger(INDICATOR_LEVELWIDTH,1,5);                // толщина линии 2-го уровня
       
    IndicatorSetInteger(INDICATOR_LEVELCOLOR,2,clrGreenYellow);   // цвет линии 3-го уровня
       
    IndicatorSetInteger(INDICATOR_LEVELSTYLE,2,STYLE_DASH);       // стиль линии 3-го уровня
       
    IndicatorSetInteger(INDICATOR_LEVELWIDTH,2,2);                // толщина линии 3-го уровня

       
    IndicatorSetDouble(INDICATOR_LEVELVALUE,0,val1);              // значение линии 1-го уровня
       
    IndicatorSetDouble(INDICATOR_LEVELVALUE,1,val2);              // значение линии 2-го уровня
       
    IndicatorSetDouble(INDICATOR_LEVELVALUE,2,val3);              // значение линии 3-го уровня

       
    IndicatorSetString(INDICATOR_LEVELTEXT,0,"Уровень 1");        // описание 1-го уровня
       
    IndicatorSetString(INDICATOR_LEVELTEXT,1,"Уровень 2");        // описание 2-го уровня
       
    IndicatorSetString(INDICATOR_LEVELTEXT,2,"Уровень 3");        // описание 3-го уровня
      
    }
    //+------------------------------------------------------------------+
    //| Обработчик события деинициализации                               |
    //+------------------------------------------------------------------+
    void OnDeinit(const int _reason)
      {

      }
    //+------------------------------------------------------------------+
    //| Обработчик события инициализации                                 |
    //+------------------------------------------------------------------+
    int OnCalculate(const int rates_total,const int prev_calculated,
                    const 
    int begin,const double &price[])
      {
       
    MqlRates rates[];                                    // массив структур ценовых данных
       
    int copied=CopyRates(_Symbol,0,0,rates_total,rates); // получить исторические данные
       
    int first,                                           // стартовый номер
       
    bar;                                                 // номер бара
       
    if(prev_calculated==0)        // если на предыдущем вызове не было баров
          
    first=begin;               // расчёт с начала
       
    else first=prev_calculated-1// расчёт с нового бара
       
    for(bar=firstbar<rates_totalbar++) // цикл расчёта
          
    buf_vol[bar]=NormalizeDouble((rates[bar].high-rates[bar].low)*pow(10.,_Digits),0); // заполнение буфера волатильности                                    
       
    return(rates_total);              // возврат баров с вычисленными значениями
      
    }
    //+------------------------------------------------------------------+ 
    [свернуть]
    а лекция 8 ???

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

  5. #5
    Денис Кириченко
    Guest

    Лекция 8

    На Лекции 8 речь шла о торговом советнике.

    Прилагаю пример кода, который рассматривался в ходе вебинара.

    Статьи по теме советников:
    _http://www.mql5.com/ru/articles/132


    ExpertTrade2.mq5


    PHP код:
    //+------------------------------------------------------------------+
    //|                                                 ExpertTrade2.mq5 |
    //|                                           Copyright 2013, denkir |
    //|                           https://login.mql5.com/ru/users/denkir |
    //|                                                                  |
    //|------------------------------------------------------------------|
    //| Цель советника: 
    //|   продемонстрировать пример открытия позиции по сигналу, установке
    //|   торговых уровней по волатильности и учёту текущей волатильности
    //|   при открытии позиции
    //| 
    //| Примечания: учебный материал к Лекции 8
    //|
    //+------------------------------------------------------------------+
    #property copyright "Copyright 2013, denkir"
    #property link      "https://login.mql5.com/ru/users/denkir"
    #property version   "1.00"

    //=== Пользовательские переменные
    input int    InpTakeProfit    =500;  // Take Profit (в пп)
    input int    InpStopLoss      =300;  // Stop Loss (в пп)
    //=== Глобальные переменные
    int ma1Handle;      // хэндл индикатора Moving Average 13
    int ma2Handle;      // хэндл индикатора Moving Average 21
    int PointsHandle;   // хэндл индикатора PointsVolatility
    double ma1Val[];    // динамический массив для хранения значений индикатора Moving Average 13
    double ma2Val[];    // динамический массив для хранения значений индикатора Moving Average 21
    double PointsVal[]; // динамический массив для хранения значений индикатора PointsVolatility
    ENUM_DEAL_ENTRY deal_entry;// Направление сделки
    //+------------------------------------------------------------------+
    //| Expert initialization function                                   |
    //+------------------------------------------------------------------+
    int OnInit()
      {
       
    int MA1_Period=13,MA2_Period=21// периоды для средних
       
    ma1Handle=iMA(_Symbol,_Period,MA1_Period,0,MODE_EMA,PRICE_CLOSE);
       
    ma2Handle=iMA(_Symbol,_Period,MA2_Period,0,MODE_EMA,PRICE_CLOSE);
       
    PointsHandle=iCustom(_Symbol,_Period,"PointsVolatility");
    //--- индексация как в таймсериях   
       
    ArraySetAsSeries(ma1Val,true);
       
    ArraySetAsSeries(ma2Val,true);
       return(
    0);
      }
    //+------------------------------------------------------------------+
    //| Expert deinitialization function                                 |
    //+------------------------------------------------------------------+
    void OnDeinit(const int reason)
      {

      }
    //+------------------------------------------------------------------+
    //| Expert tick function                                             |
    //+------------------------------------------------------------------+
    void OnTick()
      {
       if(
    PositionSelect(_Symbol)) // Выходим, если позиция уже открыта
          
    return;
    //---          
       
    int signal;
    // проверка закрытия позиции по стопу или профиту
       
    PositionCheckResult();
       if(!
    IsNewBar()) return;           // 1. Проверка на новый бар
    //---   
       
    if(CopyBuffer(ma1Handle,0,0,3,ma1Val)<0)
         {
          
    Alert("Ошибка копирования буферов индикатора MA 13 - номер ошибки:",GetLastError());
          return;
         }
       if(
    CopyBuffer(ma2Handle,0,0,3,ma2Val)<0)
         {
          
    Alert("Ошибка копирования буферов индикатора MA 21 - номер ошибки:",GetLastError());
          return;
         }
       
    signal=CheckTradeSignal();
       if(
    PositionOpen(signal))
          Print(
    "Open Position for "+_Symbol+"!");

      }
    //+------------------------------------------------------------------+
    //|          Функция проверки на появление нового бара               |
    //+------------------------------------------------------------------+
    bool IsNewBar(void)
      {
       static 
    datetime Old_Time// старое время
       
    datetime New_Time[1];     // новое время
       
    int copied=CopyTime(_Symbol,_Period,0,1,New_Time);
    // время последнего бара
       
    if(copied<1// если не удалось скопировать
         
    {
          
    Alert("Error =",GetLastError()); // Алёрт
          
    ResetLastError();                // Сброс ошибки
         
    }
       if(
    Old_Time!=New_Time[0]) // если времена отличаются
         
    {
          
    Old_Time=New_Time[0];  // запомним новое время
          
    return true;           // есть новый бар!
         
    }
       else
          return 
    false;          // нет нового бара!
      
    }
    //+------------------------------------------------------------------+
    //|          Функция проверки на появление торгового сигнала         |
    //+------------------------------------------------------------------+
    int CheckTradeSignal()
      {
       
    int TradeSignal=0;
       if((
    ma2Val[2]>ma1Val[2]) && (ma2Val[1]<ma1Val[1]))
          
    TradeSignal=1// Buy signal  
       
    if((ma2Val[2]<ma1Val[2]) && (ma2Val[1]>ma1Val[1]))
          
    TradeSignal=2// Sell signal
       
    return TradeSignal;
      }
    //+------------------------------------------------------------------+
    //|                    Функция открытия позиции                      |
    //+------------------------------------------------------------------+
    bool PositionOpen(int tradeSignal)
      {
       
    int InpTP,InpSL,vol_indx;
       
    double sl_val,equity,risk_ratio=0.03// стоимость стопа, эквити, доля риска
       
    if(tradeSignal>0// Signal
         
    {
          
    vol_indx=ResizeInputs(InpTP,InpSL); // получить индекс и скорректировать размер Take Profit, Stop Loss
          
    if(vol_indx==1// выходим, если индекс равен 1
            
    {
             Print(
    "Выходим - низкая волатильность!");
             return 
    false;
            }
          
    sl_val=InpSL*SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_VALUE);
          
    equity=AccountInfoDouble(ACCOUNT_EQUITY)*risk_ratio;
          
    double Lots=NormalizeDouble(equity/sl_val,2); // Модификация лотажа
          //---
          
    if(MQL5_TESTING)
            {
             Print(
    "Resized SL = "+IntegerToString(InpSL));
             Print(
    "Resized TP = "+IntegerToString(InpTP));
             Print(
    "Lots  = "+DoubleToString(Lots,2));
            }
          
    //--- 1. Создать запрос
          
    MqlTradeRequest Trade_reqst={0};            // Инициализация структуры торгового запроса
          
    Trade_reqst.action=TRADE_ACTION_DEAL;       // Тип: немедленное совершение сделки
          
    Trade_reqst.symbol=_Symbol;                 // Инструмент: текущий
          
    Trade_reqst.volume=Lots;                    // Лотаж
          
    Trade_reqst.type_filling=ORDER_FILLING_FOK// Политика исполнения: Fill Or Kill
          
    double sl,tp;
          if(
    tradeSignal==1// Buy signal  
            
    {
             
    Trade_reqst.type=ORDER_TYPE_BUY;            // Тип ордера: на покупку
             
    sl=SymbolInfoDouble(_Symbol,SYMBOL_BID)-InpSL*_Point;
             
    tp=SymbolInfoDouble(_Symbol,SYMBOL_BID)+InpTP*_Point;
            }
          else
            {
             
    Trade_reqst.type=ORDER_TYPE_SELL;           // Тип ордера: на продажу
             
    sl=SymbolInfoDouble(_Symbol,SYMBOL_ASK)+InpSL*_Point;
             
    tp=SymbolInfoDouble(_Symbol,SYMBOL_ASK)-InpTP*_Point;
            }
          
    Trade_reqst.sl=sl;
          
    Trade_reqst.tp=tp;
          
    //--- 2. Отправить торговый приказ
          
    MqlTradeResult Trade_reslt_m={0};             // Инициализация структуры результата торгового запроса
          
    if(!OrderSend(Trade_reqst,Trade_reslt_m))     // Отправка торгового запроса на сервер
             
    return false;
          else
             return 
    true;
         }
       else             
    // No signal
         
    {
          return 
    false;
         }
      }
    //+------------------------------------------------------------------+
    //|        Функция корректировки размера прибыли и убытка            |
    //+------------------------------------------------------------------+
    int ResizeInputs(int &inpTP,int &inpSL)
      {
       
    ArraySetAsSeries(PointsVal,true);  // индексация как в таймсериях
       
    if(CopyBuffer(PointsHandle,0,0,200,PointsVal)<0// копируем значения волатильности в буфер
         
    {
          
    Alert("Ошибка копирования буферов индикатора  PointsVolatility - номер ошибки:",
                
    GetLastError());
          return -
    1;
         }
       
    int PointsRange;                   // размах выборки
       
    PointsRange=ArrayMaximum(PointsVal)-ArrayMinimum(PointsVal);
       
    int Quartile=(int)round(PointsRange/4); // квартиль выборки
       
    int quartBounds[5];                // массив границ квартилей
       
    quartBounds[0]=ArrayMinimum(PointsVal);quartBounds[4]=ArrayMaximum(PointsVal);
       
    quartBounds[1]=ArrayMinimum(PointsVal)+Quartile;
       
    quartBounds[2]=ArrayMinimum(PointsVal)+2*Quartile;
       
    quartBounds[3]=ArrayMinimum(PointsVal)+3*Quartile;
       
    double coeff[]={0.65,0.85,1.05,1.25}; // массив коэффициентов
       
    int recentPointsVal=(int)PointsVal[1];     // значение волатильности на предпоследнем баре
       
    int indx=1;
       for(
    int i=1;i<5;i++) // найдём номер группы для  значения волатильности на предпоследнем баре
         
    {
          if(
    recentPointsVal<=quartBounds[i])
            {
             
    indx=i;   // индекс группы (первая имеет индекс 1)
             
    break;    // нашли - выходим из цикла
            
    }
          else
             continue; 
    // продолжить цикл
         
    }
       if(
    MQL5_TESTING)// индекс группы распечатать
          
    Print("Индекс группы волатильности ="+IntegerToString(indx));
       
    inpSL=(int)round(InpStopLoss*coeff[indx-1]);   // корректировка Stop Loss
       
    inpTP=(int)round(InpTakeProfit*coeff[indx-1]); // корректировка Take Profit
       
    return indx;
      }
    //+------------------------------------------------------------------+
    //|           Функция проверки результата совершения сделки          |
    //+------------------------------------------------------------------+
    bool PositionCheckResult()
      {
       static 
    uint all_deals_stat;
       
    uint all_deals;
       
    ulong  last_deal_ticket;    // Тикет сделки
       
    string deal_comm,deal_symb;
       
    double deal_pr;
       
    datetime deal_time;
       
    HistorySelect(0,TimeCurrent());
       
    all_deals=HistoryDealsTotal();
       if(
    all_deals==all_deals_stat)
          return 
    false;
       else
         {
          
    all_deals_stat=all_deals;
          
    last_deal_ticket=HistoryDealGetTicket(HistoryDealsTotal()-1); // Получить тикет последней сделки
          
    deal_entry=(ENUM_DEAL_ENTRY)HistoryDealGetInteger(last_deal_ticket,DEAL_ENTRY);
          if(
    deal_entry==DEAL_ENTRY_OUT)
            {
             
    deal_comm=HistoryDealGetString(last_deal_ticket,DEAL_COMMENT);
             Print(
    "Причина выхода - "+deal_comm);
             
    deal_pr=HistoryDealGetDouble(last_deal_ticket,DEAL_PRICE);
             
    deal_time=(datetime)HistoryDealGetInteger(last_deal_ticket,DEAL_TIME);
            }
         }
       return 
    true;
      }
    //+------------------------------------------------------------------+ 
    [свернуть]


    Чтобы советник работал нормально, нужно разместить предварительно индикатор "PointsVolatility" в папке индикаторов (Лекция 7)

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

  6. #6
    Уже не гость
    Регистрация
    24.02.2014
    Сообщений
    1
    Promo (¢)
    70
    Благодарности
    Получено: 0
    Отправлено: 0

    Вопросы по вебинару "Программирование на языке MQL5"

    Посылаю скрин свой с терминала Робофорекс (вчера поставила и советника тоже) и параметры советника - меняла уж и ТФ - пока не работает...сделку открыла сама, не робот...вообще не реагирует. Может плечо не совпадает? Параметры советника.jpgСоветник в МТ5.jpg

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

  7. #7
    Денис Кириченко
    Guest
    Цитата Сообщение от Olgun4ik Посмотреть сообщение
    Посылаю скрин свой с терминала Робофорекс (вчера поставила и советника тоже) и параметры советника - меняла уж и ТФ - пока не работает...сделку открыла сама, не робот...вообще не реагирует. Может плечо не совпадает?
    Сложно ответить однозначно. Но с большой долей вероятности могу сказать, что просто не было торгового сигнала... попробуйте в Тестере запустить этот советник - должен запуститься...

    Вы не можете благодарить!
    Последний раз редактировалось qwezz; 25.02.2014 в 20:08.

  8. #8
    Денис Кириченко
    Guest

    Лекция 2

    Вчера рассматривали советник Expert2. Привожу пример кода:

    Expert2.mq5


    PHP код:
    //+------------------------------------------------------------------+
    //| Название советника: Expert2.mq5                                  |
    //| Назначение:                                                      |
    //|    1) Открыть позицию по рынку при запуске;                      |
    //|    2) Сообщать при новом тике об открытой позиции;               |
    //|    3) Каждые 60 сек закрывать позицию, открывать новую.          |
    //| Параметры пользователя:                                          |
    //|    1) Объём позиции;                                             |
    //|    2) Размер прибыли в пунктах;                                  |
    //|    3) Размер убытка в пунктах;                                   |
    //|    4) Период скользящего среднего.                               |
    //+------------------------------------------------------------------+
    //|                                           Copyright 2014, denkir |
    //|                           https://login.mql5.com/ru/users/denkir |
    //+------------------------------------------------------------------+
    #property copyright "denkir"
    #property link      "https://login.mql5.com/ru/users/denkir"
    #property version   "1.00"

    #include <Trade\Trade.mqh>                    //включение файлов  

    //---- внешние переменные
    input double InpLots          =0.1;  // лоты
    input int    InpTakeProfit    =40;   // Take Profit (в пп)
    input int    InpSL            =30;   // Stop Loss (в пп)
    input int    MA_Period        =8;    // MA период
    //---- глобальные переменные
    CTrade myTrade;                      // trading object
    int maHandle;                        // хэндл индикатора Moving Average
    double maVal[];                      // динамический массив для хранения данных MA
    //+------------------------------------------------------------------+
    //| Expert initialization function                                   |
    //+------------------------------------------------------------------+
    int OnInit()
      {
       
    maHandle=iMA(_Symbol,_Period,MA_Period,0,MODE_SMA,PRICE_CLOSE); // хэндл индикатора MA
       
    if(maHandle<0//проверка на наличие ошибок
         
    {
          
    Alert("Индикатор MA создан неправильно!");
          return -
    1;
         }
       
    EventSetTimer(60); // Создать таймер - количество секунд
       
    ArraySetAsSeries(maVal,true);// тайм-серия
       
    return 0;
      }
    //+------------------------------------------------------------------+
    //| Expert deinitialization function                                 |
    //+------------------------------------------------------------------+
    void OnDeinit(const int reason)
      {
       
    EventKillTimer();           // удалить таймер
       
    IndicatorRelease(maHandle); // освободить хэндл индикатора
      
    }
    //+------------------------------------------------------------------+
    //| Expert tick function                                             |
    //+------------------------------------------------------------------+
    void OnTick()
      {
       if(
    PositionSelect(_Symbol)) // Если позиция открыта, то больше не открываемся
         
    {
          Print(
    "Expert2 уже открыл позицию!");
          return;
         }
       
    double price=SymbolInfoDouble(_Symbol,SYMBOL_BID); // Bid
       
    if(CopyBuffer(maHandle,0,0,5,maVal)<0// заполним буфер maVal
         
    {
          
    Alert("Ошибка копирования буферов индикатора Moving Average!");
          return;
         }
       
    ENUM_ORDER_TYPE Order;
       
    Order=CheckPrice(price,maVal[0]);
       
    PositionOpen(Order);
      }
    //+------------------------------------------------------------------+
    //| Timer function                                                   |
    //+------------------------------------------------------------------+
    void OnTimer()
      {
       
    bool trade_expert=AccountInfoInteger(ACCOUNT_TRADE_ALLOWED);
       if(!
    trade_expert)
         {
          
    Alert("Автотрейдинг не разрешён!");
          return;
         }
       if(!
    PositionSelect(_Symbol))       // Если позиция не открыта, то выходим
         
    {
          Print(
    "Нет позиции по рынку!"); // пишем в журнал
          
    return;       
         }
       else 
    // иначе
         
    {
          
    Alert("Expert2 закрывает позицию!"); // Алёрт о закрытии
          
    myTrade.PositionClose(_Symbol,15);   // Закрыть позицию
         
    }
      }
    //+------------------------------------------------------------------+
    //| Функция определения типа ордера                                  |
    //+------------------------------------------------------------------+
    ENUM_ORDER_TYPE CheckPrice(double Price,double MA)
      {
       
    ENUM_ORDER_TYPE orderType;    // тип ордера
       
    if(Price>MA)                  // сравниваем цены
          
    orderType=ORDER_TYPE_BUY;  // ордер на покупку
       
    else
          
    orderType=ORDER_TYPE_SELL// ордер на продажу
       
    return orderType;             // вернём тип ордера
      
    }
    //+------------------------------------------------------------------+
    //| Функция открытия позиции по типу ордера                          |
    //+------------------------------------------------------------------+
    bool PositionOpen(ENUM_ORDER_TYPE orderType)
      {
       
    double price,tp,sl;
       if(
    orderType==ORDER_TYPE_BUY// данные для Buy
         
    {
          
    price=SymbolInfoDouble(_Symbol,SYMBOL_ASK);//  Цена Ask
          
    tp=SymbolInfoDouble(_Symbol,SYMBOL_BID)+InpTakeProfit*_Point;// Цена для Take Profit
          
    sl=SymbolInfoDouble(_Symbol,SYMBOL_BID)-InpSL*_Point;// Цена для Stop Loss
         
    }
       else  
    // данные для Sell
         
    {
          
    price=SymbolInfoDouble(_Symbol,SYMBOL_BID);//  Цена Bid
          
    tp=SymbolInfoDouble(_Symbol,SYMBOL_ASK)-InpTakeProfit*_Point;// Цена для Take Profit
          
    sl=SymbolInfoDouble(_Symbol,SYMBOL_ASK)+InpSL*_Point;// Цена для Stop Loss
         
    }
       
    myTrade.SetTypeFilling(ORDER_FILLING_FOK);
       
    myTrade.SetDeviationInPoints(10);
       
    myTrade.PositionOpen(_Symbol,orderType,InpLots,price,sl,tp,EnumToString(orderType));// Открытие позиции
       // Sleep(500); //  Пауза - интервал задержки в миллисекундах
       // myTrade.PositionModify(_Symbol,sl,tp);//  Изменение параметров позиции Stop Loss и Take Profit
       
    return true;
      }
    //+------------------------------------------------------------------+ 
    [свернуть]

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

  9. #9
    Денис Кириченко
    Guest

    Лекция 4

    Сегодня рассматривали скрипт с функциями Script_functions. Привожу пример кода:

    Script_functions.mq5


    PHP код:
    //+------------------------------------------------------------------+
    //|                                             Script_functions.mq5 |
    //|                                           Copyright 2014, denkir |
    //|                           https://login.mql5.com/ru/users/denkir |
    //+------------------------------------------------------------------+
    #property copyright "denkir"
    #property link      "https://login.mql5.com/ru/users/denkir"
    #property version   "1.00"
    //+------------------------------------------------------------------+
    //| Script program start function                                    |
    //+------------------------------------------------------------------+
    void OnStart()
      {
    //--- 1-ый вариант функции IndexArrayMax()
       
    double Array[]={2.05,11.1,78.32,-8.55,44.55,55.44,99,-100.01};
       
    int ind=IndexArrayMax(Array); // индекс максимума в массиве
       
    PrintFormat("Индекс элемента: %d",ind);
    //--- 2-ой вариант функции IndexArrayMax()
       
    double max;
       
    ind=IndexArrayMax(max,Array);
       
    PrintFormat("Индекс элемента: %d; значение элемента: %.2f",ind,max);
      }
    //+------------------------------------------------------------------+
    //| Функция поиска элемента с максимальным значением                 |
    //+------------------------------------------------------------------+
    int IndexArrayMax(double &Array[])
      {
       
    int size=ArraySize(Array); // 1. Размер массива
       
    double max=Array[0];       // 2. Первый элемент как максимальный
       
    int index=0;               // 3. Индекс первого элемента
       
    for(int i=1;i<size;i++)    // цикл
         
    {
          if(Array[
    i]>max)        // 4. Cравнивать  каждый элемент c установленным максимумом
            
    {
             
    max=Array[i];        // 5. Новый максимум
             
    index=i;             // 6. Индекс нового максимума
            
    }
         }
       return 
    index;
      }
    //+------------------------------------------------------------------+
    //| Функция поиска элемента с максимальным значением                 |
    //|            и максимальное значение                               |
    //+------------------------------------------------------------------+
    int IndexArrayMax(double &max,double &Array[])
      {
       
    int size=ArraySize(Array); // 1. Размер массива
       
    max=Array[0];              // 2. Первый элемент как максимальный
       
    int index=0;               // 3. Индекс первого элемента
       
    for(int i=1;i<size;i++)    // цикл
         
    {
          if(Array[
    i]>max)        // 4. Cравнивать  каждый элемент c установленным максимумом
            
    {
             
    max=Array[i];        // 5. Новый максимум
             
    index=i;             // 6. Индекс нового максимума
            
    }
         }
       return 
    index;
      }
    //+------------------------------------------------------------------+ 
    [свернуть]


    Попробуйте создать функцию IndexArrayMin(), которая возвращала бы индекс элемента в массиве с минимальным значением.

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

  10. #10
    Теоретик Аватар для Martin Brest
    Регистрация
    20.12.2013
    Адрес
    Киев
    Сообщений
    4,407
    Promo (¢)
    420
    Благодарности
    Получено: 1,480
    Отправлено: 1,535
    Цитата Сообщение от Денис Кириченко Посмотреть сообщение
    Сегодня рассматривали скрипт с функциями Script
    Скажите, а где можно просмотреть предыдущие вебинары?

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

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

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

Ваши права

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