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

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


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

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

А вы можете пожалуйста написать этот цикл кодом для Однобуферного ЗигЗага чтоб на выходе я мог получить отдельно все High экстремумы и Low экстремумы за последние 500 баров?

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

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

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

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

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

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

Перейти

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

Перейти

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

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

Минимум 2 экстремума. А вот писать ли масив и нужно ли время экстремума я точно не знаю.
Но конечная задача такова:
1) эксперт должен простраивать уровни (обычные горизнотальные линии или горизонтальные трендовые) по экстремумам ЗигЗага за последние 500 баров.
2) и убирать пробитые уровни (пробитыми считаются если цена пересекла уровень и закрыла за ним подряд 15 свечей)

Это все что мне не хватает для советника и я хотел бы чтоб вы это прописали. И спасибо вам что мне помогаете я чесно не ожидал :)

уровни1.PNG
уров2.PNG

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

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

Уровни надо писать в массив, а потом в цикле по массиву рисовать уровни если прошли проверку на 15 свечей.
Если нужны лучи, то и время экстремума нужно - от него луч рисовать.
Наметим план:
1. нужна структура хранения уровня - цена + время
2. массивы hi & low уровней
3. счётчики найденных уровней
Далее
Объявляем цикл на 500 бар
ищем уровень > 0
определяем hi или low
пишем в нужный массив
увеличиваем соответствующий счётчик
конец цикла
обрезаем по размеру массивы уровней
... завтра будем наполнять
... кстати правило 15 свечей можно проверять на этапе формирования массива уровней

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

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

Доброго времени суток.
Разбил в кровь все кулаки своих извилин)
Есть такой не мало известный индикатор "$hah+"!Написал функцию для него, но хоть убейте не вьеду, почему не работает?
Огромная просьбы подсказать или дать почитать инфу?


//возвращает данные зеленого буфера
double Greens(int shift)
{
double buf = iCustom(NULL, 0, "$hah+", 0, 0, shift);
return(buf);
}
//возвращает данные красного буфера
double Reds(int shift)
{
double buf = iCustom(NULL, 0, "$hah+", 0, 1, shift);
return(buf);
}
//возвращает данные черного буфера
double Blacks(int shift)
{
double buf = iCustom(NULL, 0, "$hah+", 0, 2, shift);
return(buf);
}
bool SellSignal()
{
//если последний столбик красный, а предпоследний зеленый
if(Reds(1)!=0&&Blacks(2)!=0) return(true);

else return (false);
}
bool BuySignal()
{
//если последний столбик зеленый, а предпоследний красный
if(Greens(1)!=0&&Blacks(2)!=0) return(true);

else return (false);
}
Ссылка на сообщение
Поделиться на другие сайты

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

Здравствуйте трейдеры, подскажите, через какую функцию можно брат сигнал стрелочного индикатора, возникшим только над текущим баре? Данный индюк дает стрелку сразу, при возникновении нового бара:

Trend_R1 = iCustom (NULL,0,"Indicators_Down",LevelEn,TradeTer, 1,1); - Сигнал возникшей стрелки при открытии новой свечи:

if (Trend_R1 >= 1 && (Каким должно быть условие? Для того что бы открытие сделки произошло именно на том баре, над которым возник сигнал)
{
if (OrderSend (Symbol(), OP_SELL, Lots_x1, Bid, Slippage, sl_s, tp_s, comment, Magic, 0, clrRed) {
Print ("Ошибка открытия ордер на продажу");
}
}
Заранее Спасибо за ваш ответ.

Безымянный.png

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

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


Здравствуйте трейдеры, подскажите, через какую функцию можно брат сигнал стрелочного индикатора, возникшим только над текущим баре? Данный индюк дает стрелку сразу, при возникновении нового бара:

Trend_R1 = iCustom (NULL,0,"Indicators_Down",LevelEn,TradeTer, 1,1); - Сигнал возникшей стрелки при открытии новой свечи:

if (Trend_R1 >= 1 && (Каким должно быть условие? Для того что бы открытие сделки произошло именно на том баре, над которым возник сигнал)
{
if (OrderSend (Symbol(), OP_SELL, Lots_x1, Bid, Slippage, sl_s, tp_s, comment, Magic, 0, clrRed) {
Print ("Ошибка открытия ордер на продажу");
}
}


Вот так можно
bool TREND ()
{
if(Trend_R1 > 0 &&Trend_R1 != 2147483647.0) return(true);
return(false);
}

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

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

Извините, но, разве bool TREND () не должен находится в глобальной переменной? Я только что вставил этот код в советник и он вывел ошибку 'TREND' - function can be declared only in the global scope



Здравствуйте трейдеры, подскажите, через какую функцию можно брат сигнал стрелочного индикатора, возникшим только над текущим баре? Данный индюк дает стрелку сразу, при возникновении нового бара:

Trend_R1 = iCustom (NULL,0,"Indicators_Down",LevelEn,TradeTer, 1,1); - Сигнал возникшей стрелки при открытии новой свечи:

if (Trend_R1 >= 1 && (Каким должно быть условие? Для того что бы открытие сделки произошло именно на том баре, над которым возник сигнал)
{
if (OrderSend (Symbol(), OP_SELL, Lots_x1, Bid, Slippage, sl_s, tp_s, comment, Magic, 0, clrRed) {
Print ("Ошибка открытия ордер на продажу");
}
}


Вот так можно
bool TREND ()
{
if(Trend_R1 > 0 &&Trend_R1 != 2147483647.0) return(true);
return(false);
}
Ссылка на сообщение
Поделиться на другие сайты

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

Добрый день!
Ситуация следующая: написал советник для МТ4. В работе используются как стандартные так и внешние индикаторы. Скомпилировал, ошибок нет. Запустил тестирование без визуализации. Ошибок тоже нет, но очень медленно тестирует.
Подскажите, есть ли какой-то способ ускорить процесс?

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

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


Извините, но, разве bool TREND () не должен находится в глобальной переменной? Я только что вставил этот код в советник и он вывел ошибку 'TREND' - function can be declared only in the global scope



мм а вы представляете, что такое bool?Почитайте справку сразу поймете или вы просто неправильно записали

if( TREND()==true)
{
ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "Sloper", Magic, 0, Red);
if (ticket > 0)
{
SL = NormalizeDouble(Bid + StopLoss*Point, Digits);
TP = NormalizeDouble(Bid - TakeProfit*Point, Digits);

if (OrderSelect(ticket, SELECT_BY_TICKET))
if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))
Print("Ошибка на продажу");
}
}

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Александр_F речь идёт о функции Trend() - её надо поместить вне функции OnTick()! просто на пустом месте. А использовать так, как в примере d1w4m3.

Подскажите, есть ли какой-то способ ускорить процесс?


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

Evendx интерес к зиг-загу не пропал, будем продолжать?
  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

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

Большое Спасибо за совет, функция работает идеально) (P.S. прикрепляю итог, вдруг кому-то пригодится)

Trend_R0 = iCustom (NULL,0,"Indicators_Down",LevelEn,TradeTer, 1,0);
//+------------------------------------------------------------------+ Lots_x1
if(TREND()==true)
{
if (OrderSend (Symbol(), OP_SELL, Lots, Bid, Slippage, sl, tp, comment, Magic, 0, clrRed) {
Print ("Ошибка открытия ордер на продажу");
}
}
//+------------------------------------------------------------------+
bool TREND ()
{
if(Trend_R0 > 0 && Trend_R0 != 2147483647.0) return(true);
return(false);
}
//+------------------------------------------------------------------+

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

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

Доброго времени суток, я про автоматизированную торговлю бинарными опционами в grand capital, там система процента выигрыша опциона сейчас плавающая, что нельзя не учитывать при автоматизированной торговле, где очень важен манименеджмент, собственно перед отправкой ordersend, логично будет проверять процент прибыльности опциона, но к сожалению этой информации нет в спецификациях контрактов, уважаемые администратор и модераторы сайта tradelikeapro, существует ли способ узнать этот процент из кода советника?
Техподдержка не алё..
Client Support: Какой у вас вопрос?
Я: существует ли способ узнать процент выигрыша опциона из кода советника?
Client Support: К сожалению,не можем ничего вам подсказать по работе советника.

Может есть какие-нибудь идеи по этому поводу?
У них есть спецификация на сайте, может можно как-то спарсить инфу оттуда?

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

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

существует ли способ узнать процент выигрыша опциона из кода советника?

Читайте тему Сайлента - http://tlap.com/forum/strategii-i-indikatory/32/sovetnik-charlie/15737/
Там подробно обсудили способы получения этого процента, а так-же другие важные аспекты торговли советником на БО.
Ссылка на сообщение
Поделиться на другие сайты

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

Всем привет! Подскажите пожалуйста как сделать чтоб советник останавливал свою работу после сообщения что " недостаточно денег открыть следующую сделку." А то он пишет коммент и задерживает оптимизацию.

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
ildarvin попробуйте использовать ExpertRemove. В любом месте программы:
if ( всё_хреново() == true ) ExpertRemove();
по идее вызывает деинициализацию эксперта, т.е. завершает 1 проход оптимизациии.
Сейчас попробовал - из 6 проходов оптимизации делает все, хотя на 4 выходит по ExpertRemove...
Если попробуете - опишите результат, думаю будет интересно. Изменено пользователем 0ll
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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

Всем привет! Подскажите пожалуйста как сделать чтоб советник останавливал свою работу после сообщения что " недостаточно денег открыть следующую сделку." А то он пишет коммент и задерживает оптимизацию.



Пробуйте сделать так: объявить булевую переменную Trade, задать её в значение в OnInit(), а затем, в самом начале ф-ции OnTick() её проверять, вообщем, см. ниже:
bool Trade;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
Trade = true;
------
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//---
if(!Trade) return; // Прописать в самом начале ф-ции.
-----
if(Не денег)
{
Trade = false;
Print("Не достаточно средств.");
}
}
//+------------------------------------------------------------------+
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
mobidik этот вариант прекратит торговлю, но тики будут идти до конца периода оптимизации.
Интересно попробовать именно вариант с ExpertRemove
Ссылка на сообщение
Поделиться на другие сайты

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

Интересно попробовать именно вариант с ExpertRemove


Проверил с ExpertRemove() - работает, оптимизация проходит быстрее, при одиночном прогоне с визуализацией при наступлении события по ExpertRemove(), график дальше не двигается.
  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

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

Приветствую всех!
Подскажите, пожалуйста, что нужно написать в такой ситуации.
У меня открылся ордер по индикаторам(с этим все в порядке).
И если он закрылся по стоплоссу - открывается сразу же ордер в том же направлении,
несмотря на показания индикаторов.
И также со вторым - если закрылся по стоплоссу, открывается третий(последний).

Хотя бы в каком направлении работать....

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

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

Хотя бы в каком направлении работать...

Вам нужно открыть от 1 до 3 ордеров по сигналу индикатора? Здесь одни вопросы: время от сигнала и до открытия последнего ордера имеет значение? если за это время будет новый сигнал в ту-же сторону? или противоположный?
Самый простой случай (это когда всё не важно) :
int countB = 0, countS = 0 ; // счётчики ордеров на Бай и Селл
if ( countB {
if ( Indicatop_Buy() == true ) countB = 1; // =1 - сигнал получен
}
if ( countB > 0 && countB {
int tiket = OrderSend ( NULL, OP_BUY, ... ); // открываем ордер
if ( tiket >= 0 ) { countB++; ..... }
}
else if ( countB > 3 ) countB = 0; // >3 - сбрасываем счётчик в ожидание сигнала индюка

ПС: старайтесь более чётко формулировать вопросы - они после этого сами решаются ;)
Ссылка на сообщение
Поделиться на другие сайты

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

Сформулировал.....не отпали b-)

Только первый открывается по показаниям индикаторов.

Второй - если первый закрылся по стоплоссу.

Третий(последний) - если второй закрылся по стоплоссу.


Добавлено: 15-02-2018 02:53:49

То есть второму ордеру НЕ важны показания индикаторов, сигнал для него - если первый
закрылся по стоплоссу. Если первый ордер закрылся в профите - второй не открывается(если нет новых сигналов от индикаторов).

И также третий ордер - по отношению к второму.

Добавлено: 15-02-2018 03:35:00

Ну и конечно, ордера на покупку независимы от ордеров на продажу.

Добавлено: 15-02-2018 03:59:00

С первыми ордерами мне все понятно, но вот как к ним подключить вторые и третьи.....

Какие функции нужны....И какие сравнения производить(что и с чем). Изменено пользователем feniks78
Ссылка на сообщение
Поделиться на другие сайты

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

Да, забыл проверить на СЛ... вот с проверкой по Бай-стороне (Селл - тоже самое):

пример


int countB = 0, countS = 0, tiket = -1; // это на глобальный уровень

if ( countB {
if ( Indicatop_Buy() == true ) countB = 1; // =1 - сигнал получен
}
if ( countB > 0 && countB {
if ( tiket { int tik = OrderSend ( NULL, OP_BUY, ... ); // открываем ордер
if ( tik >= 0 ) { tiket = tik; countB = 1; ..... }
}
else // ордер есть - следим за закрытием
{
OrderSelect ( tiket, SELECT_BY_TICKET ); // выбираем ордер по сохранённому тикету
if ( OrderCloseTime() > 0 ) // ордер закрыт
{
if ( OrderProfit() { int tik = OrderSend ( NULL, OP_BUY, ... ); // открываем следующий ордер
if ( tik >= 0 ) { tiket = tik; countB++; ..... } // запоминаем тикет и считаем ордера
}
else { tiket = -1; countB = 0; } // закрыт в профите - сбрасываем счётчик
}
}
}
else if ( countB > 3 ) { tiket = -1; countB = 0; } // >3 - сбрасываем счётчик и ожидаем след. сигнала


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

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

Подскажите, пожалуйста, что не так :-s

Спойлер

{
if (curtime == Time[0]) return;
curtime = Time[0];

maxbb = iBands(NULL, 0, Bperiod, Bsdvig, Sdvigoc, PRICE_CLOSE, MODE_UPPER, 1);
minbb = iBands(NULL, 0, Bperiod, Bsdvig, Sdvigoc, PRICE_CLOSE, MODE_LOWER, 2);
maxwpr = iWPR(NULL, 0, WPRperiod, 0);
minwpr = iWPR(NULL, 0, WPRperiod, 1);
maxrsi = iRSI(NULL,0,RSIperiod,PRICE_CLOSE,0);
minrsi = iRSI(NULL, 0, RSIperiod, PRICE_CLOSE, 1);

if (countS
{
if (Ask >= maxbb && maxwpr > WPRmax && maxrsi >= RSImax)countS=1;
}
if(countS>0 && countS {
if(tiket {
tp = NormalizeDouble(Bid - Tprofit_1*Point, 5);
sl = NormalizeDouble(Bid + Sloss_1*Point, 5);
int tik = OrderSend(Symbol(), OP_SELL, 0.01, Bid, Slippage, sl, tp, "", Magic_1, 0, Red);
if(tik>=0)
{tiket = tik;
countS = 1;
}
else
{
if(OrderSelect(tiket, SELECT_BY_TICKET))
if(OrderCloseTime()>0 && OrderProfit() {
tp_1 = NormalizeDouble(Bid - Tprofit_2*Point, 5);
sl_1 = NormalizeDouble(Bid + Sloss_2*Point, 5);
int tik = OrderSend(Symbol(), OP_SELL, 0.02, Bid, Slippage, sl_1, tp_1, "", Magic_1, 0, Red);
if(tik>=0)
{
tiket = tik;
countS++;
}
else
{
tiket = -1;
countS = 0;
}

}
}

}
}
else
if(countS>3)
{
tiket = -1;
countS = 0;
}

if (countB {
if (Bid }
if(countB>0 && countB {
if(tiket {
tp = NormalizeDouble( Ask + Tprofit_1*Point, 5);
sl = NormalizeDouble(Ask- Sloss_1*Point, 5);
int tik = OrderSend(Symbol(), OP_BUY, 0.01, Ask, Slippage, sl, tp, "", Magic_1, 0, Blue);
if(tik>=0)
{
tiket = tik;
countB = 1;
}
else
{
if(OrderSelect(tiket, SELECT_BY_TICKET))
if(OrderCloseTime()>0 && OrderProfit() {
tp_1 = NormalizeDouble(Ask + Tprofit_2*Point, 5);
sl_1 = NormalizeDouble(Ask - Sloss_2*Point, 5);
int tik = OrderSend(Symbol(), OP_SELL, 0.02, Bid, Slippage, sl_1, tp_1, "", Magic_1, 0, Red);
if(tik>=0)
{
tiket = tik;
countB++;
}
else
{
tiket = -1;
countB = 0;
}
}
}
}
}
else
if(countB>3)
{
tiket = -1;
countB = 0;
}
}

//+------------------------------------------------------------------+


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

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

В журнале пишет что-нибудь?
вставь Принт сюда:
if(countS>0 && countS {
Print ( " if(tiketПотом смотри в Журнале как идёт отработка и где затык.
Потом можешь Принт поставить в другое место и с другим текстом

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

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

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

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

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

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

Войти

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

Войти

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


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

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