Индикаторы: Extend Box

 

Extend Box:

Индикатор-утилита: управляет прямоугольниками, всегда сдвигает правую границу по бару #0

Extend Box

Автор: Vladimir Karputov

 
Здравствуйте Владимир,
Прежде всего, спасибо за вашу тяжелую работу.

Не по теме, но мне нужно посоветоваться с вами по нескольким вопросам;
Исходные коды параметра "Max Spread" в советнике, который вы опубликовали ранее, следующие:

   if((spread = m_symbol.Ask()-m_symbol.Bid()) > _MaxSpread) {
      //if(InpPrintLog)
      Print("Spread Ask-Bid (",DoubleToString(spread,m_symbol.Digits()),")",
            " > Maximum spread (",DoubleToString(_MaxSpread,m_symbol.Digits()),")");
      return false;


Я использую стороннюю программу для исторических данных, и спред установлен на фиксированную точку "3" (3 Points)

В ходе тестов я обнаружил, что советник не открывает некоторые ордера там, где он должен, и в своем исследовании я подумал, что может быть проблема с существующими кодами «MaxSpread».

Когда я проверил логи советника, мое внимание привлекла следующая запись;

Spread Ask-Bid (0.00003) > Maximum spread (0.00003)

Этот журнал был создан в день, когда ордер не открывался (!)


Обобщить;

В исторических данных, например, когда цены записываются как:
ask: 1.123456
bid: 1,123457

Тогда, если округлить до 5 цифр, спред = 0,00000 пунктов.
На данный момент проблема, похоже, в том, что цены Ask и Bid закодированы как «без округления до 5 цифр».

Чтобы решить эту проблему, я подумываю отредактировать коды "MaxSpread" следующим образом;

оригинальные коды;    
if((spread = m_symbol.Ask()-m_symbol.Bid()) > _MaxSpread) {
Пересмотренные коды; 
if((spread = NormalizeDouble(m_symbol.Ask()-m_symbol.Bid(), m_symbol.Digits())) > _MaxSpread) {

Буду очень рад, если вы поделитесь своими мнениями и предложениями по теме, проблеме и доработке кода.
 
Edviao #:

Смотрите справку Вещественные типы (double, float), пример функции CompareDoubles

Документация по MQL5: Основы языка / Типы данных / Вещественные типы (double, float)
Документация по MQL5: Основы языка / Типы данных / Вещественные типы (double, float)
  • www.mql5.com
Вещественные типы (double, float) - Типы данных - Основы языка - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Vladimir Karputov #:

Смотрите справку Вещественные типы (double, float), пример функции CompareDoubles

Итак, в исходном коде вы говорите, что нет проблем с округлением до 5 цифр.
Я правильно понял?

 
Edviao #:

Итак, в исходном коде вы говорите, что нет проблем с округлением до 5 цифр.
Я правильно понял?

В исходном коде

   double spread=m_symbol.Ask()-m_symbol.Bid();
   if(m_pending_max_spread>0.0 && spread>m_pending_max_spread)
     {
      m_waiting_pending_order=false;
      if(InpPrintLog)
         Print(__FILE__," ",__FUNCTION__,
               ", ERROR: ","Spread Ask-Bid (",DoubleToString(spread,m_symbol.Digits()),")",
               " > Maximum spread (",DoubleToString(m_pending_max_spread,m_symbol.Digits()),")");
      return;
     }

ВООБЩЕ нет округления.


Если Ваша задача ловля блох - используйте 

для точного сравнения двух чисел 'double' на равенство между собой.

 
Vladimir Karputov #:

В исходном коде

ВООБЩЕ нет округления.


Если Ваша задача ловля блох - используйте 

для точного сравнения двух чисел 'double' на равенство между собой.

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


Короче, можно ли это четко сказать?

Код «MaxSpread», указанный ниже, будет работать «как надо», не вызывая проблем с 5-значными историческими данными и 5-значными брокерами.

   double spread=m_symbol.Ask()-m_symbol.Bid();
   if(m_pending_max_spread>0.0 && spread>m_pending_max_spread)
     {
      m_waiting_pending_order=false;
      if(InpPrintLog)
         Print(__FILE__," ",__FUNCTION__,
               ", ERROR: ","Spread Ask-Bid (",DoubleToString(spread,m_symbol.Digits()),")",
               " > Maximum spread (",DoubleToString(m_pending_max_spread,m_symbol.Digits()),")");
      return;
     }
 
Edviao #:



От Вас нужно несколько цифр: Ask, Bid, расчетное значение m_pending_max_spread и компоненты из которых Вы получили m_pending_max_spread

 
Vladimir Karputov #:

От Вас нужно несколько цифр: Ask, Bid, расчетное значение m_pending_max_spread и компоненты из которых Вы получили m_pending_max_spread

Vladimir,
Какие числа нам нужны? Можете ли вы привести практический пример приведенного выше кода для 5-значных исторических данных и брокера?
 
Edviao #:
Vladimir,
Какие числа нам нужны? Можете ли вы привести практический пример приведенного выше кода для 5-значных исторических данных и брокера?

Вот тестовый код - можете экспериментировать:

//+------------------------------------------------------------------+
//|                                                     Script 1.mq5 |
//|                              Copyright © 2021, Vladimir Karputov |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2021, Vladimir Karputov"
#property version   "1.000"
#property script_show_inputs
//--- input parameters
input double   InpAsk=1.56027;
input double   InpBid=1.560241;
//---
double m_pending_max_spread=0.00003;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   double spread=InpAsk-InpBid;
   if(m_pending_max_spread>0.0 && spread>m_pending_max_spread)
     {
      Print("i am here");
      return;
     }
  }
Причина обращения: