Пример MQL5. Простой советник. Проверка размера бара. Покупка/продажа - страница 4

 
Alexey Viktorov:

Это всё-равно что чесать правое ухо левой ногой... Всё что тут написано умещается в одно условие.

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   if((ENUM_ACCOUNT_MARGIN_MODE)AccountInfoInteger(ACCOUNT_MARGIN_MODE) == ACCOUNT_MARGIN_MODE_RETAIL_HEDGING)
     {
      Print("Hedging only!");
      return(INIT_FAILED);
     }
  }

Чего ради городить огород из лего??? Видимо такое поколение... ЕГЭ и лего.

 

Несколько лет назад -- на 4-ом форуме -- был один, у него советник был настолько детализирован на функции -- буквально как и у Карпутова, строчка-функция.

Как по мне, когда делаются подобные проверки, то изначально априори предполагается, что пользователь советника неадекват. Т.е. ему надо при каждом запуске напоминать, что советник не работает на netting-счетах.

Причём пользователь должен быть "хитрый неадекват" -- если советник почему-то не ставится при любой попытке -- он должен ещё понять, что нужно посмотреть во вкладку "Эксперты" -- т.к. для вывода такой важной информации используется Print().

 

Как-то решил выпендрится и поставил для заказчика в индикаторе такой выход как return(INIT_FAILED)

Помню как около часа не мог понять, почему индикатор не ставится на график.

Представляю пользователя -- он ставит советник/индикатор -- а он не ставится.


 
Vladimir Karputov:

Шаг 11: Работаем только на hedge-счетах.

Остался последний нюанс - нужно безжалостно отсечь попытки запускать советник на netting торговых счетах. Для этого введём переменную "m_margin_mode" с типом ENUM_ACCOUNT_MARGIN_MODE:

//--- parameters
double         ExtSizeOfBar=0.0;             //
bool           TradeIsAllowed=true;          //
ENUM_ACCOUNT_MARGIN_MODE m_margin_mode;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()

и две функции: установка значения нашей переменной "m_margin_mode"

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void SetMarginMode(void)
  {
   m_margin_mode=(ENUM_ACCOUNT_MARGIN_MODE)AccountInfoInteger(ACCOUNT_MARGIN_MODE);
  }

и проверка типа торгового счёта:

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool IsHedging(void)
  {
   return(m_margin_mode==ACCOUNT_MARGIN_MODE_RETAIL_HEDGING);
  }

Функции "SetMarginMode" и  "IsHedging" скопируйте в самый конец советника.

 

Теперь пропишем вызовы этих двух функций:

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   SetMarginMode();
   if(!IsHedging())
     {
      Print("Hedging only!");
      return(INIT_FAILED);
     }

//---
   m_trade.SetExpertMagicNumber(InpMagic);   // sets magic number

Теперь советник при попытке запуска на netting счетах будет выгружаться с сообщением об ошибке:

Hedging only!

Сохраним версию 1.10 в Хранилище.
 

 

Но так как показано в примере -- делать, конечно же, нельзя -- выделил зелёным моменты:

-- объявление глобальной переменной

-- инициализация этой глобальной переменной в какой-то функции

-- использование этой переменной в какой-то другой функции 

 
Artyom Trishkin:
А ты сходи в ветку, где я людям объясняю и рассказываю. А ты полистай "Любые вопросы новичков, профи, не проходите мимо, без вас - никуда" на mql4 и удивись сколько я сделал до того как ты вообще появился на ресурсе

Артем, на мой взгляд, у тебя просто несколько другой подход, по мне - так объяснения Владимира очень даже нормальны. И использование объектов из СБ - тоже очень даже к месту.

Другое дело, что код СБ - слабо переносим. Тот же класс позиции - мне пришлось его полностью писать самому, чтобы он совершенно одинаково работал на МТ4, МТ5-Net и MT5-Hedge, поскольку класс из СБ - на такое неспособен.

Но сами принципы написания Владимир, по-моему, выкладывает очень даже толково.

 
George Merts:

... И использование объектов из СБ - тоже очень даже к месту. ...

Стандартная библиотека (СБ) -- это язык в языке. То что Карпутов поясняет -- он поясняет для новичков, для других его пояснения ни к чему. Т.е. Карпутов новичкам предлагает вместо изучения mql5 изучать СБ.

 
Andrey F. Zelinsky:

 

Но так как показано в примере -- делать, конечно же, нельзя -- выделил зелёным моменты:

-- объявление глобальной переменной

-- инициализация этой глобальной переменной в какой-то функции

-- использование этой переменной в какой-то другой функции 

так нельзя делать ещё и по многим другим причинам..

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

Не знаю, может ему какие бонусы за флейм полагаются, а может просто новогоднее похмелье :-)
 
Andrey F. Zelinsky:

Стандартная библиотека (СБ) -- это язык в языке. То что Карпутов поясняет -- он поясняет для новичков, для других его пояснения ни к чему. Т.е. Карпутов новичкам предлагает вместо изучения mql5 изучать СБ.

Не согласен. Лично я именно так начинал изучать С++ - изучая библиотеку MFC, и считаю этот опыт очень полезным. Как раз СБ дает очень даже хорошее представление о работе с классами, то есть, одновременно мы получаем не только представление о работе готовых классов СБ (а большая часть этих классов - вполне себе хорошо написаны), но и об общих принципах ООП, использующихся в MQL5
 
George Merts:
Не согласен. Лично я именно так начинал измучать С++ - изучая библиотеку MFC, и считаю этот опыт очень полезным. Как раз СБ дает очень даже хорошее представление о работе с классами, то есть, одновременно мы получаем не только представление о работе готовых классов СБ (а большая часть этих классов - вполне себе хорошо написаны), но и об общих принципах ООП, использующихся в MQL5
А где, в каком месте в предлагаемых кодах есть использование ООП? Есть использование СБ в качестве набора функций. Но нет нигде разъяснения работы самих этих функций (методов классов СБ). А для новичка, для полного понимания происходящего, нужно как раз изучать работу методов, а не приёмы их использования.
 
Maxim Kuznetsov:

так нельзя делать ещё и по многим другим причинам..

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

Не знаю, может ему какие бонусы за флейм полагаются, а может просто новогоднее похмелье :-)
Не может, а точно идут. А мы обсуждая и осуждая его код только увеличиваем ему количество бонусов. Так-что я отсюда удаляюсь.
 
Artyom Trishkin:
 А для новичка, для полного понимания происходящего, нужно как раз изучать работу методов, а не приёмы их использования.

Да, с этим согласен, это полезнее.

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

Я очень хорошо помню, насколько мне класс CFile понравился больше, чем набор файловых функций (типа fopen(), или уже не помню, какие там они). Хотя, сперва использовал этот класс именно как "черный ящик", и лишь позже стал заглядывать внутрь него, разбираясь, как и что там написано.

 
Maxim Kuznetsov:

так нельзя делать ещё и по многим другим причинам..

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

Не знаю, может ему какие бонусы за флейм полагаются, а может просто новогоднее похмелье :-)

Человек, который на каждом углу вещает два тезиса:

-- вы работаете с МТ4 потому что вы ленивые

-- вам не нравится СБ, потому что вы боитесь ООП

Такой человек должен быть безукоризнен в своих советах и пояснениях.

Но его советы и его кода далеки не просто от идеала, но и порой с сомнительной корректностью.

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

Alexey Viktorov:
... Так-что я отсюда удаляюсь.

 Аналогично.

Причина обращения: