Получить 100$ на счет бесплатно!!

Получить депозит форекс за общение на форуме Бездепозитный бонус 100$

Пытаюсь научиться писать на MQL4

  
Сообщений: 32
Добрый день дорогие форумчане.
Сегодня решил наконец то поделиться своими проблемами :hoho:
Решил учиться MQL4 на примерах.
Итак начнём. первым делом я решил написать робота открывающего позицию buy в 14.01.
С чем я столкнулся
1. Может кому то понадобится
Открытие ордера
[code=php]OrderSend(Symbol(),OP_Buy,0.1,Ask,3,Bid-30*Point,Ask+40*Point,"Ордер в 14.01",1993,0,Orange); [/code]
Тут соответственно финансовый инструмент,покупка,лот,цена открытия,отклонение цены,стоплосс,тейкпрофит,комментарий,магический номер,срок истечения отложенного ордера,цвет.
Получилось так

Прошу проверить код


[code=php]
extern int ExpertID=1;
extern int oHour=14;
extern int oMinute=1;

int Start
if (Hour()>=oHour && Minute()>=oMinute)
{ OrderSend(Symbol(),OP_Buy,0.1,Ask,3,Bid-30*Point,Ask+30*Point,"Ордер в 14.01",1993,0,Orange);}
else
{ return(); }
[/code]
Сообщений: 0
код, наверное. все-таки - не РНР, а MQL4 - или я чего-то недопонял?Насколько я знаю - в МТ4 используется Мокл - т.е. MQL4, а не PHP или Java, но. может я что-то не знаю? Сарказм связан с тем, что писать нужно корректно - ведь форум читают и люди, только начинающие осваивать программирование. Насчет же предложенного кода - по устоявшемуся обычаю стоп-лосс и тейк-профит выносят во внешние переменные - это корректнее, поскольку позволяет при работе советника корректировать эти параметры.
Сообщений: 0
Прошу извинить за сарказм в отношении надписи код РНР - это делается автоматически. Еще раз - прошу прощения. В остальном - код корректен. Вообще же - написали советник - откомпилируйте его и поставьте в тестере стратегий. В режиме визуализации - и Вы сами сможете наблюдать, как ставятся ордера, убираются ли с течением времени отложенные , в общем - как Ваш советник будет себя вести в торговле.
Сообщений: 0
На мой взгляд, именно использование автоматических средств торговли переводит трейдера из разряда любителей в славные ряды профессионалов.
Давайте задумаемся: подавляющее большинство из форекс-трейдеров использует для совершения сделок терминал MetaTrader 4. Огромное преимущество этого терминала — наличие встроенного языка программирования MQL4 (MetaQuotes Language 4). И несмотря на это, многие трейдеры часами сидят у монитора, ожидая, когда поступит сигнал на покупку или продажу! Вам не жалко времени, господа?.. :angel:
Как показывает мой опыт, большинство трейдеров торгует на основе технического анализа. Нас интересуют важные ценовые уровни, линии тренда, сигналы индикаторов. И какой же тогда нам смысл сидеть весь день у монитора, если с помощью MQL4 можно создать торгового робота (бота, советника, эксперта - варианты названий тут не играют сути), который сам будет отслеживать все интересующие нас сигналы? Да и отреагирует робот на эти сигналы гораздо быстрее, чем человек! Пусть робот работает, а вы займитесь чем-то более приятным :music:
Еще одно недоразумение — это когда трейдер выставляет ордер вручную. То есть в открывшемся окне указывает тип ордера, Stop-Loss и Take-Profit и т.д. В общем, пока все поля заполнишь, цена может уже так далеко убежать, что и смысла в открытии этой позиции уже не будет… Так почему же не создать набор простейших скриптов, которые будут открывать позиции с нужными параметрами за доли секунды?.. :zlo: :cry:
Наконец, если вы прирожденный аналитик и традиционные технические индикаторы вас не устраивают, MQL4 позволит вам создать свой собственный. Почему бы и нет? :v:
Сообщений: 0
Часто пишут, что главная проблема начинающих трейдеров форекс — психология. Они торгуют бессистемно, под влиянием эмоций и в результате «сливают» депозиты. Я быстро понял: если хочешь быть успешным трейдером, тебе нужна торговая система. Сделки следует совершать только по сигналам торговой системы, отбрасывая в сторону все предчувствия, озарения и соображения. Торговая система командует — ты выполняешь. Даже если не согласен. На форексе, как в армии: приказы не обсуждаются, а исполняются.
«Итак, если у меня будет прибыльная торговая система, я стану успешным трейдером», — решил я. Но где взять такую систему? Я как раз прочёл книгу о технических индикаторах и рассудил так: «Все эти индикаторы созданы умными людьми, которые гораздо лучше меня разбираются в трейдинге. Я должен просто взять один из индикаторов и торговать по его сигналам. Даже если это будет не самый лучший индикатор, в любом случае, медленно или быстро, мой баланс будет расти, а не уменьшаться. Ведь не могли же эти умные люди создать индикатор, который подает ложные сигналы!».
Сегодня я могу сказать, что тогда по незнанию совершил главную ошибку тех, кто торгует по сигналам технических индикаторов (неважно, с помощью советников или вручную). Я не учел, что любой технический индикатор необходимо специально настраивать с учетом условий торговли — валютной пары, таймфрейма, кредитного плеча, лота и размера депозита. Параметры индикатора, которые подойдут для торговли по паре EURUSD на часовом таймфрейме с плечом 1:100, лотом 0.1 и депозитом $2000, не подойдут для депозита $1000. Тем более они не подойдут для другой валютной пары, другого таймфрейма, лота и кредитного плеча.
Если бы я, приступая к торговле по сигналам индикатора, не полагался на стандартные настройки, а подобрал оптимальные параметры именно для моего случая (моей пары, моего таймфрейма, кредитного плеча, лота и депозита), я бы существенно увеличил бы свой депозит.
НЕ ПОВТОРЯЙТЕ МОЮ ОШИБКУ!
Но как подобрать оптимальные параметры для своего индикатора? На самом деле, существует лишь один реальный способ: создать советник, который будет работать на основе этого индикатора, и запустить его оптимизацию в тестере стратегий терминала MetaTrader. Пытаться подбирать параметры индикатора без создания соответствующего советника форекс — это значит обречь себя на месяцы нудной работы, в результате которой вы если и найдете рабочий вариант, он все равно будет не самым лучшим.
Так что без изучения MQL — никуда! Если вы действительно хотите создать торговую систему на основе сигналов технических индикаторов, без овладения MQL ничего у вас не получится. Даже если вы собираетесь торговать вручную и собственно советник вам не нужен, без его создания вы все равно не сможете подобрать оптимальные параметры интересующего вас индикатора.
МедальКубок
Сообщений: 536
vvafree


Прошу проверить код


[code=php]
extern int ExpertID=1;
extern int oHour=14;
extern int oMinute=1;

int Start
if (Hour()>=oHour && Minute()>=oMinute)
{ OrderSend(Symbol(),OP_Buy,0.1,Ask,3,Bid-30*Point,Ask+30*Point,"Ордер в 14.01",1993,0,Orange);}
else
{ return(); }
[/code]



Если вы не возражаете, мне бы хотелось чуть прокомментировать код.
Первое, что бросилось в глаза - это отсутствие фигурных скобок "{" "}" в обрамлении функции start.
Причем название функции start пишется с маленькой буквы s т.к. язык MQL4 регистрозависимый. Это значит, что Start и start для компилятора две различные функции.
Второе. Условие с одной стороны вроде бы верное. Но давайте остановимся по подробнее на том, как интерпритатор будет работать в данном случае.

Ни для кого не секрет, что отрабатывание кода советника/скрипта/индикатора начинается с функции start(). При поступлении нового тика на инструмент (валютную пару) управление передается в функцию start(). Таким образом получается, что на каждом тике при терминальном времени >= 14 часов 1 минута будет выставляться ордер. И это будет продолжаться до 23:59:59.

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

[code=php]
extern int oHour=14;
extern int oMinute=1;

int start(){
if ((Hour()>=oHour && Minute()>=oMinute) && OrdersTotal() == 0)
{ OrderSend(Symbol(),OP_Buy,0.1,Ask,3,Bid-30*Point,Ask+30*Point,"Ордер в 14.01",1993,0,Orange);}
else
{ return(); }
}
[/code]
Сообщений: 0
artamir
Давайте чуть-чуть перефразируем техзадание:
В заданное пользователем время или позже должен открыться только один ордер. До открытия ордера на счете не должно быть ни одного ордера. Разрешены только закрытые/удаленные ордера.
тут есть подводный камень - а если при этом есть-таки на счету другие ордера? насчет же правильного написания функции int start() - мне стыдно, я и не заметил. Приношу извинения и топикстартеру, и благодарю artamir,
МедальКубок
Сообщений: 536
Игорь
тут есть подводный камень - а если при этом есть-таки на счету другие ордера?


То конструкция
[code=php]&& OrdersTotal() == 0[/code]
из условия if не даст открыть ордер. Т.е. ордера не будут открываться до тех пор пока не выполнится условие:
[code=php] if ((Hour()>=oHour && Minute()>=oMinute) && OrdersTotal() == 0)[/code]
МедальКубок
Сообщений: 536
А если уж непременно нужно открыть ордер даже если есть открытые ордера на счете, то для проверки, что мы не выставляли ордеров воспользуемся Magic Number. В примере из поста №6 в ф-ции OrderSend - это параметр = 1993. т.е. уникальное целое число, которое гарантированно остается у ордера, вне зависимости ни от чего.
[code=php]
extern int oHour=14;
extern int oMinute=1;
extern int MN = 1993; //Скорее всего для этой цели была объявлена переменная ExpertID

int start(){
if ((Hour()>=oHour && Minute()>=oMinute) && !isOrderWMN(MN))
{ OrderSend(Symbol(),OP_Buy,0.1,Ask,3,Bid-30*Point,Ask+30*Point,"Ордер в 14.01",MN,0,Orange);}
else
{ return(); }
}

bool isOrderWMN(int magic){
bool res = false;
int t=OrdersTotal();
int i=0;
while(!res && i if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){i++; continue;}
if(OrderMagicNumber() == magic){res=true;}
}
return(res);
}
[/code]

Есть смысл проверить, т.к. писал по памяти :)
Редактировалось: 1 раз (Последний: 12 июля 2013 в 14:38)
МедальКубок
Сообщений: 536
Простой пример работающего советника:
[code=php]
int start(){
Comment("Hello World!");
}
[/code]
Сообщений: 0
artamir
А если уж непременно нужно открыть ордер даже если есть открытые ордера на счете,
- Именно это я и имел в виду.
строку же [code=php]if ((Hour()>=oHour && Minute()>=oMinute) && !isOrderWMN(MN))[/code] я бы переписал примерно так (чтобы избавиться от не особо нужной булевской функции) - [code=php]for (int i=0;i {
bool ourTicket=false;
if ((OrderSelect(i,SELECT_BY_POS))
{
if
{
// проверка на Symbol
if (OrderSymbol()!= Symbol()) continue;
// проверка MagicNumber
if (OrderMagicNumber()!=MagicNumber) continue;
// проверка времени
if ((Hour()>=oHour && Minute()>=oMinute) )
int total=OrdersTotal();
[/code]
Или - так:
[code=php]
for (int i=0;i {
bool ourTicket=false;
if (OrderSelect(i,SELECT_BY_POS) && (OrderSymbol()!= Symbol())
&&(OrderMagicNumber()!=MagicNumber) && ((Hour()>=oHour && Minute()>=oMinute) ) ) continue;
[/code]
Впрочем - тоже могу ошибаться..
Редактировалось: 1 раз (Последний: 13 июля 2013 в 16:43)
МедальКубок
Сообщений: 536
Игорь
for (int i=0;i{
bool ourTicket=false;
if (OrderSelect(i,SELECT_BY_POS) && (OrderSymbol()!= Symbol())
&&(OrderMagicNumber()!=MagicNumber) && ((Hour()>=oHour && Minute()>=oMinute) ) ) continue;


а если нет ордеров на счете? То такая проверка выставит ордер в любое время, если ордеров на счете нет :)
МедальКубок
Сообщений: 536
artamir
if ((Hour()>=oHour && Minute()>=oMinute) && OrdersTotal() == 0)

Смысл этой проверки в том, что Первое, что будет проверяться это терминальное время. Хотя не уверен что терминальное, может быть и локальное. А второе - это проверка на количество ордеров, выставленных советником. Почему вынесено отдельно? это я сделал намеренно, чтоб в последствии можно было бы легко изменить функцию подсчета ордеров. Представьте, что такую функцию нужно использовать в 10-15 различных местах советника. Производя отладку вы вдруг обнаруживаете БАГ!!!
нужно этот баг исправлять в 10-15 местах. А если вынесено в отдельную функцию, то достаточно изменить только в одном месте :)))
Сообщений: 1
Всем форумчанам привет.
Ребята помогите пожалуйста начинающему познавать
азы программирования на MQL4.MT4

Интересует Функция SendMail

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



double MailDrawDown = 20.0; // Указываем значение в процентах %


if(AccountEquity()/AccountBalance()*100>=MailDrawDown)
SendMail("WARNING ACCOUNT !!!",AccountNumber());
{
if(!IsTesting())
return(0);
}

Зарание огромное спасибо.
Медаль
Сообщений: 396
Уважаемые коллеги, помогите если кто сможет решить такую проблему начинающему.
Нужно найти самый дальний от текущей цены ордер BUY или SELL, в общем в зависимости от условий, находим к примеру BUY и закрываем его. Как это осуществить, так понимаю, что для этого нужна какая то функция. Рысканья по просторам сети не дали пока положительного результата.
За раннее спасибо.
Главное верить в себя
В начало страницы 
|
Перейти на форум:
Быстрый ответ
Чтобы писать на форуме, зарегистрируйтесь или авторизуйтесь.

← Назад