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

 
Vitaly Muzichenko:

На самом деле мне очень интересно не просто смотреть такие ветки, а именно изучать. Но изучить то здесь особо нечего, применяется СБ, поэтому что-то понять с изложенного крайне сложно, да и не интересно вовсе.

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

Карпутову же просто нравится что-то пояснять. И ему совершенно без разницы, понимает аудитория его пояснения или нет.

К сожаланиею, ..., хотя, может и к счастью. По факту, полезна любая, даже самая бездарная и бестолковая лекция. Её польза уже в том, что народ видит и понимает как не нужно делать. 

 
Я вижу налетели "доктора психологии" и "костоправы" :) - пытаются кого-то обсуждать и винить, а по сути сами остаются РВАЧАМИ и ничего не дающие сообществу. Если можете что-то дать сообществу - пожалуйста, создавайте и показывайте, только не нужно ГАДИТЬ в каждой ветке.
 
Vladimir Karputov:
Я вижу налетели "доктора психологии" и "костоправы" :) - пытаются кого-то обсуждать и винить, а по сути сами остаются РВАЧАМИ и ничего не дающие сообществу. Если можете что-то дать сообществу - пожалуйста, создавайте и показывайте, только не нужно ГАДИТЬ в каждой ветке.
А ты сходи в ветку, где я людям объясняю и рассказываю. А ты полистай "Любые вопросы новичков, профи, не проходите мимо, без вас - никуда" на mql4 и удивись сколько я сделал до того как ты вообще появился на ресурсе
 
Vladimir Karputov:
Я вижу налетели "доктора психологии" и "костоправы" :) - пытаются кого-то обсуждать и винить, а по сути сами остаются РВАЧАМИ и ничего не дающие сообществу. Если можете что-то дать сообществу - пожалуйста, создавайте и показывайте, только не нужно ГАДИТЬ в каждой ветке.

На самом деле, всё не так, никто и ни чему не собирается учить и лечить.

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

Я всегда предпочитаю пользоваться написанными функциями именно внутри программы, а не подключать неизвестно что, пусть размер файла немного больше, но всегда в нём уверен.

Поэтому для того чтоб действительно показать как писать и что, не нужно использовать "чёрные ящики". Извините за критику, но она на мой взгляд конструктивная.

 
Vitaly Muzichenko:

На самом деле, всё не так, никто и ни чему не собирается учить и лечить.

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

Я всегда предпочитаю пользоваться написанными функциями именно внутри программы, а не подключать неизвестно что, пусть размер файла немного больше, но всегда в нём уверен.

Поэтому для того чтоб действительно показать как писать и что, не нужно использовать "чёрные ящики". Извините за критику, но она на мой взгляд конструктивная.

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

Здесь я вижу другую причину - более глубинную - это "четвёрочный" страх перед ООП - но это не совсем другая история и не в контексте данного топика. 

 

Шаг десятьCPositionInfo - класс для для упрощенного доступа к свойствам открытой рыночной позиции.

Класс CPositionInfo

Класс CPositionInfo является классом для упрощенного доступа к свойствам открытой рыночной позиции.

Описание

Класс CPositionInfo обеспечивает доступ к свойствам открытой рыночной позиции.

Заголовок

   #include <Trade\PositionInfo.mqh>

Из всего многообразия будем использовать такие методы:

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

 

PositionType

Получает тип позиции

Magic

Получает идентификатор эксперта, открывшего позицию

Доступ к текстовым свойствам

 

Symbol

Получает наименование символа позиции

Выбор

 

SelectByIndex

Выбирает позицию по индексу


И, как обычно, для того, чтобы начать использовать любой класс, этот класс нужно включить в нашу программу:

#property description "If the size of bar is more, than the set parameter - that BUY OR SELL"
#include <Trade\SymbolInfo.mqh>  
#include <Trade\Trade.mqh>
#include <Trade\PositionInfo.mqh>
CSymbolInfo    m_symbol;                     // symbol info object
CTrade         m_trade;                      // trading object
CPositionInfo  m_position;                   // trade position object
//--- input parameters

Работа с позициями очень проста:

  1. Получаем количество открытых позиций - PositionsTotal и формируем список для перебора (идём К НУЛЮ: "for(int i=PositionsTotal()-1;i>=0;i--)")
  2. Выбираем позицию по индексу - SelectByIndex.
  3. Получаем символ позиции - Symbol и идентификатор эксперта открывшего позицию - Magic.
  4. Получаем тип позиции - PositionType.

А вот, как это будет уже в нашем эксперте:

напишем отдельную функцию, которая будет закрывать позиции только определённого типа, по нужному символу и с определённым идентификатором эксперта:

//+------------------------------------------------------------------+
//| Close Positions                                                  |
//+------------------------------------------------------------------+
void ClosePositions(ENUM_POSITION_TYPE pos_type,const string symbol,const ulong m_magic)
  {
   for(int i=PositionsTotal()-1;i>=0;i--) // returns the number of current orders
      if(m_position.SelectByIndex(i)) // selects the position by index for further access to its properties
         if(m_position.Symbol()==symbol && m_position.Magic()==m_magic)
            if(m_position.PositionType()==pos_type) // gets the position type
               m_trade.PositionClose(m_position.Ticket()); // close a position by the specified symbol
  }

Эту функцию вставьте, пожалуйста, в самый конец программы.

Остаётся прописать пару строк вызова функции "ClosePositions":

   if(close>open && close-open>ExtSizeOfBar) // Buy
     {
      double lot=m_symbol.LotsMin();
      double price=m_symbol.Ask();
      //--- close all Sell positions
      ClosePositions(POSITION_TYPE_SELL,m_symbol.Name(),InpMagic);
      //---

      if(m_trade.Buy(lot,NULL,price)) // successful check of the structures
         if(m_trade.ResultDeal()!=0) // deal ticket if the deal is executed
            TradeIsAllowed=false;            // trade is forbidden
     }
   if(open>close && open-close>ExtSizeOfBar) // Sell
     {
      double lot=m_symbol.LotsMin();
      double price=m_symbol.Bid();
      //--- close all Buy positions
      ClosePositions(POSITION_TYPE_BUY,m_symbol.Name(),InpMagic);
      //---

      if(m_trade.Sell(lot,NULL,price)) // successful check of the structures
         if(m_trade.ResultDeal()!=0) // deal ticket if the deal is executed
            TradeIsAllowed=false;            // trade is forbidden
     }

Сохраняем версию 1.09. Это всё.

Файлы:
 
Vladimir Karputov:

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

Здесь я вижу другую причину - более глубинную - это "четвёрочный" страх перед ООП - но это не совсем другая история и не в контексте данного топика. 

Ты даже себе представить не можешь насколько часто и активно те, кого ты называешь боящимися ООП, используют его в своих mql4 и mql5 разработках. Причём по-разному - как некоторые классы из СБ, так и свои собственные, либо унаследованные от классов СБ. Только пишут они сами, и знают всё сами, и не на том уровне, как пишешь ты свои коды - ты ничего сам не пишешь - ты кубики складываешь. И, соответственно, растишь своё поколение идиотов, которые кроме как сложить из кубиков больше ничего и не смогут - ведь ты их другому-то и не научил.

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

Ты же, мало того, что делаешь какой-то абстрактный глупый советник (наверное это следствие того, что сам не торгуешь, и никогда не торговал), так ты ещё и просто его из кубиков складываешь. Ощущение, прошу прощения, детского сада, а не серьёзного ресурса...

ЗЫ. Вот ты считаешь, что на тебя тут "спаммеры наехали, тролляки гадские", а тебе просто пытаются донести, что не в ту степь ты тратишь свои силы - в воду всё...

 

Шаг 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 в Хранилище.
 

Файлы:
 
Vladimir Karputov:

Здесь я вижу другую причину - более глубинную - это "четвёрочный" страх перед ООП - ...

Что-то нигде, ни в одном вашем примере не видел, чтобы вы использовали ООП.

В данном примере выше, в своих кодах в Кодабазе -- вы используете методы из СБ как функции для процедурного программирования.

Карпутов, можете дать ссылку на свой пример, где вы используете ООП, создаёте экземпляры классов? Есть такой пример? 

 
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 в Хранилище.
 

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

//+------------------------------------------------------------------+
//| 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);
     }
  }

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

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