Советники: Hedge any positions - страница 2

[Удален]  

Добрый день, мой друг...

Я продолжаю изучать программирование на MQL5 и его коды послужили мне вдохновением и базой для изучения, я многому научился, но иногда я немного теряюсь и не могу понять, что именно делают некоторые коды и почему они там находятся...

Я смог понять весь код "Hedge any positions", только часть кода, которую мне трудно понять, что она делает и почему она там, может помочь мне понять, что это такое и почему она была добавлена в код?

bool RefreshRates(const string symbol,
                  const ulong magic,
                  double freeze_level,
                  double stop_level)
{
   if(!m_symbol.Name(symbol))
   {
      return(false);
   }

   m_trade.SetExpertMagicNumber(magic);
   m_trade.SetDeviationInPoints(0);
   m_trade.SetTypeFillingBySymbol(m_symbol.Name());
   m_trade.SetMarginMode();

   if(!m_symbol.RefreshRates())
   {
      Print("RefreshRates error");
      return(false);
   }

   if(!m_symbol.Refresh())
   {
      Print("Refres error");
      return(false);
   }
   
   if(m_symbol.Ask()==0 || m_symbol.Bid()==0)
   {
      return(false);
   }

   freeze_level=m_symbol.FreezeLevel()*m_symbol.Point();
   if(freeze_level==0.0)
   {
      freeze_level=(m_symbol.Ask()-m_symbol.Bid())*3.0;
   }
   freeze_level*=1.1;

   stop_level=m_symbol.StopsLevel()*m_symbol.Point();
   if(stop_level==0.0)
   {
      stop_level=(m_symbol.Ask()-m_symbol.Bid())*3.0;
   }
   stop_level*=1.1;

   if(freeze_level<=0.0 || stop_level<=0.0)
   {
      return(false);
   }
   return(true);
}
 
rmca :

Добрый день, мой друг...

Я продолжаю изучать программирование на MQL5 и его коды послужили мне вдохновением и базой для изучения, я многому научился, но иногда я немного теряюсь и не могу понять, что именно делают те или иные коды и зачем они там нужны...

Я смог понять весь код "Hedge any positions", только часть кода, которую мне трудно понять, что она делает и почему она там, может помочь мне понять, что это такое и почему она была добавлена в код?

Что именно непонятно?

[Удален]  
Vladimir Karputov:

Что именно неясно?

freeze_level=m_symbol.FreezeLevel()*m_symbol.Point();
   if(freeze_level==0.0)
   {
      freeze_level=(m_symbol.Ask()-m_symbol.Bid())*3.0;
   }
   freeze_level*=1.1;

   stop_level=m_symbol.StopsLevel()*m_symbol.Point();
   if(stop_level==0.0)
   {
      stop_level=(m_symbol.Ask()-m_symbol.Bid())*3.0;
   }
   stop_level*=1.1;

   if(freeze_level<=0.0 || stop_level<=0.0)
   {
      return(false);
   }
   return(true);
}

Я не понял, зачем проверяются"freeze_level" и "stop_level", почему в случае, если они возвращают значение "0", происходит вычисление (Ask-Bid) * 3? А если значение "0" не возвращается, то происходит умножение на 1.1?

Для чего нужны эти "freeze_level" и "stop_level"?

Я посмотрел в документации и не очень понял их назначение и почему эта проверка и умножение делается в случае возврата "0" или нет.

 
rmca :

Я не понял, почему проверяются "freeze_level" и "stop_level", ***.

Зачем проверять: читать Проверки, которые должен пройти торговый робот перед публикацией на рынке


rmca:

***Почему в случае, если они возвращают значение "0", происходит расчет (Ask-Bid) * 3? ***

Элементарная защита: "0" может означать плавающий уровень. В таких случаях принято умножать на '3'.


В моих новых экспертах используется модифицированный подход:

***
input group             "Additional features"
***
input uchar    InpFreezeCoefficient = 1;           // Коэффициент (если Freeze==0 или StopsLevels==0)
***
//+------------------------------------------------------------------+
//| Проверьте уровни замораживания и остановки|
//+------------------------------------------------------------------+
void FreezeStopsLevels(double &freeze,double &stops)
  {
//--- проверьте уровни замораживания и остановки
   /*
 SYMBOL_TRADE_FREEZE_LEVEL показывает расстояние замораживания торговых операций
 для отложенных ордеров и открытых позиций в пунктах
 ------------------------|--------------------|--------------------------------------------
 Тип ордера/позиции | Цена активации | Проверка
 ------------------------|--------------------|--------------------------------------------
 Лимитный ордер на покупку| Ask | Ask-OpenPrice>= SYMBOL_TRADE_FREEZE_LEVEL
 Buy Stop order |Ask | OpenPrice-Ask >= SYMBOL_TRADE_FREEZE_LEVEL
 Лимитный ордер на продажу | Bid| OpenPrice-Bid >= SYMBOL_TRADE_FREEZE_LEVEL
 Продать стоп-ордер | Bid| Bid-OpenPrice >= SYMBOL_TRADE_FREEZE_LEVEL
 Позиция на покупку| Bid| TakeProfit-Bid >= SYMBOL_TRADE_FREEZE_LEVEL
 || Bid-StopLoss >= SYMBOL_TRADE_FREEZE_LEVEL
 Продать позицию | Ask| Ask-TakeProfit >= SYMBOL_TRADE_FREEZE_LEVEL
 || StopLoss-Ask >= SYMBOL_TRADE_FREEZE_LEVEL
 ------------------------------------------------------------------------------------------

 SYMBOL_TRADE_STOPS_LEVEL определяет количество пунктов для минимального отступа уровней
 StopLoss и TakeProfit от текущей цены закрытия открытой позиции
. ------------------------------------------------|------------------------------------------
 Покупка осуществляется по цене Ask, а продажа - по цене Bid
 ------------------------------------------------|------------------------------------------
 TakeProfit>= Bid| TakeProfit <= Ask
 StopLoss<= Bid| StopLoss >= Ask
 TakeProfit - Bid >= SYMBOL_TRADE_STOPS_LEVEL | Ask - TakeProfit >= SYMBOL_TRADE_STOPS_LEVEL
 Bid - StopLoss >= SYMBOL_TRADE_STOPS_LEVEL | StopLoss - Ask >= SYMBOL_TRADE_STOPS_LEVEL
 ------------------------------------------------------------------------------------------
 */
   double coeff=(double)InpFreezeCoefficient;
   if(!RefreshRates() || !m_symbol.Refresh())
      return;
//--- FreezeLevel -> для отложенного ордера и модификации
   double freeze_level=m_symbol.FreezeLevel()*m_symbol.Point();
   if(freeze_level==0.0)
      if(InpFreezeCoefficient>0)
         freeze_level=(m_symbol.Ask()-m_symbol.Bid())*coeff;
//--- StopsLevel -> для TakeProfit и StopLoss
   double stop_level=m_symbol.StopsLevel()*m_symbol.Point();
   if(stop_level==0.0)
      if(InpFreezeCoefficient>0)
         stop_level=(m_symbol.Ask()-m_symbol.Bid())*coeff;
//---
   freeze=freeze_level;
   stops=stop_level;
//---
   return;
  }
The checks a trading robot must pass before publication in the Market
The checks a trading robot must pass before publication in the Market
  • www.mql5.com
Before any product is published in the Market, it must undergo compulsory preliminary checks, as a small error in the expert or indicator logic can cause losses on the trading account. That is why we have developed a series of basic checks to ensure the required quality level of the Market products. If any errors are identified by the Market...
[Удален]  
Vladimir Karputov:

Зачем проверять: читайте Проверки, которые должен пройти торговый робот перед публикацией в Маркете


Элементарная защита: '0' может означать плавающий уровень. В таких случаях принято умножать на '3'.


В моих новых экспертах используется модифицированный подход:

Спасибо за ответ, я прочитал всю документацию, которую вы мне прислали, и внес некоторые изменения в код:

bool RefreshRates(const string symb,
                  const ulong magi)
{
   if((!m_symbol.Name(symb))
   && (!m_symbol.RefreshRates() || !m_symbol.Refresh())
   && (m_symbol.Ask()==0 || m_symbol.Bid()==0))
   {
      return(false);
   }
   m_trade.SetExpertMagicNumber(magi);
   m_trade.SetDeviationInPoints(0);
   m_trade.SetTypeFillingBySymbol(m_symbol.Name());
   m_trade.SetMarginMode();
   return(true);
}

Как вы думаете, это хороший подход для обновления (и проверки обновлений) котировок и конфигурации для торговли?

 
rmca :

Спасибо за ответ, я прочитал всю документацию, которую вы мне прислали, и внес некоторые изменения в код:

Как вы думаете, это хороший подход для обновления (и проверки обновлений) котировок и конфигурации для торговли?

Вот эти строки:

   m_trade.SetDeviationInPoints(0);
   m_trade.SetTypeFillingBySymbol(m_symbol.Name());
   m_trade.SetMarginMode();

один раз нужно зарегистрироваться в OnInit.



Вы установили нулевое проскальзывание - будьте готовы к тому, что очень часто будете получать отказ

 
Все, что вам нужно сделать, это оставить этот советник активным на графике, и он будет отслеживать и "защищать" позицию другого советника на другом графике, так ли это?
 
Один вопрос, что происходит, когда коэффициент лота меньше 1, например, 0,5?
 
Eduardo Alvarado :
Один вопрос, что происходит, когда коэффициент лота меньше 1, например 0,5?

Будет открыта позиция с меньшим объемом.

 
Возможно ли модернизировать этот советник, чтобы фильтровать ордера и применять хеджирование только по определенному магическому числу?