Глюк мт4 или я что-то делаю не так?

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Dmitry Sumsky
2459
Dmitry Sumsky  

Хочу нарисовать фибоуровни с разными цветами и стилями линий. Но почему-то все линии получаются одинакового цвета и стиля. Т.е. так, как в последней "строке" массива уровней.

Для примера сделал скрипт. Может кто-нибудь что-то подскажет?

//+------------------------------------------------------------------+
//|                                                     TestFibo.mq4 |
//|                                                                  |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright ""
#property link      ""
#property version   "1.00"
#property strict
#property script_show_inputs
//+------------------------------------------------------------------+
enum     en_Width {en1=1/*1*/,en2=2/*2*/,en3=3/*3*/,en4=4/*4*/,en5=5/*5*/};
input    string            ll_1                    =  "---------------";// __________ УРОВНИ ФИБО __________
input    bool              useLev1                 =  true;             // (1) Рисовать
input    double            dLev1                   =  0;                // (1) Уровень
input    color             cLev1                   =  clrYellow;        // (1) Цвет
input    en_Width          wLev1                   =  en1;              // (1) Толщина линии
input    ENUM_LINE_STYLE   sLev1                   =  STYLE_DOT;        // (1) Стиль линии
input    string            xLev1                   =  "0";              // (1) Текст
//---
input    bool              useLev2                 =  true;             // (2) Рисовать
input    double            dLev2                   =  1;                // (2) Уровень
input    color             cLev2                   =  clrYellowGreen;   // (2) Цвет
input    en_Width          wLev2                   =  en1;              // (2) Толщина линии
input    ENUM_LINE_STYLE   sLev2                   =  STYLE_DOT;        // (2) Стиль линии
input    string            xLev2                   =  "100";            // (2) Текст
//---
input    bool              useLev3                 =  true;             // (3) Рисовать
input    double            dLev3                   =  0.764;            // (3) Уровень
input    color             cLev3                   =  clrRed;           // (3) Цвет
input    en_Width          wLev3                   =  en1;              // (3) Толщина линии
input    ENUM_LINE_STYLE   sLev3                   =  STYLE_DOT;        // (3) Стиль линии
input    string            xLev3                   =  "76.4";           // (3) Текст
//---
input    bool              useLev4                 =  true;             // (4) Рисовать
input    double            dLev4                   =  1.618;            // (4) Уровень
input    color             cLev4                   =  clrHoneydew;      // (4) Цвет
input    en_Width          wLev4                   =  en1;              // (4) Толщина линии
input    ENUM_LINE_STYLE   sLev4                   =  STYLE_DOT;        // (4) Стиль линии
input    string            xLev4                   =  "161.8";          // (4) Текст
//---
input    bool              useLev5                 =  true;             // (5) Рисовать
input    double            dLev5                   =  2.618;            // (5) Уровень
input    color             cLev5                   =  clrBisque;        // (5) Цвет
input    en_Width          wLev5                   =  en1;              // (5) Толщина линии
input    ENUM_LINE_STYLE   sLev5                   =  STYLE_DOT;        // (5) Стиль линии
input    string            xLev5                   =  "261.8";          // (5) Текст
//---
input    bool              useLev6                 =  true;             // (6) Рисовать
input    double            dLev6                   =  4.236;            // (6) Уровень
input    color             cLev6                   =  clrAqua;          // (6) Цвет
input    en_Width          wLev6                   =  en1;              // (6) Толщина линии
input    ENUM_LINE_STYLE   sLev6                   =  STYLE_DOT;        // (6) Стиль линии
input    string            xLev6                   =  "423.6";          // (6) Текст
//---
input    bool              useLev7                 =  false;            // (7) Рисовать
input    double            dLev7                   =  0;                // (7) Уровень
input    color             cLev7                   =  clrNONE;          // (7) Цвет
input    en_Width          wLev7                   =  en1;              // (7) Толщина линии
input    ENUM_LINE_STYLE   sLev7                   =  STYLE_DOT;        // (7) Стиль линии
input    string            xLev7                   =  "0";              // (7) Текст
//---
input    bool              useLev8                 =  false;            // (8) Рисовать
input    double            dLev8                   =  0;                // (8) Уровень
input    color             cLev8                   =  clrNONE;          // (8) Цвет
input    en_Width          wLev8                   =  en1;              // (8) Толщина линии
input    ENUM_LINE_STYLE   sLev8                   =  STYLE_DOT;        // (8) Стиль линии
input    string            xLev8                   =  "0";              // (8) Текст
//---
input    bool              useLev9                 =  false;            // (9) Рисовать
input    double            dLev9                   =  0;                // (9) Уровень
input    color             cLev9                   =  clrNONE;          // (9) Цвет
input    en_Width          wLev9                   =  en1;              // (9) Толщина линии
input    ENUM_LINE_STYLE   sLev9                   =  STYLE_DOT;        // (9) Стиль линии
input    string            xLev9                   =  "0";              // (9) Текст
//---
input    bool              useLev10                =  false;            // (10) Рисовать
input    double            dLev10                  =  0;                // (10) Уровень
input    color             cLev10                  =  clrNONE;          // (10) Цвет
input    en_Width          wLev10                  =  en1;              // (10) Толщина линии
input    ENUM_LINE_STYLE   sLev10                  =  STYLE_DOT;        // (10) Стиль линии
input    string            xLev10                  =  "0";              // (10) Текст
//---
input    bool              useLev11                =  false;            // (11) Рисовать
input    double            dLev11                  =  0;                // (11) Уровень
input    color             cLev11                  =  clrNONE;          // (11) Цвет
input    en_Width          wLev11                  =  en1;              // (11) Толщина линии
input    ENUM_LINE_STYLE   sLev11                  =  STYLE_DOT;        // (11) Стиль линии
input    string            xLev11                  =  "0";              // (11) Текст
//---
input    bool              useLev12                =  false;            // (12) Рисовать
input    double            dLev12                  =  0;                // (12) Уровень
input    color             cLev12                  =  clrNONE;          // (12) Цвет
input    en_Width          wLev12                  =  en1;              // (12) Толщина линии
input    ENUM_LINE_STYLE   sLev12                  =  STYLE_DOT;        // (12) Стиль линии
input    string            xLev12                  =  "0";              // (12) Текст
//+------------------------------------------------------------------+
struct   my_Fibo
{
   bool              _use;
   ENUM_LINE_STYLE   style;
   int               width;
   color             _clr;
   double            value;
   string            text;
};
my_Fibo  mLevels[]; // массив фибоуровней для визуализации
int      sLevels=12;
long     ID;
string   T;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   ID=ChartID(); ObjectsDeleteAll(ID,0,OBJ_FIBO);
   if(InitMassLevelsFibo())
      for(int i=5; i>0; i--)
         if(Open[i]==Close[i]) continue;
         else CreateFiboLevels(TimeToStr(Time[i]),Time[i],(Open[i]<Close[i]?High[i]:Low[i]),Time[i],(Open[i]<Close[i]?Low[i]:High[i]));
   return;
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Cоздает "Уровни Фибоначчи" по заданным координатам               |
//+------------------------------------------------------------------+
bool CreateFiboLevels(const string           name,             // имя объекта
                      datetime               time1=0,          // время первой точки
                      double                 price1=0,         // цена первой точки
                      datetime               time2=0,          // время второй точки
                      double                 price2=0)         // цена второй точки
{
   bool ok=false; int i;
   ResetLastError();//--- сбросим значение ошибки
   while(ObjectFind(ID,name)>=0 && !ObjectDelete(ID,name)) continue;
   //---
   if(ObjectCreate(ID,name,OBJ_FIBO,0,time1,price1,time2,price2)) ok=true;
   else Print(__FUNCTION__," Не удалось создать \"Уровни Фибоначчи\"! Код ошибки = ",GetLastError());
   if(!ok) return(false);
   ObjectSetInteger(ID,name,OBJPROP_COLOR,clrYellow);                //--- установим цвет
   ObjectSetInteger(ID,name,OBJPROP_STYLE,STYLE_SOLID);              //--- установим стиль линии
   ObjectSetInteger(ID,name,OBJPROP_WIDTH,3);                        //--- установим толщину линии
   ObjectSetInteger(ID,name,OBJPROP_BACK,false);                     //--- отобразим на переднем (false) или заднем (true) плане
   ObjectSetInteger(ID,name,OBJPROP_SELECTABLE,false);               //--- разрешение на выделение для перемещения мышью (false==запрещено)
   ObjectSetInteger(ID,name,OBJPROP_SELECTED,false);                 //--- выделить для перемещения мышью
   ObjectSetInteger(ID,name,OBJPROP_RAY_RIGHT,false);                //--- луч вправо
   ObjectSetInteger(ID,name,OBJPROP_HIDDEN,true);                    //--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
   //---
   if(!ObjectSetInteger(ID,name,OBJPROP_LEVELS,sLevels)) {Alert(sLevels," Уровней не установились"); return(false);}              
   else for(i=0; i<sLevels; i++) 
   { 
      if(!mLevels[i]._use) continue;
      ObjectSetInteger(ID,name,OBJPROP_LEVELSTYLE,i,mLevels[i].style);                       //--- стиль уровня (ENUM_LINE_STYLE)
      ObjectSetInteger(ID,name,OBJPROP_LEVELWIDTH,i,(mLevels[i].style?1:mLevels[i].width));  //--- толщина уровня (int)
      ObjectSetInteger(ID,name,OBJPROP_LEVELCOLOR,i,mLevels[i]._clr);                        //--- цвет уровня (color)
      ObjectSetDouble(ID,name,OBJPROP_LEVELVALUE,i,mLevels[i].value);                        //--- значение уровня (double)
      ObjectSetString(ID,name,OBJPROP_LEVELTEXT,i,mLevels[i].text);                          //--- описание уровня (string)
   }
   return(true);
}
//+------------------------------------------------------------------+
//|            запись массива уровней Фибосеток                      |
//+------------------------------------------------------------------+
bool InitMassLevelsFibo()
{
   if(ArrayResize(mLevels,sLevels)<0) return(false);
   static my_Fibo mCopy[]; int i,j,iL=0,iC; double value; ResetLastError();
   for(i=1; i<=sLevels; i++) //запись инпутов в массив
   {  mLevels[i-1]._use=(i==1?useLev1:(i==2?useLev2:(i==3?useLev3:(i==4?useLev4:(i==5?useLev5:(i==6?useLev6:(i==7?useLev7
                        :(i==8?useLev8:(i==9?useLev9:(i==10?useLev10:(i==11?useLev11:(i==12?useLev12:false))))))))))));
      mLevels[i-1].style=(i==1?sLev1:(i==2?sLev2:(i==3?sLev3:(i==4?sLev4:(i==5?sLev5:(i==6?sLev6:(i==7?sLev7
                        :(i==8?sLev8:(i==9?sLev9:(i==10?sLev10:(i==11?sLev11:(i==12?sLev12:STYLE_DOT))))))))))));
      mLevels[i-1].width=int(i==1?wLev1:(i==2?wLev2:(i==3?wLev3:(i==4?wLev4:(i==5?wLev5:(i==6?wLev6:(i==7?wLev7
                        :(i==8?wLev8:(i==9?wLev9:(i==10?wLev10:(i==11?wLev11:(i==12?wLev12:1))))))))))));
      mLevels[i-1]._clr=(i==1?cLev1:(i==2?cLev2:(i==3?cLev3:(i==4?cLev4:(i==5?cLev5:(i==6?cLev6:(i==7?cLev7
                        :(i==8?cLev8:(i==9?cLev9:(i==10?cLev10:(i==11?cLev11:(i==12?cLev12:clrNONE))))))))))));
      mLevels[i-1].value=(i==1?dLev1:(i==2?dLev2:(i==3?dLev3:(i==4?dLev4:(i==5?dLev5:(i==6?dLev6:(i==7?dLev7
                        :(i==8?dLev8:(i==9?dLev9:(i==10?dLev10:(i==11?dLev11:(i==12?dLev12:EMPTY_VALUE))))))))))));
      mLevels[i-1].text=(i==1?xLev1:(i==2?xLev2:(i==3?xLev3:(i==4?xLev4:(i==5?xLev5:(i==6?xLev6:(i==7?xLev7
                        :(i==8?xLev8:(i==9?xLev9:(i==10?xLev10:(i==11?xLev11:(i==12?xLev12:""))))))))))));  }
// сжатие массива
   for(i=j=0; i<sLevels; i++) if(mLevels[i]._use)  if(j==i) j++; else {fCopyLevels(mLevels,mLevels,i,j); j++;}
   if(j!=sLevels)
      if(ArrayResize(mLevels,j)==j) sLevels=j; 
      else {Alert(__FUNCTION__,"(",__LINE__,")"," Размер массива mLevels не изменился. Ошибка ",GetLastError()); return(false);}
// сортировка массива   
   if(ArrayResize(mCopy,sLevels)<0) {Alert(__FUNCTION__,"(",__LINE__,")"," Размер массива mCopy не изменился. Ошибка ",GetLastError()); return(false);}
   for(i=0; i<sLevels; i++) fCopyLevels(mLevels,mCopy,i,i);
   while(true)
   {  for(i=0,iC=-1,value=0; i<sLevels; i++) if(mCopy[i]._use) if(iC<0 || mCopy[i].value<value) {iC=i; value=mCopy[i].value;}
      if(iC<0) break;
      fCopyLevels(mCopy,mLevels,iC,iL); mCopy[iC]._use=false; iL++; 
      if(iL>=sLevels) break;  }
   ArrayFree(mCopy);
//проверка массива
   for(i=0,T="Проверка цветов уровней"; i<sLevels; i++)
      T+="\n"+(string)i+"_"+(string)mLevels[i]._use+"_"+(string)mLevels[i]._clr+"_"+mLevels[i].text;
   Comment(T);
   return(true);
}
//+------------------------------------------------------------------+
void fCopyLevels(my_Fibo &mOf[],my_Fibo &mIn[],int iOf,int iIn)
{  mIn[iIn]._use=mOf[iOf]._use;    mIn[iIn].style=mOf[iOf].style;     mIn[iIn].width=mOf[iOf].width;
   mIn[iIn]._clr=mOf[iOf]._clr;    mIn[iIn].value=mOf[iOf].value;     mIn[iIn].text=mOf[iOf].text;
   return;  }
Файлы:
TestFibo.mq4 28 kb
TestFibo.ex4 51 kb
Nikolay Khrushchev
21427
Nikolay Khrushchev  
уровни в сетке фибоначи имеют один общий цвет.
если хотите разные - рисуйте каждый уровень по отдельности в виде трендлайн.
Dmitry Sumsky
2459
Dmitry Sumsky  

Привет Николай.

А нафиг тогда сделали в справке установку цвета, стиля, толщины и т.д. для каждого уровня?

Vitaly Muzichenko
14112
Vitaly Muzichenko  
Nikolay Khrushchev:
уровни в сетке фибоначи имеют один общий цвет.
если хотите разные - рисуйте каждый уровень по отдельности в виде трендлайн.

Ну или в МТ5, там разноцветные

Vitaly Muzichenko
14112
Vitaly Muzichenko  
Dmitry Sumsky:

Привет Николай.

А нафиг тогда сделали в справке установку цвета, стиля, толщины и т.д. для каждого уровня?

Много функционала переехало на МТ4, но некоторый не работает в связи с устаревшей архитектурой платформы. Сделано для того, чтоб легче был перенос с МТ4 на МТ5

Dmitry Sumsky
2459
Dmitry Sumsky  

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

Или я что-то не так понимаю?

Vitaly Muzichenko
14112
Vitaly Muzichenko  
Dmitry Sumsky:

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

Или я что-то не так понимаю?

Дайте ссылку на справку, погляжу

Dmitry Sumsky
2459
Dmitry Sumsky  
OBJ_FIBO - Типы объектов - Константы объектов - Константы, перечисления и структуры - Справочник MQL4
OBJ_FIBO - Типы объектов - Константы объектов - Константы, перечисления и структуры - Справочник MQL4
  • docs.mql4.com
Следующий скрипт создает и перемещает на графике "Уровни Фибоначчи". Для создания и изменения свойств графического объекта написаны специальные функции, которые вы можете использовать "как есть" в своих собственных программах. //| Cоздает "Уровни Фибоначчи" по заданным координатам               |               time1=0,           ...
Dmitry Sumsky
2459
Dmitry Sumsky  
ну и...?
Vitaly Muzichenko
14112
Vitaly Muzichenko  

Да, пример видимо перекочевал со справки мт5, вот там работает цветное фибо, Я даже минимальный код выкладывал где-то

Dmitry Sumsky
2459
Dmitry Sumsky  
Vitaly Muzichenko:

Да, пример видимо перекочевал со справки мт5, вот там работает цветное фибо, Я даже минимальный код выкладывал где-то

Какая разница что откуда перекочевывает. Если это есть в справке, значит это должно работать. А иначе как можно доверять справке??? Для чего тогда справка?

12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий