Ваши вопросы по языку MQL4

hoz

Активный участник
Назрел другой вопрос. Как в классе сделать так, чтобы переменная была статичная?
Я пробывал в секции private инициализировать переменную с модификатором static, но что-то компилятор ругается:
PHP:
unresolved static variable 'BaseInfo::LotDecimal'	BaseInfo.mqh	60	10


Я так понимаю такой вариант не поддерживается. Какие ещё есть варианты?
 
Последнее редактирование:

barabashkakvn

Заблокирован
Назрел другой вопрос. Как в классе сделать так, чтобы переменная была статичная?
Я пробывал в секции private инициализировать переменную с модификатором static, но что-то компилятор ругается:
PHP:
unresolved static variable 'BaseInfo::LotDecimal'	BaseInfo.mqh	60	10


Я так понимаю такой вариант не поддерживается. Какие ещё есть варианты?

Теперь статический член класса должен быть проинициализирован в обязательном порядке.
 

ctmcn

Новичок форума
Здравствуйте !
При компиляции в 670 билде пишет варнинг... поправте пожалуйта.
С уважением.
 

Вложения

  • center_of_gravity.mq4
    5,4 КБ · Просмотры: 22

_SERG_

Активный участник
Здравствуйте !
При компиляции в 670 билде пишет варнинг... поправте пожалуйта.
С уважением.
int deinit()
{
ObjectDelete("pr" + sName);
}
Дальше, со словарём.;)
not all control paths return a value Center of Gravity.mq4 48 1

 
Последнее редактирование:

Александр_Стручков

Интересующийся
Всем доброго времени!

Выдает ошибку array out of range. Не могу сообразить как победить :(

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

PHP:
extern string sym="EURUSD,EURJPY";
extern int per1=150;//Период быстрого мувинга
extern int per2=250;//Период медленного мувинга
extern int timeframe=15;//Таймфрейм
double ma1;
double ma2;
double ma11;
double ma22;

int alert(string symbol, string pos)
{
if (pos=="Short")
 Alert ("Short","  ",symbol,"  ",Hour(),":",Minute()); 
 SendMail("Short","Short"+"  "+symbol+"  "+IntegerToString(Hour(),10,' ')+":"+IntegerToString(Minute(),10,' '));
 
if (pos=="Long")
 Alert ("Long","  ",symbol,"  ",Hour(),":",Minute()); 
 SendMail("Long","Long"+"  "+symbol+"  "+IntegerToString(Hour(),10,' ')+":"+IntegerToString(Minute(),10,' '));
return(0);
}

string ma (string symb){
ma1=iMA(symb,timeframe,per1,0,MODE_EMA,PRICE_CLOSE,1);
ma2=iMA(symb,timeframe,per2,0,MODE_EMA,PRICE_CLOSE,1);
ma11=iMA(symb,timeframe,per1,0,MODE_EMA,PRICE_CLOSE,2);
ma22=iMA(symb,timeframe,per2,0,MODE_EMA,PRICE_CLOSE,2);
if (ma11>ma22&&ma1<=ma2) return ("Short");else if (ma11<ma22&&ma1>=ma2) return ("Long"); else return("0");
}
int b;
int c;
string sym_arr[];
string time[];
string symbol_arr;
string time_arr;
void OnTick()
  {
b=StringSplit(sym,StringGetCharacter(",",0),sym_arr);
c=ArrayResize(sym_arr,ArraySize(sym_arr)+100);
if (b>0)
{
for (int i=0;i<b;i++)
{
symbol_arr=sym_arr[i];

if (time[i]!=(string)iTime(symbol_arr,timeframe,1)&&ma(symbol_arr)!="0") {alert(symbol_arr,ma(symbol_arr));time[i]=(string)iTime(symbol_arr,timeframe,1);}
}
}
}
 
Последнее редактирование:

_SERG_

Активный участник
Всем доброго времени!

Выдает ошибку array out of range. Не могу сообразить как победить :(

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

PHP:
extern string sym="EURUSD,EURJPY";
extern int per1=150;//Период быстрого мувинга
extern int per2=250;//Период медленного мувинга
extern int timeframe=15;//Таймфрейм
double ma1;
double ma2;
double ma11;
double ma22;

int alert(string symbol, string pos)
{
if (pos=="Short")
 Alert ("Short","  ",symbol,"  ",Hour(),":",Minute()); 
 SendMail("Short","Short"+"  "+symbol+"  "+IntegerToString(Hour(),10,' ')+":"+IntegerToString(Minute(),10,' '));
 
if (pos=="Long")
 Alert ("Long","  ",symbol,"  ",Hour(),":",Minute()); 
 SendMail("Long","Long"+"  "+symbol+"  "+IntegerToString(Hour(),10,' ')+":"+IntegerToString(Minute(),10,' '));
return(0);
}

string ma (string symb){
ma1=iMA(symb,timeframe,per1,0,MODE_EMA,PRICE_CLOSE,1);
ma2=iMA(symb,timeframe,per2,0,MODE_EMA,PRICE_CLOSE,1);
ma11=iMA(symb,timeframe,per1,0,MODE_EMA,PRICE_CLOSE,2);
ma22=iMA(symb,timeframe,per2,0,MODE_EMA,PRICE_CLOSE,2);
if (ma11>ma22&&ma1<=ma2) return ("Short");else if (ma11<ma22&&ma1>=ma2) return ("Long"); else return("0");
}
int b;
int c;
string sym_arr[];
string time[];
string symbol_arr;
string time_arr;
void OnTick()
  {
b=StringSplit(sym,StringGetCharacter(",",0),sym_arr);
c=ArrayResize(sym_arr,ArraySize(sym_arr)+100);
if (b>0)
{
for (int i=0;i<b;i++)
{
symbol_arr=sym_arr[i];

if (time[i]!=(string)iTime(symbol_arr,timeframe,1)&&ma(symbol_arr)!="0") {alert(symbol_arr,ma(symbol_arr));time[i]=(string)iTime(symbol_arr,timeframe,1);}
}
}
}

Пишешь : string sym_arr[];, а какой именно ?
b = StringSplit ( sym,StringGetCharacter(",",0), sym_arr ); // Размерчик то не опрределён
Тут глючёк, начинаем менять размер.
c=ArrayResize(sym_arr, ArraySize(sym_arr)+100); // После того как ошибка уже есть.
Очевидное предложение , поменять строки местами, для начала.
Ну, и посмотреть, что написал по факту, а не то, что думал написать.
Успехов.

PS
Глюков много.
Проверь пошагово каждую строку, напиши к ней комментарий, что именно ты сделал в строке, и что должно получится в результате.
Думай не абстрактно, а конкретно.
 
Последнее редактирование:

Александр_Стручков

Интересующийся
Пишешь : string sym_arr[];, а какой именно ?
b = StringSplit ( sym,StringGetCharacter(",",0), sym_arr ); // Размерчик то не опрределён
Тут глючёк, начинаем менять размер.
c=ArrayResize(sym_arr, ArraySize(sym_arr)+100); // После того как ошибка уже есть.
Очевидное предложение , поменять строки местами, для начала.
Ну, и посмотреть, что написал по факту, а не то, что думал написать.
Успехов.

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

SERG, большое спасибо за ответ! Решение, оказывается, было рядом :)

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

hoz

Активный участник
Подскажите, как правильно передать в метод классах структуру по ссылке? Желательно на примере. Теоритически я понимаю, но практически какие-то косяки возникают.
Вот структура:
PHP:
// =================================================_______ СВОЙСТВА СИМВОЛА _______=======================================================
struct Symbol_Properties
{
   datetime    gdt_Quote;           // Время поступления последней котировки
   double      gda_Price [2];       // Текущие рыночные цены (0 - Bid, 1- Ask)
   double      gd_Spread;           // Размер спреда в пунктах
   double      gd_Swap;             // Своп
   double      gd_Comission;        // Комиссия
   double      gd_Pt;               // Величина одного пункта
   int         gi_Digits;           // Количество знаков в цене после запятой
   int         gi_StopLevel;        // Минимально-допустимый уровень стоп-лосса/тейк-профита в пунктах
   int         gi_FreezLevel;       // Уровень заморозки ордеров в пунктах
};
//---- Создадим объект структуре Symbol_Properties
Symbol_Properties SSym;

В классе, который метод которого должен вызывает данную структуру по ссылке вот так я сделал:
PHP:
// Конструктор класса. ====================================================================================================================
BaseInfo::BaseInfo (Symbol_Properties& SSym)
{
   //---- Инициализируем закрытые переменные input-значениями
   SetBootstrap (ib_Bootstrap);
   SetRealTrade (ib_RealTrade);
   SetVirtualTrade (ib_VirtualTrade);
   //---- Инициализируем другие данные необходимые для работы класса
   ExpertName = StringConcatenate (WindowExpertName(), ":  ", GetNameTF (_Period), "_", _Symbol);
   RealTrade = (!IsTesting() && !IsOptimization());
   VirtualTrade = (IsOptimization() || (IsTesting() && !IsVisualMode()));
   if ( SSym.gd_Pt == 0.0 )
       {SSym.gd_Pt = GetPoint (_Symbol);}
   GetMarkerInfo (_Symbol, SSym, SPos, -1);
   SLots.gd_MinLot = MarketInfo (_Symbol, MODE_MINLOT);
   SLots.gd_MaxLot = MarketInfo (_Symbol, MODE_MAXLOT);
   SLots.gd_LotStep = MarketInfo (_Symbol, MODE_LOTSTEP);
   SLots.gd_LotSize = MarketInfo (_Symbol, MODE_LOTSIZE);
   SLots.gi_LotDecimal = LotDecimal();
   CArraysMan.InitializeArraySTR (Comments, "");
   //---- Определение индекса " ошибок " в массиве комментариев Comments[]
   IndErr = ArraySize (Comments) - 1;
   //---- Контроль возможных ошибок
}

Компилятор ругается в месте заголовка конструктора:
PHP:
'CBase' - default constructor not defined	BaseInfo.mqh	63	10
declaration of 'SSym' hides global declaration in file 'MarketData.mqh' at line 32	BaseInfo.mqh	66	40
 

viplert

Активный участник
В программировании на mql4 я нови чек и столкнулся с такой проблемой что при тестировании советника ордера на покупку открываются выше свечи на 4 пункта, почему так происходит ведь на продажу открывается правильно?
 

AlexeyVik

Программист mql4 mql5
В программировании на mql4 я нови чек и столкнулся с такой проблемой что при тестировании советника ордера на покупку открываются выше свечи на 4 пункта, почему так происходит ведь на продажу открывается правильно?
Тебе просто надо понять что такое Ask и что такое Bid. По какой цене открываются покупки и по какой продажи. И всё встанет на свои места.
 

barabashkakvn

Заблокирован
В программировании на mql4 я нови чек и столкнулся с такой проблемой что при тестировании советника ордера на покупку открываются выше свечи на 4 пункта, почему так происходит ведь на продажу открывается правильно?

Вот из справки к терминалу:
Цена — текущая цена финансового инструмента. Для позиций на продажу отображается цена Bid, для позиций на покупку — цена Ask, для позиций по биржевым инструментам (в обоих направлениях) отображается цена последней совершенной сделки (Last);
 

ctmcn

Новичок форума
Здравствуйте !
Подскажите, пожалуйста - какое значение в буфере (0 или 1 или другое) для зеленого, красного цвета на гистограмме индикатора Вильямса АО из стандартного набора МТ4. Если я правильно понимаю:
- 0 буфер для расчета числовых значений гистограммы,
- 1 буфер для окрашивания гистограммы в зеленый,
- 2 буфер для окрашивания гистограммы в красный.
Спрашиваю, потому, что обычно текущий бар на гистограмных индикаторах окрашивается в тот цвет, где в буфере в этот момент (1). На АО Вильямса может как-то по другому - проверял через тестер стратегий - не открываются ордера.
Любой другой гистограмный индикатор, у которого на текущет баре в буфере (1) - работает.
 

tommy27

Гуру форума
Здравствуйте !
Подскажите, пожалуйста...

А вы через Comment() выводите на экран показания буферов и всё понятно будет.
Я функцию такую написал, оч удобно.
Вместо b1,b2,b3 вставляйте переменные, которые надо посмотреть/проверить и всё:
PHP:
////////////////////
// Commentariy()
////////////////////
void Commentariy()
  {
    string st= 
            "Buf1_____"+b1+"\n"+
            "Buf2_____"+b2+"\n"+
            "Buf3_____"+b3+"\n"+
           
            "Spred__"+DoubleToStr(MarketInfo(Symbol(),MODE_SPREAD),2);
           
   Comment(st);  
  }
 
Последнее редактирование:

div15

Интересующийся
кто поможет написать функцию LotExponent при срабатывании стоп лоса
 

supporttr

Активный участник
Подскажите, как правильно передать в метод классах структуру по ссылке? Желательно на примере. Теоритически я понимаю, но практически какие-то косяки возникают.
Вот структура:
PHP:
// =================================================_______ СВОЙСТВА СИМВОЛА _______=======================================================
struct Symbol_Properties
{
   datetime    gdt_Quote;           // Время поступления последней котировки
   double      gda_Price [2];       // Текущие рыночные цены (0 - Bid, 1- Ask)
   double      gd_Spread;           // Размер спреда в пунктах
   double      gd_Swap;             // Своп
   double      gd_Comission;        // Комиссия
   double      gd_Pt;               // Величина одного пункта
   int         gi_Digits;           // Количество знаков в цене после запятой
   int         gi_StopLevel;        // Минимально-допустимый уровень стоп-лосса/тейк-профита в пунктах
   int         gi_FreezLevel;       // Уровень заморозки ордеров в пунктах
};
//---- Создадим объект структуре Symbol_Properties
Symbol_Properties SSym;

В классе, который метод которого должен вызывает данную структуру по ссылке вот так я сделал:
PHP:
// Конструктор класса. ====================================================================================================================
BaseInfo::BaseInfo (Symbol_Properties& SSym)
{
   //---- Инициализируем закрытые переменные input-значениями
   SetBootstrap (ib_Bootstrap);
   SetRealTrade (ib_RealTrade);
   SetVirtualTrade (ib_VirtualTrade);
   //---- Инициализируем другие данные необходимые для работы класса
   ExpertName = StringConcatenate (WindowExpertName(), ":  ", GetNameTF (_Period), "_", _Symbol);
   RealTrade = (!IsTesting() && !IsOptimization());
   VirtualTrade = (IsOptimization() || (IsTesting() && !IsVisualMode()));
   if ( SSym.gd_Pt == 0.0 )
       {SSym.gd_Pt = GetPoint (_Symbol);}
   GetMarkerInfo (_Symbol, SSym, SPos, -1);
   SLots.gd_MinLot = MarketInfo (_Symbol, MODE_MINLOT);
   SLots.gd_MaxLot = MarketInfo (_Symbol, MODE_MAXLOT);
   SLots.gd_LotStep = MarketInfo (_Symbol, MODE_LOTSTEP);
   SLots.gd_LotSize = MarketInfo (_Symbol, MODE_LOTSIZE);
   SLots.gi_LotDecimal = LotDecimal();
   CArraysMan.InitializeArraySTR (Comments, "");
   //---- Определение индекса " ошибок " в массиве комментариев Comments[]
   IndErr = ArraySize (Comments) - 1;
   //---- Контроль возможных ошибок
}

Компилятор ругается в месте заголовка конструктора:
PHP:
'CBase' - default constructor not defined	BaseInfo.mqh	63	10
declaration of 'SSym' hides global declaration in file 'MarketData.mqh' at line 32	BaseInfo.mqh	66	40

#2569 && #2571
 

extegonug

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

mobidik

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

«Торговый робот своими руками»
Здесь описание: _http://mql.info-dvd.ru/
Здесь видео: _https://cloud.mail.ru/public/633ed41c36c0/torgrobot.rar
Пароль на архив: N76XJQ80PA1TWNQR5P9BJE6T8S1GT7

А так же смотри здесь: _http://tradelikeapro.ru/programmirovanie-na-mql-kurs/
 

Вложения

  • Уроки.jpg
    Уроки.jpg
    119,4 КБ · Просмотры: 20
Последнее редактирование:
Верх