Как сделать статической переменную в таком случае?

 

Переменные, которые не изменяются с момента запуска робота, логичнее сделать статическими. Например, торгуемый символ.

Вот тело эксперта:

// ======================================================================= Включения и импорт внешних модулей =====================================================================+
#import     "SymbolListControl.ex5"
   int magicNumber(int initialMagic, string symbol, int TF);
#import

#include  <HOZ_Code\Classes\Base.mqh>
#include  <HOZ_Code\Classes\Position\Position.mqh>
#include  <HOZ_Code\Classes\Position\PositionHandling.mqh>
#include  "GetTotalSignal.mqh"

GetTotalSignal *ptrGetTotalSignal;
Position *ptrPosition;
//+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
//|                                                                         Expert initialization function                                                                         |
//+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
int OnInit() {
//---
  ptrGetTotalSignal = new GetTotalSignal();
  ptrPosition = new Position();
  return INIT_SUCCEEDED;
}
//+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
//|                                                                        Expert deinitialization function                                                                        |
//+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
void OnDeinit(const int reason) {
//---
  delete ptrGetTotalSignal;
  delete ptrPosition;
}
//+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
//|                                                                              Expert tick function                                                                              |
//+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
void OnTick() {
  Print("ptrPosition.getSymbol = ", ptrPosition.m_symbol);
  ulong mag = magicNumber(3333021, NULL, PERIOD_D1);
  Print("mag = ", mag);
/*  MqlTick lastTick;
  if (SymbolInfoTick(NULL, lastTick))
    Print("lastTick.time = ", lastTick.time);*/
/*  long res;
  bool isSelected = SymbolInfoInteger("BRN", SYMBOL_SELECT, res);
  Print("isSelected = ", isSelected);
  bool isVisible = SymbolInfoInteger("BRN", SYMBOL_VISIBLE, res);
  Print("isVisible = ", isVisible);*/
}

Здесь вообще нет вводных переменных в этом файле. Они у меня разбросаны по классам..

Но я подумал, что это, наверное, не самый удобный вариант. Решил самый используемые закинуть в тело эксперта. Возник сразу головняк.

Вот, например, базовый класс, а точнеее его заготовка, которую начал расширять:

//+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
//|                                                                                                                                                                   Position.mqh |
//|                                                                                                                                                                            hoz |
//|                                                                                                                                                                                |
//+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
#property copyright "hoz"
#property link      ""
#property version   "1.00"

// ======================================================================= Включения и импорт внешних модулей =====================================================================+
#import     "SymbolListControl.ex5"
   int magicNumber(int initialMagic, string symbol, int TF);
#import

// ===============================================================================  Input переменные  =============================================================================+
input  string    i_symbol = "EURUSD";    // Символ торгового инструмента
input  double    i_lot = 0.1,            // Объём позиции
                 i_SL = 15,              // Stop Loss позиции
                 i_TP = 85;              // Take Profit позиции
input  ulong     i_magic = 3333021,      // Магик
                 i_slippage = 2;         // Проскальзывание

//+================================================================================================================================================================================+
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//|                                                                     БАЗОВЫЙ КЛАСС ДЛЯ РАБОТЫ С ПОЗИЦИЯМИ                                                                       |
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//+================================================================================================================================================================================+
class Position {
  private:
    //---
  protected:
//    static const string m_symbol;
  public:
    static const string m_symbol;
    //---- Конструктор и деструктор
    Position(void);
   ~Position(void);
};
//==================================================================================================================================================================================
// Инициализация статических членов класса. ========================================================================================================================================
const string Position :: m_symbol = i_symbol;
//==================================================================================================================================================================================
// Конструктор класса. =============================================================================================================================================================
Position :: Position(void) {
}
//==================================================================================================================================================================================
// Деструктор класса. ==============================================================================================================================================================
Position :: ~Position(void) {
}

Видно, что у меня значение статической переменной m_symbol получается из вводной переменной i_symbol. Но, если я объявление это переменной:

input  string    i_symbol = "EURUSD";    // Символ торгового инструмента

Перенесу из этого класса Position в сам эксперт, получается никак невозможно сделать так, что бы эта переменной было статической?

Ведь в этом файле переменной i_symbol получается нет. А значит не выйдет присвоить значение соответствующей статической переменной m_symbol. Передать это значение через конструктор тоже не вариант, т.к. статическая переменная не привязана к объекту т.е. к экземпляру класса.

Как быть?

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

Я так и сделал (сеттеры и геттеры). Но вот одно странно. Ведь такие переменные, как магик, стоп лосс. тейк профит, символы торговых инструментов, отклонение и тд, ведь они же неизменны обычно. Какой резон делать для них сеттеры и геттеры? Ведь статические переменные не принадлежать экземплярам, и, соответственно, это в плане производительности актуальнее как-бы. Понятно, что не критично. Но я когда что-то пишу, стараюсь попутно продумывать все аспекты, что бы потом не пришлось капаться в том, что написано когда-то..

Получается, это не выполнимая задача? Когда input-переменная объявлена и инициализирована в другом файле, а член-класса, который будет принимать значение этой переменной будет в другом файл?

 
hoz:

Ведь такие переменные, как магик, стоп лосс. тейк профит, символы торговых инструментов, отклонение и тд, ведь они же неизменны обычно.

Это в примитиве неизменны, умная ТС их крутит очень даже в зависимости от ситуации :)

Про остальное ни слова не понял :)

 
Aleksey Vyazmikin:

Это в примитиве неизменны, умная ТС их крутит очень даже в зависимости от ситуации :)

Про остальное ни слова не понял :)

Потом да, можно крутить.. Но щяс мне нужно базовый каркас написать свой. Поясню:

Есть, например, тело эксперта:

// ======================================================================= Включения и импорт внешних модулей =====================================================================+
#import     "SymbolListControl.ex5"
   int magicNumber(int initialMagic, string symbol, int TF);
#import

// ===============================================================================  Input переменные  =============================================================================+
input  string    i_symbol = "EURUSD";    // Символ торгового инструмента
input  double    i_lot = 0.1,            // Объём позиции
                 i_SL = 15,              // Stop Loss позиции
                 i_TP = 85;              // Take Profit позиции
input  ulong     i_magic = 3333021,      // Магик
                 i_slippage = 2;         // Проскальзывание

#include  <HOZ_Code\Classes\Base.mqh>
#include  <HOZ_Code\Classes\Position\Position.mqh>
#include  <HOZ_Code\Classes\Position\PositionHandling.mqh>
#include  "GetTotalSignal.mqh"

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

Жёлтым я выделил input-переменные, значения которых я хочу присвоить статическим переменным (свойствам) класса Position, код которого вот:

// ======================================================================= Включения и импорт внешних модулей =====================================================================+
#import     "SymbolListControl.ex5"
   int magicNumber(int initialMagic, string symbol, int TF);
#import

// ===============================================================================  Input переменные  =============================================================================+
input  string    i_symbol = "EURUSD";    // Символ торгового инструмента
input  double    i_lot = 0.1,            // Объём позиции
                 i_SL = 15,              // Stop Loss позиции
                 i_TP = 85;              // Take Profit позиции
input  ulong     i_magic = 3333021,      // Магик
                 i_slippage = 2;         // Проскальзывание

//+================================================================================================================================================================================+
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//|                                                                     БАЗОВЫЙ КЛАСС ДЛЯ РАБОТЫ С ПОЗИЦИЯМИ                                                                       |
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//+================================================================================================================================================================================+
class Position {
  private:
    //---
  protected:
//    static const string m_symbol;
  public:
    static const string m_symbol;
    //---- Конструктор и деструктор
    Position(void);
   ~Position(void);
};
//==================================================================================================================================================================================
// Инициализация статических членов класса. ========================================================================================================================================
const string Position :: m_symbol = i_symbol;
//==================================================================================================================================================================================
// Конструктор класса. =============================================================================================================================================================
Position :: Position(void) {
}
//==================================================================================================================================================================================
// Деструктор класса. ==============================================================================================================================================================
Position :: ~Position(void) {
}

Розовым цветом я выделил input-переменные, которые я хочу из этого класса убрать по некоторым причинам.

Сейчас понятно? Я эти input-переменные в самом торговом эксперте объявляю и инициализирую, а самом классе Position на базе этих переменных хочу в статические переменные присвоить этих инпут-переменных значения.

 

"Переменные, которые не изменяются с момента запуска робота, логичнее сделать статическими" 

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

 
Алексей Тарабанов:

"Переменные, которые не изменяются с момента запуска робота, логичнее сделать статическими" 

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

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