Перейти к содержанию

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


Рекомендуемые сообщения

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

эм... я минус не увидел у maxprice. извиняйте за лекцию :-b :-b :-b :)) :)) :))

Изменено пользователем dermitay
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

  • Ответов 6,8k
  • Создано
  • Последний ответ

Популярные авторы

Популярные авторы

Популярные посты

Смотрим видео-уроки, изучаем MQL:       Скачать видеокурс «MQL программирование. Как самому написать форекс советник/ индикатор/ скрипт»   P.S. Тема про Обучение MQ

Перейти

Циклы цикл for Иногда необходимо повторять одно и то же действие несколько раз подряд. Для этого используют циклы. К примеру, мы хотим проанализировать последние 10 баров и выяснить наименьшую цен

Перейти

Речь идет о том, что не будет значимых нововведений. А только баги периодически будут править. А вот все новое мол - в МТ5. Когда они вживую сказали то же самое на конференции в Москве, я уточнил: "То

Перейти
Обучение языку MQL4 под MetaTrader 4 Опубликовано
dermitay, спасибо за оригинальный подход (во всяком случае для меня) для определения точки опоры от нулевого бара:

Цитата

minprice = MarketInfo(Symbol(), MODE_BID);
maxprice = MarketInfo(Symbol(), MODE_BID);

ну или просто

minprice = Bid;
maxprice = Bid;

Ссылка на сообщение
Поделиться на другие сайты

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

В http://tlap.com/forum/ugolok-programmista/13/obuchenie-yazyku-mql4-pod-metatrader-4/4034/?do=findComment&comment=249236 Kroft указал фрагмент с ошибкой, на которую я и указал.

Новый фрагмент кода без этой ошибки Sergey Forex выложил позже - когда на неё указали.

Sergey Forex и Kroft - кто из вас ведет дискуссию?
Обсуждается непонятно чей фрагмент кода...

Kroft, что это?

Цитата

Вот такая вот петрушка, мой бот берет только общую максимальную цену, а максимальную дня не пересчитывает, вроде все по уроку второму сделал. может кто разъяснит ситуацию по второму уроку - обновленному.
Настройки
extern int BarCount = 10;
extern int HourStart = 10;
extern int HourEnd = 23;

void GetMaxPrice()
{
for (int i = 0; i
{
mp = iLow (Symbol(), PERIOD_CURRENT, i);
if (mp > maxprice)
maxprice = mp;
}
return;
}


Вы в цикле обсчитываете 10 баров неизвестно какого ТФ - и не известно в какой момент времени (из фрагмента кода не видно).
Хай какого дня (вчера или текущего) вам надо вы тоже не сообщили.
Если выявление максимума дня (вчерашнего или текущего) выполняется в начале торгов в 10, то после замены mp = iHigh... текущий хай текущего дня вы найти вроде должны - если ТФ н1, конечно.
Если же выявление хая/лоя (текущего?) дня вы выполняете в ходе торгов неоднократно в разное время, то именно на этих жестко заданных вами 10 барах хай текущего и тем более вчерашнего дня быть не обязаны - искомые вами экстремумы дня могли быть раньше последних 10 баров, только которые вы проверяете.

Нет желания подумать и более тщательно сформулировать свой вопрос?

-----

Парни, без обид: но тут не продленка в школе - учителя на зарплате ваши тетрадки проверять не обязаны...
Всё, что здесь делается - бесплатно и в личное время. И по мере возможности - времени и сил.

Если появилась какая-то проблема в освоении языка, первым делом попробуйте сами её понять.
Если не получается понять самому - постарайтесь предельно точно описать свою проблему!

Конечно, никто не запрещает и даже приветствуется то, что вы выкладываете свои наработки - изучать чужой код очень хороший способ самообучения и взаимного обучения.

Но если есть что-то, что непонятно, то старайтесь как можно четче описать/показать что не понимаете или что не так работает.
Очень часто в процессе обдуманного описания проблемы наступает пониманием что сделано не так.
Да и другим будет легче вам помочь, если вы достаточно строго опишете что пытаетесь сделать и что именно не получается. Изменено пользователем Старик
  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

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

Пара советов начинающим:


  • Создавать методы, которые модифицируют какие-то глобальные переменные - это зло в большом кол-ве случаев. Eсли вам нужно получить максимальную цену за период, то данный метод не должен где-то изменять глобальные переменные. Суть совета в том что старайтесь не использовать глобальные переменные. (Привет фортран)

  • При создание метод нужно опираться на то что метод должен делать одну какую-то операцию и эта операция должна максимально отражена в название.

  • Если у вас метод возвращает, что то и у него логичное название это очень хорошо, если внутри этот метода еще где-то проставляется глобальная переменная или метод изменяет что-то во входных параметрах (например если вы передаете класс) - это зло.

  • Если уж начали программировать, то придерживайтесь определенному стилю написания кода это сильно упростит жизнь в будущем. Начните хотя бы с именования (Snake case, Camel case). Тут есть не большое описание по оформлению кода.


Вообще рекомендации можно писать бесконечно.

  • Лайк 3
Ссылка на сообщение
Поделиться на другие сайты

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

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

Ссылка на сообщение
Поделиться на другие сайты

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


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


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

struct data = get_data();
set_data_to_expert(data);
Ссылка на сообщение
Поделиться на другие сайты

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



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


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

struct data = get_data();
set_data_to_expert(data);



ничего не понял. ты хочешь сказать чтобы в сове был только один метод(функция/процедура), работающий с глобальными переменными? в чем суть-то того что ты написал? зачем обязательно данные, которые ты тащишь из/в глобальные переменные запихивать в структуру?
у меня так и сделано, индюк пишет/удаляет/модифицирует , сова только читает. ну и как бы логично что нет двух потоков, одновременно удаляющие переменные(да я бы и рад создать грамотную очередь/стек, да только что-то не встретил понятия распределения доступа к ресурсам на mql4 вобще по сути). так же логично что перед тем как лезть в переменную идут проверки на то есть ли она вобще в текущий момент или нет.


еще вопрос - чем грозит использование структур(с смешанными типами полей, стринг в их числе тоже) как таковых? Изменено пользователем dermitay
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
dermitay Ваш пример с заплатками не совсем корректен - Qj говорил об обычных задачах. Ну и, конечно, не всегда получается следовать этим правилам, особенно если надо по-быстрому что-то сляпать..., для работы с классами нужен плановый подход, детальная проработка алгоритма и т.д.
То что 1 поточный мт4 не располагает к широкому п
Ссылка на сообщение
Поделиться на другие сайты

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

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

Ссылка на сообщение
Поделиться на другие сайты

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


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


я тоже это только недавно увидел, нарадоваться теперь не могу :)) <:-p :x>
а вобще вот почитай, там вобще пробегись по всем разделам, может что новое, полезное и удобное для себя найдёшь.

http://www.metatrader5.com/ru/metaeditor/help/development/debug Изменено пользователем dermitay
Ссылка на сообщение
Поделиться на другие сайты

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

ОК, спасибо!! Сейчас кстати глянул одно из последних видео Сергея, там Play активна :-? :-? - я в синхроне набираю код - ничего подобного, будем разбираться... (как обычно лень победила, поэтому и задал вопрос - так не хотелось самому искать :d)

  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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

Всем привет. Подскажите как записать в код такую команду: если ордер закрылся по ТП - удалить все отложки. Или направьте где можно поискать.

Ссылка на сообщение
Поделиться на другие сайты

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


Всем привет. Подскажите как записать в код такую команду: если ордер закрылся по ТП - удалить все отложки. Или направьте где можно поискать.



логика проста - сначала ищешь ордер в истории закрытых ордеров(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)), потом сравниваешь его OrderClosePrice и OrderTakeProfit(). если между ними разница невелика(ну я к примеру беру не более 10пп по пятизнаку), то вызываешь собственноручно написанную функцию удаления всех отложенных ордеров.

функция тоже проста, перебираешь все ткущие ордера(MODE_TRADES) и удаляешь(OrderDelete) все у которых OrderType()>1.

пример кода:

int ord=OrdersHistoryTotal();
for(int i=ord; i>=0; i--)
{
if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) continue;
if(MathAbs(OrderClosePrice()-OrderTakeProfit()) {
Kill();
}
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void Kill()
{
int ord=OrdersTotal();
for(int i=ord; i>=0; i--)
{
if(!OrderSelect(i,SELECT_BY_POS)) continue;
if(OrderType()>1)
{
int tick=OrderTicket();
if(OrderDelete(tick))
{
Print("yeee!! mutherfucker!!! i kill him!! ",tick);
}
}

}
}
Изменено пользователем dermitay
  • Лайк 4
Ссылка на сообщение
Поделиться на другие сайты

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

Добрый день! Помогите пожалуйста, ищу обычный индикатор Tma.mq4, который используется в 3-ем уроке по обучению программированию.
Сбросьте, пожалуйста, у кого есть.

Ссылка на сообщение
Поделиться на другие сайты

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


Добрый день! Помогите пожалуйста, ищу обычный индикатор Tma.mq4, который используется в 3-ем уроке по обучению программированию.
Сбросьте, пожалуйста, у кого есть.


Индикатор во вложении. Взят из темы ТС Победа. Называется он по другому, но это он и есть.

TMA_with_Distances.mq4

Ссылка на сообщение
Поделиться на другие сайты

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

Спасибо. Но этот индикатор при компилировании в Meta Editor выдает много ошибок и не ставится на график.

Изменено пользователем htp87
Ссылка на сообщение
Поделиться на другие сайты

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

Всем доброго здравия. У меня вот такой вопрос, может кто подскажет. Как в MT4 разрешить открытие ордеров только с одним мэджиком, а с другими запретить без возможности даже открытия?

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Stampo Вы имеете в виду запрет мэджика в терминале? - ни как, а зачем? ордера открывают эксперты или Вы сами - запретите торговать эксперту и всё.
Ссылка на сообщение
Поделиться на другие сайты

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

Вопрос знатокам. уже мозги себе все переломал.

Суть проблемы: сова висит на активном графике, при перекомпиляции сова НЕ деинициализируется и не инициализируется(как должна с деинит резон 2). При вызове свойств совы и нажатии ок - тоже самое, ничего не происходит(а должен быть деинит ризон 5), в логах никаких ошибок нет, при вышеописанных двух действиях(перкомпил кода и смена входных данных) - появляется только строчка с инпутами, без деинит и инит.

нормальный деинит/инит идет только в том случае, если мы сменим таймфрейм(деинит ризон 3).

но и тут лог чист аки слеза младенца - никаких ошибок(никаких абнормалов и таймаутов).

весь код гоняется через EventSetMillisecondTimer - OnTimer.

OnTimer вызывается только в OnInit.

в коде нет ни одного цикла while, все for'ы перепроверил - везде всё ок.

в OnDeinit конечно же убиваю таймер:

void OnDeinit(const int reason)
{
//--- destroy timer

ArrayFree(BD_Signals);
ArrayFree(BD_Orders);
ArrayFree(BD_News);
EventKillTimer();


}


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

Кто сталкивался с таким глюком - подскажите, в чем может быть проблема?

Добавлено: 07-12-2015 08:38:19

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

берем новый код - кидаем на график, после этого заходим в свойства - ничего не меняем нажимаем "ОК" - ничего не происходит, пишет строку только с инпутами. опять заходим в свойства - меняем какой-либо параметр, нажимаем "ОК" - и тут наконец-таки происходит полный круг деинит-инит.

всё равно не пойму, почему тогда в первом случае полный круг происходит всегда? код по сути свой особо ничем не отличается, добавена просто туева хуча математических функций и анализа объектов графика, не более, структура кода-то осталась та же(через таймер) Изменено пользователем dermitay
Ссылка на сообщение
Поделиться на другие сайты

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

Старый и новый код откомпилирован в одной версии мэтаэдитра?

По нормальному деинт-инит по ОК без изменения значений входных параметров не нужен - это явный атавизм.
Может, в последнем эдиторе сделали наконец.

Ссылка на сообщение
Поделиться на другие сайты

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


Старый и новый код откомпилирован в одной версии мэтаэдитра?

По нормальному деинт-инит по ОК без изменения значений входных параметров не нужен - это явный атавизм.
Может, в последнем эдиторе сделали наконец.



сова пишется мной - конечно же, все что я выше написал делал в одном и том же эдиторе. ну по поводу смены входных параметров - соглашусь, ок, аттавизм. но... перекомпил-то не меняет код совы на графике... почему?..

то есть, не особо критично конечно, но стало неудобно. то есть после перекомпиляции надо опять кидать сову на график, чтобы все изменения в коде стали актуальными, так как сова, которая крутится-вертится на графике - это сова со старым кодом(который по факту загружен в ОЗУ получается).
бред бредом блин...

с другой стороны, очень похоже на зацикливание. но тогда бы при смене таймфрейма/закидывании заново совы на график в логах бы выдалось что предыдущий экземпляр совы завершил работу некорректно - но это нет, ошибок нет и при этом всё равно то пишет то не пишет деинит ризон 1(для предыдущего экземпляра, просто пишет что ремувд иногда и всё, никаких деинитов), а должен... Изменено пользователем dermitay
Ссылка на сообщение
Поделиться на другие сайты

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

Добрый день! В домашнем задании к 3-ему уроку не совсем понятно как интегрировать индикатор Stochastic в советник. Какие исходные значения нужно переносить? Какой буфер за какую линию отвечает? По идее, покупка происходит, если синяя линия пересекает снизу вверх красную при значении ниже 20, и соответственно при пересечении синей линии сверху вниз красной выше значения 80 - продажа. Помогите, пожалуйста, разобраться.

Ссылка на сообщение
Поделиться на другие сайты

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


сова пишется мной - конечно же, все что я выше написал делал в одном и том же эдиторе. ну по поводу смены входных параметров - соглашусь, ок, аттавизм. но... перекомпил-то не меняет код совы на графике... почему?..

то есть, не особо критично конечно, но стало неудобно.
то есть после перекомпиляции надо опять кидать сову на график, чтобы все изменения в коде стали актуальными, так как сова, которая крутится-вертится на графике - это сова со старым кодом(который по факту загружен в ОЗУ получается).
бред бредом блин...


А чего перекомпил какого-то кода в какой-то папке должен самостоятельно менять коды/тела/настройки загруженных/активных сов на всех графиках?
Совершенно не вижу оснований для такого беспредела!...

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

Чё-то вы путаете, коллега... :)
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Старик он не путает. такая фича была. перекомпил совы приводил к её переинициализации в терминале. Как в новых билдах не знаю - давно руками перегружаю сову - во избежании недопонимания, так сказать.
  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

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

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Специальное предложение


  • Рекомендуемые брокеры

  • ×
    ×
    • Создать...