Logo

Вход

Войти с помощью соц. сетей
Пока нет объявлений.
675 результатов за 0.0579 секунд.
Ключевые слова
Участники
Метки
  •  

  • Что то не понял, про что вы?
    Вы писали

    Я просто показал вам некий "прием" как это можно сделать(при необходимости и смотря по ситуаций), плюсом различие "веса" указателя и объекта. Как поступить(как я "изобразил" или как Игорь) решать вам, так как здесь все да такой степени просто, что я лично не вижу вообще не какого смысла в каких либо классах.

    Понятное дело что чем меньше вызовов, тем скорость выше. Но если представить что пока шел перебор ордеров и "некая" работа с ними, один или несколько ордеров закрылись по "стопу". Переменная "i" уже не содержит "реальную" длину списка ордеров. Как быть в такой ситуаций? Приведет ли это к выходу за границы списка и критической ошибки соответственно? Справка не о чем таком не говорит.

    Свой ответ я показал "в коде" выше....
    Показать больше | К сообщению
    Последний раз редактировалось АнтонР85; 26.12.2020, 05:24.

    Прокомментировать:


  • Да можно даже так.
    MQL код:

    #include <Trade/SymbolInfo.mqh>
    CSymbolInfo *Инфа = new CSymbolInfo();
    int OnInit() { Инфа.Name(Symbol()); return(INIT_SUCCEEDED); }
    void OnTick() { Инфа.RefreshRates(); Print(Инфа.Bid());}
    void OnDeinit(const int reason) { delete Инфа; }

    Только как вы собрались экономит память, экземпляр "CSymbolInfo" будет по любому создан?
    Вот попробуйте запустить этот скрипт.
    MQL код:

    #include <Trade/SymbolInfo.mqh>
    void OnStart()
    {
    CSymbolInfo *указатель;
    CSymbolInfo объект();
    Print("Размер указателя SymbolInfo " + sizeof(указатель) + " байт");
    Print("Размер самого объекта SymbolInfo который находиться в памяти " + sizeof(объект) + " байт");
    }

    У меня получилось так....
    Показать больше | К сообщению

    Прокомментировать:


  • Понял. Надо было еще предварительно обновить "котировки по символу". Теперь будет так.
    MQL код:

    #include <Trade/SymbolInfo.mqh>
    CSymbolInfo *Инфа;
    int OnInit() { Инфа = new CSymbolInfo(); Инфа.Name(Symbol()); return(INIT_SUCCEEDED); }
    void OnTick() { Инфа.RefreshRates(); Print(Инфа.Bid());}
    void OnDeinit(const int reason) { delete Инфа; }
    ...
    Показать больше | К сообщению

    Прокомментировать:


  • Я вижу как то так(в самом простом варианте)
    MQL код:

    #include <Trade/SymbolInfo.mqh>
    CSymbolInfo *Инфа;
    int OnInit() { Инфа = new CSymbolInfo(); Инфа.Name(Symbol()); return(INIT_SUCCEEDED); }
    void OnTick() { Print(Инфа.Spread()); }
    void OnDeinit(const int reason) { delete Инфа; }

    Соответственно в функций OnInit() экземпляр объекта может и не создаваться, тогда указатель "Инфа" будет указывать "на ничто", попытка обращение к такому указателю закончиться "критической ошибкой". Об этом надо помнить.
    p.s Сегодня выходной на рынке, решил опробовать его на "битке" на сервере "Метоквостов" при попытке получить "любую" цену выдает "0.0", а вот спред нормально выдает. Кто знает в чем "фишка"?...
    Показать больше | К сообщению

    Прокомментировать:


  • Для "превращения" сложного в простое....
    Показать больше | К сообщению

    Прокомментировать:


  • Для удобства. Конструкторы - это просто "особые" методы которые делают некую предварительную работу. То есть, если они "методы", то значить они и "функции", а у функций как известно есть "перегрузки", значит у методов и конструкторов соответственно тоже.

    Если мне не изменяет память(а разве тут все упомнишь) это называться "составной конструктор" и его можно использовать для упрощение иницилизаций, но не обязательно. Если поля базового класса "видны", то в принципе если нужно только присвоить значение(и не нужен какой либо "побочный эффект") , то можно обойтись без вызова какого либо конструктора базового класса. Но вот в этом например "надуманном" примере так сделать нельзя, так как поля закрыты и наследуются только конструкторы.
    MQL код:

    class A
    {
    int Поле1;
    double Поле2;
    string Поле3;
    protected:
    A(int значение1,
    ...
    Показать больше | К сообщению

    Прокомментировать:


  • На абстрактный класс "не тянет" нет "чисто" виртуальной функций. ссылка

    Вы можете сэкономить память если вместо поля типа int, будет поле с указателем на класс(указатель в 32-разрядной системе будет 4 байта, в 64-разрядной 8 байт соответственно). Требуется именно "указатель"(иначе фокуса не получиться), а не сама структура класса(она может весить и 100б и 10кб и 1мб и тд), иначе под поле будет выделена вся память для хранения структуры класса, плюс дополнительные расходы(требуемые на описание класса(это уже нюансы реализации)). А так память для экземпляра выделяться "не известно где" но у вас есть указатель на это "не известно где", если нет объекта указатель будет равен NULL....
    Показать больше | К сообщению

    Прокомментировать:


  • А для чего делать "экземплярные" если все походу существует в "одной штуке".
    Я исходил из этого. Что бы он в .mqh его положил и от туда вызывал. Хотя если мне память не изменяет, туда ведь можно и простые функций прописать? Тогда потребность в классе вообще пропадает....
    Показать больше | К сообщению

    Прокомментировать:


  • Своим примером я хотел показать что вашу задачу можно решить без помощи "наследования". Но сначала нужно сформулировать алгоритм. Вы пишите:
    то есть "сетка". Сколько "сеток" может одновременно быть в работе(например: советник мультивалютный и на каждый символ будет открыта своя сеть)? Если только одна, то вот этот класс
    MQL код:

    class Сетки
    {
    private: Сетка _Сетки[];
    public: Сетка *operator[](int индекс) { return(GetPointer(_Сетки[индекс])); }
    };

    нам уже нафиг нужен. Можно выкинуть его(он был предназначен для хранение несколько "сеток").
    Идем дальше. После того как "ордер" был успешно открыт нужно ли запоминать какую либо инфу о нем? Или если что, ее можно получить из списка ордеров терминала. Тогда модифицируем наш код и оставим только один класс со статическим методом.
    MQL код:

    class Сетка
    {
    public: static void Открытие_ордера()
    ...
    Показать больше | К сообщению

    Прокомментировать:


  • MQL код:

    class COrder
    {

    MQL код:

    public: void Proverka(bool deistvie) { if (deistvie){ /*открываем ордер */ } else { /*рисуем линию где он будет установлен */} }
    }; // Обычный класс без всяких прибамбасов. Здесь вопросов нет

    MQL код:
       public:  COrder *operator[](int indeks) { return(GetPointer(_Ordera[indeks])); } //Вообще для меня не понятная запись

    Это перегрузка оператора - [ ], которая дает возможность индексировать класс COrder как буд-то он массив. И возвращает указатель на элемент массива.
    MQL код:

    // Создаются три указателя. Пока не понимаю что такое указатели и почему не объявить просто объект класса
    Setki* setki = new Setki(); // что означают скобки()

    Здесь можно было поступить и так. Круглые скобки вызов конструктора без аргументов который возвращает указатель на только что созданный объект.
    Вместо вот такого длинного кода
    MQL код:

    Setka* setka = setki[nomer_setki];
    COrder* order
    ...
    Показать больше | К сообщению

    Прокомментировать:


  • Вот тут я изобразил кое какой код, как я вижу решение вашей задачи(если я конечно правильно понял вашу задачу).
    MQL код:

    class Ордер
    {
    public: void Проверка(bool действие) { if (действие){ /*открываем ордер */ } else { /*рисуем уровень */} }
    };
    class Сетка
    {
    private: Ордер _Ордера[];
    public: Ордер *operator[](int индекс) { return(GetPointer(_Ордера[индекс])); }
    };
    class Сетки
    {
    private: Сетка _Сетки[];
    public: Сетка *operator[](int индекс) { return(GetPointer(_Сетки[индекс])); }
    };

    void OnStart()
    {
    int номер_сетки = 5, номер_ордера = 2;
    Сетки* сетки = new Сетки();
    Сетка* сетка = сетки[номер_сетки];
    Ордер* ордер = сетка[номер_ордера];
    ордер.Проверка(true); /*Равносильно.*/ сетки[номер_сетки][номер_ордера].Проверка(false);
    }
    ...
    Показать больше | К сообщению

    Прокомментировать:


  • Жаль, жаль, очень жаль. А можно я вместо него, за вас проголосую. Очень бы хотелось взглянуть на вас, так сказать во всей красе!!!...
    Показать больше | К сообщению

    Прокомментировать:


  • Попробуйте вот этот код
    MQL код:

    #property copyright "Copyright 2019, MetaQuotes Software Corp."
    #property link "https://www.mql5.com"
    #property version "1.00"
    #property indicator_separate_window
    //+------------------------------------------------------------------+
    //| Custom indicator initialization function |
    //+------------------------------------------------------------------+
    int OnInit()
    {
    //--- indicator buffers mapping
    ObjectCreate(0, "rect",OBJ_RECTANGLE_LABEL, ChartWindowFind(), 0, 0);
    //--- установим координаты метки
    ObjectSetInteger(0,"rect",OBJPROP_XDISTANCE,100);
    ObjectSetInteger(0,"rect",OBJPROP_YDISTANCE,20);
    //--- установим размеры метки
    ObjectSetInteger(0,"rect",OBJPROP_XSIZE,1500);
    ObjectSetInteger(0,"rect",OBJPROP_YSIZE,100);
    ...
    Показать больше | К сообщению

    Прокомментировать:


  • Вам нужно сделать так.
    MQL код:

    long digits = SymbolInfoInteger(Symbol(), SYMBOL_DIGITS);

    Если требуется узнать "количество знаков после запятой" для символа текущего графика можно использовать Digits(), либо использовать переопределенную переменную _Digits....
    Показать больше | К сообщению

    Прокомментировать:


  • Если то это будет так Что бы получить/установить значение для элемента этого двухмерного массива, программе требуется знать его "адрес".(здесь конкретно, нужно установить индекс "строки" и индекс "столбца" желаемого элемента)...
    Показать больше | К сообщению

    Прокомментировать:

working...
X