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

Ugar

Гуру форума
Добрый вечер!
Подкиньте, пожалуйста, кусок кода, которым можно ограничить торговлю советника в определенный месяц.
Month
Возвращает номер текущего месяца последнего известного времени сервера.
int Month();
Возвращаемое значение
Номер текущего месяца (1-Январь,2,3,4,5,6,7,8,9,10,11,12) последнего известного серверного времени.
К примеру надо что бы что то делалось только в марте и декабре
if(Month()==3 || Month()==12)
{
//Здесь что надо делать
}
К примеру надо что бы что то не делалось только в марте и декабре
if(Month()!=3 && Month()!=12)
{
//Здесь что надо делать кроме марта и декабря
}
 

Yurkov

Почетный гражданин
К примеру надо что бы что то не делалось только в марте и декабре
if(Month()!=3 && Month()!=12)
{
//Здесь что надо делать кроме марта и декабря
}
А что написать, чтоб не торговал в эти месяцы?

P.S.
Вписал
if(Month()==3)
{
return(0);
}
И в марте торговли нет. Правильно или нет не знаю, но вроде как работает, спасибо!)
 
Последнее редактирование:

Ugar

Гуру форума
А что написать, чтоб не торговал в эти месяцы?

P.S.
Вписал
if(Month()==3)
{
return(0);
}
И в марте торговли нет. Правильно или нет не знаю, но вроде как работает, спасибо!)
Этот код буквально означает что всё что после него в марте не будет работать.
Стоит помнить что если это вся работа советника после этих строк, советник полностью прекратит работу. А если сделки открытые остались и их надо до сопроводить до закрытия, или что то надо завершить. То эти операции надо разместить до этих строк, если нужно что бы они работали всегда. Или внутри фигурных скобок, перед ретурн, если нужно что бы они работали только в марте.
 

Abi

Элитный участник
Ugar все очень четко и правильно предупредил.
Нужно точно знать, что делать с ордерами, которые остались в рынке, если наступил март:
1) либо выше по коду ставить условия по их закрытию-тралению-локированию и т.п. на ваше усмотрение
2) либо внутри скобок перед return(0); писать, что с текущими ордерами делать...
 
  • Like
Реакции: Ugar

svoi

Местный знаток
Уважаемые программисты!
Вот тут периодически возникает ошибка :

if(Time_bar!=Time[0]) в этой строчке array out of range
{
new_bar = true;
Time_bar=Time[0];
}
Кто нибудь подскажет как исправить, либо другой вариант определения что бар текущий?
 

AlexeyVik

Программист mql4 mql5
Уважаемые программисты!
Вот тут периодически возникает ошибка :

if(Time_bar!=Time[0]) в этой строчке array out of range
{
new_bar = true;
Time_bar=Time[0];
}
Кто нибудь подскажет как исправить, либо другой вариант определения что бар текущий?
Что-то у тебя из серии очевидное не вероятное... Не должно быть такого...
Если хочешь возьми мою функцию.
Код:
void OnTick()
{
 static datetime lbD, lbH;
  if(NewBar(PERIOD_D1, lbD))
   {
     // Делаем что надо в начале дня...
   }
  if(NewBar(PERIOD_H1, lbH))
   {
     // Делаем что надо в начале часа ...
   }
// И так можно определить начало бара любого периода
}/*******************************************************************/

bool NewBar(int tf, datetime &lastbar)
{
   datetime curbar = iTime(_Symbol, tf, 0);
   if(lastbar != curbar)
    {
     lastbar = curbar;
     return (true);
    }
   else return(false);
}/*******************************************************************/
Переменные lbD и lbH можно объявить на глобальном уровне, но от этого ничего особо не изменится.
 
  • Like
Реакции: svoi

svoi

Местный знаток
Что-то у тебя из серии очевидное не вероятное... Не должно быть такого...
Если хочешь возьми мою функцию.
Код:
void OnTick()
{
 static datetime lbD, lbH;
  if(NewBar(PERIOD_D1, lbD))
   {
     // Делаем что надо в начале дня...
   }
  if(NewBar(PERIOD_H1, lbH))
   {
     // Делаем что надо в начале часа ...
   }
// И так можно определить начало бара любого периода
}/*******************************************************************/

bool NewBar(int tf, datetime &lastbar)
{
   datetime curbar = iTime(_Symbol, tf, 0);
   if(lastbar != curbar)
    {
     lastbar = curbar;
     return (true);
    }
   else return(false);
}/*******************************************************************/
Переменные lbD и lbH можно объявить на глобальном уровне, но от этого ничего особо не изменится.

Спасибо за функцию, но суть таже. Попробую с функцией iTime еще. Может это ДЦ не дает время 0-ого бара спецом?
 

AlexeyVik

Программист mql4 mql5
Спасибо за функцию, но суть таже. Попробую с функцией iTime еще. Может это ДЦ не дает время 0-ого бара спецом?
А другой сути и быть не может. Есть время открытия бара и оно проверяется на неравенство.
ДЦ не может давать или не давать время открытия бара, оно берётся с сервера независимо от желания брокера вместе с очередным тиком, а уже в терминале определяется наступление нового бара какого-то периода.
Когда получишь ошибку посмотри номер строки и сравни с номером строки своего кода. Что-то кажется мне что не в этой строке ошибка.
Индикатор пишешь\правишь?
 

svoi

Местный знаток
А другой сути и быть не может. Есть время открытия бара и оно проверяется на неравенство.
ДЦ не может давать или не давать время открытия бара, оно берётся с сервера независимо от желания брокера вместе с очередным тиком, а уже в терминале определяется наступление нового бара какого-то периода.
Когда получишь ошибку посмотри номер строки и сравни с номером строки своего кода. Что-то кажется мне что не в этой строке ошибка.
Индикатор пишешь\правишь?

Это советник:
вот лог:
0 17:43:48.655 MACD_ColorHist_Alert_1_1 EURUSDf,M5: Alert: MACD Crossed down\n Date=2015.04.09 15:45\n Symbol=EURUSDf Period=5
1 17:48:33.214 array out of range in 'barabachka_pips_2_1_4-22.mq4' (175,21)
1 17:48:33.214 array out of range in 'barabachka_pips_2_1_4-2.mq4' (168,21)
0 17:58:08.865 MACD_ColorHist_Alert_1_1 EURUSDf,M5: uninit reason 1

вот кусок кода:
 

Вложения

  • ошибка.png
    ошибка.png
    13,9 КБ · Просмотры: 33

vlad_123

Местный знаток
Это советник:
вот лог:
0 17:43:48.655 MACD_ColorHist_Alert_1_1 EURUSDf,M5: Alert: MACD Crossed down\n Date=2015.04.09 15:45\n Symbol=EURUSDf Period=5
1 17:48:33.214 array out of range in 'barabachka_pips_2_1_4-22.mq4' (175,21)
1 17:48:33.214 array out of range in 'barabachka_pips_2_1_4-2.mq4' (168,21)
0 17:58:08.865 MACD_ColorHist_Alert_1_1 EURUSDf,M5: uninit reason 1
Поищи - не объявляется ли где-нибудь в твоем коде массив Time[] ;)
В этом случае MetaEditor при компиляции просто выдает варнинг:
declaration of 'Time' hides predefined variable
 

svoi

Местный знаток
Поищи - не объявляется ли где-нибудь в твоем коде массив Time[] ;)
В этом случае MetaEditor при компиляции просто выдает варнинг:

Неа , он только в этом куске, ща переделал на iTime пока нет ошибки. Странно как-то, техподдержка молчит как всегда.
 

AlexeyVik

Программист mql4 mql5
Это советник:
вот лог:
0 17:43:48.655 MACD_ColorHist_Alert_1_1 EURUSDf,M5: Alert: MACD Crossed down\n Date=2015.04.09 15:45\n Symbol=EURUSDf Period=5
1 17:48:33.214 array out of range in 'barabachka_pips_2_1_4-22.mq4' (175,21)
1 17:48:33.214 array out of range in 'barabachka_pips_2_1_4-2.mq4' (168,21)
0 17:58:08.865 MACD_ColorHist_Alert_1_1 EURUSDf,M5: uninit reason 1

вот кусок кода:
А в строке 168 что? И при каких делах тут индикатор MACD_ColorHist_Alert_1_1
 

svoi

Местный знаток
А в строке 168 что? И при каких делах тут индикатор MACD_ColorHist_Alert_1_1

168-21 это другая версия такого же советника, а Макдак просто стоит на графике, возможно был обрыв связи и заново инициализация индикатора. С iTime пока нет ошибки.
 

owjedi

Интересующийся
Может ли пользовательская функция типа bool вернуть значения двух переменных такого типа, правильно ли так описать:

bool Cross (a,b,c....)
{
return (bool s, bool f);
}

и как ней обратиться, можно ли вернуть оба значения за одно обращение?
Например так:

Cross (a,b,c....)
{
int w,m;
w=s;m=f;
return (s, f);
}
 

matro3

Почетный гражданин
В хелпе написано, что можно возвращать простые структуры.
_http://docs.mql4.com/ru/basis/types/classes#simple_structure
 
Последнее редактирование модератором:

Ugar

Гуру форума
Может ли пользовательская функция типа bool вернуть значения двух переменных такого типа, правильно ли так описать:

bool Cross (a,b,c....)
{
return (bool s, bool f);
}

и как ней обратиться, можно ли вернуть оба значения за одно обращение?
Например так:

Cross (a,b,c....)
{
int w,m;
w=s;m=f;
return (s, f);
}
Можно использовать ссылки
void Cross (int a, int b, int c, bool& s, bool& f)
{
//Здесь вычисления значений s, f.
}
 

Yura Vakulenko

Активный участник
Привет, друзья, подскажите простейшую функцию, которая если наступят условия.. (SigPF==1 или SigPF==2) и OrdersTotal>0 т.е. нужно обрабатывать только те ордера, которые сейчас в рынке, если наступит одно из условий SigPF.

Внешняя переменная для проверки условия внутри функции..
extern int PF_price_in_pips=70;
Функция должна:
1.определить с какими ордерами будем иметь дело.. если SigPF==1 , то это обрдера БАЙ (сигнал на покупку), если SigPF==2 , то это ордера СЕЛЛ (Сигнал на продажу)
2.проверить текущую цену и если
в рынке сейчас Бай ордера и был SigPF==1, тогда

разность между текущей ценой, по которой будет открыт ордер Бай, и любой из цен открытия ордеров, что уже есть в рынке больше PF_price_in_pips, тогда функция должна возвратить флаг valid_signal=true


в рынке сейчас Селл ордера и был SigPF==2, тогда

разность между любой из цен открытия ордеров, что уже есть в рынке и текущей ценой по которой будет открыт ордер Селл больше PF_price_in_pips, тогда функция должна возвратить флаг valid_signal=true

если же расстояние между ценой открытия новго ордера при наступлении сигналов на покупку-продажу меньше PF_price_in_pips, тогда функция будет возвращать valid_signal=false

В общем, если в двух словах, функция должна проверить расстояние между ценой открытия нового ордера при сигналах о покупке-продаже (SigPF==1, SigPF==2) и любой из цен открытия ордеров, что есть в рынке уже.. и если это расстояние больше чем PF_price_in_pips, тогда возвращать флаг valid_signal=true, если же это расстояние - меньше, тогда valid_signal=false. Это чтобы не открывались ордера по очень близким друг к другу ценам! И вот еще.. советник у меня торгует только по открытию нового бара.. не на всех тиках.. , хотя, думаю, это не важно.. там все-равно нужно будет рать во внимание цены Бид или Аск..

помогите с такой функцией.. ! Если не понятно что-то я постараюсь объяснить.. или дам картинки! Только помогите) Спасибо!
 

matro3

Почетный гражданин
Перебирай ордера в рынке и сравнивай цены их открытия с текущей.
Что-то не вижу проблем.
 

vladradon

Программист
Привет, друзья, подскажите простейшую функцию, которая если наступят условия.. (SigPF==1 или SigPF==2) и OrdersTotal>0 т.е. нужно обрабатывать только те ордера, которые сейчас в рынке, если наступит одно из условий SigPF.

Внешняя переменная для проверки условия внутри функции..
extern int PF_price_in_pips=70;
Функция должна:
1.определить с какими ордерами будем иметь дело.. если SigPF==1 , то это обрдера БАЙ (сигнал на покупку), если SigPF==2 , то это ордера СЕЛЛ (Сигнал на продажу)
2.проверить текущую цену и если
в рынке сейчас Бай ордера и был SigPF==1, тогда

разность между текущей ценой, по которой будет открыт ордер Бай, и любой из цен открытия ордеров, что уже есть в рынке больше PF_price_in_pips, тогда функция должна возвратить флаг valid_signal=true


в рынке сейчас Селл ордера и был SigPF==2, тогда

разность между любой из цен открытия ордеров, что уже есть в рынке и текущей ценой по которой будет открыт ордер Селл больше PF_price_in_pips, тогда функция должна возвратить флаг valid_signal=true

если же расстояние между ценой открытия новго ордера при наступлении сигналов на покупку-продажу меньше PF_price_in_pips, тогда функция будет возвращать valid_signal=false

В общем, если в двух словах, функция должна проверить расстояние между ценой открытия нового ордера при сигналах о покупке-продаже (SigPF==1, SigPF==2) и любой из цен открытия ордеров, что есть в рынке уже.. и если это расстояние больше чем PF_price_in_pips, тогда возвращать флаг valid_signal=true, если же это расстояние - меньше, тогда valid_signal=false. Это чтобы не открывались ордера по очень близким друг к другу ценам! И вот еще.. советник у меня торгует только по открытию нового бара.. не на всех тиках.. , хотя, думаю, это не важно.. там все-равно нужно будет рать во внимание цены Бид или Аск..

помогите с такой функцией.. ! Если не понятно что-то я постараюсь объяснить.. или дам картинки! Только помогите) Спасибо!

Это уже не функция, а почти полный сов... Больше похоже на ТЗ... Круто ты спросил...))) Там еще не одну функию придется использовать для разных расчетов..
 
Последнее редактирование:

Yura Vakulenko

Активный участник
Это уже не функция, а почти полный сов... Больше похоже на ТЗ... Круто ты спросил...))) Там еще не одну функию придется использовать для разных расчетов..

Это всего одна функция. Это не советник. просто все очень подробно расписал..

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