Использование свойства Comment для идентификации позиций

Программирование прибыли: от азов к секретам мастерства. Читайте, спрашивайте, делитесь опытом.
Бонус за сообщение 0.5$
Ответственный Модератор - Haos

Использование свойства Comment для идентификации позиций

Сообщение Haos » 13 мар 2017, 11:49

Часто при создании советника, работающего по гридерному методу (сетки) я сталкивался с ситуацией, когда сделки сопровождаться должны не в совокупности, а по отдельности. В таких случаях идентификатора советника в виде OrderMagicNumber() уже недостаточно (к тому же обычно для одного советника применяется один Magic).
Решение я нашел в использовании комментариев к сделке в качестве однозначного идентификатора. При этом он может быть просто порядковым номером, т.е. для 1-ой позиции (на покупку, к примеру) - 0, для второй - 1 и т.д. Тип комментария String, однако, его легко можно переводить в коде в Integer и обратно соответствующими функциями (StrToInteger() и IntegerToString()). При этом, поскольку, указывается также спецификатор в виде типа позиции (OP_BUY или OP_SELL), то совпадение комментариев для покупок и продаж - не имеет значения.
Итак, далее идут функции, требующиеся для работы с данным методом.

1. Получение величины профита позиции открытой с указанным комментарием
Код: выделить все
double f_GetProfitPosByComment(string sy, int op, int mn, string co)
{
/*
   Версия   : 12.03.2017                                                     
   Описание : Возвращает профит открытой по указанному комменту позиции
   Параметры:                                                               
   sy - наименование инструмента   ("0" - текущий символ)                 
   op - операция                   (-1   - любая позиция)                 
   mn - MagicNumber                (-1   - любой магик)                   
   co - комментарий
*/
   double dbl_Prof = 0;

   if(sy == "0") sy = Symbol();
   for(int i = 0; i < OrdersTotal(); i++)
   {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
         if((OrderSymbol() == sy) && (op < 0 || OrderType() == op))
         {
            if(OrderType() == OP_BUY || OrderType() == OP_SELL)
            {
               if(mn < 0 || OrderMagicNumber() == mn)
               {
                  if(OrderComment() == co)
                  {
                     dbl_Prof = OrderProfit() + OrderCommission() + OrderSwap();
                  }
               }
            }
         }
      }
   }

return(dbl_Prof);
}


2. Получение комментария позиции по цене открытия
Код: выделить все
string f_GetCommentByOpenPrice(int op, int mn, double pp)
{
/*
   Возвращает комментарий позиции по цене открытия
   pp - цена открытия позиции
*/
   for(int i = 0; i < OrdersTotal(); i++)
   {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
         if((OrderSymbol() == Symbol()) && (op < 0 || OrderType() == op))
         {
            if(OrderType() == OP_BUY || OrderType() == OP_SELL)
            {
               if(mn < 0 || OrderMagicNumber() == mn)
               {
                  if(NormalizeDouble(pp, _Digits) == NormalizeDouble(OrderOpenPrice(), _Digits))
                  {
                     return(OrderComment());
                  }
               }
            }
         }
      }
   }

return("");
}


3. Получение цены TakeProfit позиции, открытой с определенным комментарием
Код: выделить все
double f_GetTPPosByComment(string sy, int op, int mn, string co)
{
/*
   Описание : Возвращает цену TakeProfit позиции с определенным комментом 
   Параметры:                                                               
   sy - наименование инструмента   ("0" - текущий символ)                 
   op - операция                   (-1   - любая позиция)                 
   mn - MagicNumber                (-1   - любой магик)                   
   co - комментарий
*/
   double   tp = -1;
 
   if(sy == "0") sy = Symbol();
   for(int i = 0; i < OrdersTotal(); i++)
   {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
         if(OrderSymbol() == sy)
         {
            if(OrderType() == OP_BUY || OrderType() == OP_SELL)
            {
               if(op < 0 || OrderType() == op)
               {
                  if(mn < 0 || OrderMagicNumber() == mn)
                  {
                     if(OrderComment() == co) tp = OrderTakeProfit();
                  }
               }
            }
         }
      }
   }
return(tp);
}


4. Возвращает флаг существования позиций по указанному комментарию
Код: выделить все
bool f_ExistPosByComment(string sy, int op, int mn, string co)
{
/*
   Описание : Возвращает флаг существования позиций по комментарию
   Параметры:                                                               
   sy - наименование инструмента   ("0" - текущий символ)                 
   op - операция                   (-1   - любая позиция)                 
   mn - MagicNumber                (-1   - любой магик)                   
   co - комментарий                ()                     
*/
   if(sy == "0") sy = Symbol();
   for(int i = 0; i < OrdersTotal(); i++)
   {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
         if((OrderSymbol()==sy) && (op < 0 || OrderType() == op))
         {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
            {
               if(mn < 0 || OrderMagicNumber() == mn)
               {
                  if(OrderComment() == co) return(true);
               }
            }
         }
      }
   }

return(false);
}


В таком же стиле могут быть созданы и другие функции. В результате разработчик, однажды задав идентификатор позиции в виде комментария, приобретает над ними полный контроль.
Аватар пользователя
Haos
Специалист MQL
 
Сообщений: 24699
Зарегистрирован: 29 мар 2014, 16:07
Средств на руках: 193.70 Доллар
Группа: Главные модераторы
Благодарил (а): 3379 раз.
Поблагодарили: 8200 раз.

Вернуться в MQL – теория и практика

Кто сейчас на форуме?

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 71

Права доступа к форуму

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