Советники: TrailingTakeProfit

 

TrailingTakeProfit:

Данный неторгующий советник предназначен для простого трейлинга приказов тейк профит открытых позиций.

Работает только на счетах с хеджингом.

Принцип работы: при открытии новой позиции, советник проверяет ее приказ тейк профит и, если его нету, выставляет его на заданный в настройках размер. Далее начинает передвигать тейк профит позиции, если цена уходит на расстояние дальше, чем указано в настройках. Действия аналогичные простому трейлингу стоп лосс.

Имеется возможность задать тип позиции - любая/покупка/продажа, символ позиции (любой или указанный), магик (любой или указанный) или тикет позиции (любой или указанный). Также возможно указать режим трейлинга тейк профита в убыточной зоне - если режим не задан, то тейк профит не будет подтягиваться в зоне убытка, а остановится на дистанции безубытка от цены открытия позиции. Размер безубытка можно указать в настройках.

Для проверки работы трейлинга во всех режимах, в советник добавлено открытие позиций на каждом новом баре. Открытие позиций работает только в тестере стратегий.

Советник имеет девять настраиваемых параметров:

  • Take Profit size in points - размер тейк профита позиций в пунктах. Является так же и параметром трейлинга TrailingTake - дистанция стоп-приказа от цены;
  • Positions type - тип позиций, которые будут подтягиваться;
  • Positions symbol ("" - any symbol) - символ позиций, которые будут подтягиваться (пустое значение - все символы);
  • Positions magic number (0 - any magic) - магик позиций, которые будут подтягиваться (0 - любой магик);
  • Position ticket (0 - all tickets) - тикет позиции, которая будет подтягиваться (0 - все тикеты);
  • Trailing step - шаг трейлинга - если цена уходит от тейк профита позиции на дистанцию дальше, чем указано здесь, то тейк профит будет пододвинут так, чтобы его размер соответствовал заданному в настройке Take Profit size in points;
  • Trailing in the unprofitable zone - переключатель возможности трейлинга тейк профита в убыточной зоне. Если отключено, то тейк профит не будет выставляться в зону убытка;
  • Breakeven in points - размер безубытка в пунктах. Меньше этого значения начинается убыточная зона;
  • Spread multiplier - число, на которое советник будет умножать спред при расчете корректной дистанции стоп-приказов.
При выставлении стоп лосс или тейк профит (а так же отложенных ордеров) существует минимально разрешенная дистанция установки стоп-приказов - StopLevel. Т.е., стоп лосс или тейк профит (или отложенный ордер) должны быть выставлены не ближе этой дистанции к цене. Если же StopLevel задан нулевым, то, в основном, это не говорит об его отсутствии, а говорит о том, что StopLevel плавающий. В этом случае минимальной дистанцией чаще всего является спред*2, но иногда двойного спреда не достаточно. Поэтому и введен параметр - число, на которое советник будет умножать спред для расчета минимальной дистанции установки стопов.

Рис.1 Тест трейлинга тейк профита позиций Buy. Размер тейк профита 400 пунктов, шаг трейлинга 10, подтягивать только в прибыльной зоне.


Автор: Scriptor

 
//+------------------------------------------------------------------+
//| Модифицирует выбранную по тикету позицию                         |
//+------------------------------------------------------------------+
bool PositionModifyByTicket(const string symbol_name,const ulong magic_number,const ulong ticket,const double sl,const double tp)
  {
//--- check stopped
   if(IsStopped())
      return(false);
//--- clean
   ZeroMemory(g_request);
   ZeroMemory(g_result);
//--- setting request
   g_request.action  =TRADE_ACTION_SLTP;
   g_request.position=ticket;
   g_request.symbol  =symbol_name;
   g_request.magic   =magic_number;
   g_request.sl      =sl;
   g_request.tp      =tp;
//--- action and return the result
   return(OrderSend(g_request,g_result));
  }

Лишнее.

 
//+------------------------------------------------------------------+
//| Функция трейлинга                                                |
//+------------------------------------------------------------------+
void Trailing(void)
  {
   int   total=PositionsTotal();
   for(int i=total; i>=0; i--)
     {
      ulong ticket=PositionGetTicket(i);
      if(ticket==0) continue;
      string symbol_name=PositionGetString(POSITION_SYMBOL);
      ulong  magic_number=(ulong)PositionGetInteger(POSITION_MAGIC);
      ENUM_POSITION_TYPE type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
      if(InpPositionType>WRONG_VALUE && type!=(ENUM_POSITION_TYPE)InpPositionType) continue;

Очень дорого (особенно, string) создавать выделенные переменные до всех continue-проверок.


Представьте себе простую оптимизацию на 100 000 проходов по 10 000 000 тиков. Тогда OnTick будет вызываться один ТРИЛЛИОН раз. Любое лишнее действие вызванное триллион раз потребует доп. секунды/минуты/часы. Цените свое и чужое время.

 
fxsaber:

Очень дорого (особенно, string) создавать выделенные переменные до всех continue-проверок.


Представьте себе простую оптимизацию на 100 000 проходов по 10 000 000 тиков. Тогда OnTick будет вызываться один ТРИЛЛИОН раз. Любое лишнее действие вызванное триллион раз потребует доп. секунды/минуты/часы. Цените свое и чужое время.

Это не торгующий советник. Зачем его оптимизировать? Это же просто трал. Причём странный.
 
Artyom Trishkin:
Это не торгующий советник. Зачем его оптимизировать? Это же просто трал. Причём странный.

Это мигрирующая Trailing-функция в учебных целях.

 
fxsaber:

Это мигрирующая Trailing-функция в учебных целях.

Недостаточна для мигрирующей. Только в контексте данного кода.
 
Artyom Trishkin:
Недостаточна для мигрирующей. Только в контексте данного кода.

Мигрирующая - когда 90% кода заимствуется.

Причина обращения: