Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 426

 
Boss11:

Доброго времени суток уважаемые форумчане.

Помогите решить следующую задачу:

Нужно в мт4 с помощью mql получить данные тех индикатора,например  МА5 с таймфреймом  1 d, на момент 14.30  позавчерашнего дня.

т.е. если бы я позавчера в 14.30 запустил скрипт с iMA, то вопросов бы не возникло, но как  сегодня их получить.

хотя бы подскажите куда копать

Это очень просто. Для расчета iMA нужно задать 7 параметров. Первый параметр, имя символа, очевиден. В качестве второго, таймфрейм, задайте М1. Третий параметр - период - задайте во столько раз больше требуемого Вам, во сколько день больше минуты. Четвертый параметр - сдвиг = 0. Следующие два параметра - метод усреднения и тип цены - Вы знаете. Последний параметр - номер бара - вычислите, зная требуемое Вам время. Вот и все! Перепроверьте это, сделав расчеты для таймфреймов М5 и М15. Может быть даже для М30.

 
STARIJ:

Это очень просто. Для расчета iMA нужно задать 7 параметров. Первый параметр, имя символа, очевиден. В качестве второго, таймфрейм, задайте М1. Третий параметр - период - задайте во столько раз больше требуемого Вам, во сколько день больше минуты. Четвертый параметр - сдвиг = 0. Следующие два параметра - метод усреднения и тип цены - Вы знаете. Последний параметр - номер бара - вычислите, зная требуемое Вам время. Вот и все! Перепроверьте это, сделав расчеты для таймфреймов М5 и М15. Может быть даже для М30.

К сожалению это как раз то и не просто. Во всяком случае мне это не очевидно.  Если мы возьмем МА5, таймфрейм 1440 (1 день),  выберем бар номер 2 (позавчерашний день), то мы получим показатель МА5 для открытия или закрытия последней свечи, но не момент 14.30. А нужно указать именно его. Еще раз. Тех индикаторы вычисляются из нескольких свечей открываются они в 00.00 (если мы говорим о дне), закрываются 23.59, но последняя свеча (если это 0 бар), не закрыта, а берется для ее вычисления последняя цена 0 бара. Если вы вычисляете МА находясь на нулевом баре, то сложностей не возникнет, а если это не нулевой бар, а середина предыдущего дня, тогда что делать? Как вычеслить для середины предыдущего дня МА с ТФ 1440?

 
Artyom Trishkin:

Огромное спасибо! Буду приступать к написанию кода :) О результатах отпишусь.

 
Boss11:

К сожалению это как раз то и не просто. Во всяком случае мне это не очевидно.  Если мы возьмем МА5, таймфрейм 1440 (1 день),  выберем бар номер 2 (позавчерашний день), то мы получим показатель МА5 для открытия или закрытия последней свечи, но не момент 14.30. А нужно указать именно его. Еще раз. Тех индикаторы вычисляются из нескольких свечей открываются они в 00.00 (если мы говорим о дне), закрываются 23.59, но последняя свеча (если это 0 бар), не закрыта, а берется для ее вычисления последняя цена 0 бара. Если вы вычисляете МА находясь на нулевом баре, то сложностей не возникнет, а если это не нулевой бар, а середина предыдущего дня, тогда что делать? Как вычеслить для середины предыдущего дня МА с ТФ 1440?


Все просто

void OnStart()
  {
// Формируем время  
   Alert("14.30  позавчерашнего дня = ",StrToTime(TimeToStr(iTime(NULL,1440,2),TIME_DATE)+" "+"14:30"));

//14.30  позавчерашнего дня
   datetime time=StrToTime(TimeToStr(iTime(NULL,1440,2),TIME_DATE)+" "+"14:30");

//Бар 14.30  позавчерашнего дня
   int     shift=iBarShift(NULL,0,time);

//Машка 14.30  позавчерашнего дня  
   double ma=iMA(NULL,0,13,0,MODE_SMMA,PRICE_MEDIAN,shift);

   Alert("Машка 14.30  позавчерашнего дня = ",DoubleToString(ma,Digits));
}

Как то так

 

Есть идеи как организовать отправку сигналов по скрипту?

 

нужна помощь знащих  

короч проблема вот в чем,  есть исходник советника  раньше в 2014 году компилировался  и все было хорошо  

решил на днях запилить новый счет    и скомпилировать советника на него,  а оно не хотит компилироваться

выдает 23 вот такие ошибки  ( } ) 

куда копать и что изменилось с 2014 года ?

 
Boss11:

К сожалению это как раз то и не просто. Во всяком случае мне это не очевидно.  Если мы возьмем МА5, таймфрейм 1440 (1 день),  выберем бар номер 2 (позавчерашний день), то мы получим показатель МА5 для открытия или закрытия последней свечи, но не момент 14.30. А нужно указать именно его. Еще раз. Тех индикаторы вычисляются из нескольких свечей открываются они в 00.00 (если мы говорим о дне), закрываются 23.59, но последняя свеча (если это 0 бар), не закрыта, а берется для ее вычисления последняя цена 0 бара. Если вы вычисляете МА находясь на нулевом баре, то сложностей не возникнет, а если это не нулевой бар, а середина предыдущего дня, тогда что делать? Как вычеслить для середины предыдущего дня МА с ТФ 1440?

Это очень просто. Для расчета iMA нужно задать 7 параметров. Первый параметр, имя символа, очевиден. В качестве второго, таймфрейм, задайте М1. Третий параметр - период - задайте во столько раз больше требуемого Вам, во сколько день больше минуты. Четвертый параметр - сдвиг = 0. Следующие два параметра - метод усреднения и тип цены - Вы знаете. Последний параметр - номер бара - вычислите, зная требуемое Вам время. Вот и все! Перепроверьте это, сделав расчеты для таймфреймов М5 и М15. Может быть даже для М30.
 

Здравствуйте. Спасибо STARIJ и Artyom Trishkin за прошлую консультацию. Но так как я всё ещё остаюсь новичком, возникают другие вопросы. Например, следующий. Для открытия в одном баре только одной позиции я использую следующую функцию:

void Fun_New_Bar()                              // Ф-ия обнаружения нового бара   
  {                                             
   static datetime New_Time=0;                  // Время текущего бара  
   New_Bar=false;                               // Нового бара нет  
   if(New_Time!=Time[0])                        // Сравниваем время  
     {  
      New_Time=Time[0];                         // Теперь время такое  
      New_Bar=true;                             // Поймался новый бар  
     }  
  }

И сразу же возникает вопрос: зачем при каждом обращении к функции  статическую переменную отправлять "в начало времён" ? Ведь она при первом обращении и так самостоятельно принимает нулевое значение, а потом пусть себе хранит значение прошлого нулевого бара до следующего обращения, а не сбрасывается до нуля. Наверное можно было бы ещё упростить эту и так простую функцию. Правда сам я опасаюсь её испортить. И ещё вопрос по этой же функции: а не может такого случиться, что выражение New_Time=Time[0]; не поймает ту миллисекунду, когда открылся новый бар? что тогда произойдет?  Спасибо.

 
novichok2018:

Здравствуйте. Спасибо STARIJ и за прошлую консультацию. Но так как я всё ещё остаюсь новичком, возникают другие вопросы. Например, следующий. Для открытия в одном баре только одной позиции я использую следующую функцию:

И сразу же возникает вопрос: зачем при каждом обращении к функции  статическую переменную отправлять "в начало времён" ? Ведь она при первом обращении и так самостоятельно принимает нулевое значение, а потом пусть себе хранит значение прошлого нулевого бара до следующего обращения, а не сбрасывается до нуля. Наверное можно было бы ещё упростить эту и так простую функцию. Правда сам я опасаюсь её испортить. И ещё вопрос по этой же функции: а не может такого случиться, что выражение New_Time=Time[0]; не поймает ту миллисекунду, когда открылся новый бар? что тогда произойдет?  Спасибо.

А вы почитайте сколько раз инициализируется статическая переменная. И вопрос сам отпадёт за его несуразностью ;)
 
novichok2018:

Здравствуйте. Спасибо STARIJ и Artyom Trishkin за прошлую консультацию. Но так как я всё ещё остаюсь новичком, возникают другие вопросы. Например, следующий. Для открытия в одном баре только одной позиции я использую следующую функцию:

И сразу же возникает вопрос: зачем при каждом обращении к функции  статическую переменную отправлять "в начало времён" ? Ведь она при первом обращении и так самостоятельно принимает нулевое значение, а потом пусть себе хранит значение прошлого нулевого бара до следующего обращения, а не сбрасывается до нуля. Наверное можно было бы ещё упростить эту и так простую функцию. Правда сам я опасаюсь её испортить. И ещё вопрос по этой же функции: а не может такого случиться, что выражение New_Time=Time[0]; не поймает ту миллисекунду, когда открылся новый бар? что тогда произойдет?  Спасибо.


По второму вопросу,

если первый тик не поймает,поймает второй.