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

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

  1. loopsider

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

    Регистрация:
    13 Ноябрь 2013
    Сообщения:
    4.253
    Симпатии:
    3.882
    Баллы:
    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 в 14:47
  2. loopsider

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

    Регистрация:
    13 Ноябрь 2013
    Сообщения:
    4.253
    Симпатии:
    3.882
    Баллы:
    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.253
    Симпатии:
    3.882
    Баллы:
    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 в 14:56
    iew и Dmitri нравится это.

.

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

translate