Hedging. Частичное закрытие. - страница 2

 
Vladimir Karputov:

Пока код имеет вид:

  const int Ticket = OrderSend(_Symbol, OP_BUY, 0.5, SymbolInfoDouble(_Symbol, SYMBOL_ASK), 0, 0, 0);

это будет "четвёрочный" вид. Всё таки вопрос про MQL5. Не нужно тащить хвосты старого терминала. 

Ознакомьтесь с понятием перегрузки. Даже в СБ есть
bool CTrade::OrderSend(const MqlTradeRequest &request,MqlTradeResult &result);

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

Что править на "чистом" MQL5 - Вы уже разобрались. У всех остальных, кто не связывался с СБ, это работало изначально. И Hedging  к частичному закрытию никакого отношения не имеет.

 
fxsaber:
Ознакомьтесь с понятием перегрузки. Даже в СБ есть
bool CTrade::OrderSend(const MqlTradeRequest &request,MqlTradeResult &result);

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

Что править на "чистом" MQL5 - Вы уже разобрались. У всех остальных, кто не связывался с СБ, это работало изначально. И Hedging  к частичному закрытию никакого отношения не имеет.

С перезагрузкой, наследованием я знаком. Но, всё равно, спасибо, что лишний раз упомянули.

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

  const int Ticket = OrderSend(_Symbol, OP_BUY, 0.5, SymbolInfoDouble(_Symbol, SYMBOL_ASK), 0, 0, 0);

просто вгоняете в ступор. Мало того, такой Ваш код порождает путаницу, так как, Вы сами даже нашли:

bool CTrade::OrderSend(const MqlTradeRequest &request,MqlTradeResult &result);

Как говорится найдите две разницы :).

 
Vladimir Karputov:

С перезагрузкой, наследованием я знаком. Но, всё равно, спасибо, что лишний раз упомянули.

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

  const int Ticket = OrderSend(_Symbol, OP_BUY, 0.5, SymbolInfoDouble(_Symbol, SYMBOL_ASK), 0, 0, 0);

просто вгоняете в ступор.

Вгоняется в ступор человек, не знакомый с понятием перегрузки. ЛЮБОЙ старожил на этом форуме скажет, что мой код выше - это самый понятный пример на MQL5. Т.е. взглянув на код, старожил МГНОВЕННО скажет, что этот код делает. Тут же, не задумываясь! В этом и сила. И именно по этой причине в таком стиле народ пишет и обсуждает ТС на форумах так активно. Потому что все понятно! И этот код ничуть по чистоте не уступает СБ. Превосходит только в скорости понимания и количестве понимающих.
 
fxsaber:
Вгоняется в ступор человек, не знакомый с понятием перегрузки. ЛЮБОЙ старожил на этом форуме скажет, что мой код выше - это самый понятный пример на MQL5. Т.е. взглянув на код, старожил МГНОВЕННО скажет, что этот код делает. Тут же, не задумываясь! В этом и сила. И именно по этой причине в таком стиле народ пишет и обсуждает ТС на форумах так активно. Потому что все понятно! И этот код ничуть по чистоте не уступает СБ. Превосходит только в скорости понимания и количестве понимающих.

Для очень непонятливых - ещё раз: "четвёрочный " стиль написания неприемлем, так как не все учили сначала МТ4, а потом МТ5. Таким написанием Вы только путаете тех, кто учил начиная с МТ5. Хотите писать в стиле "четвёрки" - пожалуйста, на форуме появился новый раздел.

Ибо человек взглянув в справку MQL5, видит это:

OrderSend
Функция OrderSend() предназначена для совершения торговых операций через отправку запросов на торговый сервер.

bool  OrderSend
   MqlTradeRequest&  request,      // структура запроса 
   MqlTradeResult&   result        // структура ответа 
   );

что никоим образом не совпадает с "четвёрочным стилем". 

 

Поэтому, не прикрывайтесь терминами ООП, а просто не путайте людей.  

 
Vladimir Karputov:

Для очень непонятливых - ещё раз: "четвёрочный " стиль написания неприемлем, так как не все учили сначала МТ4, а потом МТ5. Таким написанием Вы только путаете тех, кто учил начиная с МТ5. Хотите писать в стиле "четвёрки" - пожалуйста, на форуме появился новый раздел.

Ибо человек взглянув в справку MQL5, видит это:

OrderSend
Функция OrderSend() предназначена для совершения торговых операций через отправку запросов на торговый сервер.

bool  OrderSend
   MqlTradeRequest&  request,      // структура запроса 
   MqlTradeResult&   result        // структура ответа 
   );

что никоим образом не совпадает с "четвёрочным стилем". 

 

Поэтому, не прикрывайтесь терминами ООП, а просто не путайте людей.  

Новичек в первую очередь обратит внимание на #include <MT4Orders.mqh>. Вы не пишите на чистом MQL5, а используете, как сами выяснили, неполноценную СБ, которая вызывается абсолютно так же, как и упомянутая библиотека.

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

Скинул ссылку на этот пост stringo, Rosh и Renat, чтобы они со своей колокольни, при желании, разрулили данную ситуацию. Если не вмешаются, значит ничего плохого, как поспешно можно оценить, я не делаю, предлагая кроссплатформенный код, по производительности ничуть не уступающий СБ. А по возможностям, как выяснилось, даже превосходящий на данный момент. 

 

Пока решение такое - свой класс с одним методом, производный от класса стандартной библиотеки CTrade:

//+------------------------------------------------------------------+
//|                                              CPartialClosing.mqh |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#include <Trade\Trade.mqh>
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class CPartialClosing : public CTrade
  {
private:

public:
                     CPartialClosing();
                    ~CPartialClosing();
   bool              PositionClose(const ulong ticket,const ulong deviation=ULONG_MAX,const double partial_volume=0);
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
CPartialClosing::CPartialClosing()
  {
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
CPartialClosing::~CPartialClosing()
  {
  }
//+------------------------------------------------------------------+
//| Close specified opened position                                  |
//+------------------------------------------------------------------+
bool CPartialClosing::PositionClose(const ulong ticket,const ulong deviation,const double partial_volume=0)
  {
//--- check stopped
   if(IsStopped(__FUNCTION__))
      return(false);
//--- check position existence
   if(!PositionSelectByTicket(ticket))
      return(false);
   string symbol=PositionGetString(POSITION_SYMBOL);
//--- clean
   ClearStructures();
//--- check
   if((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
     {
      //--- prepare request for close BUY position
      m_request.type =ORDER_TYPE_SELL;
      m_request.price=SymbolInfoDouble(symbol,SYMBOL_BID);
     }
   else
     {
      //--- prepare request for close SELL position
      m_request.type =ORDER_TYPE_BUY;
      m_request.price=SymbolInfoDouble(symbol,SYMBOL_ASK);
     }
//--- setting request
   m_request.action   =TRADE_ACTION_DEAL;
   m_request.position =ticket;
   m_request.symbol   =symbol;
   m_request.volume   =(partial_volume==0) ? PositionGetDouble(POSITION_VOLUME) : partial_volume;
   m_request.magic    =m_magic;
   m_request.deviation=(deviation==ULONG_MAX) ? m_deviation : deviation;
//--- close position
   PrintFormat("PositionClose #%I64d %s %.2f",ticket,EnumToString((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE)),m_request.volume);
   return(OrderSend(m_request,m_result));
  }
//+------------------------------------------------------------------+

В методе PositionClose(const ulong ticket,const ulong deviation,const double partial_volume=0) третий параметр по-умолчанию равен нулю. При обычном привычном программировании приказ на закрытие будет выглядеть так:

      m_trade_partial.PositionClose(ticket_position);

то есть третий параметр даже не мешает.

А вот как будет выглядеть вызов с указанием объёма частичного закрытия:

         m_trade_partial.PositionClose(ticket_position,-1,half_volume);
Файлы:
 
Vladimir Karputov:

Прочтя такой ответ, тысячи людей, знающих MQL4, ни за что не захотят переходить на MQL5. А те, кто не знает MQL4/5, захотят изучить MQL4, а не MQL5.

Зачем дискредитируете замечательный MQL5? Его же можно подавать очень изящно и с огромным положительным эффектом. 

 
fxsaber:

Прочтя такой ответ, тысячи людей, знающих MQL4, ни за что не захотят переходить на MQL5. А те, кто не знает MQL4/5, захотят изучить MQL4, а не MQL5.

Зачем дискредитируете замечательный MQL5? Его же можно подавать очень изящно и с огромным положительным эффектом. 

По теме есть что сказать? Например есть версия не использовать специальный класс с одним методом, а просто заполнение структур

   MqlTradeRequest   m_request;         // request data
   MqlTradeResult    m_result;          // result data

для отсылки команды

OrderSend(m_request,m_result)
 
Vladimir Karputov:

По теме есть что сказать?

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Hedging. Частичное закрытие.

fxsaber, 2016.11.02 17:43

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

 
fxsaber:
Я, в принципе, так и думал. Как до дела - сразу в кусты.