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

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


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

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


Подскажите , кто знает... Иногда случается, что как будто зависает Мета Эдитор. В сове меняю код, условия . Меняю, компилирую. Все правильно ,без ошибок. А в тестере эти изменения не проявляются. Как работал до изменения , так эти же результаты и показывает. Не компилирует , короче, по ходу. Приходится удалять сову с терминала. И заново закидывать. Только тогда изменения компилируются. Из за чего такое ?


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

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

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

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

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

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

Перейти

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

Перейти

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

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

Понеслась(((
Полезли ошибки в журнале по сове на паттернах:
"2019.04.12 17:48:05.761 2019.04.11 23:59:55 Test 2 EA EURUSD,Daily: zero divide in 'Test 2 EA.mq4' (198,57)"
и куча таких
"2019.04.12 17:50:22.542 TestGenerator: unmatched data error (volume limit 34652 at 2019.04.10 00:00 exceeded)"

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

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


Понеслась(((
Полезли ошибки в журнале по сове на паттернах:
"2019.04.12 17:48:05.761 2019.04.11 23:59:55 Test 2 EA EURUSD,Daily: zero divide in 'Test 2 EA.mq4' (198,57)"
и куча таких
"2019.04.12 17:50:22.542 TestGenerator: unmatched data error (volume limit 34652 at 2019.04.10 00:00 exceeded)"


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

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

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


Хоть так, хоть сяк. Не работает сова. Деление на ноль во всех вариантах. Даже, если OnTester() закомментировать, все равно не нератает. Изменено пользователем geugene
Ссылка на сообщение
Поделиться на другие сайты

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

Здравствуйте, не могли бы вы сделать Урок по Индикатору Стоп Лоссов с вашего сайта, чтобы данные выводилес в Терминале.

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

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

=b

Здравствуйте, не могли бы вы сделать Урок по Индикатору Стоп Лоссов с вашего сайта, чтобы данные выводилес в Терминале.


ПРИСОЕДИНЯЮСЬ К ПРОСЬБЕ
Ссылка на сообщение
Поделиться на другие сайты

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

не могли бы вы сделать Урок по Индикатору Стоп Лоссов с вашего сайта, чтобы данные выводилес в Терминале.

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

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

Здравствуйте!



Скачал видео уроки по программированию MQL4 "Курс молодого бойца".

ну и создал советника согласно урока №2.

Но во время торговли чего не работает. Не открывает отложенные ордера.

При компиляции ошибок нет.

Поскольку я в начале пути, пока трудно найти ошибку.

Прошу помочь, если кто может.

Спасибо!

Код во вложении

тест2_Обучение.mq4

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

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

ну и создал советника согласно урока №2.

Отлично, поздравляю!
По коду 2 замечания:
1. В строчках проверки ордеров - if ( BuyLimitCount() && BuyCount() ==0 ), нужно проверить 1 параметр: BuyLimitCount() = 0
2. Рекомендую перенести GetMinPrice(); в раздел расчёта параметров для Бай-Лимит - так будет правильней.
  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

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

Прошу помочь, если кто может.


Еще момент. У Вас четыре перебора ордеров. Можно обойтись одним циклом.

int buyLimitCount=0,
sellLimitCount=0,
buyCount=0,
sellCount=0;
for (int i=0,count=OrdersTotal();i if (OrderSelect(i,SELECT_BY_POS))
switch (OrderType()){
case OP_BUY: ++buyCount; break;
case OP_SELL: ++sellCount; break;
case OP_BUYLIMIT: ++buyLimitCount; break;
case OP_SELLLIMIT: ++sellLimitCount;}

Далее используются переменные.
Еще один нюанс. Он может вообще не играет роли, а может быть и существенным, все зависит от того, как компилятор работает. Вы используете вызов функции Symbol(), хотя у Вас есть предопределенная переменная _Symbol, разница в том, что если компилятор этот момент не оптимизирует, то в случае вызова функции, можно получить каждый раз лишнее разыменование, а то и кучу проверочных операций (тут все зависит от реализации создателей), а в случае обращения к переменной Вы сразу имеете адрес памяти по которой данные находятся.
Удачи и старайтесь сразу в эти нюансы вникать.
  • Лайк 3
Ссылка на сообщение
Поделиться на другие сайты

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

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

и еще потом) какой командой создать текстовый объект, чтобы рядом с ним были две мелкие кнопочки сверху и внизу +/- меняющие значения на 0.01 пункт? спасибо

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

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

Здравствуйте!
Продолжаю изучать MQL4 по видеоурокам "Курс молодого бойца". На мой взгляд очень удачный курс.
Хотел бы спросить, может кто знает: Ответы на домашние задания этого курса можно где-нибудь раздобыть? Для самоконтроля.
Премного буду благодарен!

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
powernet обратите внимание на эту тему - там разбор создания кнопочек с исходниками.
Ссылка на сообщение
Поделиться на другие сайты

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

powernet обратите внимание на эту тему - там разбор создания кнопочек с исходниками.


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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
powernet если нужна перетаскиваемая панель - то лучше вникнуть в более сложный код по ссылке, если нет необходимости в перетаскивании, то и панель не нужна - можно фиксированные кнопки прямо на графике расположить и пользоваться.
Самый "простой" и доступный способ получить значение кнопки, это на каждом тике проверять её состояние нажата/отжата. Если нажата - OrderSend и возвращаем состояние "отжата".
  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

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

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


//+------------------------------------------------------------------+ BUY
if(ObjectGetInteger(0,"s_button_buy",OBJPROP_STATE)==1)// проверяешь нажата копка или нет
{
tiket=OrderSend(Symbol(),OP_BUY,LOT,Ask,slip,SL,TP,"",magic,0,clrBlue);
ObjectSetInteger(0,"s_button_buy",OBJPROP_STATE,0); // затем отжимаешь ее
}
  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

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

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

что-то не получается. или может нужно отдельно через Void или другую команду это делать?

Цитата


if (id==CHARTEVENT_OBJECT_CLICK) {

if (sparam=="buttonbuy") {
OrderSend(Symbol(), OP_BUY, lots, Ask, 3, 0, 0, "Opened by Advisor", 0, 0, clrBlue); //add your buy order here
}
if (sparam=="buttonsell") {
OrderSend(Symbol(), OP_SELL, lots, Bid, 3, 0, 0, "Opened by Advisor", 0, 0, clrYellow); //add your sell order here
}
if (sparam=="buttoncloseall") {


}
}

}

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

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

что-то не получается.


В цикле перебираете все ордера и, если ордер удовлетворяет условиям (магик, символ и т.п.), то закрываем. Из справки:

bool OrderClose(
int ticket, // номер ордера
double lots, // количество лотов
double price, // цена закрытия
int slippage, // максимальное проскальзывание
color arrow_color // цвет
);
Ссылка на сообщение
Поделиться на другие сайты

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

По поводу создания диалоговых окон, на mql5.com была хорошая статья (с ходу найти не смог), в ней автор последовательно создает объект "диалоговое окно", заодно основы ООП хорошо описывает. Если найдете, то почитайте, очень доступно было написано, я тогда сам только-только ООП трогать начал, много интересного подчерпнул.
Вообще, диалоговые окна создавать без ООП, можно конечно, но это как в анекдоте про женщину и комсомольца, где он, как любитель преодолевать трудности, копает огород в ОЗК и противогазе, а на предложение заняться чем-нибудь поинтересней, соглашается, но в гамаке и стоя.

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

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

что-то не получается. или может нужно отдельно через Void или другую команду это делать?

О, Вы всё-таки через события запустили - похвально! Void - это тип данных, не команда. Сделайте через функцию, примерно так:

if (sparam=="buttoncloseall") { CloseAll ( ); }

далее в самом низу, на пустом месте опишите функцию:
void CloseAll ( )
Спойлер

{
for(int i=total-1;i>=0;i--)
{
if (!OrderSelect(i, SELECT_BY_POS)) continue;
if ( OrderSymbol() != _Symbol || OrderMagicNumber() != Magic ) continue; // если есть магик
int type = OrderType();
bool result = false;
switch(type)
{
//Close opened long positions
case OP_BUY :
result = OrderClose( OrderTicket(), OrderLots(), OrderClosePrice(), 5, clrGray );
break;

//Close opened short positions
case OP_SELL :
result = OrderClose( OrderTicket(), OrderLots(), OrderClosePrice(), 5, clrGray );
break;
}
}
}



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

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

О, Вы всё-таки через события запустили - похвально! Void - это тип данных, не команда. Сделайте через функцию, примерно так:


Спасибо, но ваш код почему-то не сработал или выдавал какие-то ошибки)
Я случайно нашел другой код и он сработал и хорошо закрывает открытые ордера)

Цитата

}
if (sparam=="buttonclose") {
{
CloseOrder();
ObjectSetInteger(0,"buttoncloseall",OBJPROP_STATE,false);
}

}
}

}


и потом внизу
Цитата

void CloseOrder()
{
//Close Long Order
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
if(OrderSymbol()==Symbol())
{
if(OrderType()==OP_BUY)
{
//-------------------------------------------------------------------------------------------------
double CloseBuy=OrderClose(OrderTicket(),OrderLots(),Bid,0);
//-------------------------------------------------------------------------------------------------
ChartSetInteger(0,CHART_COLOR_FOREGROUND,clrSteelBlue);
//-------------------------------------------------------------------------------------------------
}
if(OrderType()==OP_SELL)
{
//-------------------------------------------------------------------------------------------------
double CloseSell=OrderClose(OrderTicket(),OrderLots(),Ask,0);
//-------------------------------------------------------------------------------------------------
ChartSetInteger(0,CHART_COLOR_FOREGROUND,clrSteelBlue);
//-------------------------------------------------------------------------------------------------
}
}
}
}


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

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

Забавно. В "Как самому написать советник / индикатор / скрипт" втором уроке странный глюк. Повторяю код , но всё равно он мне выписывает "possible loss of data due to type conversion" на знач. StopLoss в СэндОредере. Причем ТэйкПрофит преобразуется ровно точно также, но у него такой ошибки нет. Жаль нет возможности оставлять комментарии под конкретным уроком.
Кто подскажет, что не так?

Спойлер

extern int BarCount=10;// перем. для кол. баров анализа.
extern int HourStart=11;// для времени старта.
extern double Lots=0.1; // перемен. для объема
extern int StopLoss = 300; //в пунктах
extern int TakeProfit = 200;
extern int Magic=12345;
double minprice=999999, mp, maxprice=-999999;
double SL, TP;
int ticket;
//Цикл - можно выполнить одну и туже вещь много раз. Узнать мин и макс цену нескольких баров проще в цикле.
int OnInit(){return(INIT_SUCCEEDED);}
void OnDeinit(const int reason){}
void OnTick()
{
GetMinPrice();
GetMaxPrice();
if (TimeHour(TimeCurrent())==HourStart)//тут мы вычленяем какой час из текущего времени и срав. с заданным экст.
{
SL=NormalizeDouble(minprice-StopLoss*Point,5);// поинт нужен для приведения к числу. Нормализ для уменьшения чисел после запятой.
TP=NormalizeDouble(minprice+TakeProfit*Point,5);
ticket=OrderSend(Symbol(), OP_BUYLIMIT, Lots, minprice, SL, TP, 3, "", Magic, 0, Blue);//открытие лимит.ордера на покупку
if (ticketSL=NormalizeDouble(minprice + StopLoss*Point,5);// поинт нужен для приведения к числу. Нормализ для уменьшения чисел после запятой.
TP=NormalizeDouble(minprice - TakeProfit*Point,5);
{ticket=OrderSend(Symbol(),OP_SELLLIMIT,Lots,minprice,SL, TP,3,"",Magic,0, Blue);}//открытие лимит.ордера на продажу
if (ticket}

Comment("Minprice:"+DoubleToStr(minprice,5)+"\n"+"MaxPrice:"+DoubleToStr(maxprice,5));}

void GetMinPrice()//войд - создание функции. функция вызывается выше и имеет пустые парам()
{
for (int i=0; i{
mp=iLow(Symbol(),PERIOD_CURRENT,i);//получаем и присваиваем минимальную цену переменной.
//iLow=индикатор.Парам(Symbol=ф-я опр.валют.пары,Таймфрейм=(знач.отМ5доН4иБольше)PERIOD_CURRENT=конст. на котором был запуск советника,shift=смещение 0.
//Далее делаем сравнение i c minprice.это нужно для даль. перебора значений.
if (mpminprice=mp;
}
return;
}
void GetMaxPrice()
{
for(int i=0; i{
mp=iHigh(Symbol(),PERIOD_CURRENT,i);
if(mp>maxprice)
maxprice=mp;
}
return;
}


И еще выдает ошибку 130 в режиме работы советника, даже с прописанным нулем за место SL. Изменение спреда ничего не дает.
Я вывел значения СЛ и ТП, но ничего экстраординарного в значениях не вижу.
2019.05.02 19:31:15.857 2019.04.26 11:59:59 2 EURUSD,H4: OrderSend error 130
2019.05.02 19:31:15.857 2019.04.26 11:59:59 2 EURUSD,H4: 1.10879 1.11379

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

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

Повторяю код , но всё равно он мне выписывает "possible loss of data due to type conversion" на знач. StopLoss в СэндОредере

Вы пропустили Slippage, причём и в SL и TP

Xr.png

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

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

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

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

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

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

Войти

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

Войти

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


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

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