Как начать работу с MQL5 - страница 34

 

Тип сработавшего отложенного ордера

Код 'TypePendingOrderTriggered.mq5'

//+------------------------------------------------------------------+
//|                                    TypePendingOrderTriggered.mq5 |
//|                         Copyright © 2017-2021, Vladimir Karputov |
//|                      https://www.mql5.com/en/users/barabashkakvn |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2017-2021, Vladimir Karputov"
#property link      "https://www.mql5.com/en/users/barabashkakvn"
#property version   "1.002"
#property description "What type of a pending order triggered?"
//---
bool bln_find_order=false;                // true -> you should look for a order
ulong ul_find_order=0;                    // order ticket
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(bln_find_order) // true -> you should look for a order
     {
      static long counter=0;
      PrintFormat("Attempt %d, looking for order number %",counter,ul_find_order);
      ResetLastError();
      if(HistoryOrderSelect(ul_find_order))
        {
         long type_order=HistoryOrderGetInteger(ul_find_order,ORDER_TYPE);
         if(type_order==ORDER_TYPE_BUY_LIMIT || type_order==ORDER_TYPE_BUY_STOP || type_order==ORDER_TYPE_SELL_LIMIT ||type_order==ORDER_TYPE_SELL_STOP)
           {
            Print("The pending order ",ul_find_order," is found! Type of order is ",
                  EnumToString((ENUM_ORDER_TYPE)HistoryOrderGetInteger(ul_find_order,ORDER_TYPE)));
            bln_find_order=false;         // true -> you should look for a order
            counter=0;
            return;
           }
         else
           {
            Print("The order ",ul_find_order," is not pending");
            bln_find_order=false;         // true -> you should look for a order
            return;
           }
        }
      else
        {
         Print("Order ",ul_find_order," is not find, error #",GetLastError());
        }
      counter++;
     }
  }
//+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
//+------------------------------------------------------------------+
//| TRADE_TRANSACTION_DEAL_*                                         |
//| The following fields in MqlTradeTransaction structure            |
//| are filled for trade transactions related to deals handling      |
//| (TRADE_TRANSACTION_DEAL_ADD, TRADE_TRANSACTION_DEAL_UPDATE       |
//| and TRADE_TRANSACTION_DEAL_DELETE):                              |
//|  •deal - deal ticket;                                            |
//|  •order - order ticket, based on which a deal has been performed;|
//|  •symbol - deal symbol name;                                     |
//|  •type - trade transaction type;                                 |
//|  •deal_type - deal type;                                         |
//|  •price - deal price;                                            |
//|  •price_sl - Stop Loss price (filled, if specified in the order, |
//|  •based on which a deal has been performed);                     |
//|  •price_tp - Take Profit price (filled, if specified             |
//|   in the order, based on which a deal has been performed);       |
//|  •volume - deal volume in lots.                                  |
//|  •position - the ticket of the position that was opened,         |
//|   modified or closed as a result of deal execution.              |
//|  •position_by - the ticket of the opposite position.             |
//|   It is only filled for the out by deals                         |
//|   (closing a position by an opposite one).                       |
//+------------------------------------------------------------------+
//--- get transaction type as enumeration value 
   ENUM_TRADE_TRANSACTION_TYPE type=trans.type;
//--- if transaction is result of addition of the transaction in history
   if(type==TRADE_TRANSACTION_DEAL_ADD)
     {
      bln_find_order=true;                // true -> you should look for a order
      ul_find_order=trans.order;
     }
  }
//+------------------------------------------------------------------+
Файлы:
 
Vladimir Karputov #:

Тип сработавшего отложенного ордера

Код 'TypePendingOrderTriggered.mq5'

Спасибо. Это будет полезно в моем текущем проекте.

 
daengrani # :

Дорогой Владимир,


Я хочу спросить о PostitionCloseBy.

Скажем, сработал BuyStop, он закрывает позицию Sell. Заранее спасибо.

Пример кода: Срабатывание отложенного ордера и противоположное закрытие

 

Большое спасибо, сэр. Я начал изучать mql5... Спасибо, спасибо...

Я видел некоторые из ваших кодов о DEAL_REASON_TP, DEAL_REASON_SL.

Некоторые не используют DEAL_ENTRY_OUT, некоторые используют

 

Сэр, я хочу спросить эту функцию, внутри торговой библиотеки

и это пример ea из mql5

 
daengrani #:

Сэр, я хочу спросить эту функцию, внутри Торговой библиотеки

и это пример ea из mql5

1. Пожалуйста, вставляйте код правильно: при редактировании сообщения нажмите кнопку Коди вставьте ваш код во всплывающее окно.

2. Для вставленного кода доступна раскраска:

   if(iTime(m_symbol.Name(),InpWorkingPeriod,0)==m_last_deal_in) // on one bar - only one deal
      return(true);
   double ma_high[],ma_low[],ma_median[];
   ArraySetAsSeries(ma_high,true);
   ArraySetAsSeries(ma_low,true);
   ArraySetAsSeries(ma_median,true);
   int start_pos=0,count=6;

Раскраска доступна для вставленного кода

 
Vladimir Karputov #:

1. Пожалуйста, вставьте код правильно: при редактировании сообщения нажмите кнопку и вставьте код во всплывающее окно.

2. Для вставленного кода доступна раскраска:


Извините, я ошибся
 

Уважаемый Владимир,


Я хочу спросить об использовании прямоугольника в качестве уровня для отложенных ордеров. Вот мой код:


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



void OnChartEvent(const int id,         // Event identifier
                  const long& lparam,   // Event parameter of long type
                  const double& dparam, // Event parameter of double type
                  const string& sparam  // Event parameter of string type
                 )
{
//--- the left mouse button has been pressed on the chart
   if(id==CHARTEVENT_OBJECT_CREATE || id==CHARTEVENT_OBJECT_DRAG) {
      if(sparam == sDnRectangle || sparam == sUpRectangle) {
         HandleRect();
      }
      /*
      */
      if(sparam == sUpRectangle) {

         Comment ("Rectangle Low : ", DoubleToString(UpperRectLow, _Digits), "\n",
                  "Rectangle High : ", DoubleToString(UpperRectHigh, _Digits), "\n",
                  "SellLimit Price : ", DoubleToString(ObjectGetDouble(0, sUpRectLabelPrice, OBJPROP_PRICE, 0), _Digits), "\n",
                  "SellLimit SL : ", DoubleToString(ObjectGetDouble(0, sUpRectLabelSL, OBJPROP_PRICE, 0), _Digits)
                 );
      }
      if(sparam == sDnRectangle) {

         Comment ("Rectangle High : ", DoubleToString(LowerRectHigh, _Digits), "\n",
                  "Rectangle Low : ", DoubleToString(LowerRectLow, _Digits), "\n",
                  "BuyLimit Price : ", DoubleToString(ObjectGetDouble(0, sDnRectLabelPrice, OBJPROP_PRICE, 0), _Digits), "\n",
                  "BuyLimit SL : ", DoubleToString(ObjectGetDouble(0, sDnRectLabelSL, OBJPROP_PRICE, 0), _Digits)
                 );
      }
   }
}

Если я помещу функцию HandleRect() в OnChartEvent, то всякий раз, когда я перетаскиваю этот прямоугольник, я вижу, что все значения обновляются немедленно. Но на OnTick он не обновляется.

Файлы:
 
daengrani # :

Дорогой Владимир,

Я хочу спросить об использовании прямоугольника в качестве уровня для отложенных ордеров. Вот мой код:

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


По какому принципу вы выставляете отложенный ордер? Какой бар вы проверяете?

 
daengrani # :

Дорогой Владимир,


Я хочу спросить об использовании прямоугольника в качестве уровня для отложенных ордеров. Вот мой код:


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



Если я помещу функцию HandleRect() в OnChartEvent, то всякий раз, когда я перетаскиваю этот прямоугольник, я вижу, что все значения обновляются немедленно. Но на OnTick он не обновляется.

Не используйте 'OnChartEvent' - делайте проверки в OnTick.