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

vladradon

Программист
Например. Имеем две ЕМА, одна с периодом 25 вторая 50. Допустим получаем расстояние между ними в 34пп. Как сделать что бы у третьей ЕМА стал период 34, и чтобы период изменялся так как две другие средние постоянно сходятся и расходятся.
Напрямую передать вряд ли получится не влезая в код индюков или не используя доп программы. Простой вариант написать индюк со всеми расчетами типа приложенного (чирканул от нечего делать). Не понял только в чем смысл такого расчета периода машки...
 

Вложения

  • 3MA.mq4
    2,5 КБ · Просмотры: 23

eevviill2

Местный знаток
Здравствуйте. Подскажите как программно установить параметр у индикатора, и/или передать параметр из одного индикатора в другой :)

Например. Имеем две ЕМА, одна с периодом 25 вторая 50. Допустим получаем расстояние между ними в 34пп. Как сделать что бы у третьей ЕМА стал период 34, и чтобы период изменялся так как две другие средние постоянно сходятся и расходятся.
PHP:
double ema3=iMA(Symbol(),PERIOD_CURRENT,MathAbs(ma1_f()-ma2_f()),...);
/////////////////////////
double ma1_f()
{
return(iMA(Symbol(),PERIOD_CURRENT...));
}
double ma2_f()
{
return(iMA(Symbol(),PERIOD_CURRENT...));
}
 

eevviill2

Местный знаток
Напрямую передать вряд ли получится не влезая в код индюков или не используя доп программы. Простой вариант написать индюк со всеми расчетами типа приложенного (чирканул от нечего делать). Не понял только в чем смысл такого расчета периода машки...
:facepalm:
:D:D:D
 

vladradon

Программист
eevviill2, чудик, ты мой код-то видел???:facepalm::laugh:
Твой код индюков на график не выводит! И еще разницу показаний первых 2-х машек нужно разделить на Point, чтобы привести к целому числу и преобразовать в int. ;)
 
Последнее редактирование:

remembaaa

Прохожий
Не понял только в чем смысл такого расчета периода машки...
Так это просто пример. В ответ я хотел получить намек на определенный способ реализации с учетом синтаксиса языка. Смысла в таком алгоритме работы машек нет, ведь если 2 сойдутся в 0, что за 0 период для третьей:D
 

vladradon

Программист
В ответ я хотел получить намек на определенный способ реализации с учетом синтаксиса языка.
Понятно. Если в индюках код открытый, то можно через глобальные переменные терминала передавать любое количество данных: одни индюки записывают в свои переменные данные, конечный их считывает и обрабатывает (набор функций GlobalVariable).
 

seronn

Новичок форума
Кто знает, подскажите, нужна функция, вычисляющая смещение бара по времени текущего дня. Допустим, на М15, текущее время 12:00, нужно смещение бара, открывшегося в 10:00 относительно текущего, т.е. результат должен быть =8.
Время(часы, минуты) - задаются заранее в функции в виде integer двумя отдельными числами.
Делаю так:

MqlDateTime str1;
datetime Now=TimeCurrent();
TimeToStruct(Now,str1);
int hours=str1.hour-HourOpen1;
int minutes=MathAbs(str1.min-MinuteOpen1)/15;
Shift1=4*hours+minutes;

По функции корректно обрабатываются часы, минуты - ни в какую... ( Что не так?
 

vladradon

Программист
Кто знает, подскажите, нужна функция, вычисляющая смещение бара по времени текущего дня. Допустим, на М15, текущее время 12:00, нужно смещение бара, открывшегося в 10:00 относительно текущего, т.е. результат должен быть =8.
Только ограничение при таком расчете в одни сутки - если больше суток, то нужно дату тоже втыкать:
PHP:
  int hours=0;
   int minutes=0;
   MqlDateTime str1;
   datetime Now=TimeCurrent();
   TimeToStruct(Now,str1);
   if(str1.hour>=HourOpen1) hours=(str1.hour-HourOpen1)*4;
     else hours=(24-HourOpen1+str1.hour)*4;
   if(str1.min>=MinuteOpen1) minutes=(int)MathFloor((str1.min-MinuteOpen1)/15);
     else minutes=(int)MathFloor((60-MinuteOpen1+str1.min)/15);
   Shift1=hours+minutes;
Здесь расчет с учетом перехода через полночь.
Еще один вариант попроще:
PHP:
datetime Open1=0;
if(Hour()>=HourOpen1)
 Open1=StrToTime(DoubleToStr(HourOpen1,0)+":"+DoubleToStr(MinuteOpen1,0));
if(Hour()<HourOpen1)
 Open1=StrToTime(DoubleToStr(HourOpen1,0)+":"+DoubleToStr(MinuteOpen1,0))-86400;
 int Shift1=(int)MathFloor((TimeCurrent()-Open1)/900);
В этом варианте можно и сколько угодно суток вычитать, пересчитанных в секунды (86400).
 
Последнее редактирование:

vladradon

Программист
Время(часы, минуты) - задаются заранее в функции в виде integer двумя отдельными числами.
Блин, в первом варианте забыл вычесть час при расчетах минут (-4):
PHP:
int hours=0;
 int minutes=0;
 MqlDateTime str1;
 datetime Now=TimeCurrent();
 TimeToStruct(Now,str1);
 if(str1.hour>=HourOpen1)
  hours=(str1.hour-HourOpen1)*4;
  else hours=(24-HourOpen1+str1.hour)*4;
 if(str1.min>=MinuteOpen1)
  minutes=(int)MathFloor((str1.min-MinuteOpen1)/15);
  else minutes=(int)MathFloor((60-MinuteOpen1+str1.min)/15)-4;
 int Shift1=hours+minutes;
Если текущие минуты меньше заданных.
 

eevviill2

Местный знаток
Кто знает, подскажите, нужна функция, вычисляющая смещение бара по времени текущего дня. Допустим, на М15, текущее время 12:00, нужно смещение бара, открывшегося в 10:00 относительно текущего, т.е. результат должен быть =8.
Время(часы, минуты) - задаются заранее в функции в виде integer двумя отдельными числами.
Делаю так:

MqlDateTime str1;
datetime Now=TimeCurrent();
TimeToStruct(Now,str1);
int hours=str1.hour-HourOpen1;
int minutes=MathAbs(str1.min-MinuteOpen1)/15;
Shift1=4*hours+minutes;

По функции корректно обрабатываются часы, минуты - ни в какую... ( Что не так?
Может минуты нужно разделить на 60 чтобы они стали часами(ну или наоборот)


vladradon:D
PHP:
iBarShift(Symbol(),PERIOD_M15,iTime(Symbol(),PERIOD_D1,0)+10*60*60);
 
Последнее редактирование:

vladradon

Программист
vladradon
PHP код:
iBarShift(Symbol(),PERIOD_M15,iTime(Symbol(),PERIOD_D1,0)+10*60*60);
Ну и в чем разница? Где конечный рез? Всякую хрень пишешь... Я еще с десяток расчетов могу сделать разными способами! А ты уже харе... слазь с грибов. Понимаю, что вам, "героям", тяжко сейчас, но тупизм не заразен в России.
 

eevviill2

Местный знаток
Ну и в чем разница? Где конечный рез? Всякую хрень пишешь... Я еще с десяток расчетов могу сделать разными способами! А ты уже харе... слазь с грибов. Понимаю, что вам, "героям", тяжко сейчас, но тупизм не заразен в России.
Ну да.
Ты всегда вместо 1 строки пишешь 9.
Это просто гениально:D:D:D
 

seronn

Новичок форума
Блин, в первом варианте забыл вычесть час при расчетах минут (-4):
PHP:
int hours=0;
 int minutes=0;
 MqlDateTime str1;
 datetime Now=TimeCurrent();
 TimeToStruct(Now,str1);
 if(str1.hour>=HourOpen1)
  hours=(str1.hour-HourOpen1)*4;
  else hours=(24-HourOpen1+str1.hour)*4;
 if(str1.min>=MinuteOpen1)
  minutes=(int)MathFloor((str1.min-MinuteOpen1)/15);
  else minutes=(int)MathFloor((60-MinuteOpen1+str1.min)/15)-4;
 int Shift1=hours+minutes;
Если текущие минуты меньше заданных.

Попробовал, код ведет себя некорректно. При открытии переменная Shift1 сразу =100 почему-то, независимо от времени искомого бара, дальше каждый бар значение увеличивается на 1, независимо от даты.
 

alexshell

Элитный участник
PHP:
extern datetime время=D'2004.03.21 12:00';
int shift;
void OnTick()
  {
//---
   
 shift=iBarShift(NULL,NULL,время); 
   Comment(shift);
 
  }
Ох как все любят сложные обходные пути. все же просто.
 

Вложения

  • поиск бара.mq4
    3 КБ · Просмотры: 22

seronn

Новичок форума
PHP:
extern datetime время=D'2004.03.21 12:00';
int shift;
void OnTick()
  {
//---
   
 shift=iBarShift(NULL,NULL,время); 
   Comment(shift);
 
  }
Ох как все любят сложные обходные пути. все же просто.

Не совсем так, это для одного конкретного бара, а нужно искать смещение относительно бара, открывающегося в условное время каждый день, вот в чем заковыка. Так то просто, да. )
 

vladradon

Программист
Попробовал, код ведет себя некорректно. При открытии переменная Shift1 сразу =100 почему-то, независимо от времени искомого бара, дальше каждый бар значение увеличивается на 1, независимо от даты.
У меня все правильно работает. Я пробовал на отдельном сове для тестов, который прилагаю. Там интовские переменные времени как внешние задаются. В сове второй вариант заремарен. Если чего-то не получится, стукни мне в скайп и посмотрим код.
 

Вложения

  • 111.mq4
    2,1 КБ · Просмотры: 20
Последнее редактирование:

vladradon

Программист
Ох как все любят сложные обходные пути. все же просто.
У меня первый вариант был такой же и я удалил свое сообщение сразу, поняв, что именно от интовских переменных нужно отталкиваться и преобразовывать их перед расчетом.:)
 

eevviill2

Местный знаток
Если ты код читать умеешь, то должен был видеть, что шифт расчитывает 1 строка, как и у тебя! А все остальные - время! У тебя где время расчитано?;):)
Это 10 часов текущего дня.
PHP:
iTime(Symbol(),PERIOD_D1,0)+10*60*60
Это 8:32 предыдущего.
PHP:
iTime(Symbol(),PERIOD_D1,1)+8*60*60+32*60
:D
 

vladradon

Программист
Это 10 часов текущего дня.
PHP код:
iTime(Symbol(),PERIOD_D1,0)+10*60*60*
Это 8:32 предыдущего.
PHP код:
iTime(Symbol(),PERIOD_D1,1)+8*60*60+32*60
Задача: есть интовские переменные часа и минут и нужно вычислить по ним смещение относительно текущего времени по заданному ТФ. Где ты входные интовские данные задействовал?:laugh:
Вот сделай полный расчет и выложи - посмотрим сколько у тебя строк уйдет.:nda:
 
Последнее редактирование модератором:
Верх