Советники: Pending Trailing 2 - страница 5

 

Всем доброго утра и хорошего настроения!

Обращаюсь к Владимиру Карпутову с вопросом по коду советника - с какой целью второй раз повторяются ранее объявленные глобальные переменные выделенные желтым цветом? Возможно чего-то ещё не знаю и поэтому вопрос задаю в целях саморазвития.

С уважением, Владимир.

//+------------------------------------------------------------------+
//|                                           Pending Trailing 2.mq5 |
//|                              Copyright © 2022, Vladimir Karputov |
//|                      https://www.mql5.com/en/users/barabashkakvn |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2022, Vladimir Karputov"
#property link      "https://www.mql5.com/en/users/barabashkakvn"
#property version   "1.004"
#property description "Trailing - in Points:"
#property description "--> (1.00055-1.00045=10 points)"
#property description "--> (91.312-91.310=2 points)"
/*
   barabashkakvn Trading engine 4.012
*/
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
#include <Trade\AccountInfo.mqh>
#include <Trade\OrderInfo.mqh>
//---
CTrade         m_trade;                      // object of CTrade class
CSymbolInfo    m_symbol;                     // object of CSymbolInfo class
CAccountInfo   m_account;                    // object of CAccountInfo class
COrderInfo     m_order;                      // object of COrderInfo class
//+------------------------------------------------------------------+
//| Enum Bar Сurrent                                                 |
//+------------------------------------------------------------------+
enum ENUM_BAR_CURRENT
  {
   bar_0=0,    // bar #0 (at every tick)
   bar_1=1,    // bar #1 (on a new bar)
  };
//+------------------------------------------------------------------+
//| Enum Symbol                                                      |
//+------------------------------------------------------------------+
enum ENUM_SYMBOL
  {
   all_symbols=0,    // Opened on any symbol
   current_symbol=1, // Opened on specified symbols
  };
//+------------------------------------------------------------------+
//| Enum Magic                                                       |
//+------------------------------------------------------------------+
enum ENUM_MAGIC
  {
   all_magics=0,     // Opened manually or by Expert Advisors
   manually_magic=1, // Opened manually
   advisors_magic=2, // Opened by advisors
  };
//--- input parameters
input group             "Trading settings"
input ENUM_TIMEFRAMES      InpWorkingPeriod        = PERIOD_CURRENT; // Working timeframe
input ENUM_BAR_CURRENT     InpTrailingBarCurrent   = bar_1;          // Trailing on ...
input uint                 InpTrailingStop         = 250;            // Trailing Stop (min distance from price to Pending order)
input uint                 InpTrailingStep         = 50;             // Trailing Step
input ENUM_SYMBOL          InpSymbols              = all_symbols;    // Symbols pending orders...
input string               InpVolumeSymbols        = "EURUSD,USDJPY";// ... for "Symbols pending orders" ("-" -> OFF)
input ENUM_MAGIC           InpMagics               = all_magics;     // Magics pending orders...
input string               InpVolumeMagics         = "200,100,45678";// ... for "Magics pending orders" ("-" -> OFF)
input group             "Pending Order Parameters"
input ushort               InpPendingExpiration    = 600;            // Pending: Expiration, in minutes ('0' -> OFF)
input uint                 InpPendingMaxSpreadUpper= 30;             // Pending: Maximum spread ... upper value ('0' -> OFF)
input uint                 InpPendingMaxSpreadLower= 12;             // Pending: Maximum spread ... lower value ('0' -> OFF)
input bool                 InpPlaceAfterDeletion   = true;           // Place pending order after deletion
input group             "Additional features"
input bool                 InpPrintLog             = true;           // Print log
input uchar                InpFreezeCoefficient    = 3;              // Coefficient (if Freeze==0 Or StopsLevels==0)
input ulong                InpMagic                = 221;            // Magic number
//---
double   m_trailing_stop            = 0.0;      // Trailing Stop                             -> double
double   m_trailing_step            = 0.0;      // Trailing Step                             -> double
double   m_pending_max_spread_upper = 0.0;      // Pending: Maximum spread ... upper value   -> double
double   m_pending_max_spread_lower = 0.0;      // Pending: Maximum spread ... lower value   -> double

datetime m_prev_bars                = 0;        // "0" -> D'1970.01.01 00:00';
bool     m_init_error               = false;    // error on InInit

ulong    m_magics[];
string   m_symbols[];
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- forced initialization of variables
   m_trailing_stop            = 0.0;      // Trailing Stop                             -> double
   m_trailing_step            = 0.0;      // Trailing Step                             -> double
   m_pending_max_spread_upper = 0.0;      // Pending: Maximum spread ... upper value   -> double
   m_pending_max_spread_lower = 0.0;      // Pending: Maximum spread ... lower value   -> double
//---
   m_prev_bars                = 0;        // "0" -> D'1970.01.01 00:00';
   m_init_error               = false;    // error on InInit
//---
   ArrayFree(m_magics);
   ArrayFree(m_symbols);
.
.
.


и т.д. 
 
MrBrooklin #:

Всем доброго утра и хорошего настроения!

Обращаюсь к Владимиру Карпутову с вопросом по коду советника - с какой целью второй раз повторяются ранее объявленные глобальные переменные выделенные желтым цветом? Возможно чего-то ещё не знаю и поэтому вопрос задаю в целях саморазвития.

С уважением, Владимир.

Вы невнимательны - сначала идёт Объявление переменных (переменные объявляются с указанием типа переменной - 'double', 'datetime' и 'bool') в шапке советника, а в OnInit принудительная инициализация (обнуление) переменных.

 
Vladimir Karputov #:

Вы невнимательны - сначала идёт Объявление переменных (переменные объявляются с указанием типа переменной - 'double', 'datetime' и 'bool') в шапке советника, а в OnInit принудительная инициализация (обнуление) переменных.

Спасибо за ответ! Теперь понятно. Раньше считал, что достаточно всего один раз объявить глобальную переменную и присвоить ей нулевое значение, а оказывается ещё нужно и инициализировать. Буду знать.

С уважением, Владимир.

 
Vladimir Karputov #:

Вы невнимательны - сначала идёт Объявление переменных (переменные объявляются с указанием типа переменной - 'double', 'datetime' и 'bool') в шапке советника, а в OnInit принудительная инициализация (обнуление) переменных.

Здравствуйте - тоже стало интересно.

Эту функцию вы вынесли из  OnInit  - по этому так у вас реализовано ? 

//+------------------------------------------------------------------+
//| Set Init                                                         |
//+------------------------------------------------------------------+
bool SetInit(const string symbol)
  {
   if(!m_symbol.Name(symbol)) // sets symbol name
     {
      Print(__FILE__," ",__FUNCTION__,", ERROR: CSymbolInfo.Name");
      return(false);
     }
   if(!RefreshRates(m_symbol))
      return(false);
//---
   m_trade.SetTypeFillingBySymbol(m_symbol.Name());
//---
   m_trailing_stop            = InpTrailingStop             * m_symbol.Point();
   m_trailing_step            = InpTrailingStep             * m_symbol.Point();
   m_pending_max_spread_upper = InpPendingMaxSpreadUpper    * m_symbol.Point();
   m_pending_max_spread_lower = InpPendingMaxSpreadLower    * m_symbol.Point();
//---
   return(true);
  }
//+------------------------------------------------------------------+
 
137 Matrix #:

Здравствуйте - тоже стало интересно.

Эту функцию вы вынесли из  OnInit  - по этому так у вас реализовано ? 

Вынес так как для каждого символа пересчитываются переменные (ведь отложки могут быть не только по одному символу).

 
Vladimir Karputov #:

Вынес так как для каждого символа пересчитываются переменные (ведь отложки могут быть не только по одному символу).

весь код - видно что он и создан для мульти.

Спасибо! а то я был, по вашим функциям собрал мультивалютный, только там я сам прописывал - и скорее всего неправильно, а теперь из этого вашего кода, можно правильно переписать

свои каракули.  

 
Vladimir Karputov #:

Вы невнимательны - сначала идёт Объявление переменных (переменные объявляются с указанием типа переменной - 'double', 'datetime' и 'bool') в шапке советника, а в OnInit принудительная инициализация (обнуление) переменных.

Кстати, а зачем тогда в Вашем советнике нужна принудительная инициализация в OnInit, если в справочнике MQL5 прописано:

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

... Инициализация глобальных переменных производится однократно после загрузки программы в память клиентского терминала и перед первой обработкой события Init.

Честно говоря, мне не понятен этот момент.

С уважением, Владимир.


Документация по MQL5: Программы MQL5 / События клиентского терминала
Документация по MQL5: Программы MQL5 / События клиентского терминала
  • www.mql5.com
События клиентского терминала - Программы MQL5 - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
MrBrooklin #:

Кстати, а зачем тогда в Вашем советнике нужна принудительная инициализация в OnInit, если в справочнике MQL5 прописано:

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

... Инициализация глобальных переменных производится однократно после загрузки программы в память клиентского терминала и перед первой обработкой события Init.

Честно говоря, мне не понятен этот момент.

С уважением, Владимир.


Протестируйте этот советник, прикрепите его на график и попереключайте таймфреймы.

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2020, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
double   m_trailing_stop            = 0.0;      // Trailing Stop
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   Print(__FUNCTION__,", IN OnInit ",m_trailing_stop);
   m_trailing_stop=0.05;
   Print(__FUNCTION__,", OUT OnInit ",m_trailing_stop);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Print(__FUNCTION__,", OnDeinit ",m_trailing_stop);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   m_trailing_stop=MathRand();
  }
//+------------------------------------------------------------------+
Файлы:
Test.mq5  3 kb
 
Vladimir Karputov #:

Всё нестабильно, нет четкой картин

Vladimir Karputov #:

Всё нестабильно, нет четкой картины.

 Конечно это было бы здорово если реализовать такую функцию  выставлять ордера на старое место после закрытия но тут очень много разных нюансов --  кроме всего прочего - зависание компьютера перезагрузка и т.д. очень много)))

1.  Поэтому я и предложил просто сделать проверку А именно:  Задавать в настройках значение если ордера ближе столльки- то пунктов от рынка (задаём в основных настройках)   их  по расширению спреда удаляем,  если же ордера находятся на "уважаемом"))  удалении от рынка их не трогаем  ---- в этом тоже есть свой большой плюс а плюс в том что если рынок рванёт то его ордер поймает и не даст допустить большой убыток  по депозиту.  А если будет ордер удалён, то большой вопрос выставиться он своевременно или нет. Мне кажется этого пока-что  будет вполне достаточно.

2.  Дайте Пожалуйста  пока-что  доработку простое закрытие по времени - жизни ордера,  я погоняю эксперта протестирую - по настраиваю, время идёт а я без дела)))))!!! 

 

Ещё один момент: 

Вы хотите привязать запуск  времени жизни ордера   с того момента как начнётся движение то есть треллинг

А если привязать время жизни ордера не ко времени а к пунктам?   например: прошол ордер 10 или 100 пунктов если не зацепило то закрыли.

Вот такая есть мысль.