Что то не понял, про что вы?
Вы писали
Я просто показал вам некий "прием" как это можно сделать(при необходимости и смотря по ситуаций), плюсом различие "веса" указателя и объекта. Как поступить(как я "изобразил" или как Игорь) решать вам, так как здесь все да такой степени просто, что я лично не вижу вообще не какого смысла в каких либо классах.
Понятное дело что чем меньше вызовов, тем скорость выше. Но если представить что пока шел перебор ордеров и "некая" работа с ними, один или несколько ордеров закрылись по "стопу". Переменная "i" уже не содержит "реальную" длину списка ордеров. Как быть в такой ситуаций? Приведет ли это к выходу за границы списка и критической ошибки соответственно? Справка не о чем таком не говорит.
Свой ответ я показал "в коде" выше....
Пока нет объявлений.
500 результатов за 0.0669 секунд.
Ключевые слова
Участники
Метки
-
Последний раз редактировалось АнтонР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....Прокомментировать:
-
Если то это будет так Что бы получить/установить значение для элемента этого двухмерного массива, программе требуется знать его "адрес".(здесь конкретно, нужно установить индекс "строки" и индекс "столбца" желаемого элемента)...Прокомментировать:
Прокомментировать: