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

 
#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 сделку, вроде логика трейлинга правильная, но на практике выходит какая то херота, никакого трейлинга не происходит, ничего не пойму. Кто поможет решить?

 

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

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

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

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

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

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

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

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

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

 
Alexey Viktorov:

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

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

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


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

 
Vladimir Karputov:

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

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


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

 
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);
     }
  }
//+------------------------------------------------------------------+
 
Vladimir Karputov:

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

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


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

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

 
RomanRott:

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

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


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

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

 

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

 
RomanRott:

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


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

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

if(!PositionSelect(

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


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

if(MathAbs(CurrentStopLoss-Ask)>stop)
 
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 и будет-ли вообще???