Доработка ботов (советников, индикаторов)

Статус
Закрыто для дальнейших ответов.

Sergey55555555

Почетный гражданин
Даже поспали :tired:
Для NFP можно формулу написать.
Для остального ничего лучше в голову не приходит, чем завести массив строк-событий halt[] и go[], вручную их проинициализировать.
А что, ньюс-фильтр не умеет читать прошлые события? Это было бы проще всего.

ВТ с ньюс-фильтром происходит неразумно долго,
а оптима будет длиться почти вечность...

К тому же, если настраивать ньюс-фильтр,
то для него это всё события одного уровня важности,
и можно только один раз определить время до (например 1 час)
и время после (1,5 час), на которое блокируется торговля.

А для NFP и ставок это надо делать - 1,5 час до и 2 час после,
для Драги 2-3 часа до и 5-8 часов после, и т.д.
 

Sergey55555555

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

Я попробовал этот вариант
[IMPORTANT]int start()
{
if(Day()==23 && (Hour()==15 && Minute()>=30 ||
Hour()==16 && Minute()<30)) return;[/IMPORTANT]
Компилируется без проблем, а торговлю не запрещает.
 

AlexeyVik

Программист mql4 mql5
Я попробовал этот вариант
[IMPORTANT]int start()
{
if(Day()==23 && (Hour()==15 && Minute()>=30 ||
Hour()==16 && Minute()<30)) return;[/IMPORTANT]
Компилируется без проблем, а торговлю не запрещает.
Вам qqmber ещё вчера на этот вопрос ответил.
Ты сейчас станешь ругаться на метаквотов, но приоритет операции || выше, чем у &&. Скобки придется поставить.
 
  • Like
Реакции: Dom

eevviill

Заблокирован
Уважаемый eevviill, а так же остальные не менее уважаемые мастера своего дела не поможете с таким вот индикатором:
состоит он из трёх частей , но почему то на графике он показывает на то что нужно подправте его пожалуйста,
или посоветуйте такого формата трендовый индикатор?
(на красные вертикалы внимание не обращайте скапировал не убрал) работает на Н1
спасибо!
VQ и Coral
 

AlexeyVik

Программист mql4 mql5
Да, я помнюоО и даже попробовал исправленный вариант,
всё равно не работает.
Просто надо включить логику и заключить в скобки (час и минуту) одного времени и (час и минуту) другого времени.
if(Day()==23 && ((Hour()==15 && Minute()>=30) || (Hour()==16 && Minute()<30)))

ps; А вот зелёненькие стрелки, согласно приоритету && и || можно не ставить. Но если поменяют приоритеты то они будут нужны. Так-что я не вдаваясь в подробности всегда ставлю. На скорость это не влияет.

psps; А посмотрев повнимательней, вижу что логика условия абсолютно неверная.
Если перевести это, то получается так:
если число месяца 23 и (время больше 15:30 или меньше 16:30)
Если тебе надо запретить работу в промежутке 15:30 и 16:30 то знак || надо поменять на знак && и можно убрать все скобки. За исключением относящихся к if()
 
Последнее редактирование:

Sergey55555555

Почетный гражданин
Просто надо включить логику и заключить в скобки (час и минуту) одного времени и (час и минуту) другого времени.
if(Day()==23 && ((Hour()==15 && Minute()>=30) || (Hour()==16 && Minute()<30)))

ps; А вот зелёненькие стрелки, согласно приоритету && и || можно не ставить. Но если поменяют приоритеты то они будут нужны. Так-что я не вдаваясь в подробности всегда ставлю. На скорость это не влияет.

psps; А посмотрев повнимательней, вижу что логика условия абсолютно неверная.
Если перевести это, то получается так:
если число месяца 23 и (время больше 15:30 или меньше 16:30)
Если тебе надо запретить работу в промежутке 15630 и 16:30 то знак || надо поменять на знак && и можно убрать все скобки. За исключением относящихся к if()

Попробовал вот так:
Код:
int start()
  {
  
  if(Day()==23 [COLOR="red"]||[/COLOR] Hour()==1 ||
 Minute()>=00 && Hour()==23 || Minute()<59)
  return;

и так:
Код:
int start()
  {
  
  if(Day()==23 [COLOR="Red"]&&[/COLOR] Hour()==1 || 
Minute()>=00 && Hour()==23 || Minute()<59)
  return;

Не работает.

Как правильно сделать?
 

Sergey55555555

Почетный гражданин
Вот так тоже не получается:
Код:
  if(Day()==23 && Hour()==1 && Minute()>=00 
&& Hour()==23 && Minute()<59)
  return;
 

AlexeyVik

Программист mql4 mql5
Попробовал вот так:
Код:
int start()
  {
  
  if(Day()==23 [COLOR=red]||[/COLOR] Hour()==1 ||
 Minute()>=00 && Hour()==23 || Minute()<59)
  return;
и так:
Код:
int start()
  {
  
  if(Day()==23 [COLOR=Red]&&[/COLOR] Hour()==1 || 
Minute()>=00 && Hour()==23 || Minute()<59)
  return;
Не работает.

Как правильно сделать?
Сергей, надо не просто пробовать, а включить логику и просто написать словами что ты хочешь видеть. Или хотя-бы внимательно читать что тебе пишут
Если тебе надо запретить работу в промежутке 15:30 и 16:30 то знак || надо поменять на знак && и можно убрать все скобки. За исключением относящихся к if()

Тогда это условие будет звучать так:
если число месяца 23 и время больше 15:30 и меньше 16:30
То-есть от 15:30 до 16:30 А время состоит из часа и минуты, т.е Hour() == 15 && Minute() > 30
 

Sergey55555555

Почетный гражданин
Тогда это условие будет звучать так:
если число месяца 23 и время больше 15:30 и меньше 16:30
То-есть от 15:30 до 16:30 А время состоит из часа и минуты, т.е Hour() == 15 && Minute() > 30

Т.е. первое условие - начало паузы будет выглядеть так:
Код:
 if(Day()==23 && Hour()==1 && Minute()>=00

А второе - конец паузы:
Код:
Day()==23 && Hour()==23 && Minute()<59)

?
 

jib07

Местный житель
Попробовал вот так:
Код:
int start()
  {
  
  if(Day()==23 [COLOR="red"]||[/COLOR] Hour()==1 ||
 Minute()>=00 && Hour()==23 || Minute()<59)
  return;

и так:
Код:
int start()
  {
  
  if(Day()==23 [COLOR="Red"]&&[/COLOR] Hour()==1 || 
Minute()>=00 && Hour()==23 || Minute()<59)
  return;

Не работает.

Как правильно сделать?

Может так по-проще будет для понимания))
Код:
if (Day() == 23)                         // условия для дня
  if (Hour() >= 15 && Minute() >= 30)     // условия для старта
    if (Hour() <=16 && Minute() <= 59)    // условия для конца
      return;
return сработает 23 числа с 15.30 до 16.59 включительно))
 

Sergey55555555

Почетный гражданин
Может так по-проще будет для понимания))
Код:
if (Day() == 23)                         // условия для дня
  if (Hour() >= 15 && Minute() >= 30)     // условия для старта
    if (Hour() <=16 && Minute() <= 59)    // условия для конца
      return;
return сработает 23 числа с 15.30 до 16.59 включительно))

Это точно:D
Вроде работает:)
А как сделать переход через сутки и указать месяц?
Т.е.
начало паузы =31 Июля 20-00
конец паузы =01 Августа 01-00
 

jib07

Местный житель
Это точно:D
Вроде работает:)
А как сделать переход через сутки и указать месяц?
Т.е.
начало паузы =31 Июля 20-00
конец паузы =01 Августа 01-00

Если Вам надо чтобы сова не работала только ночью, то все намного проще))

Код:
if (Hour() >= 20 && Minute() >= 0)
    return;
if (Hour() <= 1 && Minute() <= 0)
    return;

Ежедневно с 20.00 по 1.00 сова не будет работать, какая цель то у Вас?

ЗЫ подправил))
 
Последнее редактирование:

Sergey55555555

Почетный гражданин
Если Вам надо чтобы сова не работала только ночью, то все намного проще))

Код:
if (Hour() >= 20 && Minute() >= 0)
  if (Hour() <= 1 && Minute() <= 0)
    return;

Ежедневно с 20.00 по 1.00 сова не будет работать, какая цель то у Вас?

Цель:
- провести оптимизацию с исключением
конкретных событий в указанные дату и время.
 

jib07

Местный житель
Цель:
- провести оптимизацию с исключением
конкретных событий в указанные дату и время.

Через TimeCurrent()
Код:
if (TimeCurrent() > дата1 && TimeCurrent() < дата2)
  return;
дата1 - старт
дата2 - конец

и писать так все даты))) или автоматом из экселя, но гемора больше))

ЗЫ как правильно писать даты надеюсь знаете)))
 

AlexeyVik

Программист mql4 mql5
Это точно:D
Вроде работает:)
А как сделать переход через сутки и указать месяц?
Т.е.
начало паузы =31 Июля 20-00
конец паузы =01 Августа 01-00
По хорошему, не надо усложнять себе жизнь дополнительными параметрами.
В одной из подсказок, кажется тебе здесь, я ссылался на документацию, где говорится, что преобразование строки 15:30 во время даст текущий день. Соответственно StrToTime("15:30"); Будет не что иное как сегодня, или тот день который моделируется в тестере. И всё твоё извращение можно написать так.
Код:
datetime timeStop = StrToTime("15:30");
if(TimeDay(timeStop)  == 23 && TimeCurrent() >= timeStop && TimeCurrent() < timeStop+60*60)
Переводим на русский.
timeStop текущий день, время 15:30
если сегодня 23 число месяца и текущее время больше заданного в переменной timeStop и меньше чем timeStop плюс 60 минут умноженные на 60 для перевода времени в секунды.
Переход от последнего числа месяца к первому числу следующего месяца проходит без проблем. Большую сложность представляет переход с пятницы на понедельник. Тут надо учитывать день недели и соответственно прибавлять 2е суток.
 

AlexeyVik

Программист mql4 mql5
Если Вам надо чтобы сова не работала только ночью, то все намного проще))

Код:
if (Hour() >= 20 && Minute() >= 0)
    return;
if (Hour() <= 1 && [COLOR=Red][B]Minute() <= 0[/B][/COLOR])
    return;
Ежедневно с 20.00 по 1.00 сова не будет работать, какая цель то у Вас?

ЗЫ подправил))
А когда бывает минута меньше нуля?
 

AlexeyVik

Программист mql4 mql5
да косяк, так верней))

Код:
if (Hour() >= 20  || Hour() <= 1)
    return;
c 20 до 1.59))
Да не обращай внимания... Когда пишешь не в едиторе, то таких ошибок можно написать... каких начинающие не пишут.
А исправленный вариант запретит работу с 20 часов до 2х :)

Оо! Я нажал цитирование прямо в момент исправления, и не видел поправку...
 
Последнее редактирование:
Статус
Закрыто для дальнейших ответов.

Отслеживают (859) Посмотреть

Верх