Уровни Фибоначчи в MQL4

 
  Всем доброе время суток! Возник вопрос - при создании объекта Уровней Фибоначчи, можно ли каждый отдельно уровень сделать разным цветом и как можно присвоить отдельному уровню сигнальное значение для советника? Заранее благодарен! С уважением, Евгений!
 
лучше рассчитывать их значения сразу в советнике
 

     Вот так в функции можно прописать? Но цвет не меняется на отдельных уровнях может где-то есть ошибка или что-то еще надо добавить???

  int fibo(datetime X1, double Y1, datetime X2, double Y2) 

{

ObjectCreate("Fibo", OBJ_FIBO, 0, 0, 0, 0, 0); // Создаем объект Уровней Фибоначчи

ObjectSet("Fibo",OBJPROP_COLOR,clrRed); //  цвет диагонали 

//ObjectSet("Fibo",OBJPROP_LEVELCOLOR,clrBlue); // цвет уровней одинаковый

//ObjectSetInteger(0,"Fibo",OBJPROP_BACK,true);//--- отобразим на переднем (false) или заднем (true) плане


ObjectSet("Fibo",OBJPROP_FIBOLEVELS,13); //Устанавливаем число уровней объекта


ObjectSet("Fibo",OBJPROP_FIRSTLEVEL+0,0.000);//Устанавливаем значения каждого  уровня объекта

      ObjectSetDouble(0,"Fibo",OBJPROP_LEVELVALUE,0,0.000);

ObjectSetInteger(0,"Fibo",OBJPROP_LEVELCOLOR,0,clrGreen); // цвет уровня 

ObjectSetInteger(0,"Fibo",OBJPROP_LEVELSTYLE,0,STYLE_SOLID);//Сплошная линия

ObjectSetInteger(0,"Fibo",OBJPROP_LEVELWIDTH,0,1);  //--- толщина уровня 

ObjectSetFiboDescription("Fibo",0,"0.000");


ObjectSet("Fibo",OBJPROP_FIRSTLEVEL+1,0.146);

      ObjectSetDouble(0,"Fibo",OBJPROP_LEVELVALUE,1,0.146);

ObjectSetInteger(0,"Fibo",OBJPROP_LEVELCOLOR,1,clrGreen); // цвет уровня 

ObjectSetInteger(0,"Fibo",OBJPROP_LEVELSTYLE,1,STYLE_SOLID);//Сплошная линия

ObjectSetInteger(0,"Fibo",OBJPROP_LEVELWIDTH,1,1);  //--- толщина уровня 

ObjectSetFiboDescription("Fibo",1,"0.146");


ObjectSet("Fibo",OBJPROP_FIRSTLEVEL+2,0.236);

      ObjectSetDouble(0,"Fibo",OBJPROP_LEVELVALUE,2,0.236);

ObjectSetInteger(0,"Fibo",OBJPROP_LEVELCOLOR,2,clrGreen); // цвет уровня 

ObjectSetInteger(0,"Fibo",OBJPROP_LEVELSTYLE,2,STYLE_SOLID);//Сплошная линия

ObjectSetInteger(0,"Fibo",OBJPROP_LEVELWIDTH,2,1);  //--- толщина уровня 

ObjectSetFiboDescription("Fibo",2,"0.236");


ObjectSet("Fibo",OBJPROP_FIRSTLEVEL+3,0.382);

      ObjectSetDouble(0,"Fibo",OBJPROP_LEVELVALUE,3,0.382);

ObjectSetInteger(0,"Fibo",OBJPROP_LEVELCOLOR,3,clrGreen); // цвет уровня 

ObjectSetInteger(0,"Fibo",OBJPROP_LEVELSTYLE,3,STYLE_SOLID);//Сплошная линия

ObjectSetInteger(0,"Fibo",OBJPROP_LEVELWIDTH,3,1);  //--- толщина уровня 

ObjectSetFiboDescription("Fibo",3,"0.382");



ObjectSet("Fibo",OBJPROP_FIRSTLEVEL+4,0.5);

      ObjectSetDouble(0,"Fibo",OBJPROP_LEVELVALUE,4,0.5);

ObjectSetInteger(0,"Fibo",OBJPROP_LEVELCOLOR,4,clrGreen); // цвет уровня 

ObjectSetInteger(0,"Fibo",OBJPROP_LEVELSTYLE,4,STYLE_SOLID);//Сплошная линия

ObjectSetInteger(0,"Fibo",OBJPROP_LEVELWIDTH,4,1);  //--- толщина уровня 

ObjectSetFiboDescription("Fibo",4,"0.5");


ObjectSet("Fibo",OBJPROP_FIRSTLEVEL+5,0.618);

     ObjectSetDouble(0,"Fibo",OBJPROP_LEVELVALUE,5,0.618);

ObjectSetInteger(0,"Fibo",OBJPROP_LEVELCOLOR,5,clrGreen); // цвет уровня 

ObjectSetInteger(0,"Fibo",OBJPROP_LEVELSTYLE,5,STYLE_SOLID);//Сплошная линия

ObjectSetInteger(0,"Fibo",OBJPROP_LEVELWIDTH,5,1);  //--- толщина уровня 

ObjectSetFiboDescription("Fibo",5,"0.618");


ObjectSet("Fibo",OBJPROP_FIRSTLEVEL+6,0.764);

     ObjectSetDouble(0,"Fibo",OBJPROP_LEVELVALUE,6,0.764);

ObjectSetInteger(0,"Fibo",OBJPROP_LEVELCOLOR,6,clrGreen); // цвет уровня 

ObjectSetInteger(0,"Fibo",OBJPROP_LEVELSTYLE,6,STYLE_SOLID);//Сплошная линия

ObjectSetInteger(0,"Fibo",OBJPROP_LEVELWIDTH,6,1);  //--- толщина уровня 

ObjectSetFiboDescription("Fibo",6,"0.764");


ObjectSet("Fibo",OBJPROP_FIRSTLEVEL+7,1);

      ObjectSetDouble(0,"Fibo",OBJPROP_LEVELVALUE,7,1);

ObjectSetInteger(0,"Fibo",OBJPROP_LEVELCOLOR,7,clrGreen); // цвет уровня 

ObjectSetInteger(0,"Fibo",OBJPROP_LEVELSTYLE,7,STYLE_SOLID);//Сплошная линия

ObjectSetInteger(0,"Fibo",OBJPROP_LEVELWIDTH,7,1);  //--- толщина уровня 

ObjectSetFiboDescription("Fibo",7,"1");


ObjectSet("Fibo",OBJPROP_FIRSTLEVEL+8,1.236);

      ObjectSetDouble(0,"Fibo",OBJPROP_LEVELVALUE,8,1.236);

ObjectSetInteger(0,"Fibo",OBJPROP_LEVELCOLOR,8,clrGreen); // цвет уровня 

ObjectSetInteger(0,"Fibo",OBJPROP_LEVELSTYLE,8,STYLE_SOLID);//Сплошная линия

ObjectSetInteger(0,"Fibo",OBJPROP_LEVELWIDTH,8,1);  //--- толщина уровня 

ObjectSetFiboDescription("Fibo",8,"1.236");


ObjectSet("Fibo",OBJPROP_FIRSTLEVEL+9,1.618);

      ObjectSetDouble(0,"Fibo",OBJPROP_LEVELVALUE,9,1.618);

ObjectSetInteger(0,"Fibo",OBJPROP_LEVELCOLOR,9,clrGreen); // цвет уровня 

ObjectSetInteger(0,"Fibo",OBJPROP_LEVELSTYLE,9,STYLE_SOLID);//Сплошная линия

ObjectSetInteger(0,"Fibo",OBJPROP_LEVELWIDTH,9,1);  //--- толщина уровня 

ObjectSetFiboDescription("Fibo",9,"1.618");


      

ObjectSet("Fibo",OBJPROP_FIRSTLEVEL+10,-0.236);

      ObjectSetDouble(0,"Fibo",OBJPROP_LEVELVALUE,10,-0.236);

ObjectSetInteger(0,"Fibo",OBJPROP_LEVELCOLOR,10,clrBlue); // цвет уровня 

ObjectSetInteger(0,"Fibo",OBJPROP_LEVELSTYLE,10,STYLE_SOLID);//Сплошная линия

ObjectSetInteger(0,"Fibo",OBJPROP_LEVELWIDTH,10,1);  //--- толщина уровня 

ObjectSetFiboDescription("Fibo",10,"-0.236");


ObjectSet("Fibo",OBJPROP_FIRSTLEVEL+11,-0.618);

      ObjectSetDouble(0,"Fibo",OBJPROP_LEVELVALUE,11,-0.618);

ObjectSetInteger(0,"Fibo",OBJPROP_LEVELCOLOR,11,clrBlue); // цвет уровня 

ObjectSetInteger(0,"Fibo",OBJPROP_LEVELSTYLE,11,STYLE_SOLID);//Сплошная линия

ObjectSetInteger(0,"Fibo",OBJPROP_LEVELWIDTH,11,1);  //--- толщина уровня 

ObjectSetFiboDescription("Fibo",11,"-0.618");


ObjectSet("Fibo",OBJPROP_FIRSTLEVEL+12,-1);

      ObjectSetDouble(0,"Fibo",OBJPROP_LEVELVALUE,12,-1);

ObjectSetInteger(0,"Fibo",OBJPROP_LEVELCOLOR,12,clrBlue); // цвет уровня 

ObjectSetInteger(0,"Fibo",OBJPROP_LEVELSTYLE,12,STYLE_SOLID);//Сплошная линия

ObjectSetInteger(0,"Fibo",OBJPROP_LEVELWIDTH,12,1);  //--- толщина уровня 

ObjectSetFiboDescription("Fibo",12,"-1");


ObjectMove("Fibo", 1, X1, Y1); 

ObjectMove("Fibo",0, X2, Y2);

return(0);

}

         


 
int fFiboLevels(string Prefix,int Number
              ,int Bar1,double Price1
              ,int Bar2,double Price2
              ,int Bar3,double Price3
              ,color Цвет,color ЦветОтката
              ,int Видимость=0,int Толщина=1
              ,int УровнейПродолжения=6,int УровнейОтката=5
              ,int Стиль=STYLE_SOLID,int СтильУровня=STYLE_DOT
              ,bool Луч=false,bool Фон=false){
   int Error;
   string Name;
   datetime Time1=Time[Bar1],
            Time2=Time[Bar2],
            Time3=Time[Bar3];
   if( Bar1<=Bar2 || Bar2<=Bar3 || Bar3<1
    || Price1<Zero || Price2<Zero || Price3<Zero
    || Price3-MathMax(Price1,Price2)>Zero
    || MathMin(Price1,Price2)-Price3>Zero ) return(MyError);
   Name=Prefix+"Targets ";
   if( Number>0 ) Name=Name+Number;
   if( ObjectFind(Name)>=0 ) {
      if( !ObjectDelete(Name) ) {
         Error=GetLastError();
         PlaySound("alert.wav");
         Print("***** "+Name+" не создан, ошибка удаления "+Error);
         return(Error);
   }  }
   if( ObjectCreate(Name,OBJ_EXPANSION,0,Time1,Price1,Time2,Price2,Time3,Price3) ){
      if( !ObjectSet(Name, OBJPROP_FIBOLEVELS, УровнейПродолжения)
       || !ObjectSet(Name, OBJPROP_COLOR, Цвет)
       || !ObjectSet(Name, OBJPROP_STYLE, Стиль)
       || !ObjectSet(Name, OBJPROP_WIDTH, Толщина)
       || !ObjectSet(Name, OBJPROP_TIMEFRAMES, Видимость)
       || !ObjectSet(Name, OBJPROP_LEVELCOLOR, Цвет)
       || !ObjectSet(Name, OBJPROP_LEVELSTYLE, СтильУровня)
       || !ObjectSet(Name, OBJPROP_RAY, Луч)
       || !ObjectSet(Name, OBJPROP_BACK, Фон)
       || !ObjectSet(Name, OBJPROP_FIRSTLEVEL+0, 1)
       || !ObjectSet(Name, OBJPROP_FIRSTLEVEL+1, 1.618)
       || !ObjectSet(Name, OBJPROP_FIRSTLEVEL+2, 2.618)
       || !ObjectSet(Name, OBJPROP_FIRSTLEVEL+3, 4.236)
       || !ObjectSet(Name, OBJPROP_FIRSTLEVEL+4, 6.854)
       || !ObjectSet(Name, OBJPROP_FIRSTLEVEL+5, 11.09) ){
         Error=GetLastError();
         PlaySound("alert.wav");
         Print("****  "+Name+" - ошибка модификации параметров "+Error);
   }  }
   else {
      Error=GetLastError();
      PlaySound("alert.wav");
      Print("***** "+Name+" не создан, ошибка "+Error);
   }
   Name=Prefix+"Recoils ";
   if( Number>0 ) Name=Name+Number;
   if( ObjectFind(Name)>=0 ) {
      if( !ObjectDelete(Name) ) {
         Error=GetLastError();
         PlaySound("alert.wav");
         Print("***** "+Name+" не создан, ошибка удаления "+Error);
         return(Error);
   }  }
   if( ObjectCreate(Name,OBJ_FIBO,0,Time1,Price1,Time2,Price2) ){
      if( !ObjectSet(Name, OBJPROP_FIBOLEVELS, УровнейОтката)
       || !ObjectSet(Name, OBJPROP_COLOR, Цвет)
       || !ObjectSet(Name, OBJPROP_STYLE, Стиль)
       || !ObjectSet(Name, OBJPROP_TIMEFRAMES, Видимость)
       || !ObjectSet(Name, OBJPROP_LEVELCOLOR, ЦветОтката)
       || !ObjectSet(Name, OBJPROP_LEVELSTYLE, СтильУровня)
       || !ObjectSet(Name, OBJPROP_RAY, false)
       || !ObjectSet(Name, OBJPROP_BACK, Фон)
       || !ObjectSet(Name, OBJPROP_FIRSTLEVEL+0, 0)
       || !ObjectSet(Name, OBJPROP_FIRSTLEVEL+1, 0.236)
       || !ObjectSet(Name, OBJPROP_FIRSTLEVEL+2, 0.382)
       || !ObjectSet(Name, OBJPROP_FIRSTLEVEL+3, 0.618)
       || !ObjectSet(Name, OBJPROP_FIRSTLEVEL+4, 1) ){
         Error=GetLastError();
         PlaySound("alert.wav");
         Print("****  "+Name+" - ошибка модификации параметров "+Error);
   }  }
   else {
      Error=GetLastError();
      PlaySound("alert.wav");
      Print("***** "+Name+" не создан, ошибка "+Error);
   }
   return(Error);
}
 
jekk:

     Вот так в функции можно прописать? Но цвет не меняется на отдельных уровнях может где-то есть ошибка или что-то еще надо добавить???

Вам индикатор или для советника? Если для советника, то вполне хватит только расчёта значений этих уровней, красивостей и цвета совсем не нужно.

 
 Для советника - хочу понять какой функцией можно воспользоваться, чтоб отделить каждый уровень, для присвоения сигнального значения? Мысль по ZigZag находим координаты - советник рисует Уровни Фибоначчи и от каждого уровня (на расстояние чуть больше спреда) отступаем, и прописываем еще параллельные уровни - их берем за основу принятия решений на открытие ордера.
 
jekk:
 Для советника - хочу понять какой функцией можно воспользоваться, чтоб отделить каждый уровень, для присвоения сигнального значения? Мысль по ZigZag находим координаты - советник рисует Уровни Фибоначчи и от каждого уровня (на расстояние чуть больше спреда) отступаем, и прописываем еще параллельные уровни - их берем за основу принятия решений на открытие ордера.

Для OBJ_FIBO цвет одинаковый для всех уровней. Если шибко приперло, рисуйте фибо простыми линиями OBJ_TRENDLINE разного цвета.
 
jekk:
 Для советника - хочу понять какой функцией можно воспользоваться, чтоб отделить каждый уровень, для присвоения сигнального значения? Мысль по ZigZag находим координаты - советник рисует Уровни Фибоначчи и от каждого уровня (на расстояние чуть больше спреда) отступаем, и прописываем еще параллельные уровни - их берем за основу принятия решений на открытие ордера.

не надо ничего отделять, берёте формулу и производите вычисления каждого уровня прямо в советнике, работаете с полученными значениями, зачем цвет и линии вообще?
 
evillive:

Вам индикатор или для советника? Если для советника, то вполне хватит только расчёта значений этих уровней, красивостей и цвета совсем не нужно.

всегда визуальная часть должна присутсвовать, чтобы понятно было (по крайней мере в начале то точно)
 
evillive:

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

А, как выглядит формула, пример можно показать??? 
 
jekk:

А, как выглядит формула, пример можно показать??? 

ну формулой это назвать сложно: берём минимальную и максимальную цену - 0% и 100% и делим на уровни, значения их везде понаписаны - 23,6%, 38.2%, 50%, 61.8%, 161,8% (или 0.236, 0.382, 0.5, 0.618, 1.618 и т.д. делением на 0,618 с округлением до 3 знака).

для цен 1,3254 и 1,3896 как-то так:

 прямой  обратный 
161,80% Уровень:  1.42930,0% Уровень:1.3896
100,0% Уровень:  1.389623,60% Уровень:1.3744
61,8% Уровень:  1.365138,2% Уровень:1.3651
50,0% Уровень:  1.357550,0% Уровень:1.3575
38,2% Уровень:  1.349961,8% Уровень:1.3499
23,6% Уровень:
 1.3406100,0% Уровень:1.3254
0,0% Уровень:  1.3254161,8% Уровень: 1.2857


то есть (Цена(100%)-Цена(0%))*Уровень(в тысячных) + Цена(0%) для прямого расчёта и Цена(100%) - (Цена(100%)-Цена(0%)) * Уровень(в тысячных) - для обратного расчёта.

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