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

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


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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Александр_F в Вашем коде есть сомнительные строки, например:
if(OrderOpenPrice()что содержится в переменной BULevel? В Bid реальная цена как её можно умножать на Point?
Я бы сделал так (если в BULevel кол-во пипс):
if(OrderOpenPrice()
Добавлено: 01-08-2017 05:57:30

Alex Fato стрелочные индикаторы отличаются от обычных только типом буфера, так что Вам нужно с обычных индикаторов начинать, а как только научитесь Вам уже стрелочные нафиг не нужны будут... :d Изменено пользователем 0ll
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

Перейти

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

Перейти

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

Перейти
Обучение языку MQL4 под MetaTrader 4 Опубликовано
Alex Fato стрелочные индикаторы отличаются от обычных только типом буфера, так что Вам нужно с обычных индикаторов начинать, а как только научитесь Вам уже стрелочные нафиг не нужны будут... :d

Да согласен, и некоторые я уже писал.
Но сейчас, задача состоит в том что нужно 2 индикатора объединить в одну стрелку.
К примеру когда свеча заходит за Болиджер и за уровень стохастика, скрин ниже.
Можешь как то мне помочь с этим или посоветовать того кто поможет?

5Zk8Fjc0Dfg.jpg

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

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

Но сейчас, задача состоит в том что нужно 2 индикатора объединить в одну стрелку.
К примеру когда свеча заходит за Болиджер и за уровень стохастика, скрин ниже.
Можешь как то мне помочь с этим или посоветовать того кто поможет?

Ну делай, я помогу (советом). Возьми боллинжер (3 буфера) делай их невидимыми, добавь буфер стоха и 2 стрелочных буфера .
Ссылка на сообщение
Поделиться на другие сайты

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


Ну делай, я помогу (советом). Возьми боллинжер (3 буфера) делай их невидимыми, добавь буфер стоха и 2 стрелочных буфера .


Первая версия готова, сейчас придумаю как отфильтровать стохастиком.
_http://fxpics.ru/image/5I25w
Думал будет сложнее.
Код скидать файлом или копировать и как текст?

90_BB.mq4

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

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

Можно и под спойлером - для оперативности
Только шаблон старый - возьми посвежее для 600+ билдов.

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

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


izeran6565, а ничего, что оптить со спрэдами на шару вы сможете года через 3 - после того, как лично соберете реальные котиры всех нужных вам пар на всех нужных вам брокерах?!
А ближайшие пару лет опту/тестам ни-ни?!
При том, что за 3 года круглосуточной включенности для сбора котиров ваша коллекция старых ноутбуков как раз Богу душу и отдаст!
И даже после этого вы не сможете тестить всех ботов, в код которых нельзя будет воткнуть понимание этой приблуды.

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

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




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

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


Можно и под спойлером - для оперативности
Только шаблон старый - возьми посвежее для 600+ билдов.



Шаблон новый нашел и не один, теперь у меня 4 шаблона.
Такой вопрос на видеокурсе был рассмотрен самый простой индикатор
Тот же что и здесь _https://book.mql4.com/ru/samples/icustom
При смене параметров BufferH = High[i+1];
Линия сдвигается в право. Скрин внизу
Почему при BufferH = High[i-1]; Индикатор пропадает?


#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 clrRed
#property indicator_width1 1
#property indicator_style1 0

#property indicator_color2 clrLime
#property indicator_width2 1
#property indicator_style2 0

double BufferH[];
double BufferL[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
SetIndexBuffer(0, BufferH);
SetIndexStyle(0, DRAW_LINE);
SetIndexBuffer(1, BufferL);
SetIndexStyle(1, DRAW_LINE);

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[])
{
for (int i=0; i {
BufferH = High[i-1];
BufferL = Low;
}
return(rates_total);
}
//+------------------------------------------------------------------+

5Zk8Fjc0Dfg.jpg
GBPUSDH1.png

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

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

Вы не указали индекс у буферов (BufferH[?], Low[?]) + возможно и при High[-1] выбивает по ошибке.
цикл желательно использовать по другому, чтоб на каждом тике не перебирать все бары истории
попробуй напиши так:
{
i = rates_total - prev_calculated - 1; if (i while( i > 0 ) // отсекаем тики 0-бара
{
BufferH[ i ] = High[ i-1 ];
BufferL[ i ] = Low [ i ];
}
return(rates_total);
}

ПС: возможно насчёт индексов я не прав - форум не пропускает конструкцию [ i ] без пробелов... ;)

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

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


Вы не указали индекс у буферов (BufferH[?], Low[?]) + возможно и при High[-1] выбивает по ошибке.
цикл желательно использовать по другому, чтоб на каждом тике не перебирать все бары истории
попробуй напиши так:
{
i = rates_total - prev_calculated - 1; if (i while( i > 0 ) // отсекаем тики 0-бара
{
BufferH[ i ] = High[ i-1 ];
BufferL[ i ] = Low [ i ];
}
return(rates_total);
}

ПС: возможно насчёт индексов я не прав - форум не пропускает конструкцию [ i ] без пробелов... ;)



Терминал зависает сразу же только индикатор ставлю
Индикаторы с условием i-1 вообще реально писать? или можно только +1 Изменено пользователем Alex Fato
Ссылка на сообщение
Поделиться на другие сайты

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

Индикаторы с условием i-1 вообще реально писать? или можно только +1

Реально, но надо аккуратно. Вы поясните задачу, для чего это? писать в текущий буфер значение из "будущего".
Ссылка на сообщение
Поделиться на другие сайты

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


Индикаторы с условием i-1 вообще реально писать? или можно только +1

Реально, но надо аккуратно. Вы поясните задачу, для чего это? писать в текущий буфер значение из "будущего".

Да, счас все объясню.
Скидываю все четыре шаблона
в них прописано условие точки входа, которая дает 90%
if(High > BB_SELL_1 &&
Close >= Close[i-1] &&
Close > Open
)
и если удалить Close >= Close[i-1] то все 4 шаблона работают, но тогда нет точки входа
если добавить то в тестере ничего не работает, а на графике работает только на истории, а на появляющихся барах пусто.
1. И я так понимаю или можно как то сделать что б индикатор работал с этой точкой входа.
2. Или это иллюзия и работать будет только на истории, где уже есть "будущий бар", и мне нужно искать другую точку входа.
90 ВВ ver 5.0 это тот же старый шаблон
остальные новые какой лучше не знаю еще.

90_BB_ver_5.0.mq4
arrows_90_PRO.mq4
iTest3.mq4
lreversenenveloper_90.mq4

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

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

Понятно. Нужно сделать чтоб [ i - 1 ] всегда было >= 1, ноль уже не подойдёт, т.к. клоуз[0] постоянно меняется.
Давай пробовать. Кстати нашёл ошибку в своём посте - забыл i-- в цикле While.
Написал индюка, пробуй, проверь код - может чего недопонял...

ПС: в твоём новом шаблоне много хрени, похоже автор шаблона не совсем понял принцип работы индюка.
ППС: алерты не смотрел, но на 1 баре работать не будут - только на 2-ом.

BB_signal_90.mq4

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

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


Понятно. Нужно сделать чтоб [ i - 1 ] всегда было >= 1, ноль уже не подойдёт, т.к. клоуз[0] постоянно меняется.
Давай пробовать. Кстати нашёл ошибку в своём посте - забыл i-- в цикле While.
Написал индюка, пробуй, проверь код - может чего недопонял...

ПС: в твоём новом шаблоне много хрени, похоже автор шаблона не совсем понял принцип работы индюка.
ППС: алерты не смотрел, но на 1 баре работать не будут - только на 2-ом.


Алерты то уже потом, когда со стелкой все хорошо будет.
По тестил в тестере бары идут сигналы появляются, почитал код превосходно, я не знал что можно так цикл писать и про i-- тоже не знал.
Но на тесте в меленом режиме заметил такую не приятною особенность
Сигнальная стрелка появляется когда бар 1 закрывается, а нужно по закрытию бара 2.(скрин номеров бара внизу.)
Я попробую за ночь что то сделать, и завтра буду пробовать.
Возможно ли как то ранее получить сигнал?

Бар01.png

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

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

Возможно ли как то ранее получить сигнал?

:) По Вашим условиям можно только стрелочку перенести со 2-го бара на 1-ый. Но имей в виду - момент появления стрелки изменить нельзя...
Ссылка на сообщение
Поделиться на другие сайты

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

Добрый день.

При написании советника столкнулся с проблемой выставления отложенных ордеров BUY_STOP и SELL_STOP.
Создание ордеров выполняется строкой (на примере покупки)
Ticket = OrderSend(Symbol (),OP_BUYSTOP,Lot,(High[1]+150),0,0,0,"Comment ",1111,0, Blue);
Результатом выполнения строки является ошибка 130.
Та же самая строка, выполненная из скрипта прекрасно работает.

Ticket - объявлена
переменная Lot фиксирована и =0,1
выражение (High[1]+150) также может быть заменена на переменную, но результат остается тот же.
пробовал SL и TP задавать =0, а также конечным числом (в том числе и расчетной переменной) - результат тот же

При этом, если OP=BUYSTOP заменить на OP_BUY все работает.

В чем может быть проблема? Что я не учел?
Заранее спасибо

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

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

При написании советника столкнулся с проблемой выставления отложенных ордеров BUY_STOP и SELL_STOP.

В скрипте открывает? и цена не смущает?
надо High[1] + 150 *_Point

PS: Если будете сталкиваться с ошибками, сначала Print-ом выводите все данные по ордеру и смотрите что реально отправляется в функцию OrderSend. Такие ошибки реально найти самому без обращений на форумы, имхо.
Ссылка на сообщение
Поделиться на другие сайты

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


Возможно ли как то ранее получить сигнал?

:) По Вашим условиям можно только стрелочку перенести со 2-го бара на 1-ый. Но имей в виду - момент появления стрелки изменить нельзя...

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

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

Подскажите, как получить номер бара и цены Open Close High Low этого бара по клику на графике?

void OnChartEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
{
if(id==CHARTEVENT_CLICK) {

int lparamToBarNumber;

Print(lparamToBarNumber);
}
}

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

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

А как правильно перенести стрелку, что б по закрытию свечи 1 над этой свечой появлялась стрелка?

2 пути: писать в i-1 буфер или переделать условия с точки зрения 1 бара (что правильней). Думаю Вам под силу самому пробовать.
Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

нужно чтобы отложенный ордер был отменен, если цена опустится ниже минимума предыдущей свечи.

if ( Low[0]
Ссылка на сообщение
Поделиться на другие сайты

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

Здравствуйте, уважаемые!
Проблема вот в чем: при инициализации советника необходимо иметь историю в несколько недель по текущему инструменту и на текущем ТФ.
Как организовать проверку средствами MQL и, при необходимости, подкачку истории?
Спасибо.

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

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

Здрасте всем. Прошу совета бывалых. Как в конце дня закрыть все какие есть ордера.
например : иф тайм аур(тайм каррент) равно 23 , то закрыть все ордера ( и отложки ирыночные)

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

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


Подскажите, как получить номер бара и цены Open Close High Low этого бара по клику на графике?

void OnChartEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
{
if(id==CHARTEVENT_CLICK) {

int lparamToBarNumber;

Print(lparamToBarNumber);
}
}




Привет!
Суть такова, получаем координаты, преобразовываем их во время, ну а время в индекс бара(я назвал его "shift").

С индексом вариантов много. Через индекс узнаем интересующие нас данные, через функции: MqlRates(предварительно заполнив его через CopyRates) в этом массиве будет вся интересующая тебя инфа или отдельно запрашивать через: iOpen(),iHigh(),iLow(),iClose().

Написал я индикатор, можно кинуть на график и понять что к чему. Информация будет выводится во вкладку Эксперты.

Вроде все.

Eksperiment_Indi.mq4

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

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

Возможно, ли сделать так что б индикатор рисовал стрелку, на открытии бара, а не на закрытии?
Или тогда столкнемся перерисовыванием?

[Spoiler]
#property indicator_buffers 2
#property indicator_color1 clrFireBrick
#property indicator_color2 clrFireBrick
#property indicator_width1 2
#property indicator_width2 2

input string arr_set = "=== Arrow settings ===";
input int arrow_indent = 22;
input int UP_code = 234;
input int DW_code = 233;
input int BB_Period = 20; //период
input int BB_devi = 2; //кол-во стандартных отклонений
input int shift1 = 1;
extern int CCI_Period = 5;

input string emp1 = "///////////////////////////////////////";
input string al_set = "Alerts settings";
input bool use_alert = false;
input string up_alert = "UP";
input string down_alert = "DOWN";
extern bool WI_A = True;

double bufUP[];
double bufDW[];
int prev_bars;
/////////////////////////////////////////////////////////////////
int OnInit()
{
ArrayInitialize(bufUP,EMPTY_VALUE);
ArrayInitialize(bufDW,EMPTY_VALUE);

SetIndexBuffer(0,bufUP);
SetIndexStyle(0,DRAW_ARROW);
SetIndexArrow(0,UP_code);
SetIndexLabel(0,"UP arrow");

SetIndexBuffer(1,bufDW);
SetIndexStyle(1,DRAW_ARROW);
SetIndexArrow(1,DW_code);
SetIndexLabel(1,"DOWN arrow");

return(INIT_SUCCEEDED);
}
//////////////////////////////////////////////////////////////////
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[])
{

if(rates_total int i = rates_total - prev_calculated;
if (i else if (i>=rates_total) i = rates_total -1;
else if (i == 1) i = 2;
while( i > 0 ) // отсекаем тики 0-бара, сменил на i>0 все бары
{

double BB_SELL_1 = iBands(NULL, 0, BB_Period, BB_devi, 0, PRICE_CLOSE, MODE_UPPER, i);

double CCI_O = iCCI(NULL, 0, CCI_Period, PRICE_OPEN, i);
double CCI_C = iCCI(NULL, 0, CCI_Period, PRICE_CLOSE, i);

double WI_13 = iWPR(NULL, 0, 14, i);
double WI_131 = iWPR(NULL, 0, 14, i+1);
double CCI_C1 = iCCI(NULL, 0, CCI_Period, PRICE_CLOSE, i+1);

if(WI_A == false)
{
if (CCI_C CCI_O >= 100 &&
CCI_C //WI_13 -20 //pro++
)

bufUP = High + arrow_indent *_Point;
}

if(WI_A == true)
{
if (//CCI_C //CCI_O >= 100 &&
//CCI_C WI_13 -20 //pro++
)

bufUP = High + arrow_indent *_Point;
}

double BB_BUY_1 = iBands(NULL, 0, BB_Period, BB_devi, 0, PRICE_CLOSE, MODE_LOWER, i);

if (//CCI_O //CCI_C >= -100 &&
//CCI_C >= CCI_O //&&//вход на покупку
WI_13 > -80 && WI_131 )

bufDW = Low - arrow_indent *_Point;

i--;
}

//Alerts
/* if(use_alert)
{
if(bufUP[1]!=EMPTY_VALUE) Alert(Symbol()," ",Period()," ",up_alert);
if(bufDW[1]!=EMPTY_VALUE) Alert(Symbol()," ",Period()," ",down_alert);
}*/

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

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

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

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

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

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

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

Войти

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

Войти

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


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

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