Проблема с подключением библиотеки TrailingFixedPips.mqh - страница 2

 
Vladimir Karputov:
Никакая. Сами напишем трейлинг.
Спасибо! Но, трал написать я сам могу. Просто, решил с ООП разобраться, а так же со Стандартной Библиотекой.
 
Виктор:
Спасибо! Но, трал написать я сам могу. Просто, решил с ООП разобраться, а так же со Стандартной Библиотекой.
Ну до этого ещё несколько шагов. Идём дальше (кстати торговые классы CPositionInfo, CTrade и CSymbolInfo - это Стандартная Библиотека) ?
 
Vladimir Karputov:
Ну до этого ещё несколько шагов. Идём дальше (кстати торговые классы CPositionInfo, CTrade и CSymbolInfo - это Стандартная Библиотека) ?
https://www.mql5.com/ru/docs/standardlibrary/tradeclasses
Документация по MQL5: Стандартная библиотека / Торговые классы
Документация по MQL5: Стандартная библиотека / Торговые классы
  • www.mql5.com
Стандартная библиотека / Торговые классы - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Виктор:
https://www.mql5.com/ru/docs/standardlibrary/tradeclasses

Замечательно, это Вы знаете. Идем дальше - OnInit() :

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   if(!m_symbol.Name(Symbol())) // sets symbol name
      return(INIT_FAILED);
   RefreshRates();

   string err_text="";
   if(!CheckVolumeValue(InpLots,err_text))
     {
      Print(err_text);
      return(INIT_PARAMETERS_INCORRECT);
     }
//---
   m_trade.SetExpertMagicNumber(m_magic);
//---
   if(IsFillingTypeAllowed(SYMBOL_FILLING_FOK))
      m_trade.SetTypeFilling(ORDER_FILLING_FOK);
   else if(IsFillingTypeAllowed(SYMBOL_FILLING_IOC))
      m_trade.SetTypeFilling(ORDER_FILLING_IOC);
   else
      m_trade.SetTypeFilling(ORDER_FILLING_RETURN);
//---
   m_trade.SetDeviationInPoints(m_slippage);

   ExtStopLoss=InpStopLoss*m_symbol.Point();
   ExtTakeProfit=InpTakeProfit*m_symbol.Point();
   ExtTrailingStop=InpTrailingStop*m_symbol.Point();
   ExtTrailingStep=InpTrailingStep*m_symbol.Point();
//---
   return(INIT_SUCCEEDED);
  }

В блоке

   if(!m_symbol.Name(Symbol())) // sets symbol name
      return(INIT_FAILED);
   RefreshRates();

инициализируем объект класса CSymbolInfo и проверяем результат инициализации - мало-ли что: символа нет в Окне Данных 

и вызываем функцию RefreshRates() - это самописная функция, которая обновляет цены в объекте класса CSymbolInfo.


Присвоение идентификатора эксперта:

//---
   m_trade.SetExpertMagicNumber(m_magic);

думаю понятно.


Дальше проверяем объём позиции заданный во входных параметрах (это самописная функция), с объёмом который можно задавать для данного символа (здесь проверка на квантование и на макс и на мин) 

   string err_text="";
   if(!CheckVolumeValue(InpLots,err_text))
     {
      Print(err_text);
      return(INIT_PARAMETERS_INCORRECT);
     }


Заливка (это самописная функция) :

   if(IsFillingTypeAllowed(SYMBOL_FILLING_FOK))
      m_trade.SetTypeFilling(ORDER_FILLING_FOK);
   else if(IsFillingTypeAllowed(SYMBOL_FILLING_IOC))
      m_trade.SetTypeFilling(ORDER_FILLING_IOC);
   else
      m_trade.SetTypeFilling(ORDER_FILLING_RETURN);
//---


проскальзывание и инициализации переменных ExtXXXX:

   m_trade.SetDeviationInPoints(m_slippage);

   ExtStopLoss=InpStopLoss*m_symbol.Point();
   ExtTakeProfit=InpTakeProfit*m_symbol.Point();
   ExtTrailingStop=InpTrailingStop*m_symbol.Point();
   ExtTrailingStep=InpTrailingStep*m_symbol.Point();
 
Это все понятно.
 
Виктор:
Это все понятно.

Если понятно, тогда весь код - здесь универсальный метод обхода позиций: обход всего списка позиций, выбор позиции по её индексу в списке ( if(m_position.SelectByIndex(i)) )

//+------------------------------------------------------------------+
//|                                                 TrailingStop.mq5 |
//|                              Copyright © 2018, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2018, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.000"
#property description "Example TrailingStop"
#include <Trade\PositionInfo.mqh>
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>  
CPositionInfo  m_position;                   // trade position object
CTrade         m_trade;                      // trading object
CSymbolInfo    m_symbol;                     // symbol info object
//--- input parameters
input double   InpLots           = 0.1;      // Volume transaction
input int      InpStopLoss       = 15;       // Stop Loss (in pips)
input int      InpTakeProfit     = 40;       // Take Profit (in pips)
input int      InpTrailingStop   = 5;        // Trailing Stop (in pips)
input int      InpTrailingStep   = 5;        // Trailing Step (in pips)
//---
ulong          m_ticket;
ulong          m_magic=15489;                // magic number
ulong          m_slippage=10;                // slippage

double         ExtStopLoss=0.0;
double         ExtTakeProfit=0.0;
double         ExtTrailingStop=0.0;
double         ExtTrailingStep=0.0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   if(!m_symbol.Name(Symbol())) // sets symbol name
      return(INIT_FAILED);
   RefreshRates();

   string err_text="";
   if(!CheckVolumeValue(InpLots,err_text))
     {
      Print(err_text);
      return(INIT_PARAMETERS_INCORRECT);
     }
//---
   m_trade.SetExpertMagicNumber(m_magic);
//---
   if(IsFillingTypeAllowed(SYMBOL_FILLING_FOK))
      m_trade.SetTypeFilling(ORDER_FILLING_FOK);
   else if(IsFillingTypeAllowed(SYMBOL_FILLING_IOC))
      m_trade.SetTypeFilling(ORDER_FILLING_IOC);
   else
      m_trade.SetTypeFilling(ORDER_FILLING_RETURN);
//---
   m_trade.SetDeviationInPoints(m_slippage);

   ExtStopLoss=InpStopLoss*m_symbol.Point();
   ExtTakeProfit=InpTakeProfit*m_symbol.Point();
   ExtTrailingStop=InpTrailingStop*m_symbol.Point();
   ExtTrailingStep=InpTrailingStep*m_symbol.Point();
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- TrailingStop
   if(!RefreshRates())
      return;
//--- при таком методе мы будет сюда попадать на каждом тике.
   for(int i=PositionsTotal()-1;i>=0;i--)
      if(m_position.SelectByIndex(i))
         if(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==m_magic)
           {
            //--- TrailingStop -> подтягивание StopLoss у ПРИБЫЛЬНОЙ позиции
            if(m_position.PositionType()==POSITION_TYPE_BUY)
              {
               //--- когда у позиции ещё нет StopLoss
               if(m_position.StopLoss()==0)
                 {
                  //--- пока StopLoss равен 0.0, TrailingStep не учитываем
                  if(m_symbol.Bid()-ExtTrailingStop>m_position.PriceOpen())
                    {
                     //--- модификация позиции
                     m_trade.PositionModify(m_position.Ticket(),m_position.PriceOpen(),0.0);
                    }
                 }
               //--- у позиции уже есть StopLoss
               else
                 {
                  //--- теперь TrailingStep нужно учитывать, иначе мы будет модифицировать 
                  //--- поизцию НА КАЖДОМ ТИКЕ, а это ПЛОХО
                  if(m_symbol.Bid()-ExtTrailingStop-ExtTrailingStep>m_position.StopLoss())
                    {
                     //--- модификация позиции
                     m_trade.PositionModify(m_position.Ticket(),
                                            NormalizeDouble(m_symbol.Bid()-ExtTrailingStop,m_symbol.Digits()),0.0);
                    }
                 }
              }

            if(m_position.PositionType()==POSITION_TYPE_SELL)
              {
               //--- когда у позиции ещё нет StopLoss
               if(m_position.StopLoss()==0)
                 {
                  //--- пока StopLoss равен 0.0, TrailingStep не учитываем
                  if(m_symbol.Ask()+ExtTrailingStop<m_position.PriceOpen())
                    {
                     //--- модификация позиции
                     m_trade.PositionModify(m_position.Ticket(),m_position.PriceOpen(),0.0);
                    }
                 }
               //--- у позиции уже есть StopLoss
               else
                 {
                  //--- теперь TrailingStep нужно учитывать, иначе мы будет модифицировать 
                  //--- поизцию НА КАЖДОМ ТИКЕ, а это ПЛОХО
                  if(m_symbol.Ask()+ExtTrailingStop+ExtTrailingStep<m_position.StopLoss())
                    {
                     //--- модификация позиции
                     m_trade.PositionModify(m_position.Ticket(),
                                            NormalizeDouble(m_symbol.Ask()+ExtTrailingStop,m_symbol.Digits()),0.0);
                    }
                 }
              }
           }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool RefreshRates()
  {
//--- refresh rates
   if(!m_symbol.RefreshRates())
      return(false);
//--- protection against the return value of "zero"
   if(m_symbol.Ask()==0 || m_symbol.Bid()==0)
      return(false);
//---
   return(true);
  }
//+------------------------------------------------------------------+
//| Check the correctness of the order volume                        |
//+------------------------------------------------------------------+
bool CheckVolumeValue(double volume,string &error_description)
  {
//--- minimal allowed volume for trade operations
   double min_volume=m_symbol.LotsMin();
   if(volume<min_volume)
     {
      error_description=StringFormat("Volume is less than the minimal allowed SYMBOL_VOLUME_MIN=%.2f",min_volume);
      return(false);
     }
//--- maximal allowed volume of trade operations
   double max_volume=m_symbol.LotsMax();
   if(volume>max_volume)
     {
      error_description=StringFormat("Volume is greater than the maximal allowed SYMBOL_VOLUME_MAX=%.2f",max_volume);
      return(false);
     }
//--- get minimal step of volume changing
   double volume_step=m_symbol.LotsStep();
   int ratio=(int)MathRound(volume/volume_step);
   if(MathAbs(ratio*volume_step-volume)>0.0000001)
     {
      error_description=StringFormat("Volume is not a multiple of the minimal step SYMBOL_VOLUME_STEP=%.2f, the closest correct volume is %.2f",
                                     volume_step,ratio*volume_step);
      return(false);
     }
   error_description="Correct volume value";
   return(true);
  }
//+------------------------------------------------------------------+ 
//| Checks if the specified filling mode is allowed                  | 
//+------------------------------------------------------------------+ 
bool IsFillingTypeAllowed(int fill_type)
  {
//--- Obtain the value of the property that describes allowed filling modes 
   int filling=m_symbol.TradeFillFlags();
//--- Return true, if mode fill_type is allowed 
   return((filling & fill_type)==fill_type);
  }
//+------------------------------------------------------------------+
Файлы:
 
Владимир, спасибо! А с подключением библиотеки TrailingFixedPips.mqh так разобраться и не получилось.
 
Виктор:
Владимир, спасибо! А с подключением библиотеки TrailingFixedPips.mqh так разобраться и не получилось.
Я же говорил, что эта библиотека для советников, которые генерируются Мастером MQL5. Сгенерируйте советник и в процесс генерации выберите модуль стоп лосс фиксированный пункты (или примерно так). В полученном коде увидите, сколько всего используется.
 
Vladimir Karputov:
Я же говорил, что эта библиотека для советников, которые генерируются Мастером MQL5. Сгенерируйте советник и в процесс генерации выберите модуль стоп лосс фиксированный пункты (или примерно так). В полученном коде увидите, сколько всего используется.
Генерировал и видел. Вот и теперь сам решил лишь эту библиотеку подключить, т.к. нет на ней никаких ограничений. Ничего не получилось. Но, пока разбирался - много интересного нашел.
Причина обращения: