Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Подключи MQL5 Cloud Network. Начни зарабатывать!
Leonid Borsky
2374
Leonid Borsky 2016.09.09 07:13 

Добрый день всем! 

Возникла необходимость использовать ф-ю NormalizeDouble для  показаний индикатора в отдельном окне. 

//----------Задаем расхождние  между ценовыми линиями на текущем баре --------------
  RRRR_ = NormalizeDouble((Complex_1_1 - Complex_1_2 ),3);
  RRRR_2 = NormalizeDouble((Complex_2_1 - Complex_2_2 ),3);
//----------------------------------------------------------

Заданы три цифры после запятой.  

Вывел данные значения (разность между линиями на 1 и 2 барах) в комментарий на графике

//----- Вывод информации на экран -----------------------------------------
string info="";
string on_off="---------------------------------------------------"+  "\r\n";

if ((Long)||(Short))on_off=StringConcatenate (on_off,"Текущее расхождение на открытии бара",
                           "/","Заданное расхождение  = ",RRRR_," / ",Delta, "\r\n");
if ( Filter){
 on_off=StringConcatenate (on_off,"на 0 баре=",RRRR_,"\r\n");
 on_off=StringConcatenate (on_off,"на 1 баре=",RRRR_2,"\r\n");

и обнаружил, - что данные значения округлены до целых чисел! 

 

 

 Пож. подскажите, почему не работает  NormalizeDouble(******),3) и вместо трёх цифр после запятой выводятся целые значения   RRRR_ и   RRRR_2 ?  

Alexey Viktorov
5194
Alexey Viktorov 2016.09.09 07:18  
Вместо нормализы используй DoubleToString(RRRR_, 3)
Leonid Borsky
2374
Leonid Borsky 2016.09.09 07:21  
Благодарю. попробую.
Leonid Borsky
2374
Leonid Borsky 2016.09.09 07:28  

Исправил. Вместо  NormalizeDouble(******),3) задал DoubleToString(RRRR_, 3)

//----------Задаем расхождние  между ценовыми линиями на текущем баре --------------
  RRRR_ = DoubleToString((Complex_1_1 - Complex_1_2 ),3);
  RRRR_2 = DoubleToString((Complex_2_1 - Complex_2_2 ),3);
//-----------------------------
//----- Вывод информации на экран -----------------------------------------
if ((Long)||(Short))on_off=StringConcatenate (on_off,"Текущее расхождение на открытии бара",
                           "/","Заданное расхождение  = ",RRRR_," / ",Delta, "\r\n");
if ( Filter){
 on_off=StringConcatenate (on_off,"на  первом  баре=",RRRR_,"\r\n");
 on_off=StringConcatenate (on_off,"на втором баре=",RRRR_2,"\r\n");

Но все равно, в комментарии отображаются только целые значения RRRR_ и RRR_2

     

Vitalie Postolache
11108
Vitalie Postolache 2016.09.09 07:35  

А в вычислении Complex_*_* случайно не используется деление на Point? Может там целые числа вообще.

Или берёте напрямую значения из индикатора, без обработки? 

Leonid Borsky
2374
Leonid Borsky 2016.09.09 07:42  

Значения индикатора беру вот так:

//ЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖ Расчет индикатора Complex_Common ЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖ 
 
if (Symbol()=="GBPUSD")    { m=2; n=0;}
if (Symbol()=="EURUSD")    { m=1; n=0;}
if (Symbol()=="GBPJPY")    { m=2; n=4;}
if (Symbol()=="GBPCHF")    { m=2; n=3;}
if (Symbol()=="EURJPY")    { m=1; n=4;}
if (Symbol()=="EURGBP")    { m=1; n=2;}
if (Symbol()=="USDJPY")    { m=0; n=4;}
if (Symbol()=="EURJPY")    { m=1; n=4;}
if (Symbol()=="USDCHF")    { m=0; n=3;}
if (Symbol()=="EURCHF")    { m=1; n=3;}
if (Symbol()=="CHFJPY")    { m=3; n=4;}

//-------------- задаем значения индикатора Complex_Common по первому символу  --------
  double Complex_1_1=iCustom(Symbol(),0,"Complex_Common_01mod",Period_low,Period_fast,m,1); // на 1-м баре
  double Complex_2_1=iCustom(Symbol(),0,"Complex_Common_01mod",Period_low,Period_fast,m,2); // на 2-м баре
  
//---------------задаем значения индикатора Complex_Common по второму символу ------------ 
  double Complex_1_2=iCustom(Symbol(),0,"Complex_Common_01mod",Period_low,Period_fast,n,1); // на 1-м баре
  double Complex_2_2=iCustom(Symbol(),0,"Complex_Common_01mod",Period_low,Period_fast,n,2); // на 2-м баре
  
//----------Задаем расхождние  между ценовыми линиями на 1 баре --------------
  RRRR_ = DoubleToString((Complex_1_1 - Complex_1_2 ),3);

 Индикатор - в закачке. Код написал сам по мотивам известных статей Сем-Сем. о кластерных индикаторах. Деления в коде индюка нет вообще (только разность): 

Файлы:
Leonid Borsky
2374
Leonid Borsky 2016.09.09 08:04  

Убрал сейчас из кода "нормализацию" и обнаружилось, что 

//-------------- задаем значения индикатора Complex_Common по первому символу  --------
  double Complex_1_1=iCustom(Symbol(),0,"Complex_Common_01mod",Period_low,Period_fast,m,1); // на 1-м баре
  double Complex_2_1=iCustom(Symbol(),0,"Complex_Common_01mod",Period_low,Period_fast,m,2); // на 2-м баре
  
//---------------задаем значения индикатора Complex_Common по второму символу ------------ 
  double Complex_1_2=iCustom(Symbol(),0,"Complex_Common_01mod",Period_low,Period_fast,n,1); // на 1-м баре
  double Complex_2_2=iCustom(Symbol(),0,"Complex_Common_01mod",Period_low,Period_fast,n,2); // на 2-м баре

//----------Задаем расхождние  между ценовыми линиями на текущем баре --------------
RRRR_ = (Complex_1_1 - Complex_1_2 );
 RRRR_ отображается  также в целых числах! Хотя, наверное так не должно быть? 
Alexey Viktorov
5194
Alexey Viktorov 2016.09.09 08:11  
leonid553:

Исправил. Вместо  NormalizeDouble(******),3) задал DoubleToString(RRRR_, 3)

Но все равно, в комментарии отображаются только целые значения RRRR_ и RRR_2

Не туда вставил

//----- Вывод информации на экран -----------------------------------------
string info="";
string on_off="---------------------------------------------------"+  "\r\n";

if ((Long)||(Short))on_off=StringConcatenate (on_off,"Текущее расхождение на открытии бара",
                           "/","Заданное расхождение  = ",RRRR_," / ",Delta, "\r\n");
if ( Filter){
 on_off=StringConcatenate (on_off,"на 0 баре=",DoubleToString(RRRR_, 3)"\r\n");
 on_off=StringConcatenate (on_off,"на 1 баре=",DoubleToString(RRRR_2, 3)"\r\n");
Vitalie Postolache
11108
Vitalie Postolache 2016.09.09 08:56  
leonid553:

Значения индикатора беру вот так:

 Индикатор - в закачке. Код написал сам по мотивам известных статей Сем-Сем. о кластерных индикаторах. Деления в коде индюка нет вообще (только разность): 

В индикаторе применяется умножение на 10000 и 100, что для чертырехзначных котировок равнозначно делению на значение Point() для соответствующего символа, просто автор индикатора не озаботился о качестве кода или опыта не хватило.

На выходе должны быть челые числа при правильном написании кода (нормализация вычитания средних до Digits и деление на Point).

Лучше переделайте индикатор с нормализацией и делением на пойнт, будут всегда целые числа на выходе.

Но если желаете с "хвостиком" после запятой, то ниже приложенный код проверки у меня работает как надо на 4-зн котировках, на 5-зн не знаю, пробуйте.

extern int Period_low = 21;
extern int Period_fast = 8;

   int m=-1,n=-1,Delta=10;

void OnStart()
{
   while(!IsStopped())
   {
      if (Symbol()=="GBPUSD")    { m=2; n=0;}
      if (Symbol()=="EURUSD")    { m=1; n=0;}
      if (Symbol()=="GBPJPY")    { m=2; n=4;}
      if (Symbol()=="GBPCHF")    { m=2; n=3;}
      if (Symbol()=="EURJPY")    { m=1; n=4;}
      if (Symbol()=="EURGBP")    { m=1; n=2;}
      if (Symbol()=="USDJPY")    { m=0; n=4;}
      if (Symbol()=="EURJPY")    { m=1; n=4;}
      if (Symbol()=="USDCHF")    { m=0; n=3;}
      if (Symbol()=="EURCHF")    { m=1; n=3;}
      if (Symbol()=="CHFJPY")    { m=3; n=4;}
      
      //-------------- задаем значения индикатора Complex_Common по первому символу  --------
        double Complex_1_1=iCustom(Symbol(),0,"Complex_Common_01mod",Period_low,Period_fast,m,1); // на 1-м баре
        double Complex_2_1=iCustom(Symbol(),0,"Complex_Common_01mod",Period_low,Period_fast,m,2); // на 2-м баре
        
      //---------------задаем значения индикатора Complex_Common по второму символу ------------ 
        double Complex_1_2=iCustom(Symbol(),0,"Complex_Common_01mod",Period_low,Period_fast,n,1); // на 1-м баре
        double Complex_2_2=iCustom(Symbol(),0,"Complex_Common_01mod",Period_low,Period_fast,n,2); // на 2-м баре
        
      //----------Задаем расхождние  между ценовыми линиями на текущем баре --------------
      string RRRR_ = Complex_1_1 - Complex_1_2 ;
      string RRRR_2 = Complex_2_1 - Complex_2_2;
      //-----------------------------
      
      //----- Вывод информации на экран -----------------------------------------
      string info="";
      string on_off="---------------------------------------------------"+  "\r\n";
      
      on_off=StringConcatenate (on_off,"Текущее расхождение на открытии бара",
                              "/","Заданное расхождение  = ",RRRR_," / ",Delta, "\r\n");
      
      on_off=StringConcatenate (on_off,"на 1 баре=",DoubleToString(RRRR_, 3),"\r\n");
      on_off=StringConcatenate (on_off,"на 2 баре=",DoubleToString(RRRR_2, 3),"\r\n");
      
      Comment(on_off);
      Sleep(500);
      
   }
}
Leonid Borsky
2374
Leonid Borsky 2016.09.09 10:13  
Благодарю, попробую.
/
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий