Что не так с моим трейлингом? MQL5

Roman Sharanov  
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"

#include <Trade\Trade.mqh>
CTrade trade;
   int stop=500;
   int take=0;
   int magicOrder=1101;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   double Ask=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
   if(!PositionSelect(_Symbol))
      {
         trade.Buy(0.01,_Symbol,Ask,Ask-stop*_Point,Ask+take*_Point,NULL);
      }
   
   TrailingStop(Ask);
  }
//+------------------------------------------------------------------+
void TrailingStop(double Ask)
{

   for(int i=PositionsTotal()-1; i>=0; i--)
      {
         string symbol=PositionGetSymbol(i);
         if(_Symbol==symbol)
            {
               ulong PositionTicket=PositionGetTicket(POSITION_TICKET);
               double CurrentStopLoss=PositionGetDouble(POSITION_SL);

               if(MathAbs(CurrentStopLoss-Ask)>stop)
                  {
                     trade.PositionModify(PositionTicket,(Ask-stop*_Point),0);
                  }
            }      
      }


}

Тестовый код, пытаюсь разгадать загадку трейлинг стопа.

Открываю 1 сделку, вроде логика трейлинга правильная, но на практике выходит какая то херота, никакого трейлинга не происходит, ничего не пойму. Кто поможет решить?

Vladimir Karputov  

Только если цена поднялась вверх и ушла от текущего StopLoss на нужное количество пунктов:

if(Ask-CurrentStopLoss>stop*Point())

но так будет модификация чуть ли не на каждом тике - а это неправильно. Нужен ещё один параметр: шаг или по простому - зазор:

if(Ask-CurrentStopLoss-step*Point()>stop*Point())
Alexey Viktorov  
RomanRott:

Тестовый код, пытаюсь разгадать загадку трейлинг стопа.

Открываю 1 сделку, вроде логика трейлинга правильная, но на практике выходит какая то херота, никакого трейлинга не происходит, ничего не пойму. Кто поможет решить?

Запишите на бумаге чему равна цена Ask, чему равна цена CurrentStopLoss и затем разницу этих цен.

Затем ответьте на вопрос: "Когда разница этих цен будет больше значения stop"

И тогда наступит счастье.

Roman Sharanov  
Alexey Viktorov:

Запишите на бумаге чему равна цена Ask, чему равна цена CurrentStopLoss и затем разницу этих цен.

Затем ответьте на вопрос: "Когда разница этих цен будет больше значения stop"

И тогда наступит счастье.


Будет больше когда Ask улетит вверх?

Roman Sharanov  
Vladimir Karputov:

Только если цена поднялась вверх и ушла от текущего StopLoss на нужное количество пунктов:

но так будет модификация чуть ли не на каждом тике - а это неправильно. Нужен ещё один параметр: шаг или по простому - зазор:


Я не понимаю, изменил, но все равно ничего не трейлится

Vladimir Karputov  
RomanRott:

Я не понимаю, изменил, но все равно ничего не трейлится


Вы неправильно определяли тикет. 

Пример полностью для неттинга:

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"

#include <Trade\Trade.mqh>
CTrade trade;
int stop=500;
int step=15;
int take=0;
int magicOrder=1101;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

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

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   double Ask=NormalizeDouble(SymbolInfoDouble(Symbol(),SYMBOL_ASK),Digits());
   if(!PositionSelect(Symbol()))
      trade.Buy(0.01,Symbol(),Ask,Ask-stop*Point(),Ask+take*Point(),NULL);

   TrailingStop(Ask);
  }
//+------------------------------------------------------------------+
void TrailingStop(double Ask)
  {
   if(PositionSelect(Symbol()))
     {
      ulong PositionTicket=PositionGetInteger(POSITION_TICKET);
      double CurrentStopLoss=PositionGetDouble(POSITION_SL);

      if(Ask-CurrentStopLoss-step*Point()>stop*Point())
         trade.PositionModify(PositionTicket,(Ask-stop*Point()),0.0);
     }
  }
//+------------------------------------------------------------------+
Roman Sharanov  
Vladimir Karputov:

Вы неправильно определяли тикет. 

Пример полностью для неттинга:


Да, работает, буду разбираться
Так неттинг это вроде когда много сделок сливаются в одну по усредненной цене, в таком случае как?

Я в условии вместо PositionSelect написал PositionsTotal()<2 но почему то он открывает кучу сделок и сливает в одну, соответственно стоп прыгает туда сюда

Vladimir Karputov  
RomanRott:

Да, работает, буду разбираться
Так неттинг это вроде когда много сделок сливаются в одну по усредненной цене, в таком случае как?

Я в условии вместо PositionSelect написал PositionsTotal()<2 но почему то он открывает кучу сделок и сливает в одну, соответственно стоп прыгает туда сюда


Неттинг: по одному символу может быть открыта ТОЛЬКО одна позиция.

Хедж: по одному символу может быть одновременно открыто НЕСКОЛЬКО позиций и при этом ОДНОГО или РАЗНОГО направления.

Roman Sharanov  

Все разобрался, благодарю за помощь

Vladimir Karputov  
RomanRott:

хеджирование в мт5 невозможно?


Почему это невозможно? Уже года два, как в MetaTrader 5 ввели поддержку хеджа. 

Просто когда я увидел в Вашем коде

if(!PositionSelect(

я решил, что Вы используете неттинг (так как PositionSelect по имени символа применима только на неттинге).


Если Вам нужно обрабатывать хежд - тогда нужна другая логика: нужно обходить список всех позиций и в зависимости от типа позиции, от текущей цены модифицировать. И главное: сначала на бумажке напишите, А КАК ИМЕННО нужно модифицировать позиции - чтобы не получилось таких казусов, вроде:

if(MathAbs(CurrentStopLoss-Ask)>stop)
Alexey Viktorov  
Roman Sharanov:

Будет больше когда Ask улетит вверх?

Я сегодня добрый, раз вам мама не позволяет писать на бумаге, я напишу для вас.

Согласно вашего кода

   int stop=500;
   double Ask=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
               double CurrentStopLoss=PositionGetDouble(POSITION_SL);

Переменная Ask может принимать значения в зависимости от валюты, попробуем посчитать по EURUSD и позиция Buy

Текущая цена 1.22660, пусть будем считать что StopLoss поставлен на уровень 1.22160

Теперь считаем абсолютное значение разницы этих цен

               if(MathAbs(CurrentStopLoss-Ask)>stop)

получаем 0.00500

ВОПРОС: При какой цене Ask абсолютная величина разницы этих цен будет больше 500 и будет-ли вообще???

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