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

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

  1. loopsider

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

    Регистрация:
    13 Ноябрь 2013
    Сообщения:
    4.672
    Симпатии:
    4.317
    Баллы:
    435
    Пол:
    Мужской
    Как программно закрыть терминал?
    Следующий скрипт при перетаскивании на любой график закрывает терминал
    Код:
    //+------------------------------------------------------------------+
    //| Находит дескриптор главного окна и закрывает терминал            |
    //+------------------------------------------------------------------+
    #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
    Сообщения:
    4.672
    Симпатии:
    4.317
    Баллы:
    435
    Пол:
    Мужской
    Как проверить, разрешена ли торговля советнику?
    Код:
    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
    Сообщения:
    4.672
    Симпатии:
    4.317
    Баллы:
    435
    Пол:
    Мужской
    Как разобраться с закрытием встречными ордерами и частичным закрытием по истории сделок
    Полезные функции от 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
    Сообщения:
    4.672
    Симпатии:
    4.317
    Баллы:
    435
    Пол:
    Мужской
    Как обеспечить подгрузку истории по различным таймфремам в советнике/индикаторе?

    Пожалуйста, войдите или зарегистрируйтесь для просмотра ссылок от авторов МТ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
    Сообщения:
    4.672
    Симпатии:
    4.317
    Баллы:
    435
    Пол:
    Мужской
    Использование 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
    Сообщения:
    4.672
    Симпатии:
    4.317
    Баллы:
    435
    Пол:
    Мужской
    Скрипт разворачивает и сворачивает окно любого графика финансового инструмента.
    Код:
    //+------------------------------------------------------------------+
    //|                                                          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);
      }
    //+------------------------------------------------------------------+
    Источник: Пожалуйста, войдите или зарегистрируйтесь для просмотра ссылок
     

    Вложения:

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

.

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

translate