Пишем простейшего эксперта
На мой взгляд, наиболее простым способом для новичка изучить процесс написания экспертов будет подробный разбор специально написанных мной для этой цели экспертов. На данный момент (да и далее в своих статьях) я не буду ставить перед собой цель написать супер гениального эксперта, который способен будет зарабатывать десятки процентов в месяц и делать это стабильно. Основная цель - показать все аспекты программирования экспертов, а не написать "грааль".
Итак, внимательно изучите код эксперта ниже, но не волнуйтесь, что на данный момент Вам пока еще ничего не понятно. В следующих выпусках я подробно разберу каждую строчку этого эксперта.
//+------------------------------------------------------------------+ //| My First Expert.mq4 | //| Copyright © 2006, Andrey Vedikhin | //| http://www.vedikhin.ru | //+------------------------------------------------------------------+ #property copyright "Copyright © 2006, Andrey Vedikhin" #property link "http://www.vedikhin.blog-forex.org" #define STATE_SQUARE 0 #define STATE_LONG 1 #define STATE_SHORT 2 //---- input parameters extern int MAPeriod=13; extern double LotsNumber=1.0; //---- глобальные переменные int CurrentState; int MyOrderTicket; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- if (iMA(NULL, 0, MAPeriod, 0, MODE_EMA, PRICE_CLOSE, 0) > Close[0]) CurrentState = STATE_SHORT; else CurrentState = STATE_LONG; MyOrderTicket = 0; //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { //---- int err; double MA; MA = iMA(NULL, 0, MAPeriod, 0, MODE_EMA, PRICE_CLOSE, 0); if ( CurrentState == STATE_LONG) { if (MA > Close[1]) //скользящая средняя выше цены закрытия { CurrentState = STATE_SHORT; //переворачиваемся в продажу //---закрыть позицию, если была открыта if ( MyOrderTicket != 0) { if (!OrderClose(MyOrderTicket, LotsNumber, Bid, 3, CLR_NONE)) { err = GetLastError(); Print("Ошибка при закрытии позиции: ", err); return(0); } MyOrderTicket = 0; } RefreshRates(); //--- длинная позиция была закрыта успешно //--- теперь откроем позицию в продажу //--- проверим на наличие свободных средств if (!CheckForEnoughMargin()) return(0); MyOrderTicket = OrderSend(Symbol(), OP_SELL, LotsNumber, Bid, 3, 0, 0, NULL, 0, 0, CLR_NONE); if (MyOrderTicket<0) { err = GetLastError(); Print("Ошибка при открытии позиции: ", err); MyOrderTicket = 0; } } } else { if (MA < Close[1]) //скользящая средняя ниже цены закрытия { CurrentState = STATE_LONG; //переворачиваемся в покупку //---закрыть позицию, если была открыта if ( MyOrderTicket != 0) { if (!OrderClose(MyOrderTicket, LotsNumber, Ask, 3, CLR_NONE)) { err = GetLastError(); Print("Ошибка при закрытии позиции: ", err); return(0); } MyOrderTicket = 0; } RefreshRates(); //--- короткая позиция была закрыта успешно //--- теперь откроем позицию в покупку //--- проверим на наличие свободных средств if (!CheckForEnoughMargin()) return(0); MyOrderTicket = OrderSend(Symbol(), OP_BUY, LotsNumber, Ask, 3, 0, 0, NULL, 0, 0, CLR_NONE); if (MyOrderTicket<0) { err = GetLastError(); Print("Ошибка при открытии позиции: ", err); MyOrderTicket = 0; } } } //---- return(0); } //+------------------------------------------------------------------+ //| Проверка наличия свободной маржи | //+------------------------------------------------------------------+ bool CheckForEnoughMargin() { if (GetOneLotMargin(Symbol())*LotsNumber<AccountFreeMargin()) return(true); else return(false); } //+-------------------------------------------------------------------+ //| Вычисление необходимой маржи на один лот| //+-------------------------------------------------------------------+ double GetOneLotMargin(string s) { double p; if ((StringSubstr(s, 0, 3) == "EUR")||(StringSubstr(s, 0, 3) == "GBP")|| (StringSubstr(s, 0, 3) == "AUD")||(StringSubstr(s, 0, 3) == "NZD")) { if (!IsTesting()) return(MarketInfo(s, MODE_LOTSIZE)*MarketInfo(StringSubstr(s, 0, 3)+"USD", MODE_BID)/AccountLeverage()); else { p = iClose(StringSubstr(s, 0, 3)+"USD", Period(), iBarShift(StringSubstr(s, 0, 3)+"USD", Period(), CurTime(), true)); return(MarketInfo(s, MODE_LOTSIZE)*p/AccountLeverage()); } } if (StringSubstr(s, 0, 3) == "USD") return(MarketInfo(s, MODE_LOTSIZE)/AccountLeverage()); if (s == "CHFJPY") { p = iClose("USDCHF", Period(), iBarShift("USDCHF", Period(), CurTime(), true)); return(MarketInfo(s, MODE_LOTSIZE)/(AccountLeverage()*p)); } return(77777777777777777777777777.0); } //+------------------------------------------------------------------+
Благодарю Вас за то, что Вы мужественно дочитали до этой строчки. Как я уже упомянул ранее, в следующих выпусках я очень подробно остановлюсь на каждой строчке этого эксперта, и проясню Вам все непонятные моменты.
Все статьи по теме "Пишем советников для MetaTrader 4".
- Механическая торговая система - миф или реальность?
- С чего начать при написании советника:
- Создаем нового советника - Настраиваем параметры. - Язык MetaQuotes Language 4:
Комментарии по теме "Пишем простейшего эксперта"
Здравствуйте
Ваша статья самое лучшее из того, что я нашел в инете по написанию советников на MQL-4, но тоже не идеал. Не знаю почему, но нормальных учебников для начинающих очень мало. Ведь все когда-то постигали азы. Кому-то материал объясняли преподаватели, другие же учились сами по книгам.
Как- то появилась мысль создать свой сайт. Начал изучать язык HTML, накачал книг и стал читать, когда читал всю эту макулатуру, то возникло такое впечатление, что все эти книги написаны задом на перёд (короче через одно место). Но мне всё же повезло среди всего этого хлама нашел учебник «HTML– первые шаги» автор Алленова Наталья. Учебник простой и легко читаемый, а главное он пошагово объясняет принцип построения Web-страницы, затем к этому учебнику добавился справочник «HTML в примерах» автор А. Климов, в котором приводилось название тэга, что он делает, в каких случаях используется, а затем несколько примеров с использованием донного тега.
Сейчас у меня возникла та же самая ситуация, как и при изучении HTML Накачал книги по программированию на MQL-4, а толку ноль.
Ведь можно же написать учебник нормальным доступным языком для тех кто ничего не знает о программировании.
Что касается вашего учебного пособия, то согласитесь, что оно скорее для тех кто уже писал советники на Си…. хотя на главной странице Вашего сайта и красуется надпись «Механические торговые системы.
Самое полное руководство по программированию советников для начинающих». Вы приводите пример советника достаточно сложного в написании (для меня, по крайней мере).
Хотя можно было использовать в качестве примера ТС, которая только покупает. Допустим по одному лоту, бай, профит/стоп – 20 пунктов. Цена дошла до отметки в 20 пунктов и тут же идет следующая покупка
Просто? Проще не бывает. А затем дополняем и не много усложняем, добавив продажи. Допустим после нескольких не удачных бай идет сел. И только после этого мы добавляем к советнику индикатор скользящая средняя. А в итоге получаем предложенный Вами советник.
И еще один момент. Это хорошо, что Вы приводите в тексте не только команды относящееся к данному советнику, но и дополнительно объясняете другие.
Вот только объяснение походу дела, и как бы до кучи всего остального «мол, раз уж затронули эту тему» не много напрягает и рассеивает внимание. В итоге приходится по тексту выискивать, тот материал , который касается именно этого эксперта. Хотя все эти сведения и какие-то дополнительные нюансы в написании советника можно было бы вынести в отдельный справочный материал.
И тем не мение спасибо до свидания.
Автор: Дмитрий | 04.08.2007 19:43
Добрый день хочется узнать существует ли книга где бы была представлена наиболее полное издание по Програмированию в среде MOL4. Начиная с азов и заканчивая полноценных МТ?
Автор: Батыршин Валерий | 20.11.2007 16:34