Скачать MetaTrader 5

Торговые системы: Универсальный шаблон экспертов

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
MetaQuotes Software Corp.
Модератор
183627
MetaQuotes Software Corp.  

New article Универсальный шаблон экспертов has been published:

Данная статья поможет начинающим трейдерам создавать гибко-настраиваемые эксперты.

Многие трейдеры сталкивалось с проблемой написания своих экспертов. С чего начать? Как задать в коде советника тейк-профит, стоп-лосс или трейлинг-стоп? Как проверить стратегию на работоспособность? В данной статье рассматриваются основные функции для создания экспертов. Возможно для кого-нибудь код трейлинг-стопа окажется полезным.

Author: Вадим Андреевич

Valery V. Chesnokov
1323
Valery V. Chesnokov  
Поясните, пожалуйста, Вашу фразу: "Во-первых - опции задаваемые 0 и 1 вместо true и false помогают Вам оптимизировать советника лучше, качественней". В чём это "лучше, качественней"?
И ещё, в коде if(OrderType()==0) вместо 0 может быть, стоит указать какую-то константу, что-то типа == OP_BUY или == OP_SELL вместо безликого нуля, понимание кода улучшится, как Вы думаете?
Andrey Khatimlianskii
136
Andrey Khatimlianskii  
Мне кажется, статьи, написанные на таком уровне, вообще не стоит публиковать.
Опытному mql-щику они ни к чему, а новичку ничего хорошего не дадут.
Вадим Андреевич
374
Вадим Андреевич  
chv:
Поясните, пожалуйста, Вашу фразу: "Во-первых - опции задаваемые 0 и 1 вместо true и false помогают Вам оптимизировать советника лучше, качественней". В чём это "лучше, качественней"?
И ещё, в коде if(OrderType()==0) вместо 0 может быть, стоит указать какую-то константу, что-то типа == OP_BUY или == OP_SELL вместо безликого нуля, понимание кода улучшится, как Вы думаете?

true & false в оптимизаторе не могут перебираться
Сергей Ковалев
2607
Сергей Ковалев  
komposter:
Мне кажется, статьи, написанные на таком уровне, вообще не стоит публиковать.
Опытному mql-щику они ни к чему, а новичку ничего хорошего не дадут.


В целом поддерживаю. Имеет смысл пересмотреть (а по некоторым показателям сформировать) требования к содержанию и оформлению статей.

Эту статью можно отнести к разряду учебных. В подобных случаях необходимо подробно описывать смысл переменных, указывать построчные поясняющие комментарии, разъяснять необходимость и назначение каждой из функций и т.д. Кроме того, статья должна иметь связный понятный текст. Например, фраза "Первая функция просто проверяет условия, две следующих задают условия. А теперь функция, которая высчитывает уровни стопов, если они заданы не правильно и определяет размер лота" ничего не поясняет, а скорее вводит в заблуждение. Возникает масса вопросов: какие условия? зачем их поверять?, а тем более задавать? в какой части кода что-то задаётся, а что-то проверяется и что именно?, почему уровни стопа заданы неправильно и почему при этом нужно проверять размер лота?

Вывод "Экспертов создавать очень легко" напомнил мне лозунг "Пятилетку на отлично!", отлитый из бетона возле одного ЖБК (высотой ок.3м и длиной ок.15), который имел скорее архитектурное значение, а именно играл роль забора - прямо за ним начиналась мусорная свалка.

Вадим Андреевич
374
Вадим Андреевич  
komposter:
Мне кажется, статьи, написанные на таком уровне, вообще не стоит публиковать.
Опытному mql-щику они ни к чему, а новичку ничего хорошего не дадут.

То, что вы делаете за деньги не дает права ВАМ наседать, чтоб другие не делали бесплатно (премерно около года назад из-за ваших цен и изучил этот язык!)
Andrey Khatimlianskii
136
Andrey Khatimlianskii  
cloud666:
То, что вы делаете за деньги не дает права ВАМ наседать, чтоб другие не делали бесплатно (премерно около года назад из-за ваших цен и изучил этот язык!)
Я рад, что мои цены не только пугают, но и толкают к знаниям! ;)

А по сути вопроса:
Во-первых, я не "наседаю". Я высказал свое мнение. Для этого комментарии к статье и созданы.
Во-вторых, каждый сам решает работать ему бесплатно или за деньги. Я выбрал второй вариант, мне так проще жить.
В-третьих, прежде чем писать за деньги, я 3 года изучал язык и писал бесплатно. Писать на заказ я начал, когда отзывы о моих работах стали положительными.
В-четвертых, я и сейчас иногда пишу бесплатно. Когда у меня есть время и желание или когда появляются интересные идеи. Вы можете наблюдать плоды моей работы в разделах "Статьи" и "Code Base".

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

Когда вы создаете темы на форуме или отвечаете на вопросы, я молчу. Форум перечитывают не все.
А статьи созданы для обучения, и здесь не должно быть "слабого" материала.

Я ничего не имею против вас лично, я просто люблю mql4.com и стараюсь делать все для его процветания.
Без обид ;)
Вадим Андреевич
374
Вадим Андреевич  
komposter:
cloud666:
То, что вы делаете за деньги не дает права ВАМ наседать, чтоб другие не делали бесплатно (премерно около года назад из-за ваших цен и изучил этот язык!)


Я рад, что мои цены не только пугают, но и толкают к знаниям! ;)

А по сути вопроса:
Во-первых, я не "наседаю". Я высказал свое мнение. Для этого комментарии к статье и созданы.
Во-вторых, каждый сам решает работать ему бесплатно или за деньги. Я выбрал второй вариант, мне так проще жить.
В-третьих, прежде чем писать за деньги, я 3 года изучал язык и писал бесплатно. Писать на заказ я начал, когда отзывы о моих работах стали положительными.
В-четвертых, я и сейчас иногда пишу бесплатно. Когда у меня есть время и желание или когда появляются интересные идеи. Вы можете наблюдать плоды моей работы в разделах "Статьи" и "Code Base".

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

Когда вы создаете темы на форуме или отвечаете на вопросы, я молчу. Форум перечитывают не все.
А статьи созданы для обучения, и здесь не должно быть "слабого" материала.

Я ничего не имею против вас лично, я просто люблю mql4.com и стараюсь делать все для его процветания.
Без обид ;)


Просто некоторые функции окажутся полезными для кода некоторых людей. Это просто шаблон, а не слабый код. Так в заголовке и в введении написано. :) Ругаетесь, а сами не внимательны!!! Как и человек пять, которые уже постучали ко мне в АСЮ и спросили как это работает! :)
PSmith
165
PSmith  

Ошибки остались :-(((

   StopLoss=sl;
   TakeProfit=tp;
   if(TakeProfit!=0 && TakeProfit<(MarketInfo(Symbol(),MODE_STOPLEVEL))) // Работает всегда если не задан TP. 
                                                                         // MarketInfo возвращает к-во поинтов 
                                                                         // например 10 или 8
     {
      TakeProfit=MarketInfo(Symbol(),MODE_STOPLEVEL); // TakeProfit = 10
     }
   if(StopLoss!=0 && StopLoss<(MarketInfo(Symbol(),MODE_STOPLEVEL))) // Аналогично. MarketInfo возвращает к-во
                                                                     // поинтов например 10 или 8
     {
      StopLoss=MarketInfo(Symbol(),MODE_STOPLEVEL); // StopLoss = 10
     }
   return(0);

Отсюда получаем

      res=OrderSend(Symbol(), 0, NormalizeDouble(Lot,1), Ask, Slippage,  // И все-таки 0 лучше заменить на OP_BUY !!!
       NormalizeDouble(Ask-StopLoss,4),                           //  StopLoss = Ask-10 = -8.64.. для EURUSD
        NormalizeDouble(Ask+TakeProfit,4), 0, 0, 0, 0);           //  TakeProfit = Ask+10 = 11.36..

Общепринятой практикой, если уж речь зашла о шаблоне, является задание StopLoss и TakeProfit в целых пунктах с последующим умножением на Point.

Вместо

extern double TakeProfit;
extern double TrailingStop;
extern double StopLoss;

Задется

extern int TakeProfit = 0;
extern int TrailingStop = 0;
extern int StopLoss = 0;

Тогда логично получается

int init()
  {
   tp=TakeProfit*Point;
   sl=StopLoss*Point;
   return(0);
  }
...
...
//   StopLoss=sl;
//   TakeProfit=tp;
   if(TakeProfit < MarketInfo(Symbol(),MODE_STOPLEVEL))
     {
      tp=MarketInfo(Symbol(),MODE_STOPLEVEL)*Point;
     }
   if(StopLoss < MarketInfo(Symbol(),MODE_STOPLEVEL))
     {
      sl=MarketInfo(Symbol(),MODE_STOPLEVEL)*Point;
     }
   return(0);

И последнее. OrderSend в таком виде не покатит, потому как StopLoss для ордеров OP_BUY должен быть меньше цены закрытия на StopLevel. А цена закрытия у них это Bid

      res=OrderSend(Symbol(), 0, NormalizeDouble(Lot,1), Ask, Slippage,  // И все-таки 0 лучше заменить на OP_BUY
       NormalizeDouble(Bid-sl,Digits),                           //  StopLoss = Bid - StopLevel - покупки закрываются по Bid!!!
        NormalizeDouble(Ask+tp,Digits), 0, 0, 0, 0);             //  Про йену забыли при округлении?
Аналогично с продажами StopLoss должен быть выше Ask на уровень стопа, потому что продажи закрываются по Ask/
Andrey Khatimlianskii
136
Andrey Khatimlianskii  
cloud666:
Просто некоторые функции окажутся полезными для кода некоторых людей. Это просто шаблон, а не слабый код. Так в заголовке и в введении написано. :)
То, что это шаблон, не должно означать что код в нем должен быть слабым.
Наоборот, шаблоны используются новичками (для обучения и для написания своих экспертов) и код в них должен быть профессиональным, хорошо комментированным и однозначным.

cloud666:
Ругаетесь, а сами не внимательны!!! Как и человек пять, которые уже постучали ко мне в АСЮ и спросили как это работает! :)
Когда статья написана хорошо, вопросов возникает исключительно мало.
Поэтому в статьях, расчитанных на "чайников", подробно разжевывается каждое понятие и каждая строка кода.

В этой статье что-то понять тяжело даже опытному пользователю, приходится собирать обрывки фраз и додумывать. Без базы знаний (а у новичков ее нет!) использовать этот "шаблон" сложно и опасно.
Dmitriy
18
Dmitriy  
:(((  Мдя...
Сколько срубил???
Маладца.
___
PS: Ничё конструктивного в голову не приходит. Завидую сдержанности и терпению отписавшихся здесь.
Администрации - фи.
12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий