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

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


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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
KriKs-Fx у функций есть "вызов" и "тело-описание", так вот тело должно описываться за скобками основной функции - на пустом месте, например:
void OnTick()
{
//здесь вызываем функцию CountBuy()
if ( Ask .....
} - закрывающая скобка основной функции ( скобки - очень важная часть MQL )

int CountBuy() { ... здесь описание функции - её тело, заканчивается - return( N ); } - закрывающая скобка функции
  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

Перейти

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

Перейти

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

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

Благодарю Вас Oll с скобками я действительно лоханулся. Ошибок больше нет. Но в тесторе на любом ДЦ сова выставляет только один ордер без SL and TP И всё.. дальше ступор. И предупреждения... OrderModify (ticket,OrderOpenPrice(),SL,TP,0); и предупреждение return value of 'OrderModify' should be checked. OrderSelect(trade,SELECT_BY_POS,MODE_TRADES); предупреждение...return value of 'OrderSelect' should be checked

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
KriKs-Fx предупреждения можно игнорировать, если мешают, создайте переменную bool hren; и все функции, требующие контроля, вызывайте так:
hren = OrderSelect(...); и предупреждений не будет.
По поводу 1 ордера - добейтесь выставления СЛ/ТП и будут другие ордера, проверьте правильность расчёта СЛ/ТП
Ссылка на сообщение
Поделиться на другие сайты

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

Доброго времени суток, столкнулся с ошибкой, не закрывает на обратный сигнал, НИКАК не увижу, прошу помощи

///условия открытия

if(CountSell()==0 && Bid Bid SD163 - max_indent*Point)//lastBarTime != Time[0]
{
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("Ошибка на продажу");
}
}
if(CountBuy()==0 && Ask > SD163 && BuySignal()==true &&
Bid >= SD163 + min_indent*Point && Bid {
ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, "Sloper", Magic, 0, Blue);
if (ticket>0)
{
TP = NormalizeDouble(Ask + TakeProfit*Point, Digits);
SL = NormalizeDouble(Ask - StopLoss*Point, Digits);

if (OrderSelect(ticket, SELECT_BY_TICKET))
if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))
Print("Ошибка на покупку");
}
}
//условия обратного сигнала
if(z==true)
{
if ( CountSell()>0 && Ask > SD163 && BuySignal()==true &&
Bid >= SD163 + min_indent*Point && Bid {
for(int i = OrdersTotal() -1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderMagicNumber() == Magic && OrderType() == OP_SELL )
if(!OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, Black))
Print("Ошибка");
}
}
}
if ( CountBuy()>0 && Bid Bid SD163 - max_indent*Point)
{
for(int i = OrdersTotal() -1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderMagicNumber() == Magic && OrderType() == OP_BUY)
if(!OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, Black))
Print("Ошибка");
}
}
}
}


Добавлено: 21-04-2018 07:03:14

Как такое может быть в будни работает, в выходные нет???

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

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

Может из-за расширения спреда в тестере? ведь у Вас в условиях:
Ask > SD163 , а Bid

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

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

я и без пробовал

if(CountSell() == 0  &&  SellSignal()==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("Ошибка на продажу");
}
}
if( CountBuy() == 0 && BuySignal()==true)
{
ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, "Sloper", Magic, 0, Blue);
if (ticket>0)
{
TP = NormalizeDouble(Ask + TakeProfit*Point, Digits);
SL = NormalizeDouble(Ask - StopLoss*Point, Digits);

if (OrderSelect(ticket, SELECT_BY_TICKET))
if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))
Print("Ошибка на покупку");
}
} //условия обратного сигнала
if(z==true)
{
if ( CountSell()>0 && BuySignal()==true )
{
for(int i = OrdersTotal() -1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderMagicNumber() == Magic && OrderType() == OP_SELL )
if(!OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, Black))
Print("Ошибка");
}
}
}
if ( CountBuy()>0 && SellSignal()==true)
{
for(int i = OrdersTotal() -1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderMagicNumber() == Magic && OrderType() == OP_BUY)
if(!OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, Black))
Print("Ошибка");
}
}
}
}
********************
bool SellSignal()
{
//если последний столбик красный, а предпоследний зеленый
if(Reds(1)!=EMPTY_VALUE && (Blacks(2)!=EMPTY_VALUE || Greens(2)!=EMPTY_VALUE)) return(true);

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

else return (false);


Добавлено: 21-04-2018 12:28:43

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

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

^:)^ ^:)^ ^:)^ ^:)^ ^:)^ ^:)^ ^:)^ ^:)^ ^:)^ ^:)^ ^:)^


Добавлено: 21-04-2018 12:54:45

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

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

альтернативный вариант закрытия ордера в сове работающей по Trailing-stop на примере урока № 5.

там ситуация следующая, по условию if (CountBay() + CountSell() == 0 && Bid >= maprice) открывается ордер и срабатывает следующая ф-ция Trailing (). по которой и происходит закрытия ордера.

а хотелось бы получить в общем такой вариант, что бы было двойное условие выхода: по Trailing (), но пока не выпадет дополнительное условия на выход Bid
попробовал например так, но не сработало:

Спойлер

...
if (CountBay() + CountSell() == 0 && Bid >= maprice && last_type != OP_BUY )
{
ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippadge, 0,0,"РОБОТ", Magic, Blue);
if (ticket > 0)
Print ("ошибка открытия ордера на бая");
}

//------------------- + закрытие

while( Bid >= maprice)
Trailing ();

if (Bid 0 )
{
for(int i = OrdersTotal() -1; i>=0; i-- )
{
if ( OrderSelect( i,SELECT_BY_POS, MODE_TRADES))
{
if ( OrderMagicNumber() == Magic && OrderType()== OP_BUY )
if (! OrderClose( OrderTicket(), OrderLots(), Bid , Slippadge, Black ))
Print("ошибка закрытия ордера на покупку");

}}}


...
но вопрос вроде как решился
поставив ф-ции на закрытие:
Спойлер

...
Trailing ();
close_OP_BUY();
close_OP_SELL();
//----------

void close_OP_BUY()
{
if (Bid 0 )
{
for(int i = OrdersTotal() -1; i>=0; i-- )
{
if ( OrderSelect( i,SELECT_BY_POS, MODE_TRADES))
{

if ( OrderMagicNumber() == Magic && OrderType()== OP_BUY )
if (! OrderClose( OrderTicket(), OrderLots(), Bid , Slippadge, Black ))
Print("ошибка закрытия ордера на покупку");


}}} }
//+------------------------------------------------------------------+


но висит еще такая идея как совместить сл, тп и Trailing(). например работает Trailing() и при достижение проеденного кол -ва пунктов он выходил бы из сделки в любой ситуации. то есть наверное надо как то задать что бы на каком то его Trailing() уровне, шаг -TralingStep стал = 0. наверное так, я так понимаю?

урок_№5.mq4

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

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

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

Я думаю если цена прошла заданное кол-во пунктов, надо не тралом заморачиваться, а просто закрыть ордер.
и в Вашем коде ошибочка:
ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippadge, 0,0,"РОБОТ", Magic, Blue);
if (ticket > 0)
Print ("ошибка открытия ордера на бая");
когда тикет > 0 - это значит открылся ордер, а вот когда
Ссылка на сообщение
Поделиться на другие сайты

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

Хочу сам написать индикатор (MQL4), но данные для массивов надо брать из web-ресурса. Подскажите что почитать, где поюзать???

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

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


Хочу сам написать индикатор (MQL4), но данные для массивов надо брать из web-ресурса. Подскажите что почитать, где поюзать???


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

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

Добрый день. Надеюсь пишу по адресу. Опишу ситуацию: пишу советника который открывал бы ордера по показаниям индикаторов и закрывал бы позиции через определенное время. Так вот в какой то момент на тестах советник стал открывать только один ордер за весь период и закрывает его. Думал косяк в коде(возможно и в коде тоже), нашел и скачал сторонний советник частично похожий, так и он на тесте открывает и закрывает только один ордер за весь период тестирования, ордер открытия на обоих советниках только buy. Может это быть косяком компилятора или МТ4?

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

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
0ll да, сначала открывалось как надо, единственное закрывалось раньше, а сейчас так же раньше, но только один ордер открывается, тусовал строки по разному, менял местами блоки, в любом порядке кода открывается только buy. Попутно вопрос: существует ли МТ4 без привязки к брокеру, чтобы избежать косяков со сборкой брокера?
Ссылка на сообщение
Поделиться на другие сайты

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

У нас на форуме есть коллекция чистых билдов МТ4 с практически до-исторических времён :d
читать здесь

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
0llСпасибо
еще вопрос)): как проще прописать в условии индикатора серию из свечей одного направления(например 5 черных свечей)? первое что пришло на ум Open[n]>Close[n], но это долго и объемно получается.
и сразу еще вопросик: какие существуют варианты вывода сигнала индикатора, а именно запись в файл? Изменено пользователем Sacred70
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Sacred70 У Вас идут свечи одна за другой, ведь по другому ни как - значит просто поставьте счётчик, типа:
if ( Close[1] > Open[1] ) { countB++; countS = 0; }
else { countS++; countB = 0; }
а теперь анализируем счётчики
if ( countB == 5 ) // делаем что-то
Ссылка на сообщение
Поделиться на другие сайты

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

самое простое решение это сохранить направление последнего открытого ордера или тикет (если потом мартина прикручивать)
добавьте глобальную переменную int lastType = -1;
Когда открываете ордер (BUY) делаете проверку if ( lastType != OP_BUY ) { открываем Бай ...; lastType = OP_BUY; }

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

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

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

Подскажите, как подключить индикатор MovingAverage, не к графику цены, а к индикатору что находится в "подвале".

Спасибо.

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

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

Привет! Подскажите как в коде обрисовать ситуацию : есть некий гэп и далее цена проходит определенное расстояние в пунктах.

Спойлер

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

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

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

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

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

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

Войти

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

Войти

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


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

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