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

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


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

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


mark4431 эта торговая панель по сути - обычный советник, поэтому можно пихать туда всё, что угодно (всё, что понапихано в другие советники).


Ништяк! Спасибо! Буду изучать "работу с кнопками" \M/

Добавлено: 19-08-2015 17:29:46

Пишу сеточник, при выставлении неограниченного числа ордеров, в конце выскакивает ошибка 4107, при этом ордера ставятся как положено и все значения нормализованы, есть предположение, что это из-за границ графика. Подскажите как ограничить выставление отложек макс и мин значениями графика, точнее как получить эти значения, например как с лотом "MarketInfo(Symbol(),MODE_MAXLOT)"? Или может есть другие предположения по данной ошибке?

И еще в журнале периодически бывает "1.#INF" Изменено пользователем mark4431
Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

Перейти

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

Перейти

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

Перейти
Обучение языку MQL4 под MetaTrader 4 Опубликовано
mark4431 это не из-за границ графика. Перед ОрдерСэнд() вставьте принт со всеми параметрами ордера и потом по логам изучайте.
Такого "1.#INF" мне не встречалось...
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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


mark4431 это не из-за границ графика. Перед ОрдерСэнд() вставьте принт со всеми параметрами ордера и потом по логам изучайте.
Такого "1.#INF" мне не встречалось...


Ок. Спасибо, будем разбираться)

Добавлено: 21-08-2015 18:56:50

Ребят, подскажите пожалуйста, как реализовать функцию, чтобы выводилось в журнал последнее максимальное значение AccountProfit(). Т.е. например, было 1000$, открыли сделки, профит вышел к 120и и затем откатил на 105, как реализовать чтобы после n-го условия вышел принт 120. Закрылись-обнулились, открылись-повтор. Изменено пользователем mark4431
Ссылка на сообщение
Поделиться на другие сайты

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

JR, Konstebl, mark4431, 0ll спасибо за коменты (форум живой).
Книгу я читал несколько раз "Учебник по MQL 4" автор Сергей Ковалёв, а так же все найденные в интернете книги, брошюры и видео по данной теме, очень надеялся что видео поможет как нибудь понять что написано в книгах - результат 0. Шуточки что это не мое это не ко мне : ). Точно знаю что перепишу всех программистов но меня этому нужно научить.

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
mark4431 что-то Вы очень простые вещи спрашиваете...
1. введите переменную и в ините или при открытии первого ордера (я не понял Вашего замысла): Мах_Эквити = АккЭквити()
2. если (АккЭквити() > Мах_Эквити) Мах_Эквити = АккЭквити()
Вот у Вас есть мах эквити - делайте что хотите.
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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

Подскажите, как правильно задать выполнение одного из двух условий.


open1 = NormalizeDouble(iOpen(Symbol(), Period(), 1), Digits);
open2 = NormalizeDouble(iOpen(Symbol(), Period(), 2), Digits);
close1 = NormalizeDouble(iClose(Symbol(), Period(), 1), Digits);
close2 = NormalizeDouble(iClose(Symbol(), Period(), 2), Digits);
low1 = NormalizeDouble(iLow(Symbol(), Period(), 1), Digits);
low2 = NormalizeDouble(iLow(Symbol(), Period(), 2), Digits);
high1 = NormalizeDouble(iHigh(Symbol(), Period(), 1), Digits);
high2 = NormalizeDouble(iHigh(Symbol(), Period(), 2), Digits);

if (open2 > close2 && close1 > open1 && open2 > close1 && close2 if (close2 > open2 && open1 > close1 && close2 > open1 && open2

Сравниваю 2 свечи, нужно, чтобы при совпадении одного из If продолжилось выполнение действия. Как я понимаю через || это не сделать
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Rever27 почему через или не сделать? - делай. только 1 и 2 условие: if ( (1) || (2) ) { ... }
Ссылка на сообщение
Поделиться на другие сайты

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


Rever27 почему через или не сделать? - делай. только 1 и 2 условие: if ( (1) || (2) ) { ... }



Вот вчера так и делал - писал предупреждение. Сегодня сделал - все заработало, мистика ))

Народ, возможно, этот вопрос уже задавался тут сто раз, но подскажите сайты, где есть подробные уроки MQL для чайников, без видео, достаточно текста и доступного описания. Пол года назад пытался выучить MQL, так и не вышло, зато взамен выучил VBA для Excel, хоть опыт в программировании получил, теперь попытка №2 )
Ссылка на сообщение
Поделиться на другие сайты

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

Парни, хочу уточнить такой нубский момент:
MarketInfo(Symbol(), MODE_STOPLEVEL) - Минимально допустимый уровень стоп-лосса/тейк-профита в пунктах

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

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

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

Еще вопрос: что за природа ошибки Invalid slippage for OrderSend function? Возникает периодически, непонятно отчего. Slippage у меня в данном случае равен 3п (старыми), тип int.

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

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

Подскажите.
Использую такую конструкцию, чтобы выполнять дальнейшие действия только 1 раз за бар, не мучая Эксперта каждый тик:

if (timeBarInside == iTime(Symbol(),Period(),1)) return;


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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
JR впервые узнал о такой ошибке... понятия не имею что не так...
Rever27 старайся не использовать функции типа iTime(Symbol(),Period(),1), лучше просто Time[1]
функция таймера:

bool f_TimeChange(int dSek)
{
static datetime last_DT;
if (last_DT > TimeCurrent() - dSek) return(false);
last_DT = TimeCurrent(); return(true);
}
Ссылка на сообщение
Поделиться на другие сайты

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


Rever27 старайся не использовать функции типа iTime(Symbol(),Period(),1), лучше просто Time[1]


Кстати, почему?
Ссылка на сообщение
Поделиться на другие сайты

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


Rever27 старайся не использовать функции типа iTime(Symbol(),Period(),1), лучше просто Time[1]
функция таймера:


Сделал, вроде работает )
if (timeBarInside == Time[1]) return;
timeBarInside = Time[1];

Цитата


bool f_TimeChange(int dSek)
{
static datetime last_DT;
if (last_DT > TimeCurrent() - dSek) return(false);
last_DT = TimeCurrent(); return(true);
}


Для самых тугих, можно написать пример запуска этой функции, где dSek указывать? )
Ссылка на сообщение
Поделиться на другие сайты

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



Rever27 старайся не использовать функции типа iTime(Symbol(),Period(),1), лучше просто Time[1]

Кстати, почему?
Как я понял эти функции берут инфу из разных источников. Попадающие в МТ тики формируют свечи текущего ТФ в массиве в оперативке - это Time[х], а потом МТ сбрасывает массивы в базу котировок на диск, а iTime() читает с диска. Всё имхо...

Rever27 то, что Вы сделали будет работать по открытию бара. Моя ф-ция будет работать по секундам. Использовать:
if ( f_TimeChange(10) ) //- для 10 секунд.
{
... код исполняемый 1/10 сек.
} Изменено пользователем 0ll
  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

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

При

timeBarInside == Time[1];
,
если тестируешь с даты самого начала котировок, то терминал выдает критическую ошибку EA, ибо нет бара до текущего. Как я понимаю, я могу и Time[0] писать, разницы то нет, все равно 1 раз в бар будет выполняться действие?
С 10 секундами я погорячился, f_TimeChange(60) работает отлично, чаще и не нужно нагружать терминал. Благодарю
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Rever27 можно Time[0], но в любом случае нельзя тестировать с самого начала котировок - ибо для работы индюков тоже нужна история...
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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

Приветствую! Есть ли такая функция которая позволяет не округлять а отбрасывать часть знаков после запятой? Или есть способ это как то реализовать?

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

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

Есть ли такая функция которая позволяет не округлять а отбрасывать часть знаков после запятой? Или есть способ это как то реализовать?

Правильно сделать так, как написал JR, но можно и так:
double x = 123,456;
int y = (int)x; // результат: y = 123
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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

Хочу еще раз поднять вопрос по ошибке Invalid slippage for OrderSend function, которую отдавал сервер при попытке открыть ордер. Я так и не понял ее природу, а когда я не могу до конца разобраться, я остаюсь неудовлетворен :)
Собственно изначально у меня стоял slippage равный 3 старым пунктам (тип Int), для 5-ти знака шел пересчет с умножением на 10. Ставлю сову на демо счет робофорекса (5-ти знак) - периодически вылазит данная ошибка. Не системно, как попало - то открывает ордера, то нет. Увеличил slippage до 4-х, потом до 5-ти пунктов, не помогло. Я уже даже в поддержку робо написал, может у них ограничения какие - но там отморозились.
Потом поставил slippage обратно в 3п и... убрал умножение на 10 для 5-ти знака. Странно, но с таким параметром пока работает без ошибок, наблюдаю дальше.

Собственно вопрос - а надо ли slippage для 5-ти знака умножать на 10? И какие вообще оптимальные значения для этого параметра и как их вычислять.

З.Ы. В гугле по ошибке Invalid slippage for OrderSend function практически нет результатов, а те что есть - ответа не дают.

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
JR имхо причуды брокера, или что-то с типом/умножением не так... Ваш "тип Int" вместо "тип int" как-то подозрительно выглядит...
Ссылка на сообщение
Поделиться на другие сайты

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


Ваш "тип Int" вместо "тип int" как-то подозрительно выглядит...


Сорри, привычка все писать с заглавной :) Там все просто было:

int Slippage = 3;
if (Digits == 3 || Digits == 5) {
Slippage *= 10;
}

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
JR по коду замечаний нет.
В своих ботах 4-5 знак не перевожу (из принципа - считаю не своим делом), слиппаж у меня почти всегда = 20, на робо счетов нет, ошибок не было...
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

Войти

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

Войти

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


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

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