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

rus008

Почетный гражданин
Коллеги добрый день.Нужна ваша помощь.
Подскажите как можно сделать чтоб можно было указывать колличество закрытых баров после того как цена ушла выше или ниже мувингов.С возможность указывать открытие ордера по open close бара. Нужно именно пересечение ценой и закрепление выше мувингов или ниже. Пересечение мувингов не нужно,
 

Вложения

  • Screenshot_191.png
    Screenshot_191.png
    49,8 КБ · Просмотры: 38

com.bvv

Местный знаток
Всем доброго времени!
Подскажите как добавить функцию "Активация по времени". Конкретно интересует - добавить включение работы Тральщика в определенное время? Если нужен код - предоставлю...
 

Ugar

Гуру форума
Всем доброго времени!
Подскажите как добавить функцию "Активация по времени". Конкретно интересует - добавить включение работы Тральщика в определенное время? Если нужен код - предоставлю...
input datetime TimeActiv=D'12.07.2021 12:05';//Время активации

void OnTick()
{
static datetime PrevTime=0;
datetime TimeCur=TimeCurrent();//Текущее время
if(PrevTime==0)PrevTime=TimeCur;//Инициализация
//Если наступило время активации
if(PrevTime<TimeActiv && TimeCur>=TimeActiv)
{
//Здесь код тральщика
}
PrevTime=TimeCur;//Запомнить время для сравнения
}
 

com.bvv

Местный знаток
input datetime TimeActiv=D'12.07.2021 12:05';//Время активации

void OnTick()
{
static datetime PrevTime=0;
datetime TimeCur=TimeCurrent();//Текущее время
if(PrevTime==0)PrevTime=TimeCur;//Инициализация
//Если наступило время активации
if(PrevTime<TimeActiv && TimeCur>=TimeActiv)
{
//Здесь код тральщика
}
PrevTime=TimeCur;//Запомнить время для сравнения
}
Спасибо!
Но судя по коду - это одноразовая фишка?
Я могу заблуждаться...
Не пинайте сильно...
Мне нужно, чтобы тральщик делал свою работу в определенное время и бесконечно....
И ещё, вот этот код "input datetime TimeActiv=D'12.07.2021 12:05';//Время активации" будет отображаться в настройках Тральщика?
Проще, наверное, код этого Тральщика сюда приложить,чтобы специалисты просто его дополнили этой функцией)
 
Последнее редактирование:

com.bvv

Местный знаток
Спасибо!
Но судя по коду - это одноразовая фишка?
Я могу заблуждаться...
Не пинайте сильно...
Мне нужно, чтобы тральщик делал свою работу в определенное время и бесконечно....
И ещё, вот этот код "input datetime TimeActiv=D'12.07.2021 12:05';//Время активации" будет отображаться в настройках Тральщика?
Проще, наверное, код этого Тральщика сюда приложить,чтобы специалисты просто его дополнили этой функцией)
 

Вложения

Ugar

Гуру форума
Спасибо!
Но судя по коду - это одноразовая фишка?
Я могу заблуждаться...
Не пинайте сильно...
Мне нужно, чтобы тральщик делал свою работу в определенное время и бесконечно....
И ещё, вот этот код "input datetime TimeActiv=D'12.07.2021 12:05';//Время активации" будет отображаться в настройках Тральщика?
Проще, наверное, код этого Тральщика сюда приложить,чтобы специалисты просто его дополнили этой функцией)
Да, дата и время активации задаётся в свойствах эксперта.
Этот код включит тральщик в заданную дату и время и будет включенным до перезапуска. Как и была описана задача.
Если надо что бы как то по другому работал, надо описать как именно.
 

com.bvv

Местный знаток
Да, дата и время активации задаётся в свойствах эксперта.
Этот код включит тральщик в заданную дату и время и будет включенным до перезапуска. Как и была описана задача.
Если надо что бы как то по другому работал, надо описать как именно.
Благодарствую!
Однако компиляция завершилась ошибкой
1625977037972.png
Решил просто... Весь Ваш код опустил за код тральщика. Ошибки исчезли, но работает или нет проверю завтра...
 
Последнее редактирование:

Ugar

Гуру форума
Благодарствую!
Однако компиляция завершилась ошибкой
Посмотреть вложение 441982
Решил просто... Весь Ваш код опустил за код тральщика. Ошибки исчезли, но работает или нет проверю завтра...
Функция OnTick() современный обработчик событий тиков. Древний назывался start(). В этом советнике древний start().
Всё что внутри фигурных скобок OnTick() нужно перенести внутрь фигурных скобок start(). А сам код тральщика нужно поместить внутрь фигурных скобок где //Здесь код тральщика
С такими знаниями программирования, наверное, самому можно даже не пытаться что то делать, даже с подсказками.
Лучше попросить других. Это здесь Доработка ботов (советников, индикаторов) vol. 2
 

griz

Активный участник
Здравствуйте. Подскажите как реализовать следующую задачу.
Нужно записать данные ордера (тип ордера, объем, цена) в текстовой файл. А другим индюком эти данные прочитать. Ордеров может быть несколько.

Как я представляю эти данные в текстовом файле: данные каждого ордера пишутся с новой строки.
Код:
Expand Collapse Copy
buy limit, 0.01, 1.1234
sell limit, 0.02, 1.5678

Как реализовать запись и чтение данных в файл в коде?
 

MakarFX

Элитный участник
Подскажите, пожалуйста, как это вывести во внешнюю переменную
Код:
Expand Collapse Copy
double levelss[7] = {0,0.236,0.382,0.5,0.618,1,1.618}; // Уровни Fibo
 

Абдулхаким

Почетный гражданин
Подскажите, пожалуйста, как это вывести во внешнюю переменную
Код:
Expand Collapse Copy
double levelss[7] = {0,0.236,0.382,0.5,0.618,1,1.618}; // Уровни Fibo
как вариант записать так же строчкой, при инициализации собрать в массив
 

mobidik

-----
Подскажите, пожалуйста, как это вывести во внешнюю переменную
Код:
Expand Collapse Copy
double levelss[7] = {0,0.236,0.382,0.5,0.618,1,1.618}; // Уровни Fibo
Вот тебе два варианта, как пример.
В первом - нет защиты от дурака, т.е., отсутствует проверка на наличие букв и любых иных символов кроме заданного разделителя - "/" в поле ввода уровней. В данном случае, пользователь может задать любое количество уровней.
Во втором варианте - задано фиксированное количество уровней. Пользователь не может задать больше, чем прописано в настройках.
 

Вложения

MakarFX

Элитный участник
Вот тебе два варианта, как пример.
В первом - нет защиты от дурака, т.е., отсутствует проверка на наличие букв и любых иных символов кроме заданного разделителя - "/" в поле ввода уровней. В данном случае, пользователь может задать любое количество уровней.
Во втором варианте - задано фиксированное количество уровней. Пользователь не может задать больше, чем прописано в настройках.
Я не совсем понял, можно наглядно с моим кодом, мои познания mql ограничены:(

Дошло, спасибо огромное:)
 
Последнее редактирование:

Milord

Местный знаток
Всем привет!
давно тут небыл по разным причинам,но меня мучает вопрос как написать в коде такой алгоритм работы:
как известно всего 5 дней недели рабочих,как прописать в коде ,чтобы в каждый день советник генерил своё случайное число из какого то промежутка чисел?
например задаём в настройках промежуток:
min=1;/--------
max=9;/--------
P.S.
ПРОСЬБА СИЛЬНО НЕ ПИНАТЬ,ПОТОМУ ЧТО МНОГОЕ ЗАБЫЛ,ЧТО ЗНАЛ...:)
 

mobidik

-----
Всем привет!
давно тут небыл по разным причинам,но меня мучает вопрос как написать в коде такой алгоритм работы:
как известно всего 5 дней недели рабочих,как прописать в коде ,чтобы в каждый день советник генерил своё случайное число из какого то промежутка чисел?
например задаём в настройках промежуток:
min=1;/--------
max=9;/--------
P.S.
ПРОСЬБА СИЛЬНО НЕ ПИНАТЬ,ПОТОМУ ЧТО МНОГОЕ ЗАБЫЛ,ЧТО ЗНАЛ...:)
Как вариант, за основу использовать стандартную ф-цию MathRand():
C-подобный:
Expand Collapse Copy
//+------------------------------------------------------------------+
//|                                                       Random.mq4 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window

extern int  min = 1;
extern int  max = 9;

int      Random;
datetime BarTime;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
    BarTime = 0;
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
    if(BarTime!=iTime(NULL,PERIOD_D1,0))
     {
       BarTime = iTime(NULL,PERIOD_D1,0);
       Random  = MathRand();
      
       while(Random<min) Random*=10;
       while(Random>max) Random/=10;
     }
    
    Comment("\n min - ",min,"\n max - ",max,"\n Random - ",Random);
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

PS.
Если закоментить строку: BarTime = iTime(NULL,PERIOD_D1,0); - значения в коменте будут меняться с каждым тиком.
 

Milord

Местный знаток
Как вариант, за основу использовать стандартную ф-цию MathRand():
C-подобный:
Expand Collapse Copy
//+------------------------------------------------------------------+
//|                                                       Random.mq4 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window

extern int  min = 1;
extern int  max = 9;

int      Random;
datetime BarTime;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
    BarTime = 0;
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
    if(BarTime!=iTime(NULL,PERIOD_D1,0))
     {
       BarTime = iTime(NULL,PERIOD_D1,0);
       Random  = MathRand();
    
       while(Random<min) Random*=10;
       while(Random>max) Random/=10;
     }
  
    Comment("\n min - ",min,"\n max - ",max,"\n Random - ",Random);
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

PS.
Если закоментить строку: BarTime = iTime(NULL,PERIOD_D1,0); - значения в коменте будут меняться с каждым тиком.
спасибо за ответ,но возникло 2 вопроса,судя из вашего кода и моего нулевого уровня понимания:
1- зачем в коде писать как индикатор?мне не нужен индикатор ни коим образом,а лишь кусок кода советника с данной логикой работы,если я конечно правильно понял ваш код!
2 -вы пишите" Если закоментить строку: BarTime = iTime(NULL,PERIOD_D1,0); - значения в коменте будут меняться с каждым тиком."
можете на простой русский перевести,а то я разучился понимать такие фразы,повторюсь еще раз - мне нужен кусочек кода самый простой по написанию и маленький по объёму,чтобы в любой из дней недели с понедельника по пятницу советник генерил по случайному алгоритму одно число в свой день недели из промежутка,который будет в шапке советника как переменные
extern int min = 1;
extern int max = 9;
в итоге например должны получатся такие цифры:
понедельник - 4
вторник - 9
среда - 1
четверг - 3
пятница - 7
далее вторая неделя:
понедельник - 2
вторник - 8
среда - 6
четверг - 5
пятница - 3
и так далее...
 

mobidik

-----
спасибо за ответ,но возникло 2 вопроса,судя из вашего кода и моего нулевого уровня понимания:
1- зачем в коде писать как индикатор?мне не нужен индикатор ни коим образом,а лишь кусок кода советника с данной логикой работы,если я конечно правильно понял ваш код!
2 -вы пишите" Если закоментить строку: BarTime = iTime(NULL,PERIOD_D1,0); - значения в коменте будут меняться с каждым тиком."
можете на простой русский перевести,а то я разучился понимать такие фразы,повторюсь еще раз - мне нужен кусочек кода самый простой по написанию и маленький по объёму,чтобы в любой из дней недели с понедельника по пятницу советник генерил по случайному алгоритму одно число в свой день недели из промежутка,который будет в шапке советника как переменные
extern int min = 1;
extern int max = 9;
в итоге например должны получатся такие цифры:
понедельник - 4
вторник - 9
среда - 1
четверг - 3
пятница - 7
далее вторая неделя:
понедельник - 2
вторник - 8
среда - 6
четверг - 5
пятница - 3
и так далее...
МНОГОЕ ЗАБЫЛ,ЧТО ЗНАЛ...
Ups,
судя по Вашим вопросам, знали Вы не много...
1. Это всего лишь пример.
2. Что мешает взять из всего кода только нужный кусок?
3. На счет: закомментировать - только с целью визуального наблюдения изменения рандомного значения.

Ладно, теперь по коду: начнем с 42 строки, при этом не забываем, что выше объявлены нужные переменные.
1) Если время текущего бара по ТФ Д1 не равно предыдущему значению, т.е., наступил новый день - определим новое рандомное значение, иначе, ничего не делаем.
2) В переменную Random занесем значение полученное с помощью ф-ции MathRand(). Её значение может находится в пределах: от 0 до 32767. Как видим, значение может выходить за пределы заданные в настройках.
3) Если полученное значение меньше за минимально заданное - тогда результат умножим на 10 и будем это повторять до тех пор, пока результат не станет больше за минимально заданное значение - 47 строка кода.
4) Если полученное значение больше макс. заданного: тогда результат делим на 10. Опять таки, будем это делать до тех пор, пока результат не станет меньше макс. заданного. Строка кода 48.
5) Выводим результат в комент только для наглядности.

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

Milord

Местный знаток
судя по Вашим вопросам, знали Вы не много...
я ничего незнаю,иначе бы не задавал такие простые вопросы!
хотел уточнить,чем отличается ваш вариант кода от такого варианта:
if(BarTime!=iTime(NULL,PERIOD_D1,0))
{
BarTime = iTime(NULL,PERIOD_D1,0);
Random = MathRand();

if(Random<min) Random*=10;
if(Random>max) Random/=10;
}
в любом случае спасибо за ответ,пойду писать свой ГРААЛЬ!:)
 
Последнее редактирование:

AlexeyVik

Программист mql4 mql5
- тогда результат умножим на 10 и будем это повторять до тех пор, пока…………………
- тогда результат делим на 10. Опять таки, будем это делать до тех пор, пока………………
Проще говоря, пока не охренеешь…
Проще написать так
Код:
Expand Collapse Copy
if(BarTime!=iTime(NULL,PERIOD_D1,0))
{
BarTime = iTime(NULL,PERIOD_D1,0);
Random = fabs(MathRand()%9); // получим остаток от деления на 9
}
Если задаётся диапазон, то контролировать нужно только минимальное значение. Возможны и другие варианты. К примеру надо получить диапазон 3-12… тут можно получить и меньше 3, и никогда не получишь 12. Тогда включаем соображалку и к результату плюсуем 3… но попадаем и на больше 12… И это не беда, возьмём остаток от деления на 12-3=9+1. Тогда получив 0 результат будет 3 как и задано. Если-же получили 9 результат будет 12 что и требовалось…
 

mobidik

-----
я ничего незнаю,иначе бы не задавал такие простые вопросы!
хотел уточнить,чем отличается ваш вариант кода от такого варианта:
if(BarTime!=iTime(NULL,PERIOD_D1,0))
{
BarTime = iTime(NULL,PERIOD_D1,0);
Random = MathRand();

if(Random<min) Random*=10;
if(Random>max) Random/=10;
}
в любом случае спасибо за ответ,пойду писать свой ГРААЛЬ!:)
Вот смотри, наступил новый день, ф-ция MathRand выдала значение, например 2733, а у тебя задан диапазон от 0 до 9. В твоем варианте выполнится условие: if(Random>max) Random/=10; результат будет 273 - что больше за верхний предел диапазона и это значение таковым и останется - а он тебе нужно? В моем же варианте, благодаря оператору while будет проверка по условию, результат в 2733 будем делить на 10 и так будет до тех пор, пока не попадем в нужный диапазон, получим значение 2.
Проще говоря, пока не охренеешь…
Пока результат не попадет в нужный диапазон, причем, верхняя граница диапазона может быть больше за максимально возможное значение генерируемое ф-цией MathRand, т.е., предложенный вариант подойдет по любой заданный диапазон без всяких танцев с бубном.
Проще написать так
При этом, сам же пишешь, что можно не попасть в заданный диапазон и начинаются танцы с бубном, то прибавить, то включить соображалку...
Так в чем проще то???
 
Верх