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

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


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

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


Sany2912 я-ж не знаю что Вы используете и как это рассчитывается у Вас в сове.
например для восстановления параметров открытых ордеров из ОнИнит запускается ф-ция пересчета, которая ищет свои ордера и восстанавливает внутренние значения СЛ/ТП/БУ, если сетка, то сортирует ордера, восстанавливает лотность, цену открытия последнего колена и т.д.



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

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

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

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

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

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

Перейти

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

Перейти

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

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

Господа, осваиваю Forex EA Generator, несколько советников несложных уже составил, и теперь не могу понять как составить другого, на основе Боллинджера. Задача, чтобы сделки не открывались одновременно в одну сторону и не открывались одновременно в противоположные стороны. Не пойму, как выставить блоки, чтобы открывался лонг скажем на условии Close(1)>SMA20, а закрывался либо на верхней полосе Боллинджера либо на нижней. Например лонг открылся, и закрылся в профите по верхней линии Боллиджера, и тут нужно ждать, не открывать еще раз лонг на откате, а входить только в шорт по сигналу, как только сработает Close(1)Ну и в дополнение, киньте пожалуйста ссылкой на понятный русскоязычный учебник по MQL4 с примерами по созданию таких роботов. Или может начинать надо лучше с 5 версии?)

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

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


Как, примерно, должен быть написан код чтоб сохранить в ОнИнит последние Бид и Аск известные на момент выключения?

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
otten пробуй пересечение! пример: if (Close(1)>SMA20 && Close(2)тогда срабатывать будет только при пересечении и следовательно бай и сел будут чередоваться.
Ссылка на сообщение
Поделиться на другие сайты

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

Да! Об этом я не подумал, теперь буду знать способ с пересечением.
НО, осталось теперь обойти сумасшедшие свечи. Тут вот одна пробила максимумами обе линии сразу, и советник такого поворота не ожидал.

Спойлер



Добавлено: 15-01-2016 21:07:35

Не нашел как вставить маленькую превьюшку.

Добавлено: 15-01-2016 21:34:34

Вроде работает. Спасибо за подсказку!
С сильными свечами пока не придумал ничего лучше, чем задать ограничение в количество сделок на одну в заданный диапазон минут, в зависимости от таймфрейма нужного. Изменено пользователем otten
Ссылка на сообщение
Поделиться на другие сайты

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

Доброй ночи. Подскажите пожалуйста, написал советник по 2-ум индикаторам TMA и МА, когда средняя ТМА пересекает МА снизу вверх - покупаем. Закрытие происходит когда средняя ТМА пересекает сверху вниз МА. Сделки на продажу наоборот.
Сделки открываются не так как надо и, соответственно, закрываются не так. В чем причина.

extern double Lots = 0.1;
extern int Slippage = 5;
extern int Magic = 123;
extern int TakeProfit = 40;
extern int StopLoss = 20;

extern string comment = "Custom Moving Averages";
extern string Indi = "Данные индикатора!";
input int InpMAPeriod = 20; // Period
input int InpMAShift = 0; // Shift
input ENUM_MA_METHOD InpMAMethod = MODE_EMA; // Method

extern string commentTMA = "TMAnew";
extern string IndiTMA = "Данные индикатора!";
extern string TimeFrame = "current time frame";
extern int HalfLength = 56;
extern int Price = PRICE_CLOSE;
extern double ATRMultiplier = 2.0;
extern int ATRPeriod = 100;
extern bool Interpolate = true;

double MA, MA1, TMA, TMA1, Close1, Close2, Close3, Open1, TP, SL;
int ticket, ticketclose;

//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
if(Digits==3 || Digits==5)
{
TakeProfit *= 10;
StopLoss *= 10;
Slippage *= 10;
}
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{

}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
MA = iCustom(Symbol(), 0, "Custom Moving Averages", InpMAPeriod, InpMAShift, InpMAMethod, 0, 0);
MA1 = iCustom(Symbol(), 0, "Custom Moving Averages", InpMAPeriod, InpMAShift, InpMAMethod, 0, 1);
TMA = iCustom (Symbol(), 0, "TMAnew", TimeFrame, HalfLength, Price, ATRMultiplier, ATRPeriod, Interpolate, 0, 0);
TMA1 = iCustom (Symbol(), 0, "TMAnew", TimeFrame, HalfLength, Price, ATRMultiplier, ATRPeriod, Interpolate, 0, 1);

Close1 = iClose (Symbol(), 0, 1);
Close2 = iClose (Symbol(), 0, 2);
Close3 = iClose (Symbol(), 0, 3);
Open1 = iOpen (Symbol(), 0, 1);

if(TMA1 MA && CountBuy()==0)
{
SL = NormalizeDouble(Ask - StopLoss*Point,Digits);
ticket = OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,comment,Magic,0,Red);
if(ticket > 0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)==true)
{
if(OrderModify(ticket,OrderOpenPrice(),SL,0,0) == true)
Print("Ордер успешно изменился");
}
}
}

if(TMA1 > MA1 && TMA {
SL = NormalizeDouble(Bid + StopLoss*Point,Digits);
ticket = OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,comment,Magic,0,Red);
if(ticket > 0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)==true)
{
if(OrderModify(ticket,OrderOpenPrice(),SL,0,0) == true)
Print("Ордер успешно изменился");
}
}
}

if(TMA1MA && CountSell() > 0)
{
for(int i = OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) == true && OrderMagicNumber() == Magic && OrderType() == OP_SELL)
{
if(OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,Black) == true)
Print("Ордер успешно закрылся!");
}
}
}
if(TMA1>MA1 && TMA 0)
{
for(int i = OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) == true && OrderMagicNumber() == Magic && OrderType() == OP_BUY)
{
if (OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Black) == true)
Print("Ордер успешно закрылся!");
}
}
}

}
//+------------------------------------------------------------------+
int CountSell()
{
int count = 0;
for(int i = OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) == true && OrderMagicNumber() == Magic && OrderSymbol() == Symbol() && OrderType() == OP_SELL)
count++;
}
return(count);
}
//+------------------------------------------------------------------+
int CountBuy()
{
int count = 0;
for(int i = OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) == true && OrderMagicNumber() == Magic && OrderSymbol() == Symbol() && OrderType() == OP_BUY)
count++;
}
return(count);
}
//+------------------------------------------------------------------+

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
htp87 тма перерисовывает не только 0-бар, но и ещё HalfLength-баров. Поэтому сделки на истории будут не там. Пробуйте в режиме визуализации (придётся ручками индюки ставить)
Ссылка на сообщение
Поделиться на другие сайты

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

Добрый день. Спасибо за такой курс. Научился программированию по нему недели за две. Строчу этих роботов теперь по пять штук в неделю ))) Столкнулся с небольшой трудностью. Сделал робота открывающего сделки в начале каждой свечи. Но например при открытии рынка, когда уже тики идут или при экспирации рынок закрыт. Соответственно робот отрабатывает свои сигналы (10 прописал), а сделки нет. Когда уже рынок открывается робот молчит до следующей свечи. Подскажите пожалуйста функцию открытого рынка? Не могу сообразить...

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

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


Добрый день. Спасибо за такой курс. Научился программированию по нему недели за две. Строчу этих роботов теперь по пять штук в неделю ))) Столкнулся с небольшой трудностью. Сделал робота открывающего сделки в начале каждой свечи. Но например при открытии рынка, когда уже тики идут или при экспирации рынок закрыт. Соответственно робот отрабатывает свои сигналы (10 прописал), а сделки нет. Когда уже рынок открывается робот молчит до следующей свечи. Подскажите пожалуйста функцию открытого рынка? Не могу сообразить...



да пожалуйста:
http://docs.mql4.com/ru/check/istradeallowed
http://docs.mql4.com/ru/check/istradecontextbusy

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

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

А так можно?
if (IsTradeAllowed() && !IsTradeContextBusy())
Вроде в тестере пока хорошо показывает. Гляну на открытии сегодня, в смысле завтра...
И спасибо. Я видел эти функции, но по описанию мой мозг отказывался доверять им ))).

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

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


А так можно?
if (IsTradeAllowed() && !IsTradeContextBusy())
Вроде в тестере пока хорошо показывает. Гляну на открытии сегодня, в смысле завтра...
И спасибо. Я видел эти функции, но по описанию мой мозг отказывался доверять им ))).



ну по идее по описанию в IsTradeAllowed() уже есть и IsTradeContextBusy(), но я натыкался на такие глюки что эти функции работают не совсем так, как написано в официальной документации. я их применял именно так как ты и написал.

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

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

Здравствуйте! Подскажите пожалуйста, есть ли функции типа: вкл/выкл советников, или разрешать/запрещать торговлю, ну на крайняк отключиться/подключиться к счёту. Хочу написать сова, который бы ограничивал бы работу других работающих советников на счету по времени.

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

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

Обновили урок по написанию советника на мартингейле
http://tradelikeapro.ru/pishem-sovetnik-po-martingeylu/

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

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

Здравствуйте! Подскажите, может быть у кого-нибудь есть пример работы с GlobalVariable или видео-урок по работе с глобальными переменными, например с GlobalVariableSet()?

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

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


Здравствуйте! Подскажите, может быть у кого-нибудь есть пример работы с GlobalVariable или видео-урок по работе с глобальными переменными, например с GlobalVariableSet()?



ну как бы есть же официальная документация, в которой всё популярно разжевано. работа точно такая же как и с кучей ордеров или одномерным массивом элементов. вместо OrdersTotal() берется GlobalVariablesTotal(), вместо OrderSelect() в цикле перебора нужно создавать стринговую перменную и в нее пихать GlobalVariableName(#i-тый элемент#) и далее все манипуляции проводить через это стринговое имя.

нюансы. имя переменной(GlobalVariableName()) - только String, а значение GlobalVariableGet() существует в двух вариациях, тащить можно с проверкой через два параметра(возврат будет булевый) а можно и через один и тут возврат только double. GlobalVariableSet не только меняет значение уже существующей переменной но еще и создает новую, если перменной с запрашиваемым именем не существует.

Все изменения с глобальными переменными можно "вживую" отслеживать нажатием клавиши F3 в терминале.

http://docs.mql4.com/ru/globals Изменено пользователем dermitay
  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

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

Помогите пожалуйста. Захотел написать советник на основе magic dots. Скачал пример советника и в нем внес изменения. Цель, чтобы при появлении синий точки покупал, а при красной точке продавал(закрывая предыдущую сделку). Пытаюсь взять из буфера сигнал, вроде ошибок нет, но сделки советник не открывает к сожалению.

int IndicatorSignal()
{
int Sig=0;

double mg_1=iCustom(Symbol(),0,"Magic dots 2 mtf alerts",ma_method,period,2,0);
double mg_2=iCustom(Symbol(),0,"Magic dots 2 mtf alerts",ma_method,period,3,0);


if ((mg_1 if ((mg_1>mg_2)) Sig=2;


return(Sig); }

Super.mq4
Magic_dots_2_mtf_alerts.mq4

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

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

Oll, как вы сделали "VaBank" так, чтоб он работал на одном счете одновременно на разных парах?? Дело лишь в разных магиках или, всетаки, есть еще какие то особенности, например каждому сов.выделить определенный размер депозита?

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

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





1. у вас в iCustom перечислены не все входные параметры индикатора. хоть по документации при таком подходе и должны подставляться значения по умолчнию, и типа все должно корреткно работать. но по факту я всегда нарывался на некорректное поведение кода/вывода вытаскиваемых значений.
вы либо вобще удалите все входные параметры индикатора, либо перечислите все, как полагается, с точным совпадением еще и типов переменных

2. вывод

if ((mg_1 if ((mg_1>mg_2)) Sig=2;

немного некорректен, не думали что одно из значений может(и будет) равно нулю? сделки на бай уже пролетают лесом как минимум. а если вытаскиваемое значение таки не равно нулю а например нерисуемое на графике значение буфера будет равно +100500 или -100500?
не проще просто сравнивать с нулем чем между собой? Изменено пользователем dermitay
Ссылка на сообщение
Поделиться на другие сайты

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


Oll, как вы сделали "VaBank" так, чтоб он работал на одном счете одновременно на разных парах?? Дело лишь в разных магиках или, всетаки, есть еще какие то особенности, например каждому сов.выделить определенный размер депозита?

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

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






1. у вас в iCustom перечислены не все входные параметры индикатора. хоть по документации при таком подходе и должны подставляться значения по умолчнию, и типа все должно корреткно работать. но по факту я всегда нарывался на некорректное поведение кода/вывода вытаскиваемых значений.
вы либо вобще удалите все входные параметры индикатора, либо перечислите все, как полагается, с точным совпадением еще и типов переменных

2. вывод

if ((mg_1 if ((mg_1>mg_2)) Sig=2;

немного некорректен, не думали что одно из значений может(и будет) равно нулю? сделки на бай уже пролетают лесом как минимум. а если вытаскиваемое значение таки не равно нулю а например нерисуемое на графике значение буфера будет равно +100500 или -100500?
не проще просто сравнивать с нулем чем между собой?


Поправил
int IndicatorSignal()
{
int Sig=0;

double mg_1=iCustom(Symbol(),0,"Magic dots 2 mtf alerts",2,0);
double mg_2=iCustom(Symbol(),0,"Magic dots 2 mtf alerts",3,0);


if ((mg_1 >= 0)) Sig=1;
if ((mg_2 >= 0)) Sig=2;



return(Sig);
}

вот так. Теперь он открывает, только одну сделку на sell, не закрывая ее.

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

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



Oll, как вы сделали "VaBank" так, чтоб он работал на одном счете одновременно на разных парах?? Дело лишь в разных магиках или, всетаки, есть еще какие то особенности, например каждому сов.выделить определенный размер депозита?

Сова проверяет магик и пару. Какой депо выделить - задача пользователя. Совы установленные на разные пары ничего о друг-друге не знают.


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

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


Поправил
int IndicatorSignal()
{
int Sig=0;
double mg_1=iCustom(Symbol(),0,"Magic dots 2 mtf alerts",2,0);
double mg_2=iCustom(Symbol(),0,"Magic dots 2 mtf alerts",3,0);
if ((mg_1 >= 0)) Sig=1;
if ((mg_2 >= 0)) Sig=2;
return(Sig);
}
вот так. Теперь он открывает, только одну сделку на sell, не закрывая ее.



включите логику. если сигнала нет вобще - то он может быть и равен нулю, что является судя по функции сигналом и на бай и на селл. сигнал должен быть строго больше нуля.
судя по вашему коду в итоге у вас всегда будет возвращен Sig = 2.
плюс я хз какой код в основном блоке. может вы с условиями открытия/закрытия ордера налажали >:d Изменено пользователем dermitay
Ссылка на сообщение
Поделиться на другие сайты

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



Поправил
int IndicatorSignal()
{
int Sig=0;
double mg_1=iCustom(Symbol(),0,"Magic dots 2 mtf alerts",2,0);
double mg_2=iCustom(Symbol(),0,"Magic dots 2 mtf alerts",3,0);
if ((mg_1 >= 0)) Sig=1;
if ((mg_2 >= 0)) Sig=2;
return(Sig);
}
вот так. Теперь он открывает, только одну сделку на sell, не закрывая ее.



включите логику. если сигнала нет вобще - то он может быть и равен нулю, что является судя по функции сигналом и на бай и на селл. сигнал должен быть строго больше нуля.
судя по вашему коду в итоге у вас всегда будет возвращен Sig = 2.
плюс я хз какой код в основном блоке. может вы с условиями открытия/закрытия ордера налажали >:d


Спасибо, сделал так.
if ((mg_1 > 0)) Sig=1; else
if ((mg_2 > 0)) Sig=2;
Начал выдавать сигнал на покупку вместо продажи
Подскажите здесь нужен, какой-то цикл типа for, чтобы он считал и sig=1 и sig=2?
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
mops0000 буфер индикатора выглядит так:
0,0,0,0,0,0,0,0,1.1254,0,0,0,0,0,0,1.2687,0,0,0,0,0,
значения отличные от "0" - координаты цены отрисовки точки (красной или зелёной - разницы нет)
нужно брать значения не с 0 бара - там они точно появляются и исчезают несколько раз, а с 1 бара, т.е.
double mg_1=iCustom(Symbol(),0,"Magic dots 2 mtf alerts",2, 1 );
кстати вот вызов Вашего индюка (попробуйте):
iCustom(NULL, 0, "Magic dots 2 mtf alerts", 0, MODE_EMA, 6, 0, PRICE_CLOSE, false, false, false, false, false, false, 2, 1)
чтоб прога лучше читалась используйте стандартные константы (совет), типа:
if ((mg_1 > 0)) Sig=OP_SELL; ( или OP_BUY для 3 буфера )
реверс сигнала тогда пишется просто: Sig = 1- Sig;
  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

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

Спасибо. Я попробовал изменить как Вы написали iCustom(NULL, 0, "Magic dots 2 mtf alerts", 0, MODE_EMA, 6, 0, PRICE_CLOSE, false, false, false, false, false, false, 2, 1), теперь при тестировании начали появляться точки сигнала, но цену все равно только один раз открывает на бай и все потом не закрывает. Я посмотрел здесь Урок №3 — пишем советник на внешнем индикаторе и переписал советник, но проблема теперь в том, что он открывает в начале по точкам сначала бай и селл, многократно и только потом переходит к следующей точке? И как указать, что если точка после открытия ордера появляется следующая точка того же цвета, чтобы он не открывал ещё один ордер, а продолжал пока не появится точка другого цвета?

Untitled_1.jpg

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

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

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

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

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

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

Войти

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

Войти

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


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

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