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

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


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

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



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

Спойлер


if(OrderSelect(HistoryTotal()-1,SELECT_BY_POS,MODE_HISTORY))
{
if (OrderProfit() {
if(OrderSelect(HistoryTotal()-2,SELECT_BY_POS,MODE_HISTORY))
{
if (OrderProfit() {
if(OrderSelect(HistoryTotal()-3,SELECT_BY_POS,MODE_HISTORY))
{
if (OrderProfit() {
if(OrderSelect(HistoryTotal()-4,SELECT_BY_POS,MODE_HISTORY))
{
if (OrderProfit() {
if(OrderSelect(HistoryTotal()-5,SELECT_BY_POS,MODE_HISTORY))
{
if (OrderProfit() {
if(OrderSelect(HistoryTotal()-6,SELECT_BY_POS,MODE_HISTORY))
{
if (OrderProfit() {
if(OrderSelect(HistoryTotal()-7,SELECT_BY_POS,MODE_HISTORY))
{
if (OrderProfit() {
if(OrderSelect(HistoryTotal()-8,SELECT_BY_POS,MODE_HISTORY))
{
if (OrderProfit() {
sell();
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}


Как можно сделать более лаконично?


рекомендую посмотреть урок №2


после просмотра моментально сможете уложиться в 5 строк кода вместо этого монстра... :)

А можете немного намекнуть, какими циклами можно обойтись, что бы решить задачу с минимумом кода? :) for? while? switch?
Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

Перейти

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

Перейти

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

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


А можете немного намекнуть, какими циклами можно обойтись, что бы решить задачу с минимумом кода? :) for? while? switch?



можно использовать for..., а можно и while...
switch - это условный оператор
Ссылка на сообщение
Поделиться на другие сайты

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

Всем начинающим и не очень кодерам привет!
Заинтересовался программингом на mql, дабы проверить некоторые свои идеи, постепенно втягиваюсь в это увлекательное дело:) Отдельное спасибо xbms за уроки, с ними процесс обучения веселее и приятней, а главное понятней!:)

Не пинайте сильно за нубский вопрос, который возможно и был, так как только начинаю осваивать mql.:
Допустим у меня открыты рыночные ордера и sell и buy, их нужно закрыть, когда общий профит этих ордеров выходит в определенный плюс. Если использовать if (AccountProfit() >= Profit) - то закрываемся, сами понимаете, закрытие в реальном рынке будет безумно долго, особенно если ордеров много.
Есть ли какой способ вычислить общий ТП висящих buy и sell ордеров, отталкиваясь от нужного значения в валюте депо, допустим Profit = 5 usd?

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

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


Всем начинающим и не очень кодерам привет!
Заинтересовался программингом на mql, дабы проверить некоторые свои идеи, постепенно втягиваюсь в это увлекательное дело:) Отдельное спасибо xbms за уроки, с ними процесс обучения веселее и приятней, а главное понятней!:)

Не пинайте сильно за нубский вопрос, который возможно и был, так как только начинаю осваивать mql.:
Допустим у меня открыты рыночные ордера и sell и buy, их нужно закрыть, когда общий профит этих ордеров выходит в определенный плюс. Если использовать if (AccountProfit() >= Profit) - то закрываемся, сами понимаете, закрытие в реальном рынке будет безумно долго, особенно если ордеров много.
Есть ли какой способ вычислить общий ТП висящих buy и sell ордеров, отталкиваясь от нужного значения в валюте депо, допустим Profit = 5 usd?



ну это проще простого...
также рекомендую и Вам обратиться к уроку №2 ( в частности циклы :), чтобы просуммировать профит всех ордеров )
ну и дополнительно использовать функцию OrderProfit, чтобы получить профит каждого ордера в отдельности :)

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

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


Будут ещё видео уроки? Хотелось бы видео по написанию индикаторов.



вполне возможно, что ещё будут...
но индикаторов ещё немного не дошли, есть несколько не рассмотренных тем.
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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



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

Спойлер


if(OrderSelect(HistoryTotal()-1,SELECT_BY_POS,MODE_HISTORY))
{
if (OrderProfit() {
if(OrderSelect(HistoryTotal()-2,SELECT_BY_POS,MODE_HISTORY))
{
if (OrderProfit() {
if(OrderSelect(HistoryTotal()-3,SELECT_BY_POS,MODE_HISTORY))
{
if (OrderProfit() {
if(OrderSelect(HistoryTotal()-4,SELECT_BY_POS,MODE_HISTORY))
{
if (OrderProfit() {
if(OrderSelect(HistoryTotal()-5,SELECT_BY_POS,MODE_HISTORY))
{
if (OrderProfit() {
if(OrderSelect(HistoryTotal()-6,SELECT_BY_POS,MODE_HISTORY))
{
if (OrderProfit() {
if(OrderSelect(HistoryTotal()-7,SELECT_BY_POS,MODE_HISTORY))
{
if (OrderProfit() {
if(OrderSelect(HistoryTotal()-8,SELECT_BY_POS,MODE_HISTORY))
{
if (OrderProfit() {
sell();
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}


Как можно сделать более лаконично?


рекомендую посмотреть урок №2

после просмотра моментально сможете уложиться в 5 строк кода вместо этого монстра... :)

Честно, посмотрел несколько раз. Сначала думал, что ситуация с циклом for 1 в 1 как моя, но, так и не хватило ума, как реализовать это в моем случае. Попробовал с циклом while. Вроде бы, все просто и логично, но тоже не работает.
Подскажите, где собака зарыта?
Спойлер


int a=1;
int b=8;

while (OrderProfit()
if(OrderSelect(HistoryTotal()-a,SELECT_BY_POS,MODE_HISTORY))
a ++;
if (a >= b)

sell();

}

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

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

Друзья, помогите найти индикатор ТМА с кодом как в 3ем уроке. У меня все какие то другие. из за этого не могу третий урок сделать.

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

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


Друзья, помогите найти индикатор ТМА с кодом как в 3ем уроке. У меня все какие то другие. из за этого не могу третий урок сделать.



Вроде этот:

Tma.mq4

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

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



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

Спойлер


if(OrderSelect(HistoryTotal()-1,SELECT_BY_POS,MODE_HISTORY))
{
if (OrderProfit() {
if(OrderSelect(HistoryTotal()-2,SELECT_BY_POS,MODE_HISTORY))
{
if (OrderProfit() {
if(OrderSelect(HistoryTotal()-3,SELECT_BY_POS,MODE_HISTORY))
{
if (OrderProfit() {
if(OrderSelect(HistoryTotal()-4,SELECT_BY_POS,MODE_HISTORY))
{
if (OrderProfit() {
if(OrderSelect(HistoryTotal()-5,SELECT_BY_POS,MODE_HISTORY))
{
if (OrderProfit() {
if(OrderSelect(HistoryTotal()-6,SELECT_BY_POS,MODE_HISTORY))
{
if (OrderProfit() {
if(OrderSelect(HistoryTotal()-7,SELECT_BY_POS,MODE_HISTORY))
{
if (OrderProfit() {
if(OrderSelect(HistoryTotal()-8,SELECT_BY_POS,MODE_HISTORY))
{
if (OrderProfit() {
sell();
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}


Как можно сделать более лаконично?


рекомендую посмотреть урок №2

после просмотра моментально сможете уложиться в 5 строк кода вместо этого монстра... :)

Честно, посмотрел несколько раз. Сначала думал, что ситуация с циклом for 1 в 1 как моя, но, так и не хватило ума, как реализовать это в моем случае. Попробовал с циклом while. Вроде бы, все просто и логично, но тоже не работает.
Подскажите, где собака зарыта?
Спойлер


int a=1;
int b=8;

while (OrderProfit()
if(OrderSelect(HistoryTotal()-a,SELECT_BY_POS,MODE_HISTORY))
a ++;
if (a >= b)

sell();

}


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

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

Цитата

while(выражение)
оператор;

Значение выражения определяется до выполнения оператора. Следовательно, если выражение ложно с самого начала, то оператор вообще не выполняется.



Может попробовать сравнить a и b, а не OrderProfit() и 0?
Ссылка на сообщение
Поделиться на другие сайты

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


Честно, посмотрел несколько раз. Сначала думал, что ситуация с циклом for 1 в 1 как моя, но, так и не хватило ума, как реализовать это в моем случае. Попробовал с циклом while. Вроде бы, все просто и логично, но тоже не работает.
Подскажите, где собака зарыта?



Итак, функция для подсчёта суммарного профита в валюте депозита:
//---------------------------------------------------------------------------------------------------------
double CalculateProfit() 
{
double Profit = 0;
for (cnt = OrdersTotal() - 1; cnt >= 0; cnt--)
{
if(OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
if (OrderMagicNumber() == MagicNumber)
if (OrderType() == OP_BUY || OrderType() == OP_SELL) Profit += (OrderProfit() + OrderSwap() + OrderCommission());
}
return (Profit);
}


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

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





Огромное спасибо!


Добавлено: 07-11-2013 03:21:04

А вы, в будущих уроках, планируете рассматривать создание мультивалютных роботов? Изменено пользователем Ricedeni
Ссылка на сообщение
Поделиться на другие сайты

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


Итак, функция для подсчёта суммарного профита в валюте депозита...


- а чем она отличается от AccountProfit()?
Ссылка на сообщение
Поделиться на другие сайты

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



Итак, функция для подсчёта суммарного профита в валюте депозита...


- а чем она отличается от AccountProfit()?

Этой строчкой Profit += (OrderProfit() + OrderSwap() + OrderCommission() и циклом, который выбирает ордера совы.

AccountProfit() - общий профит счёта.

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

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


Всем начинающим и не очень кодерам привет!
Заинтересовался программингом на mql, дабы проверить некоторые свои идеи, постепенно втягиваюсь в это увлекательное дело:) Отдельное спасибо xbms за уроки, с ними процесс обучения веселее и приятней, а главное понятней!:)

Не пинайте сильно за нубский вопрос, который возможно и был, так как только начинаю осваивать mql.:
Допустим у меня открыты рыночные ордера и sell и buy, их нужно закрыть, когда общий профит этих ордеров выходит в определенный плюс. Если использовать if (AccountProfit() >= Profit) - то закрываемся, сами понимаете, закрытие в реальном рынке будет безумно долго, особенно если ордеров много.
Есть ли какой способ вычислить общий ТП висящих buy и sell ордеров, отталкиваясь от нужного значения в валюте депо, допустим Profit = 5 usd?



Если нужно выставить TP у брокера:
1. Фильтр по инструменту (если нужно).
2. Фильтр по магику (если нужно).
3. Вычислить разницу в общих объёмах бай и селл (куда объём больше - туда и будем работать).
4. Посчитать общий безубыток.
5. Перевести наши 5 usd в пункты, относительно разницы объёмов.
6. Посчитать TP = безубыток + посчитанные пункты (учесть спред)
7. Модифицировать ордера.

Если спред плавающий, может вылезти бяка...

mzk_3om6u,
я думал, этой: if (OrderMagicNumber() == MagicNumber)
и мне интересно, учитывает-ли AccountProfit(), своп и комиссию...
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Vorchunozavr , спс, буду пробовать.


и мне интересно, учитывает-ли AccountProfit(), своп и комиссию...



Мне тоже :) Если нет, получается функцию CalculateProfit(), приведенную выше, можно заменить на Profit = AccountProfit() + OrderSwap() + OrderCommission() ?
Ссылка на сообщение
Поделиться на другие сайты

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


Vorchunozavr , спс, буду пробовать.

Мне тоже :) Если нет, получается функцию CalculateProfit(), приведенную выше, можно заменить на Profit = AccountProfit() + OrderSwap() + OrderCommission() ?



Нет, немного не так. OrderSwap() и OrderCommission() нужно вытаскивать из каждого ордера, а это всё-равно функция получается.
Т.е., лучше использовать функцию xbms (и если фильтр по магику не нужен - можно убрать...)

PS. Набросал скрипт, теперь знаю, что AccountProfit() комиссию учитывает. Про своп, буду знать в понедельник.

2013-11-08_133053.png

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

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

Всем добрый вечер!

У меня вопрос(в интернете не нашел ответа), какие отношения у mql4 и .txt?

Задача найти в .txt нужную строчку и её вытащить.
Из функций самая близкая FileReadString(), но она возвращает только первую строчку, как перейти ко второй?
Функция FileSeek() так же передвигает значение по первой строчке.

В общем я в замешательстве. :)

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

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


Всем добрый вечер!

У меня вопрос(в интернете не нашел ответа), какие отношения у mql4 и .txt?

Задача найти в .txt нужную строчку и её вытащить.
Из функций самая близкая FileReadString(), но она возвращает только первую строчку, как перейти ко второй?
Функция FileSeek() так же передвигает значение по первой строчке.

В общем я в замешательстве. :)



А может цикл поможет!

Цитата

while(FileIsEnding(File)==false) //с начала файла
Text =FileReadString(File);
if(FileIsEnding(File)==true) //до конца
break;


а потом может StringSubstr() поможет или StringFind()! Изменено пользователем elruso
Ссылка на сообщение
Поделиться на другие сайты

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

Итак, эксперимент завершён, теперь точно знаю, что AccountProfit(), учитывает и своп и комиссию.

Ricedeni, Вы решили свою задачку с циклом?

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

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

Очень понравился, работает хорошо, прибыль норма, но просадка ну очень до неприличных размеров, по тесту 67%, за 2 недели, 2700 зелени накосил, Но просадка как слон все съела. Пыталась S/L вставить, не слушается, нужно(как я думаю) S/L=6 или 10 поставить. А еще открытые ордера с увел. лотом без стопа и профита, вот и висят. Заранее большое спасибо!

CrazyScalper-full_ver_1.0MM+.mq4
CrazyScalper-full_ver_1.0MM+.ex4

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

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


Очень понравился, работает хорошо, прибыль норма, но просадка ну очень до неприличных размеров, по тесту 67%, за 2 недели, 2700 зелени накосил, Но просадка как слон все съела. Пыталась S/L вставить, не слушается, нужно(как я думаю) S/L=6 или 10 поставить. А еще открытые ордера с увел. лотом без стопа и профита, вот и висят. Заранее большое спасибо!


Вы что, специально зарегистрировались на этом форуме вчера 8 ноября, чтобы вам этот сливатор полечили?! :-? Изменено пользователем FOREX-kun777
Ссылка на сообщение
Поделиться на другие сайты

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


Итак, эксперимент завершён, теперь точно знаю, что AccountProfit(), учитывает и своп и комиссию.

Ricedeni, Вы решили свою задачку с циклом?



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

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

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

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

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

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

Войти

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

Войти

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


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

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