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

Leonup

Новичок форума
Здравствуйте! Начал писать советник, в котором нужно на D1 найти High и Low последнего закрытого месяца.
Воспользовался iHigh(Symbol(),PERIOD_MN1,1), но когда применил Print("High1= ", iHigh(Symbol(),PERIOD_MN1,1)), увидел High1 = 0. Это произошло, видимо, потому что тестер не тестирует советники, использующие период: месяц.
Как тогда найти на D1 High и Low последнего закрытого месяца, чтобы впоследствии можно было протестировать советник?
Спасибо.
 

MrGreen86

Гуру форума
Здравствуйте! Начал писать советник, в котором нужно на D1 найти High и Low последнего закрытого месяца.
Воспользовался iHigh(Symbol(),PERIOD_MN1,1), но когда применил Print("High1= ", iHigh(Symbol(),PERIOD_MN1,1)), увидел High1 = 0. Это произошло, видимо, потому что тестер не тестирует советники, использующие период: месяц.
Как тогда найти на D1 High и Low последнего закрытого месяца, чтобы впоследствии можно было протестировать советник?
Спасибо.
закачайте месячную историю.
 

vladradon

Программист
закачайте месячную историю.
Здравствуйте! Начал писать советник, в котором нужно на D1 найти High и Low последнего закрытого месяца.
Воспользовался iHigh(Symbol(),PERIOD_MN1,1), но когда применил Print("High1= ", iHigh(Symbol(),PERIOD_MN1,1)), увидел High1 = 0. Это произошло, видимо, потому что тестер не тестирует советники, использующие период: месяц.
Как тогда найти на D1 High и Low последнего закрытого месяца, чтобы впоследствии можно было протестировать советник?
Спасибо.

Привет! Сейчас специально прогнал эту строчку в тестере в индюке и в сове на не закачанных парах - у меня на Робофорексе автоматом закачивает историю и в обоих вариантах выдает ненулевое значение и история появляется в архиве. Билд терминала 1170 - ничего особенного.
 

Ugar

Гуру форума
Здравствуйте! Начал писать советник, в котором нужно на D1 найти High и Low последнего закрытого месяца.
Воспользовался iHigh(Symbol(),PERIOD_MN1,1), но когда применил Print("High1= ", iHigh(Symbol(),PERIOD_MN1,1)), увидел High1 = 0. Это произошло, видимо, потому что тестер не тестирует советники, использующие период: месяц.
Как тогда найти на D1 High и Low последнего закрытого месяца, чтобы впоследствии можно было протестировать советник?
Спасибо.
Тестер не тестирует на MN, но имеет доступ к истории. Соответственно, нужно что бы была эта история.
 

Leonup

Новичок форума
Тестер не тестирует на MN, но имеет доступ к истории. Соответственно, нужно что бы была эта история.

Привет! Сейчас специально прогнал эту строчку в тестере в индюке и в сове на не закачанных парах - у меня на Робофорексе автоматом закачивает историю и в обоих вариантах выдает ненулевое значение и история появляется в архиве. Билд терминала 1170 - ничего особенного.

Доступ к истории имеет. Закачал всю историю последовательно от M1 до MN1, брокер Forex4you, билд 1170. Результат тот же. Менять брокера?
 

vladradon

Программист
Доступ к истории имеет. Закачал всю историю последовательно от M1 до MN1, брокер Forex4you, билд 1170. Результат тот же. Менять брокера?
Слушай, вот специально сейчас с сайта Forex4you закачал и установил их терминал и сгенерировал демо счет. Запустил сова на девственно чистом терминале с одной только этой строчкой - все как положено - закачалась история на автомате и пошли ненулевые резы в журнале. Я даже не знаю что можно посоветовать - сложно найти ошибку, если ее нет.:)
 

vladradon

Программист
Менять брокера?
Попробуйте переустановить терминал сначала поверх старого (может просто какой-то файл битый и его достаточно перезаписать), а если не поможет, то полностью удалить терминал и почистить все папки, которые он устанавливал и после этого снова его установить. Сов и индикаторов только не забудьте скопировать перед удалением! ;)
 

Leonup

Новичок форума
Попробуйте переустановить терминал сначала поверх старого (может просто какой-то файл битый и его достаточно перезаписать), а если не поможет, то полностью удалить терминал и почистить все папки, которые он устанавливал и после этого снова его установить. Сов и индикаторов только не забудьте скопировать перед удалением! ;)
Спасибо, попробую.
 

Leonup

Новичок форума
Слушай, вот специально сейчас с сайта Forex4you закачал и установил их терминал и сгенерировал демо счет. Запустил сова на девственно чистом терминале с одной только этой строчкой - все как положено - закачалась история на автомате и пошли ненулевые резы в журнале. Я даже не знаю что можно посоветовать - сложно найти ошибку, если ее нет.:)

Пока я не стал ничего делать с терминалом, а сделал точно так же, как вы. Скачал и установил терминал, сгенерировал демо-счет. Закачал всю историю последовательно от M1 до MN1. Сгенерировал новый советник (шаблон), вставил эту строчку с print-ом, в настройках тестирования выбрал дневной период. Ничего не получается, результат тот же. Какая-то мистика… Кстати, если в коде поменять PERIOD_MN1 на PERIOD_W1, результат тот же. А вот если поставить там PERIOD_D1, а в настройках тестирования выбрать период ниже дневного, то работает как надо.

И тут я наткнулся на зарубежный форум _ , посвященный этой теме. Там приводится код. Если можете, подскажите, пожалуйста, как этот код вставить в советник. По существу в советнике пока ничего нет, там две строчки только: iHigh да iLow. Начав писать советник, сразу столкнулся с данной проблемой.
 
Последнее редактирование модератором:

Ugar

Гуру форума
Здравствуйте! Начал писать советник, в котором нужно на D1 найти High и Low последнего закрытого месяца.
Воспользовался iHigh(Symbol(),PERIOD_MN1,1), но когда применил Print("High1= ", iHigh(Symbol(),PERIOD_MN1,1)), увидел High1 = 0. Это произошло, видимо, потому что тестер не тестирует советники, использующие период: месяц.
Как тогда найти на D1 High и Low последнего закрытого месяца, чтобы впоследствии можно было протестировать советник?
Спасибо.
Вставил в советник строчку Print("High1= ", iHigh(Symbol(),PERIOD_MN1,1));
Вот что в журнале при тестировании
0 01:41:50.602 2018.03.27 00:00:00 temp EURUSD,H1: High1= 1.25553
0 01:41:50.602 2018.03.27 01:00:00 temp EURUSD,H1: High1= 1.25553
0 01:41:50.602 2018.03.27 02:00:00 temp EURUSD,H1: High1= 1.25553
0 01:41:50.602 2018.03.27 03:00:00 temp EURUSD,H1: High1= 1.25553
..,
 

MrGreen86

Гуру форума
И тут я наткнулся на зарубежный форум _ , посвященный этой теме. Там приводится код. Если можете, подскажите, пожалуйста, как этот код вставить в советник. По существу в советнике пока ничего нет, там две строчки только: iHigh да iLow. Начав писать советник, сразу столкнулся с данной проблемой.
Там предлагается получить доступ к данным через структуры. Но с учетом специфики вашей ошибки, шансы на то что это поможет крайне малы. Тем не менее вот как это использовать:
MqlRates rates[]; // создаем струткру MqlRates
int copy_rates = CopyRates(_Symbol,PERIOD_MN1,1,1,rates);
if(copy_rates<=1) {
Print("Ошибка получение данных");
}else{
Print(DoubleToString(rates[0].high,_Digits));
}
 
Последнее редактирование модератором:

Leonup

Новичок форума
Там предлагается получить доступ к данным через структуры. Но с учетом специфики вашей ошибки, шансы на то что это поможет крайне малы.
Вы правы:
2019.06.24 07:59:51.923 2016.01.05 00:00:00 proverka EURUSD,Daily: Ошибка получение данных
(Хотелось бы знать причину специфичности этой ошибки, но…).
Можно, наверно, пойти по другому пути. Но для этого нужно знать номер бара открытия текущего месяца. А как это определить, пока не знаю. Может быть, вы поможете. Спасибо.
 

MrGreen86

Гуру форума
Вы правы:
2019.06.24 07:59:51.923 2016.01.05 00:00:00 proverka EURUSD,Daily: Ошибка получение данных
(Хотелось бы знать причину специфичности этой ошибки, но…).
Можно, наверно, пойти по другому пути. Но для этого нужно знать номер бара открытия текущего месяца. А как это определить, пока не знаю. Может быть, вы поможете. Спасибо.
номер бара открытия текущего месяца всегда 0.
Сделайте так:
Print("Ошибка получение данных "+(string)GetLastError());
будет написан код ошибки, можно будет копать дальше.

И я ошибся в этой строке:
if(copy_rates<=1) {
нужно )
if(copy_rates<=0) {
 

vladradon

Программист
Вы правы:
2019.06.24 07:59:51.923 2016.01.05 00:00:00 proverka EURUSD,Daily: Ошибка получение данных
(Хотелось бы знать причину специфичности этой ошибки, но…).
Можно, наверно, пойти по другому пути. Но для этого нужно знать номер бара открытия текущего месяца. А как это определить, пока не знаю. Может быть, вы поможете. Спасибо.
Там в коде MrGreen опечатка: в строке if(copy_rates<=1) нужно убрать знак равно, иначе всегда будет принтовать ошибку получения данных.
 

vladradon

Программист
Можно, наверно, пойти по другому пути. Но для этого нужно знать номер бара открытия текущего месяца. А как это определить, пока не знаю. Может быть, вы поможете. Спасибо.
Я тут поизвращался с расчетам по дневным барам. Попробуйте такой вариант:
SQL:
   MqlDateTime str1;
   MqlRates rates[];
   int copy_rates=0;
   bool begin=false;
   double High1=0.0;
   double Low1=10000.0;
   int day=32;

   for(int r=0; r<=62; r++)
     {
      copy_rates=CopyRates(_Symbol,PERIOD_D1,r,1,rates);
      if(copy_rates<1) {Print("Ошибка копирования данных"); break;}
      TimeToStruct(rates[0].time,str1);
      if(day>str1.day && !begin) {day=str1.day; continue;}
      else begin=true;
      if(begin)
        {
         if(High1<rates[0].high) High1=rates[0].high;
         if(Low1>rates[0].low) Low1=rates[0].low;
         if(str1.day==1) {begin=false; break;}
        }
     }
   Print("High= ",iHigh(_Symbol,PERIOD_MN1,1));
   Print("High1=",High1);
   Print("Low= ",iLow(_Symbol,PERIOD_MN1,1));
   Print("Low1=",Low1);
Тут в конце выводятся оба варианта принтами. На скрине я показал рез.
 

Вложения

  • TestHigh_Low.png
    TestHigh_Low.png
    14,2 КБ · Просмотры: 9

Leonup

Новичок форума
нужно )
if(copy_rates<=0) {

Я тут поизвращался с расчетам по дневным барам. Попробуйте такой вариант:

Спасибо вам за помощь.
Начал пока с
if(copy_rates<=0)
Ошибка такая: 4074 ERR_NO_MEMORY_FOR_HISTORY Не хватает памяти для исторических данных
Но как ее исправить, пока не знаю.
 

Ugar

Гуру форума
Спасибо вам за помощь.
Начал пока с
if(copy_rates<=0)
Ошибка такая: 4074 ERR_NO_MEMORY_FOR_HISTORY Не хватает памяти для исторических данных
Но как ее исправить, пока не знаю.
Места сколько на том диске где стоит терминал? Если мало, надо почистить от мусора или увеличить объём диска.
 

BorisSedov

Активный участник
Начинающим очень полезно прочитать и понять следующие разделы Справочника MQL4.
В редакторе "MetaEditor 4" - Меню - Справка - Справочник MQL4

  • Основы языка
    • Типы данных
      • Целые типы
        • Типы char, short, int и long
        • Тип datetime
        • Тип bool
      • Вещественные типы (double, float)
      • Тип string
    • Операции и выражения
      • Выражения
      • Арифметические операции
      • Операции присваивания (до выражения y %= x; включительно)
      • Операции отношения
      • Логические операции
    • Операторы
      • Условный оператор if-else
      • Оператор-переключатель switch
      • Оператор цикла while
      • Оператор цикла for
      • Оператор завершения break
      • Оператор продолжения continue

Это минимум теории, необходимый для уверенного программирования в процедурном стиле. Понимая эти основы, можно с легкостью создавать собственные советники, индикаторы и скрипты.
 

BorisSedov

Активный участник
Есть скрипт, в котором переменной присваивается значение. Далее значение переменной выводится при помощи функции Print.
Почему-то значение выводится с ошибкой, вместо 0.5 выводится 0.0.
Нужно исправить эту ошибку, понять и объяснить почему так происходит.
 

Вложения

  • MQL4-test-1.mq4
    936 байт · Просмотры: 9
Верх