Вложенные циклы

 

Коллеги, помогите найти ошибку.

Задача в большом цикле рассчитать и начертить уровни взяв за отправные точки Low и High

Во внутреннем цикле построить уровни внутри ранее построенных "больших" уровней.

Проблем в том, что не строятся внутренние уровни между 0 и 1 большим и 6-7 большим те что по краям.

А во внутренних все ок.

Вот скриншот 


Вот код:

//+------------------------------------------------------------------+
void DrawFibo()
{
   int high, low;
   
   high  = iHighest(Symbol(), PERIOD_D1, MODE_HIGH, FiboBar, 1);
   low   = iLowest(Symbol(), PERIOD_D1, MODE_LOW, FiboBar, 1);
   
   if(iTime(Symbol(), PERIOD_D1, high) > iTime(Symbol(), PERIOD_D1, low)) trend = TRUE;
   else trend = FALSE;
      
   startBar = iHigh(Symbol(), PERIOD_D1, high);
   endBar = iLow(Symbol(), PERIOD_D1, low);
   
   if (startBar == prevStart && endBar == prevEnd) return;

   DrawLevels(startBar, endBar, startBar - endBar);
   prevStart = startBar; 
   prevEnd = endBar; 

}
//+------------------------------------------------------------------+
void DrawLevels(double                price1=0,          // 1 st point's price
                 double                price2=0,          // 2 nd point's price
                 double                size=0)           // 0 = Big, 1 = Small
{

   double smallSize = 0;
   
   ObjectsDeleteAll(0,OBJ_TREND); // Удаление всех построенных линий 
      
   if (trend) 
   {
      BigFibo[0] = price2;
      BigFibo[6] = price1;
      ArraySetAsSeries(PercentArr, true);
   }
   else
   {
      BigFibo[0] = price1; 
      BigFibo[6] = price2;
      ArraySetAsSeries(PercentArr, false);        
   }
      
   for(int i = 1; i <= 5; i++)
   {
      if (trend) BigFibo[i] = NormalizeDouble(BigFibo[0] + size*PercentArr[i]/100, Digits);
      else BigFibo[i] = NormalizeDouble(BigFibo[0] - size*PercentArr[i]/100, Digits);
   }
      
   for (int i = 0; i <= 6; i++)
   {
      if (!TrendCreate(BigNames[i], iTime(Symbol(), PERIOD_D1, FiboBar), BigFibo[i], TimeCurrent(), BigFibo[i]))
         printf("Error Big Fibo");
      
      if (i <= 5)
      {  
         for (int j = 1; j <= 5; j++)
         {

            if (trend) smallSize = BigFibo[i+1] - BigFibo[i];
            else smallSize = BigFibo[i] - BigFibo[i+1];
                    
            if (trend) SmallFibo[i,j] = NormalizeDouble(BigFibo[i] + smallSize*PercentArr[j]/100, Digits);
            else SmallFibo[i,j] = NormalizeDouble(BigFibo[i] - smallSize*PercentArr[j]/100, Digits);
            
            SmallNames[j] = "Level" + IntegerToString(i) + IntegerToString(j);
              
            if (!TrendCreate(SmallNames[j], iTime(Symbol(), PERIOD_D1, FiboBar), SmallFibo[i,j], TimeCurrent(), SmallFibo[i,j], clrBlue))
               printf("Error Small Fibo");     
         }
      }
   }
}

//+------------------------------------------------------------------+
 

Надо посмотреть в списке объектов, есть эти уровни или их действительно нет. Скорее всего они создается, но значения неправильные, где-то там они за пределами окна. Основное подозрение на PercentArr. Еще может быть для SmallNames размер неправильно задан.

 
Dmitry Fedoseev:

Надо посмотреть в списке объектов, есть эти уровни или их действительно нет. Скорее всего они создается, но значения неправильные, где-то там они за пределами окна. Основное подозрение на PercentArr. Еще может быть для SmallNames размер неправильно задан.

в объектах все есть если я правильно понимаю, а на графике нет


что касается PercentArr

 

   string BigNames[7], SmallNames[7];

   PercentArr[0] = 100;
   PercentArr[1] = 78.6;
   PercentArr[2] = 61.8;
   PercentArr[3] = 50;
   PercentArr[4] = 38.2;
   PercentArr[5] = 23.6;
   PercentArr[6] = 0; 



   for (int i = 0; i < 7; i++)
   {
      BigNames[i] = "Level " + IntegerToString(i);
      SmallNames[i] = "Level " + IntegerToString(i);
   }  
 
Roman Meskhidze:

в объектах все есть если я правильно понимаю, а на графике нет

Если в списке объектов щелкнуть на строке, откроется окно свойств объекта. Посмотрите, какие там значения. Пользуясь функцией Print() выясните, почему расчет неверный. Скорее всего что-то с размерами какого-то массива. 

Еще можно попробовать откомпилировать с #property strict, если есть выход за пределы массива, то будет известно в какой строке.

...

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

---

С PercentArr все нормально, иначе бы на других больших уровнях были ошибки с мелкими уровнями. Скорее всего размер массива SmalFibo.

 
Dmitry Fedoseev:

Если в списке объектов щелкнуть на строке, откроется окно свойств объекта. Посмотрите, какие там значения. Пользуясь функцией Print() выясните, почему расчет неверный. Скорее всего что-то с размерами какого-то массива. 

Еще можно попробовать откомпилировать с #property strict, если есть выход за пределы массива, то будет известно в какой строке.

...

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

---

С PercentArr все нормально, иначе бы на других больших уровнях были ошибки с мелкими уровнями. Скорее всего размер массива SmalFibo.

приведу весь код, так как strict использую и ошибок нет

#property copyright "Copyright 2019"
#property link      "https://mql5.com"
#property version   "1.00"
#property strict

input    int         FiboBar     =  300;
input    int         Magic       =  1100;

double   BigFibo[7], SmallFibo[6,7], PercentArr[7];
string   BigNames[7], SmallNames[7]; 
double   startBar, endBar, prevStart, prevEnd;
bool     trend; // false=bear, true=bull

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{   
   PercentArr[0] = 100;
   PercentArr[1] = 78.6;
   PercentArr[2] = 61.8;
   PercentArr[3] = 50;
   PercentArr[4] = 38.2;
   PercentArr[5] = 23.6;
   PercentArr[6] = 0; 
   
   for (int i = 0; i < 7; i++)
   {
      BigNames[i] = "Level " + IntegerToString(i);
      SmallNames[i] = "Level " + IntegerToString(i);
   }    

   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{

}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
   
   DrawFibo();

}
//+------------------------------------------------------------------+
void DrawFibo()
{
   int high, low;
   
   high  = iHighest(Symbol(), PERIOD_D1, MODE_HIGH, FiboBar, 1);
   low   = iLowest(Symbol(), PERIOD_D1, MODE_LOW, FiboBar, 1);
   
   if(iTime(Symbol(), PERIOD_D1, high) > iTime(Symbol(), PERIOD_D1, low)) trend = TRUE;
   else trend = FALSE;
      
   startBar = iHigh(Symbol(), PERIOD_D1, high);
   endBar = iLow(Symbol(), PERIOD_D1, low);
   
   if (startBar == prevStart && endBar == prevEnd) return;

   DrawLevels(startBar, endBar, startBar - endBar);
   prevStart = startBar; 
   prevEnd = endBar; 

}
//+------------------------------------------------------------------+
void DrawLevels(double                price1=0,          // 1 st point's price
                 double                price2=0,          // 2 nd point's price
                 double                size=0)           // 0 = Big, 1 = Small
{

   double smallSize = 0;
   
   ObjectsDeleteAll(0,OBJ_TREND); // Удаление всех построенных линий 
      
   if (trend) 
   {
      BigFibo[0] = price2;
      BigFibo[6] = price1;
      ArraySetAsSeries(PercentArr, true);
   }
   else
   {
      BigFibo[6] = price2;
      BigFibo[0] = price1; 
      ArraySetAsSeries(PercentArr, false);        
   }
      
   for(int i = 1; i <= 5; i++)
   {
      if (trend) BigFibo[i] = NormalizeDouble(BigFibo[0] + size*PercentArr[i]/100, Digits);
      else BigFibo[i] = NormalizeDouble(BigFibo[0] - size*PercentArr[i]/100, Digits);
   }
      
   for (int i = 0; i <= 6; i++)
   {
      if (!TrendCreate(BigNames[i], iTime(Symbol(), PERIOD_D1, FiboBar), BigFibo[i], TimeCurrent(), BigFibo[i]))
         printf("Error Big Fibo");
      
      if (i <= 5)
      {  
         for (int j = 1; j <= 5; j++)
         {

            if (trend) smallSize = BigFibo[i+1] - BigFibo[i];
            else smallSize = BigFibo[i] - BigFibo[i+1];
                    
            if (trend) SmallFibo[i,j] = NormalizeDouble(BigFibo[i] + smallSize*PercentArr[j]/100, Digits);
            else SmallFibo[i,j] = NormalizeDouble(BigFibo[i] - smallSize*PercentArr[j]/100, Digits);
            
            SmallNames[j] = "Level" + IntegerToString(i) + IntegerToString(j);
              
            if (!TrendCreate(SmallNames[j], iTime(Symbol(), PERIOD_D1, FiboBar), SmallFibo[i,j], TimeCurrent(), SmallFibo[i,j], clrBlue))
               printf("Error Small Fibo");     
         }
      }
   }
}

//+------------------------------------------------------------------+
//| Create a trend line by the given coordinates                     |
//+------------------------------------------------------------------+
bool TrendCreate(const string          name="TrendLine",  // Line name                 
                 datetime              time1=0,           // 1 st point's date
                 double                price1=0,          // 1 st point's price
                 datetime              time2=0,           // 2 nd point's date
                 double                price2=0,          // 2 nd point's price
                 const color           clr=clrRed,        // Line color
                 const int             width=1,           // Line width
                 const ENUM_LINE_STYLE style=STYLE_SOLID, // Line style  
                 const bool            ray_right=true,    // Line's continuation to the right              
                 const bool            back=false,         // in the background
                 const bool            selection=false,   // highlight to move
                 const bool            hidden=false,       // hidden in the object list
                 const long            z_order=0,         // priority for mouse click
                 const long            chart_ID=0,        // chart's ID
                 const int             sub_window=0)      // subwindow index
{
   ResetLastError();
   
   if(!ObjectCreate(chart_ID,name,OBJ_TREND,sub_window,time1,price1,time2,price2)) {
      Print(__FUNCTION__, ": failed to create a trend line! Error code = ",GetLastError());
      return(false);
   }
   ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
   ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
   ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
   ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
   ObjectSetInteger(chart_ID,name,OBJPROP_RAY_RIGHT,ray_right);
   ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
   ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
   ChartRedraw();
   return(true);
}
//+------------------------------------------------------------------+
//| Creating Text object                                             |
//+------------------------------------------------------------------+
bool TextCreate(const string            name="Text",               // object name
                datetime                time=0,                    // anchor point time
                double                  price=0,                   // anchor point price
                const string            text="Text",               // the text itself
                const color             clr=clrRed,                // color
                const string            font="Arial",              // font
                const int               font_size=8,               // font size              
                const ENUM_ANCHOR_POINT anchor=ANCHOR_RIGHT_LOWER, // text slope
                const double            angle=0.0,                 // anchor type
                const bool              back=true,                 // in the background
                const bool              selection=false,           // highlight to move
                const bool              hidden=true,               // hidden in the object list
                const long              z_order=0,                 // priority for mouse click
                const long              chart_ID=0,                // chart's ID
                const int               sub_window=0)              // subwindow index
  {
   ResetLastError();
   if(!ObjectCreate(chart_ID,name,OBJ_TEXT,sub_window,time,price)) {
      Print(__FUNCTION__,": failed to create \"Text\" object! Error code =",GetLastError());
      return(false);
   }
   ObjectSetString(chart_ID,name,OBJPROP_TEXT,text);
   ObjectSetString(chart_ID,name,OBJPROP_FONT,font);
   ObjectSetInteger(chart_ID,name,OBJPROP_FONTSIZE,font_size);
   ObjectSetDouble(chart_ID,name,OBJPROP_ANGLE,angle);
   ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor);
   ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
   ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
   ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
   ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
   ChartRedraw();
   return(true);
  }

спасибо за помощь

 

А вот у меня какая картинка:

1

Все же нормально? Ничего не менял.

 
Нашел один символ-таймрейм, на нем глючит.
 
Dmitry Fedoseev:

А вот у меня какая картинка:

Все же нормально? Ничего не менял.

в том и дело, что иногда нормалньо, а большую часть времени нет.

не понимаю как такое возможно.

сейчас тестирую на м15 и н1 евродоллар и не могу добиться, что б все четко было

проверял у разных брокеров (((

 

Нашел:

  for(int i = 1; i <= 5; i++)
   {
      if (trend) BigFibo[i] = NormalizeDouble(BigFibo[0] + size*PercentArr[i]/100, Digits);
      else BigFibo[i] = NormalizeDouble(BigFibo[0] - size*PercentArr[6-i]/100, Digits);
   }
      
Добавить отмеченное.
 
А нет не все.
 
Dmitry Fedoseev:

Нашел:

Добавить отмеченное.

гениально, и здесь тоже самое

else SmallFibo[i,j] = NormalizeDouble(BigFibo[i] - smallSize*PercentArr[6-j]/100, Digits);

спасибо ОГРОМНОЕ!