Обучение языку MQL4 под MetaTrader 4📌

От xbms, 13 апреля, 2013 в Уголок Программиста

#2951


Парни, такая проблема... А возможно получить данные с другого периода при тестировании 99.9 в Тикстори? У меня например, при тестировании советника на м15, обычная функция iClose(Symbol(), PERIOD_M1, 1) отдает нули, т.е. с м1 данные не подгружает. Сами понимаете, при тестировании индикаторов и функций с значениями периодов отличными от текущего будут косяки.



Может слишком поздно реагирую, но очень часто встречаю такие стереотипы.
В ТЕСТЕРЕ Все прекрасно работает

и iOpen
и iClose
и iHigh
и iLow
и iTime
и iVolume

В моем примере есть fxt только для М5, а все iOpen.... тянут с М1 и все показывают и 0 баре и на 1 баре.
Источником данных скорее всего являются hst файлы вот они должны быть для всех ТФ.

Hst файлы автоматом должны все делаться, главное галочку в тикстори поставить
Generate HST files - одна галка для всех ТФ сразу.

А вот когда речь идет не о ТЕСТЕРЕ, а о РЕАЛЕ, то тут сбойная iClose..... может дать результат, а может и не дать. И каждый вызов iClose..... надо контролировать на успешность выполнения GetLastError. Вот здесь начинается гемор.

Пример

iOpenW1_0 = iOpen(NULL, PERIOD_W1, 0);

Err_GetLast = GetLastError();

if(iOpenW1_0 == 0 || Err_GetLast != 0)
{
if(Err_GetLast != 4059) //
{
Print(Symbol(), " !!! NEWBAR iOpenW1_0 Err= ", Err_GetLast);

Print(" }

if(!IsTesting() && !IsOptimization() ) return;
}

Постоянным обращением к серверу функция iOpen со временем заставит подкачать нужные данные, но надо ждать и постоянно обращаться.

iClose....png
Folder.png
0_Comment.mq48 скач.

Изменено 28 декабря, 2015 пользователем dzennn2

#2952


На MQL4 , вроде бы, возможно ООП. А как создать свою библиотеку классов, чтобы их можно было потом использовать в своих программах?



Примеры реализации классов на ОПП есть в папке ...MQL4\Include

очень много простых наглядных классов в папке
... MQL4\Include\ChartObjects
#2953

Здравствуйте! Проделал по видео урок по "Классам". Уже несколько раз проверил, ошибок нет, в editore компилит без ошибок и предупреждений, а в тестере стратегий (в журнале выдаёт): invalid pointer access in 'Lesson_Class.mq4' (126,32). Ругается на ES.SignalOpen() и аналогичные в условиях if, в функции void OnTick(). Никто с таким не сталкивался?! Код прилагаю, может кто посмотрит и подскажет:)
Так же, хочу обратиться конкретно к Сергею и предложить рассмотреть тему, следующего характера. Допустим, пишем советник по индикатору, который у нас есть с открытым кодом. Задача: наш советник должен состоять из одного файла, без вспомогательных файлов (файла индикатора). Вопрос: можно ли вписать код индикатора в код советника, чтобы все обращения были внутри одного файла. Спасибо.

Lesson_Class.mq47 скач.

#2954
serpent989, посмотрите. Может, найдете что-то более свежее.
http://articles.mql4.com/ru/309
#2955
Спойлер


Здравствуйте! Проделал по видео урок по "Классам". Уже несколько раз проверил, ошибок нет, в editore компилит без ошибок и предупреждений, а в тестере стратегий (в журнале выдаёт): invalid pointer access in 'Lesson_Class.mq4' (126,32). Ругается на ES.SignalOpen() и аналогичные в условиях if, в функции void OnTick(). Никто с таким не сталкивался?! Код прилагаю, может кто посмотрит и подскажет:)
Так же, хочу обратиться конкретно к Сергею и предложить рассмотреть тему, следующего характера. Допустим, пишем советник по индикатору, который у нас есть с открытым кодом. Задача: наш советник должен состоять из одного файла, без вспомогательных файлов (файла индикатора). Вопрос: можно ли вписать код индикатора в код советника, чтобы все обращения были внутри одного файла. Спасибо.



А может вам надо это-

"Работа с пользовательскими индикаторами, подключенными в качестве ресурсов
Для работы mql4-программ может потребоваться один или несколько пользовательских индикаторов, все они могут быть включены в код исполняемой mql4-программы. Включение индикаторов в качестве ресурсов позволяет упростить распространение программ."

тогда сюда
_http://docs.mql4.com/ru/runtime/resources
#2956

Объясните пожалуйста как тут работает флаг, а точнее обновление котировок происходит с каждым циклом или нет и почему? Я считаю, что обновление происходит на каждом новом цикле, пока if(IsTradeContextBusy())==true

if(IsTradeContextBusy()) // True, если поток для выполнения торговых операций занят
{
Print("Торговый поток занят. Ждем 3 сек...");
Sleep(3000);
Delay=True; // Устанавливаем флаг - в работе цикла была задержка и необходимо обновление котировок
// Значит if(Delay) обновляет котировки
continue; // Уходим на начало цикла
}

if(Delay)// Если во время выполнения цикла была задержка
{
RefreshRates();//Обновляем котировки доступные советнику
Delay=False;//И сбрасываем флаг наличия задержки
}

И верхний код равнозначен этому:

if(IsTradeContextBusy()) // True, если поток для выполнения торговых операций занят
{
Print("Торговый поток занят. Ждем 3 сек...");
Sleep(3000);
RefreshRates();//Обновляем котировки доступные советнику
continue; // Уходим на начало цикла
}

Или я полный ОЛЕНЬ!

Изменено 3 января, 2016 пользователем wawilon

#2957

Играюсь с графическими элементами на графике. К примеру, от экстремумов отложить 200пп и нарисовать прямоугольник. Прикольная штука, чтобы облегчить себе жизнь и не использовать фибо сеткой или трендовой линией как линейкой.

Но, столкнулся с одной проблемой. Хочу отложить значение ATR от хая/лоя. Как узнать значение ATR на том баре, от которого и нужно отложить на расстоянии ATR прямоугольник?

Как определить экстремум среди небольшой "кучи" свечей - это сделано. Но с ATR гемор, т.к. он постоянно меняется.

Я думал iShiftBar и iBars использовать. Но как, хз. В самой iATR есть параметр shift. Вот туда и нужно, я так думаю, задавать смещение, которое и должно указывать на тот самый бар.

#2958

в shift пишите № бара найденного экстремума (из функции iHighest/iLowest)

#2959


Или я полный ОЛЕНЬ!

:d
Где код цикла? или Вы имели ввиду OnTick()?
функция Sleep(3000); - вешает терминал, т.е. пока не пройдёт 3 сек исполнение кода не будет...

Обычно определяют количество попыток коннекта, потом в цикле по количеству попыток отправляют запросы серверу и в зависимости от ошибки или Слип+новая попытка или выход.
#2960



Или я полный ОЛЕНЬ!

:d
Где код цикла? или Вы имели ввиду OnTick()?
функция Sleep(3000); - вешает терминал, т.е. пока не пройдёт 3 сек исполнение кода не будет...

Обычно определяют количество попыток коннекта, потом в цикле по количеству попыток отправляют запросы серверу и в зависимости от ошибки или Слип+новая попытка или выход.


Я просто не весь код отобразил! Да уже разобрались с хозяином этого кода! Спасибо!
#2961

Прошу совета у знающих. Такая ситуация: Пишу советник. Стоит на М30. При пересечении быстрой и медленной машек на текущем баре - сигнал на открытие позиции. Открыли ордер.
И если ордер закрылся на этом же текущем баре, то, т.к. условия на вход еще актуальны, он снова открывает позицию, а цена уже не выгодная.
Как запретить советнику открывать повторный ордер на том же баре?

#2962

Делать проверку на новый бар. Тут в теме была функция от Oll, не так давно, поищите.

#2963

Коллеги, подскажите, пожалуйста, почему для советника компилятор выдает предупреждение "no OnStart function defined in the script"?

#2964
Sergey Forex введите переменную дататайм и присваивайте ей время открытия бара на котором открыли сделку, а потом сравнивайте при следующей попытке открытия. примерно так:

static datetime dt_open = 0;
if ( signal_open() && Time[0] != dt_open )
{
dt_open = Time[0];
SendOrder(...);
}

Arius777 компилятору кажется, что Вы делаете скрипт... Внимательнее посмотрите заголовки.
#2965


Коллеги, подскажите, пожалуйста, почему для советника компилятор выдает предупреждение "no OnStart function defined in the script"?



Наверно Вы используете функцию Start() (которая используется обычно в скриптах) вместо OnTick().
#2966

Это было бы слишком легко, если так. )))
На будущее для новичков - у меня в заголовках стояла директива - #property show inputs, которая работает только для скриптов, поэтому компилятор ищет дальше, где же этот OnStart...
Прошу прощения за такой поспешный вопрос - новичкам это свойственно...))

Изменено 7 января, 2016 пользователем Arius777

#2967

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

Теперь расскажу подробно. Есть у меня советник, купил его за 150 бакинских. Торгует так себе ни в плюс ни в минус, но для адекватной торговли ему надо сделать такие перерывы - три минуты ждет, потом закрыл ордер, открыл новый и снова ждет. Так как разработчик отказался сам добавить такую функцию, думаю как самому это сделать. Думаю вторым советником на втором графике. Только вот не могу найти функции на блокировку выполнений операций и обработку ожидания.

Помогите добить эту тему, уж очень жаль если деньги просто так отдал((

#2968

Блокировать операции другой совы нельзя.
Но можно повесить терминал на 3 сек. после появления нового ордера с помощью Sleep(3000);

#2969

по-моему, это невозможно.

как ты "займешь" торговый поток чтобы на сервер брокера не посылалась ни одна команда OrderSend/Modify/Close/Delete не вмешиваясь в код самого mt4?

Oll, разве Sleep не вешает основной исполняемый код данного советника? причем здесь код другой совы, работающей вобще параллельно?

#2970
Kiman, если бот в mq4, выкладывайте - один хрен реально использовать не можете.
А если программисты отшаманят бота, то может и деньги отобьёте.
Жаться уже смысла нет...
#2971


Kiman, если бот в mq4, выкладывайте - один хрен реально использовать не можете.
А если программисты отшаманят бота, то может и деньги отобьёте.
Жаться уже смысла нет...



В том то и дело, что не в mq4, иначе я бы не стал делать все через вторую сову.

Добавлено: 09-01-2016 20:08:20


по-моему, это невозможно.

как ты "займешь" торговый поток чтобы на сервер брокера не посылалась ни одна команда OrderSend/Modify/Close/Delete не вмешиваясь в код самого mt4?

Oll, разве Sleep не вешает основной исполняемый код данного советника? причем здесь код другой совы, работающей вобще параллельно?



А нельзя ли оборвать или заблокировать соединение с сервером программно?
#2972

Есть тема. Нужно сделать машку со смещением по оси У в процентном отношении и в ту и в другую сторону, должно получиться три машки в виде болинджера...
Есть вот такая хрень, но он по оси У плавает как болинджер, то дальше от средней, то ближе, а надо чтобы не плавал...

Спойлер

#2973

Оборвать соединение можно, но геморрой. все совы в МТ4 работают в одном потоке, когда одна сова спит - спят все.

Изменено 10 января, 2016 пользователем 0ll

#2974


Оборвать соединение можно, но геморрой. все совы в МТ работают в одном потоке, когда одна сова спит - спят все.



то есть если у меня запущено 3 совы в одном терминале и если в одной из них пропишу Sleep(овердохренацифр) то все 3 совы этого терминала будут "спать"? :-o @-) :-o

если это правда то метаквотовцев пора кастрировать за такое

Изменено 9 января, 2016 пользователем dermitay

#2975


Оборвать соединение можно, но геморрой. все совы в МТ работают в одном потоке, когда одна сова спит - спят все.


понял, жаль.

Спасибо всем, кто подсказал.

Добавлено: 09-01-2016 20:41:01


Оборвать соединение можно, но геморрой. все совы в МТ работают в одном потоке, когда одна сова спит - спят все.



Стапэ! Т.е. если я в сове напишу через каждую секунду спать 3 минуты, то первая сова ничего не сможет сделать? Так то что надо же :)

Попробую. Если кому интересно, что за советник, то в лс пишите, а то ведь интеллектуальная собственность, еще покарают за выкладывание.

Изменено 9 января, 2016 пользователем Kiman

Для публикации сообщений создайте учётную запись или авторизуйтесь

Перейти к списку тем
Форум · 2.0.20260627.0025