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

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


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

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


20 мая 2013 две сделки, а на графике цена на много выше,мы не могли войти там в сделку. фото приложил)))
Второй момент сделка №1 и №2 закрылась по цене 1,29417 и 1,29864, а хай этого дня вообще не поднимался выше 1,29006. Фото приложил , архив котировок брокера Фибо групп. Понимаю что это всего лишь видеоролик где xbms учит нас программированию,но цены несуществующие :-?


Добавлено: 07-04-2015 17:11:55

Не нарушается ли логика в последовательности действий ???
Если в коде указанны блок продаж Sell , потом блок покупок Buy . Потом блоки закрытия. В фото приведённом постом выше, мы одновременно находились в сделке и Buy и Sell по Евро Доллару.

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

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

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

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

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

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

Перейти

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

Перейти

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

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

Всем доброго вечера, уважаемые! :d

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

Нашел вот такой фрагмент кода:

Спойлер

Цитата

Часть кода по модификации лота. Кидаем в любой советник.

Эта часть при описи переменных
extern double Лот = 0.01; // Для установки размера лота
extern double Максимальный_лот = 0.04; // Ограничение по максимально возможному лоту
Эта часть в начале основного кода

// +++++++++++ модификация лота +++ начало ++++++++++++++++++++
//-------------------------------------------------------------
double lot=Лот;

// узнаем лот последнего ордера и его прибыль
int i=1;
double order_history_profit=0;
double order_history_lot=0;

while (i {
OrderSelect (OrdersHistoryTotal()-i,SELECT_BY_POS,MODE_HISTORY);
if (Magicbuy==OrderMagicNumber( ) || Magicsell==OrderMagicNumber( ))
{
if (OrderSymbol() == Symbol())
{
order_history_profit = OrderProfit( );
order_history_lot = OrderLots();
break();
}
}
i++;
}
// увеличим размер лота если последний ордер убыточный
if (order_history_profit // уменьшим размер лота если последний ордер прибыльный
if (order_history_profit > 0) lot=Лот;
// упорядочивание лота при его выходе за пределы нормы

if (lot >= Максимальный_лот ) lot=Лот; // ограничение по количеству модификаций

if (lot if (lot > MarketInfo(Symbol(),MODE_MAXLOT)) lot=MarketInfo(Symbol(),MODE_MAXLOT); // ограничение по максимально допустимому лоту

//------------------------------------------------------------
// +++++++++++ модификация лота +++ конец ++++++++++++++++++++

В функцию "OrderSend" переменная "lot"



При компилировании выдаются ошибки насчет функций Magicbuy и Magicsell в первом условном операторе, а так же ошибка на скобках break();.

Что это может быть? Вообще этот участок кода рабочий? Может кто-то может что то подсказать...

Буду очень признателен, за помощь. >:d
Заранее спасибо большое! :)
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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

Замените if (Magicbuy==OrderMagicNumber( ) || Magicsell==OrderMagicNumber( )) на if (Magic ==OrderMagicNumber( ) )
break(); на break;
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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

Добрый день.
0ll,
Заменил в коде, вторая ошибка со скобками исчезла, но первая ошибка остается: 'Magic' - undeclared identifier

Что еще может служить причиной?

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

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

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

Добрый день! :)

Магик используется, но он по-другому в советнике назван, а именно EA_magic равен он 9494, по-моему то.

Заменил именно на такое название и вроде компиляция прошла. Сегодня пока еще не тестировал советник. Вечером займусь.

Спасибо большое Вам! =d>
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
0ll, добрый день.

Компиляцию провожу без ошибок, но все равно при тестировании после возникновении СЛ лот не увеличивается - не работают изменения. Возможно проблема с переменными?

Решил все по-порядку расписать, возможно ошибка найдется.

В моем советнике в описи использованы следующие переменные:

Лот - FixLot
Магик - EA_magic

В куске кода для примения Мартина, описано добавление еще двух перепенных в опись -

Цитата

Эта часть при описи переменных
extern double Лот = 0.01; // Для установки размера лота
extern double Максимальный_лот = 0.04; // Ограничение по максимально возможному лоту



Меня смущают вот эти сами переменные, ведь они должны быть скоррелированы с теми, которые уже прописаны в советнике, так ведь? Или я что то не понимаю?
И еще вопрос. Я извиняюсь, что не обладаю достаточными знаниями, возможно вопрос сам по себе будет звучать нелепо, но тем не менее - в какую часть советника вшивать этот кусок кода? Я его вставил сразу после описи переменных, правильно ли это?

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

Спойлер

Цитата

Часть кода по модификации лота. Кидаем в любой советник.

Эта часть при описи переменных
extern double Лот = 0.01; // Для установки размера лота
extern double Максимальный_лот = 0.04; // Ограничение по максимально возможному лоту
Эта часть в начале основного кода

// +++++++++++ модификация лота +++ начало ++++++++++++++++++++
//-------------------------------------------------------------
double lot=Лот;

// узнаем лот последнего ордера и его прибыль
int i=1;
double order_history_profit=0;
double order_history_lot=0;

while (i {
OrderSelect (OrdersHistoryTotal()-i,SELECT_BY_POS,MODE_HISTORY);
if (EA_magic ==OrderMagicNumber( ) )
{
if (OrderSymbol() == Symbol())
{
order_history_profit = OrderProfit( );
order_history_lot = OrderLots();
break;
}
}
i++;
}
// увеличим размер лота если последний ордер убыточный
if (order_history_profit // уменьшим размер лота если последний ордер прибыльный
if (order_history_profit > 0) lot=Лот;
// упорядочивание лота при его выходе за пределы нормы

if (lot >= Максимальный_лот ) lot=Лот; // ограничение по количеству модификаций

if (lot if (lot > MarketInfo(Symbol(),MODE_MAXLOT)) lot=MarketInfo(Symbol(),MODE_MAXLOT); // ограничение по максимально допустимому лоту

//------------------------------------------------------------
// +++++++++++ модификация лота +++ конец ++++++++++++++++++++

В функцию "OrderSend" переменная "lot"



И последний вопрос - В функцию "OrderSend" переменная "lot" - не понятно что с этим нужно сделать?

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

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


Меня смущают вот эти сами переменные, ведь они должны быть скоррелированы с теми, которые уже прописаны в советнике, так ведь? Или я что то не понимаю?


А вас не смущает что внешние переменные вы на Русском написали?
Приведу пример : extern double Lots = 0.1;
Строчка отправки ордера : OrderSend (Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, comment, MagicNumber, 0, Blue);
похоже в неё вам и указывали вписать Lots , но не на Русском
наводите на непонятные переменные курсор и нажимайте F1 в метаедиторе,в справке примеры есть как должны выглядеть полностью строки с вашими примерами,в вашем колде для того чтоб торговал не дописаны функции отправки ордеров OrderSend.
И закоментированные слова на Русском после двойных слешей обязательно должны быть в одну строку!
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Гриня, спасибо за ответ.

В том то и дело, что вижу что код кривой, но из-за недостатка опыта не могу понять в чем дело. :-/

Как Вы считаете, код вообще правильный, если добавить описанную Вами функцию (кстати ее вставить после всего куска кода?):

OrderSend (Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, comment, MagicNumber, 0, Blue);

и Lots, я так понимаю, должен быть FixLot согласно описи в моем советнике, так?
Ссылка на сообщение
Поделиться на другие сайты

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


Гриня, спасибо за ответ.
В том то и дело, что вижу что код кривой, но из-за недостатка опыта не могу понять в чем дело. :-/


Пожалуйста. Во первых разрисуйте полное тех задание для себя,что ? когда ? и как должен выполнить ваш советник !!! Полнейшее понимание в голове перенесите на лист бумаги для себя. Откройте метаэдитор и нажмите создать новый файл-эксперт.Обязательно к просмотру уроки xbms от которого и произошла эта ветка на сайте,вам урок номер 3 ,выучить бы наизусть. Сперва объявите внешние переменные вот например:
extern double Lots =0.1;
extern double StopLoss=50; // стоплосс
extern double TakeProfit=50; // тейкпрофит
extern int TrailingStop=5;
extern int Slippage=5;
extern int MagicNumber=123;
extern string ind_name = "Stochastic";//название индикатора
extern int Stoch_D = 48; //первый параметр индикатора
extern int Stoch_K = 8; //второй параметр индикатора
extern int Stoch_S = 16; //трeтий параметр индикатора
extern int H_level = 90; //уровень индикатора для открытия ордеров
Определитесь на основе какого или каких индикаторов будет работать советник их нужно прописать в коде. Начните размышлять логически, раз советник должен покупать и продавать значит должны быть OP_BUY , OP_SELL , соответственно он должен открывать и закрывать по Бидам Bid или Аскам Ask что тоже необходимо указать, отправки ордеров OrderSend , модификация выставления стопов и тейков OrderModify(OrderTicket(),OrderOpenPrice(), SL, TP,0,CLR_NONE);
OrderSelect и закрытие ордеров раз открывали OrderClose.
И открывайте кучу советников и читайте код для кругозора что и как у других реализовано.А просто вставить блок не получиться ,но шаблон со всеми готовыми функциями поищите вам это облегчит работу на начальном этапе. Или из урока перепишите,ну и все 120 страниц прочитать этой ветки тоже очень полезно. Я и сам читаю учусь.


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

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

А вас не смущает что внешние переменные вы на Русском написали?

Ёпрст, а я в своих совах по русски пишу..., а оказывается нельзя... :(
Vanka-Yanka
Приведённый код рабочий, только его надо правильно интегрировать в Ваш советник. переменные extern в начало совы.
остальной код непосредственно перед открытием ордера. Точнее подсказать невозможно по причине отсутствия полного кода.
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
0ll, добрый день.

Я вот тут вроде расписал в раннем письме - какие у меня переменные extern прописаны в СОВе и свои вопросы. Посмотрите плиз.

----------------------------------------------------------------------------------------------------------------------------------------------------------

Компиляцию провожу без ошибок, но все равно при тестировании после возникновении СЛ лот не увеличивается - не работают изменения. Возможно проблема с переменными?

Решил все по-порядку расписать, возможно ошибка найдется.

В моем советнике в описи использованы следующие переменные:

Лот - FixLot
Магик - EA_magic

В куске кода для примения Мартина, описано добавление еще двух перепенных в опись -

Цитата


Эта часть при описи переменных
extern double Лот = 0.01; // Для установки размера лота
extern double Максимальный_лот = 0.04; // Ограничение по максимально возможному лоту



Меня смущают вот эти сами переменные, ведь они должны быть скоррелированы с теми, которые уже прописаны в советнике, так ведь? Или я что то не понимаю?

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

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

Спойлер

Часть кода по модификации лота. Кидаем в любой советник.

Эта часть при описи переменных
extern double Лот = 0.01; // Для установки размера лота
extern double Максимальный_лот = 0.04; // Ограничение по максимально возможному лоту
Эта часть в начале основного кода

// +++++++++++ модификация лота +++ начало ++++++++++++++++++++
//-------------------------------------------------------------
double lot=Лот;

// узнаем лот последнего ордера и его прибыль
int i=1;
double order_history_profit=0;
double order_history_lot=0;

while (i {
OrderSelect (OrdersHistoryTotal()-i,SELECT_BY_POS,MODE_HISTORY);
if (EA_magic ==OrderMagicNumber( ) )
{
if (OrderSymbol() == Symbol())
{
order_history_profit = OrderProfit( );
order_history_lot = OrderLots();
break;
}
}
i++;
}
// увеличим размер лота если последний ордер убыточный
if (order_history_profit // уменьшим размер лота если последний ордер прибыльный
if (order_history_profit > 0) lot=Лот;
// упорядочивание лота при его выходе за пределы нормы

if (lot >= Максимальный_лот ) lot=Лот; // ограничение по количеству модификаций

if (lot if (lot > MarketInfo(Symbol(),MODE_MAXLOT)) lot=MarketInfo(Symbol(),MODE_MAXLOT); // ограничение по максимально допустимому лоту

//------------------------------------------------------------
// +++++++++++ модификация лота +++ конец ++++++++++++++++++++




Гриня написал, что в коде не хватает OrderSend (Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, comment, MagicNumber, 0, Blue); куда ее вставить? Вконце кода?
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Vanka-Yanka приведённый код - это расчёт лота и всё. этот код нужно вставлять в то место в сове, где уже принято решение на открытие сделки, т.е. если сова работает, то там уже есть ОрдерСенд - вот перед ним и вставлять.
Вы заставляете нас решать вслепую некие ребусы. Задачу интеграции мартина в сову можно решать значительно проще и разными приёмами.
Ссылка на сообщение
Поделиться на другие сайты

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

Добрый день. Написал if(StopLoss>0) Sleep(1800000); чтоб при срабатывании стоплосса на 30 минут засыпал советник и не входил в сделки , но не срабатывает функция(не засыпает). Что посоветуете?

if (Bid >= PriceHigh - Indent*Point && StochZone >= 70 && CountSell() == 0)
{
RefreshRates();
SL = NormalizeDouble(Bid + StopLoss * Point, Digits);
TP = NormalizeDouble(Bid - TakeProfit * Point, Digits);

ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, comment, MagicNumber, 0, Red);
if(ticket>0)

{
if(StopLoss>0) Sleep(1800000);
if(OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES) == true)
OrderModify(OrderTicket(),OrderOpenPrice(), SL, TP,0,CLR_NONE);

}
}


if (Ask {
RefreshRates();
SL = NormalizeDouble(Ask - StopLoss * Point, Digits);
TP = NormalizeDouble(Ask + TakeProfit * Point, Digits);

ticket = OrderSend (Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, comment, MagicNumber, 0, Blue);
if(ticket>0)

{
if(StopLoss>0) Sleep(1800000);
if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES) == true)
OrderModify(OrderTicket(),OrderOpenPrice(), SL, TP,0,CLR_NONE);

}
}

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Гриня
1. не советую использовать Слип и тем более на 30 минут.
2. if(StopLoss>0) Sleep(1800000); - это совсем не то, что Вы думаете. Отследить срабатывание СЛ нужно совсем по другому
нужно отслеживать ОрдерКлозеТайм > 0 (по текущему ордеру)
Ссылка на сообщение
Поделиться на другие сайты

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

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

double Lots()
{
double lot = Lots;
int total = OrdersHistoryTotal();
for (int i = 0; i {
OrderSelect(i, SELECT_BY_POS, MODE_HISTORY);
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
if (OrderProfit() > 0 )

lot = Lots;
if( OrderProfit()
lot = lot * LotMnogitel;

}
}
return(lot);
}

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Sharovik С этим кодом бот тормозить будет сильно. Надо цикл перебора ордеров с конца до 0 делать и прекращать цикл сразу после расчёта лота.
Условие будет такое - если первый найденный ордер лоссовый - выход, если профитный, то выставим флаг bool flPr = true; и ищем дальше. если второй найденный ордер лоссовый и флаг flPr == true, то мартин, иначе - выход.
Ссылка на сообщение
Поделиться на другие сайты

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

сделал так, конечно понимаю что код громоздкий но по другому не умею. Вроде не особо тормозит бот. Спасибо.

double Lots()
{
double lot = Lots;
int total = OrdersHistoryTotal();
for (int i = 0; i {
OrderSelect(i, SELECT_BY_POS, MODE_HISTORY);
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{

OrderProfit1 =OrderProfit();
OrderLots1= OrderLots();
}

OrderSelect(i-1, SELECT_BY_POS, MODE_HISTORY);
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{

OrderProfit2=OrderProfit();
OrderLots2=OrderLots();
}


if (OrderProfit1 > 0 )
lot = Lots;

if( OrderProfit1
lot=Lots;

if( OrderProfit1


lot = lot + Lots;




}


return(lot);
}

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

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

Всем привет. Подскажите по заданию 3 вроде получилось сделать сову. Но я не как не могу понять как написать во входе в позицию
если цена выше Линии Хая, а потом пробила ее сверху вниз - вот тогда чтоб открылся ордер на продажу. Спасибо)

Experts_TMA_middle.ex4
Experts_TMA_middle.mq4

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

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


Всем привет. Подскажите по заданию 3 вроде получилось сделать сову. Но я не как не могу понять как написать во входе в позицию
если цена выше Линии Хая, а потом пробила ее сверху вниз - вот тогда чтоб открылся ордер на продажу. Спасибо)



Если предыдущий бар закрылся выше линии канала, а текущая цена - ниже линии канала = пробой сверху вниз
Ссылка на сообщение
Поделиться на другие сайты

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



Всем привет. Подскажите по заданию 3 вроде получилось сделать сову. Но я не как не могу понять как написать во входе в позицию
если цена выше Линии Хая, а потом пробила ее сверху вниз - вот тогда чтоб открылся ордер на продажу. Спасибо)



Если предыдущий бар закрылся выше линии канала, а текущая цена - ниже линии канала = пробой сверху вниз


Спасибо, сейчас попробую

Добавлено: 18-04-2015 16:22:56




Всем привет. Подскажите по заданию 3 вроде получилось сделать сову. Но я не как не могу понять как написать во входе в позицию
если цена выше Линии Хая, а потом пробила ее сверху вниз - вот тогда чтоб открылся ордер на продажу. Спасибо)



Если предыдущий бар закрылся выше линии канала, а текущая цена - ниже линии канала = пробой сверху вниз


Спасибо, сейчас попробую

Вроде получилось:
if (Close[1] > PriceHigh && Bid Но что то не понятно через некоторое время открывает кучу ордеров в бай

EURUSDM5.png

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

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

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

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




Всем привет. Подскажите по заданию 3 вроде получилось сделать сову. Но я не как не могу понять как написать во входе в позицию
если цена выше Линии Хая, а потом пробила ее сверху вниз - вот тогда чтоб открылся ордер на продажу. Спасибо)



Если предыдущий бар закрылся выше линии канала, а текущая цена - ниже линии канала = пробой сверху вниз


Спасибо, сейчас попробую

Добавлено: 18-04-2015 16:22:56




Всем привет. Подскажите по заданию 3 вроде получилось сделать сову. Но я не как не могу понять как написать во входе в позицию
если цена выше Линии Хая, а потом пробила ее сверху вниз - вот тогда чтоб открылся ордер на продажу. Спасибо)



Если предыдущий бар закрылся выше линии канала, а текущая цена - ниже линии канала = пробой сверху вниз


Спасибо, сейчас попробую

Вроде получилось:
if (Close[1] > PriceHigh && Bid Но что то не понятно через некоторое время открывает кучу ордеров в бай



sanyasan, нужно понимать, что на бай у Вас аналогично задано условие, только уже идет подсчет ордеров на бай. Думаю, что у Вас не правильно работает ф-ция CountSell(). Выведите её значение в комент или принт, тога будет ясно.
Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

Войти

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

Войти

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


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

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