Скачать MetaTrader 5

Обсуждение статьи "Написание советника в MQL5 с использованием объектно-ориентированного подхода"

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Нет компьютера под рукой? Переписывайся с друзьями с помощью телефона!
MetaQuotes Software Corp.
Модератор
181050
MetaQuotes Software Corp. 2010.07.12 17:55 

Опубликована статья Написание советника в MQL5 с использованием объектно-ориентированного подхода:

Эта статья посвящена использованию объектно-ориентированного подхода для создания советника, рассмотренного в статье "Пошаговое руководство по написанию советников для начинающих". Большинство людей думают, что это сложно, но могу вас заверить, что после прочтения этой статьи вы сможете написать свой собственный советник на основе объектно-ориентированного похода.

Автор: Samuel

Stanislav Korotky
17867
Stanislav Korotky 2010.07.13 14:03  

В общем, неплохо, но слегка хромает следование лозунгу ООП, использованному в названии. Например, зачем стоплосс, тейк и цены вынесены вне класса? STP и TKP просятся в члены, нужен метод setSLTP; latest_price и уровни - считать внутри openBuy/openSell. Сами они написаны крайне нерационально - там желателно оставить только один if с вызовом MarginOK, а внутри неё добавить первой строкой проверку if(Chk_Margin == 0) return(true);

И еще мелочь. Зачем Chk_Margin объявлена int-ом, хотя по смыслу используется только как bool? Лучше описать минимальным достаточным типом, а то возникают вопросы при чтении исходника, что будет если вдруг Chk_Margin == 2, 3 и т.д.

Aleksandr Kotlyarov
617
Aleksandr Kotlyarov 2010.07.14 09:26  
С указанной парой на указанном периоде с входными параметрами по умолчанию не получается такого красивого графика баланса. У автора были другие котировки? Нельзя ли приложить входные параметры, с которыми был получен такой график?

Anatoli Kazharski
56806
Anatoli Kazharski 2010.07.16 20:08  
capr:
С указанной парой на указанном периоде с входными параметрами по умолчанию не получается такого красивого графика баланса. У автора были другие котировки? Нельзя ли приложить входные параметры, с которыми был получен такой график?

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

 

Artem
306
Artem 2010.07.22 16:50  

конструкция вызывает недоумение

   if(Buy_Condition_1 && Buy_Condition_2 && Buy_Condition_3 && Buy_Condition_4)
     {
       return(true);
     }
     else
     {
       return(false);
     }
Vladimir Batrudinov
4924
Vladimir Batrudinov 2010.07.22 17:01  
ortv:

конструкция вызывает недоумение

А чем именно она так вам не нравится? Конечно, в контексте кода я ее не видел...
Artem
306
Artem 2010.07.22 17:44  
Interesting:
А чем именно она так вам не нравится? Конечно, в контексте кода я ее не видел...

разве не так обычно пишут в таких случаях?

return(Buy_Condition_1 && Buy_Condition_2 && Buy_Condition_3 && Buy_Condition_4);
Vladimir Batrudinov
4924
Vladimir Batrudinov 2010.07.22 18:41  
ortv:

разве не так обычно пишут в таких случаях?

Можно и так, если код воспроизведен точно и там нет больше ничего в обработке...
Yedelkin
4532
Yedelkin 2010.08.23 13:22  

Немного не понял следующую часть кода:

// Скопируем цену закрытия предыдущего бара (бар 1) в соответствующую переменную эксперта
   Cexpert.setCloseprice(mrate[1].close);  // цена закрытия бара 1
//--- Проверка наличия позиции на покупку
   if (Cexpert.checkBuy()==true)
   {
      if (Buy_opened) 
         {
            Alert("У нас уже есть позиция на покупку!!!"); 
            return;    // Не добавляем к длинной позиции
         }
      double aprice = NormalizeDouble(latest_price.ask,_Digits);
      double stl    = NormalizeDouble(latest_price.ask - STP*_Point,_Digits);
      double tkp    = NormalizeDouble(latest_price.ask + TKP*_Point,_Digits);
      int    mdev   = 100;
      // размещаем ордер
      Cexpert.openBuy(ORDER_TYPE_BUY,Lot,aprice,stl,tkp,mdev);
   }
Если мы собираемся открывать позицию на покупку, то ориентироваться следует на цену latest_price.ask, но при выставлении стоплосса и тейкпрофита для такой позиции - на цену latest_price.bid. Правильно? Почему же тогда в тексте кода стоплосс и тейкпрофит выставляются исходя из цены ask? Это - опечатка или особенность конкретной стратегии (в отношении открытия позиции на продажу код имеет аналогичную конструкцию)?
Vladimir Batrudinov
4924
Vladimir Batrudinov 2010.08.23 15:50  
Yedelkin:

Немного не понял следующую часть кода:

Если мы собираемся открывать позицию на покупку, то ориентироваться следует на цену latest_price.ask, но при выставлении стоплосса и тейкпрофита для такой позиции - на цену latest_price.bid. Правильно? Почему же тогда в тексте кода стоплосс и тейкпрофит выставляются исходя из цены ask? Это - опечатка или особенность конкретной стратегии (в отношении открытия позиции на продажу код имеет аналогичную конструкцию)?

Тут такая логика (скорей всего, я тоже ей обычно пользуюсь):

1. Цена открытия для Buy считается по Ask (и это верно);

Допустим мы открываемся по цене 1,27 по EURUSD

2. При открытии позиции мы получаем разницу равную спреду, для Buy это Ask-Bid (потенциальный убыток если закрыть по текущей цене);

Допусти что spred у нас равнен 5 пунктов. Таким образом Bid при открытии будет на 1,2695 (верно?)

3. Закрытие Long-ов у на происходит по цене Bid (и это вполне логично)

Таким образов когда Bid выйдет на 1,27 мы получаем БУ по позе (верно?)

4. Но нам то нужно еще и профита получить (пунктов 100 в стандартной котировки).

То есть TP у нас должно быть выше чем Open на 100 pips. В нашем случае это 1,28 (верно?)

При этом TP сработает если Bid (не Ask) достигнет этих самых 1,28...

5. SL же тоже нужно ставить (допустим он у нас 50 pips). Значит в нашем примере он будет располагаться на 1,2650 (50 pips ниже Open)

При каких условиях сработает SL?

По логике вещей он должен сработать тогда когда цена пройдет эти самые 50 пунктов против нас (то есть Ask в монет закрытия по SL должен по логике вещей быть на этих самых 1,2650).

Где же в таком случае должен быть Bid? А он в это время будет располагаться на 1,2645 (ведь Spred по условию у нас 5 pips)

Вспоминая о том что Long-и фиксируются

6. Давайте теперь посмотрим на то, что происходит на самом деле (для примера возьмем рыночное открытие лонга в MQL4)

//Взято из справки по OrderSend
ticket=OrderSend(Symbol(),OP_BUY,1,Ask,3,Bid-25*Point,Ask+25*Point);

Что мы тут видим

Цена открытия считается по ask, SL считается по Bid, а TP по Ask.

в нашем случае мы получим вот такой шаблон

OrderSend(Symbol(),OP_BUY,1,Open = Ask,3,SL = Bid-50*Point,TP Ask+100*Point);

Подставим сюда наши данные:

OrderSend(Symbol(),OP_BUY,1,1.2700,3,1.2695-50*Point,TP 1.2700+100*Point);

Что получается в итоге - Open = 1.2700 SL= 1.2645 TP 1.28

PS

Сравним с исходными данными:

Приказ - Open = 1.2700 SL= 1.2645 TP 1.28

модель - Open = 1.2700 SL= 1.2645 TP 1.28

Yedelkin
4532
Yedelkin 2010.08.23 22:50  
Interesting:

Тут такая логика (скорей всего, я тоже ей обычно пользуюсь):

1. Цена открытия для Buy считается по Ask (и это верно);

Допустим мы открываемся по цене 1,27 по EURUSD

2. При открытии позиции мы получаем разницу равную спреду, для Buy это Ask-Bid (потенциальный убыток если закрыть по текущей цене);

Допусти что spred у нас равнен 5 пунктов. Таким образом Bid при открытии будет на 1,2695 (верно?)

 

5. SL же тоже нужно ставить (допустим он у нас 50 pips). Значит в нашем примере он будет располагаться на 1,2650 (50 pips ниже Open)

При каких условиях сработает SL?

По логике вещей он должен сработать тогда когда цена пройдет эти самые 50 пунктов против нас (то есть Ask в монет закрытия по SL должен по логике вещей быть на этих самых 1,2650).

Где же в таком случае должен быть Bid? А он в это время будет располагаться на 1,2645 (ведь Spred по условию у нас 5 pips)

Вспоминая о том что Long-и фиксируются

Если Bid при открытии будет на 1.2695, то 5 пунктов убытка мы уже имеем автоматически. Если при этом SL составляет по замыслу разработчика 50 pips, то до его срабатывания осталось пройти в неблагоприятном направлении ещё 45 pips. Т.е. при срабатывании стоплосса Bid должен быть не на 1.2645, а на 1.2650; а Ask, соответственно, - на 1.2655.
12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий