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

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


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

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

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

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

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

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

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

Перейти

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

Перейти

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

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

Делаю третий урок из видео) советник по ТМА. Переписал как в видео от и до. Но советник теперь открывает ордера на покупку и продажу из любой позиции, из какой он хочет. А не четко от границ канала ТМА

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Deymos надеюсь Вы в курсе, что ТМА перерисовывается? попробуйте заменить на Енвелопс и посмотрите...
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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


возможно вы правы и причина в этом. попробую поэксперементировать с другими индикаторами



Deymos, попробуй вот такой индикатор, если тебе нужен не перерисовывающийся канал
HalfLength - период канала (как MA)
PRICE_MODE - точно не знаю, скорее всего к какой цене применять, можно стандартно, по ценам закрытия, т.е. значение "0"
ATR_PERIOD - Период индикатора ATR, который KC берет для своих расчетов
K - коэффициент для значения ATR

То есть принцип работы такой: берем среднюю цену за N свечей(HalfLength) и строим от нее канал. Границей будет сдвиг от средней цены за N свечей на значение индикатора ATR с периодом (ATR_PERIOD), умноженное на коэф. (K) (вверх и вниз)

Поэкспериментируй, гибкий инструмент достаточно




Добавлено: 15-03-2015 15:06:29


oleguitar переписал для 600 билда. изучай пользуйся.
Добавил дельту (отступ) от графика, а то за стрелками его не видно
+ исправил логику вместо: open1-low1 - close1-low1.



Oll, я тут пытаюсь менять индикатор, в данном случае хочу заложить в него разные свечные паттерны, но вот на графике индикатор ведет себя совсем "не по правилам"
Пытался так же проверять, является ли максимум i-той свечи максимумом за период N свечей, так же неудачно...

В чем ошибка? (хотя бы касательно паттернов)

Спойлер



Спойлер



#property copyright "-"
#property link "-"
#property strict
//---- отрисовка индикатора в главном окне
#property indicator_chart_window
//---- количество индикаторных буфферов
#property indicator_buffers 2
//---- цвета индикатора
#property indicator_color1 Blue
#property indicator_color2 Red
//---- входные параметры индикатора

// input int ma_period = 48;
input int atr_period = 100;
input int bars = 50;

input int delta = 150;

int MA_Slow = 260;
//---- индикаторные буфферы
double buf_1[];
double buf_2[];
//+------------------------------------------------------------------+
//| Функция инициализации, запускается один раз |
//+------------------------------------------------------------------+
int OnInit()
{
//---- 2 индикаторных буффера использованы для счёта
SetIndexBuffer(0, buf_1);
SetIndexBuffer(1, buf_2);
//---- Стиль исполнения графика
//---- DRAW_ARROW - стрелки(символы)
SetIndexStyle (0, DRAW_ARROW, STYLE_SOLID, 2);
SetIndexStyle (1, DRAW_ARROW, STYLE_SOLID, 2);
SetIndexArrow (0, 233);
SetIndexArrow (1, 234);
//---- установка значений индикатора, которые не будут видимы на графике
SetIndexEmptyValue(0,0.0);
SetIndexEmptyValue(1,0.0);
//---- установка номера бара, начиная с которого будет отрисовываться индикатор
SetIndexDrawBegin(0,MA_Slow);
SetIndexDrawBegin(1,MA_Slow);
//---- завершение инициализации
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int OnCalculate ( const int rates_total, const int prev_calculated,
const datetime &time[],const double &open[],const double &high[], const double &low[], const double &close[],
const long &tick_volume[],const long &volume[],const int &spread[])
{
int i = (prev_calculated if (i while(i > 0)
{
//Здесь все расчёты


// double atr = iATR(_Symbol, 0, atr_period, i);

// double highest = iHighest(Symbol(), 0, MODE_HIGH, bars, i-1);
// double lowest = iLowest (Symbol(), 0, MODE_LOW, bars, i-1);

double outside_bar_buy = 0;
double outside_bar_sell = 0;

if(Open[i ]Close[i-1] && High[i ]>High[i-1] && Low[i ]if(Open[i ]>Close[i ] && Open[i-1]High[i-1] && Low[i ]

// if(High[i-1]>highest) condition_highest = 1;
// if(Low[i-1] >lowest) condition_lowest = 1;

buf_2[i ] = outside_bar_sell ==1 ? High[i ] + delta*_Point : 0.0;
buf_1[i ] = outside_bar_buy ==1 ? Low[i ] - delta*_Point : 0.0;
//-----------------
i--;
}



return(rates_total);
}
//+------------------------------------------------------------------+


KC.mq4
KC.ex4

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
oleguitar
1. Это условие: High[i ]>High[i-1] && Low[i ]2. [i-1] этот индекс на 0-баре заглядывает в будущее. Вообще нужно i+1.
3. Если Вы делаете сравнение: outside_bar_sell ==1, а тип double, то может некорректно работать, надо int.
4. Про максимум я не понял, но Вы-то поняли, что в цикле мы проходим от 1-бара до N (в обратную сторону) и даст-ли Вам что-то Ваш максимум при этом? Пробуйте через iHighest.
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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


oleguitar
1. Это условие: High[i ]>High[i-1] && Low[i ]2. [i-1] этот индекс на 0-баре заглядывает в будущее. Вообще нужно i+1.
3. Если Вы делаете сравнение: outside_bar_sell ==1, а тип double, то может некорректно работать, надо int.
4. Про максимум я не понял, но Вы-то поняли, что в цикле мы проходим от 1-бара до N (в обратную сторону) и даст-ли Вам что-то Ваш максимум при этом? Пробуйте через iHighest.



1. Ну да, поглощение же
2. Так вон оно как... попробую
3. Да, по привычке double поставил, а вообще, обычно работает
4. Упростит картину мне. Я же просто тоже индекс брал [i-1], поэтому не работало вероятно

Добавлено: 16-03-2015 09:27:58

Максимум не определяет... даже не знаю прям
Т.е. я понимаю, что это не должно выглядеть как индикатор фракталов, мне просто нужно, чтобы индикатор знал, является ли High текущей свечи максимумом за N баров...

Спойлер



input int bars = 50;

double highest = iHighest(Symbol(), 0, MODE_HIGH, bars, i);
double lowest = iLowest (Symbol(), 0, MODE_LOW, bars, i);

int condition_highest = 0;
int condition_lowest = 0;

if(High[i ]>highest) condition_highest = 1;
if(Low[i ]
buf_2[i ] = condition_highest == 1 ? High[i ] + delta*_Point : 0.0;
buf_1[i ] = condition_lowest == 1 ? Low[i ] - delta*_Point : 0.0;



Спойлер

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
oleguitar Вы хоть справку читали?
int iHighest - Возвращает индекс наибольшего найденного значения (смещение относительно текущего бара) соответствующего графика.
А Вы индекс с ценой сравниваете.
И если Вы сравниваете хай от i бара с хаем нескольких баров начиная с i - нормально ? и хотите чтоб условие выполнилось?

Надо так: int highest = iHighest(Symbol(), 0, MODE_HIGH, bars, i+1);
if(High[i ]>High[highest]) condition_highest = 1;
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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


oleguitar Вы хоть справку читали?
int iHighest - Возвращает индекс наибольшего найденного значения (смещение относительно текущего бара) соответствующего графика.
А Вы индекс с ценой сравниваете.
И если Вы сравниваете хай от i бара с хаем нескольких баров начиная с i - нормально ? и хотите чтоб условие выполнилось?

Надо так: int highest = iHighest(Symbol(), 0, MODE_HIGH, bars, i+1);
if(High[i ]>High[highest]) condition_highest = 1;



Точно, индекс же)
Спасибо, вроде сработало
Ссылка на сообщение
Поделиться на другие сайты

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


Помогите пожалуйста с кодом функции работающий 4 знаком. Суть функции такова.
Чтоб советник открыл сделку на покупку когда цена направляется на вверх на определенный тик без отката (например 4 или 5 пункта без возврата, нужна чтоб можно указать в параметрах) и соответственно на продажу, если цена направляется вниз, и чтоб ордер был только одним т.е. чтоб не открывал пока не закроется другой. И нужно добавить трейлинг стоп в пунктах, чтоб можно было изменить в параметрах. СЛ и ТП думаю добавлю сам как то.

Спасибо!




Был бы рад помочь, но загружен своими задачами выше крыши.

Могу только подсказать.
Там необходимо еще много всяких параметров, т.к. ситуаций много разных:
1. Могут быть безоткатные движения но по малым сдвигам и недалеко, например ночью :
есть движение, но короткое на малых объёмах тиков. Будет ловить лоси. т.к. спреды ночью большие.
2. Могут быть такие движения возле уровней - "тестирование уровня" .
3. Ограничивать (отделять) открытие одного ордера от другого, а то может на одной минуте несколько
ордеров, причем в разные стороны открыть.
ну и т.д.

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

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


Помогите пожалуйста с кодом функции работающий 4 знаком. Суть функции такова.
Чтоб советник открыл сделку на покупку когда цена направляется на вверх на определенный тик без отката (например 4 или 5 пункта без возврата, нужна чтоб можно указать в параметрах) и соответственно на продажу, если цена направляется вниз, и чтоб ордер был только одним т.е. чтоб не открывал пока не закроется другой. И нужно добавить трейлинг стоп в пунктах, чтоб можно было изменить в параметрах. СЛ и ТП думаю добавлю сам как то.

Спасибо!




не совсем понятно намеренье.
Советник просто должен следить за ценой на каждом тике? В чём проблема то? Следи за ценой, а не за свечками Изменено пользователем Pavel888
Ссылка на сообщение
Поделиться на другие сайты

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

Всем доброго времени суток.
У меня проблема с 8 уроком по открытию и модификации ордеров.
В первой части по OrderSendX у меня в новом билде выдает ошибку.
Функцию Start() подставляю в void OnTick() чтобы было похоже на старый билд.
Далее вроде все по видео но выдает ошибку.
Может кто нибудь объяснить, что не так?

Test_8_ошибка.png
Test_8.mq4

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
rva7171, перед последней скобкой, для возобновления общего цикла работы кода, нужно добавить return(0); . Изменено пользователем chistaia-rodina
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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


rva7171, перед последней скобкой, для возобновления общего цикла работы кода, нужно добавить return(0); .



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

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

Всем привет, это мой первый советник, так-что просьба тапки не кидать.
Сов работает, но не так. Помогите понять почему :-/

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

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

Deymos . При компиляции увидел ошибку в твоём коде, пропущено return(0); и скобки фигурные
int init()
{
{
//Проверка брокера на пятизнак
if (Digits ==3 || Digits == 5)
TakeProfit *=10;
StopLoss *=10;
Slippage *=10;
}
return(0);
}


Добавлено: 22-03-2015 14:10:57


Делаю третий урок из видео) советник по ТМА. Переписал как в видео от и до. Но советник теперь открывает ордера на покупку и продажу из любой позиции, из какой он хочет. А не четко от границ канала ТМА



Действительно в уроке Сергей (xbms) в конце упомянул что необходимо в условия добавить ещё индикатор , например RSI. Чтоб убедиться что цена двинулась от границ канала TMA и одновременно из зон перекупленности или перепроданности индикатора RSI. Вот строка кода с условиями как добавить RSI в неё ??? if (Bid >= PriceHight && CountSell() == 0) Где указать что будут использоваться оба индикатора??? Изменено пользователем Гриня
Ссылка на сообщение
Поделиться на другие сайты

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


Действительно в уроке Сергей (xbms) в конце упомянул что необходимо в условия добавить ещё индикатор , например RSI. Чтоб убедиться что цена двинулась от границ канала TMA и одновременно из зон перекупленности или перепроданности индикатора RSI. Вот строка кода с условиями как добавить RSI в неё ??? if (Bid >= PriceHight && CountSell() == 0) Где указать что будут использоваться оба индикатора???

Вам нужно описать РСИ: rsi = iRSI(NULL,0,RSIPeriod,PRICE_CLOSE,1); и в условие на вход дописать:
if (Bid >= PriceHight && rci && CountSell() == 0) ...
Вместо 70 можно писать RSI_Up и вывести его во внешние настройки (вместе с RSI_Down)
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
AVE-Tip сожалею, но код не рабочий. некоторые ошибки:
- что такое просадка ? по балансу, эквити или какого-то ордера? (есть подозрение что эта задача решается проще)
- "Определяет если ордер закрылся по стопу" - для этого достаточно проверить OrderProfit() > 0
- Эту строку: Pros =+ OrderLots()/2; надо писать так Pros += OrderLots()/2; - см. справку.
- заканчивать цикл можно: break; Ваш вариант тоже рабочий.
- Здесь тоже самое: Pros =- Pros / Drob;
- ф-ция CountTrades() будет только в тестере работать. Вы сами её написали или взяли где-то? ужасно кривая.
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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

0ll, большое спасибо >:d1. В данном случае просадка (сумма всех OrderLots()) закрытых по стопу минус отработанная часть.
2. Спасибо, не знал, но и так тоже работает :)
3. Исправил
4. Исправил
5. Исправил
6. Функцию взял в видео уроке ___http://tradelikeapro.ru/category/uroki-po-mql/ (помним первый советник)
Ну и главное (код нерабочий) подправил, суть проблемы изменилась:
Суть ошибки, пока сделки закрываются по стопу, он всё делает правильно, после тейка забывает общую просадку.
Например первую сделку открывает лотом 0.7, при Drob = 1 Удваивает или Drob >1 увеличивает. Но после тейка может открыть сделку лотом 0.01 что меньше стартового лота и забыть весь Pros :(

Всё, разобрался, спасибо :)
Добавил варианты входа, стало семпотнее :d

EURUSD_2014.gif

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

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

1. В данном случае просадка (сумма всех OrderLots()) закрытых по стопу минус отработанная часть.

Вдумайтесь! То что Вы хотите есть в МТ нужно только взять. Например, запоминаем стартовый баланс. На каком-то ордере текущий баланс Потом если текущий > стартового, то стартовый = текущий и так далее.
Ссылка на сообщение
Поделиться на другие сайты

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

Еще раз спасибо!!!
Но... баланс общий для всех инструментов и советников. В любом случае, с ММ вроде ПОКА* разобрался, теперь над более правильными входами сижу.
*ПОКА - Pros придётся потом скорее всего в ini пихать, т.к. это будет мультивалютник с входами от силы валюты и он должен быть общим для всех (что кстати неплохо как вы предлагаете сделать), но опять же другие совы на счету и все пойдет не так. Пока сижу, учусь с ini работать.

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

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

Пока сижу, учусь с ini работать.

С .ini? файлы инициализации виндовс? если да, то как Вы учитесь - чераз АПИ Виндовс или через текстовый файл средствами мкл?
Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
AVE-Tip если Вы раньше занимались программированием - то справитесь. Это (передача через файл) не такая лёгкая задача, например вопросы: как 2 сова узнает, что 1 что-то написала в файл? а если обе совы одновременно захотят что-то написать - что будет?
Если Вы только начинаете программировать, то лучше не тратить на это время. Тем более передать параметры внутри одного терминала можно через глобальные переменные, а если в разных терминалах - скачайте сову копировщик с открытым кодом и смотрите как совы общаются.
Ссылка на сообщение
Поделиться на другие сайты

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

Здравствуйте! Помогите пожалуйста разобраться со вторым уроком: код написал как на видео, только у меня в тестере почему то не работает, а на видео все норм. Ошибка в журнале "OrderSend error 130", и условие "if (_TimeStart == TimeHour(TimeCurrent()) && CountBayLimit () == 0 && CountSellLimit () == 0)" не работает, по моему... Не могу понять из-за чего? Ошибок при компиляции нет...

Тест_3.mq4

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

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

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

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

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

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

Войти

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

Войти

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


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

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