Запрос уровней фибо

 
Что-то не пойму, как запросить програмно, какой цене торгового инструмента соответствует уровень, например,38,2 натянутого на волну объекта уровней фибоначчи? Есть способ, или надо рассчитывать самому? Начал делать скрипт, дошёл до ObjectGet() и словно в ступор вошёл. Может кто разъяснит?
//+------------------------------------------------------------------+
//|                                                          111.mq4 |
//|                                        Copyright © 2007, Forexer |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright ""
#property link      ""
#include <Errors.mqh>
 
string   SMB;
double   Prise1,Prise2;
datetime Tim1,Tim2;
double   Pr1,Pr2,Pr3,Pr4,Pr5,Pr6,Pr7,Pr8;
 
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start(){
 
   SMB=Symbol();
   Tim1=iTime(SMB,PERIOD_D1,1);
   //Tim2=iTime(SMB,PERIOD_D1,1);
  
   Prise1=iHigh(SMB,PERIOD_D1,1);
   Prise2=iLow(SMB,PERIOD_D1,1);
   
   
   
   if(!ObjectCreate("1",OBJ_FIBO,0,Tim1,Prise1,Tim1,Prise2)){
     GeneralError();
   }
   if(!ObjectSet("1",OBJPROP_COLOR,Red)){
     GeneralError();
   }
   if(!ObjectSet("1",OBJPROP_LEVELCOLOR,Blue)){
     GeneralError();
   }
   
   // ------ Запрашиваем значения уровней фибо
   Pr2=ObjectGet();//Что же сюда вписать, чтоб узнать цены?
   
 
 
 
 
   return(0);
}
//+------------------------------------------------------------------+
 
Странно, у меня такая мысль не возникала. Хотя она вполне естественна. Я - просто считаю. Хотя логично было бы что-то типа
Pr2 = ObjectGet( "1", OBJPROP_FIRSTLEVEL+1 );
Но эта конструкция дает только сами Фибы, т.е. пропорции, а не цены...
 

Просто рассчитать уровень и все.

void FIBO_calculate()
{
  int digits = MarketInfo(Symbol(),MODE_DIGITS);
  double bid=MarketInfo(Symbol(),MODE_BID);                 //текущая цена Bid
  High_day=iHigh(NULL,1440,0);                              //максимум текущего дня 
  Low_day=iLow(NULL,1440,0);                                //минимум текущего дня
  middle_day=NormalizeDouble((High_day + Low_day)/2,digits);//среднее текущего дня
  Shi_Fibo = MathRound((High_day - Low_day)/Point);         //ширина ФИБО дня 
  if(bid > middle_day) {UP_trend=1; DN_trend=0;}            //тенденция вверх
     else              {UP_trend=0; DN_trend=1;}            //тенденция вниз   
//рассчитаем уровни ФИБО  
  Fibo25 = NormalizeDouble(Low_day + (High_day - Low_day)*0.25, digits);
  Fibo38 = NormalizeDouble(Low_day + (High_day - Low_day)*0.382,digits);
  Fibo50 = middle_day;
  Fibo62 = NormalizeDouble(Low_day + (High_day - Low_day)*0.618,digits);
  Fibo75 = NormalizeDouble(Low_day + (High_day - Low_day)*0.75, digits);
 
}
 

Спасибо парни. Понял.

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

 
FION писал (а) >>

Просто рассчитать уровень и все.

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

 
// ------------- PriceLevelFiboUp() ----------------------------------------------------------------
// На вход функции постпуает уровень фибо, напр. 61,8
// функция возвращает его цену по данной валютной паре
// В переменные Price_0 и Price_100 подают заранее вычисленную цену нулевого и сотого уровней фибо
// Если на вход подан нкорректный Level, то функция вернёт -1
//---------------------------------------------------------------------------------
double PriceLevelFiboUp(double Level,double Price_0,double Price_100){
  double Rst=0,Price=-1;
  string SMB=Symbol(),FunctionName="PriceLevelFiboUp()";
        if(Price_0>=Price_100){
                Print("Ошибка. В переменные Price_0 и Price_100 поданы некорректные цены = ",Price_0," и ",Price_100);
                Print("==================== ",FunctionName," ====================");
                return(Price);
        }
        int DGS=MarketInfo(SMB,MODE_DIGITS);
        Rst=Price_100-Price_0;
  if(Level==0){
                Price=NormalizeDouble(Price_0,DGS);
        }
        if(Level==23.6){
                Price=NormalizeDouble(Price_0+Rst*0.236,DGS);
        }
        if(Level==38.2){
                Price=NormalizeDouble(Price_0+Rst*0.382,DGS);
        }
        if(Level==50){
                Price=NormalizeDouble(Price_0+Rst*0.5,DGS);
        }
        if(Level==61.8){
                Price=NormalizeDouble(Price_0+Rst*0.618,DGS);
        }
        if(Level==100){
                Price=NormalizeDouble(Price_100,DGS);
        }
        if(Level==123.6){
                Price=NormalizeDouble(Price_0+Rst*1.236,DGS);
        }
        if(Level==138.2){
                Price=NormalizeDouble(Price_0+Rst*1.382,DGS);
        }
        if(Level==150){
                Price=NormalizeDouble(Price_0+Rst*1.5,DGS);
        }
        if(Level==161.8){
                Price=NormalizeDouble(Price_0+Rst*1.618,DGS);
        }
        if(Level==180.9){
                Price=NormalizeDouble(Price_0+Rst*1.809,DGS);
        }
        if(Level==200){
                Price=NormalizeDouble(Price_0+Rst*2.000,DGS);
        }
        if(Level==223.6){
                Price=NormalizeDouble(Price_0+Rst*2.236,DGS);
        }
        if(Level==238.2){
                Price=NormalizeDouble(Price_0+Rst*2.382,DGS);
        }
        if(Level==250){
                Price=NormalizeDouble(Price_0+Rst*2.5,DGS);
        }
        if(Level==261.8){
                Price=NormalizeDouble(Price_0+Rst*2.618,DGS);
        }
        if(Level==280.9){
                Price=NormalizeDouble(Price_0+Rst*2.809,DGS);
        }
        if(Level==300){
                Price=NormalizeDouble(Price_0+Rst*3.000,DGS);
        }
        if(Level==323.6){
                Price=NormalizeDouble(Price_0+Rst*3.236,DGS);
        }
        if(Level==338.2){
                Price=NormalizeDouble(Price_0+Rst*3.382,DGS);
        }
        if(Level=350){
                Price=NormalizeDouble(Price_0+Rst*3.5,DGS);
        }
        if(Level==361.8){
                Price=NormalizeDouble(Price_0+Rst*3.618,DGS);
        }
        if(Level==380.9){
                Price=NormalizeDouble(Price_0+Rst*3.809,DGS);
        }
        if(Level==400){
                Price=NormalizeDouble(Price_0+Rst*4.000,DGS);
        }
        if(Level==423.6){
                Price=NormalizeDouble(Price_0+Rst*4.236,DGS);
        }
        
        return(Price);
}
//---------------------------------------------------------------------------------

// ------------- PriceLevelFiboDown() ----------------------------------------------------------------
// На вход функции постуает уровень фиоб, напр. 61,8
// функция возвращает его цену по данной валютной паре
// В переменные Price_0 и Price_100 подают заранее вычисленную цену нулевого и сотого уровней фибо
// Причём Price_0 > Price_100
// Если на вход подан нкорректный Level, то функция вернёт -1
//---------------------------------------------------------------------------------
double PriceLevelFiboDown(double Level,double Price_0,double Price_100){
  double Rst=0,Price=-1;
  string SMB=Symbol(),FunctionName="PriceLevelFiboDown()";
        if(Price_0<=Price_100){
                Print("Ошибка. В переменные Price_0 и Price_100 поданы некорректные цены = ",Price_0," и ",Price_100);
                Print("==================== ",FunctionName," ====================");
                return(Price);
        }
        int DGS=MarketInfo(SMB,MODE_DIGITS);
        Rst=Price_0-Price_100;
  if(Level==0){
                Price=NormalizeDouble(Price_0,DGS);
        }
        if(Level==23.6){
                Price=NormalizeDouble(Price_0-Rst*0.236,DGS);
        }
        if(Level==38.2){
                Price=NormalizeDouble(Price_0-Rst*0.382,DGS);
        }
        if(Level==50){
                Price=NormalizeDouble(Price_0-Rst*0.5,DGS);
        }
        if(Level==61.8){
                Price=NormalizeDouble(Price_0-Rst*0.618,DGS);
        }
        if(Level==100){
                Price=NormalizeDouble(Price_100,DGS);
        }
        if(Level==123.6){
                Price=NormalizeDouble(Price_0-Rst*1.236,DGS);
        }
        if(Level==138.2){
                Price=NormalizeDouble(Price_0-Rst*1.382,DGS);
        }
        if(Level==150){
                Price=NormalizeDouble(Price_0-Rst*1.5,DGS);
        }
        if(Level==161.8){
                Price=NormalizeDouble(Price_0-Rst*1.618,DGS);
        }
        if(Level==180.9){
                Price=NormalizeDouble(Price_0-Rst*1.809,DGS);
        }
        if(Level==200){
                Price=NormalizeDouble(Price_0-Rst*2.000,DGS);
        }
        if(Level==223.6){
                Price=NormalizeDouble(Price_0-Rst*2.236,DGS);
        }
        if(Level==238.2){
                Price=NormalizeDouble(Price_0-Rst*2.382,DGS);
        }
        if(Level==250){
                Price=NormalizeDouble(Price_0-Rst*2.5,DGS);
        }
        if(Level==261.8){
                Price=NormalizeDouble(Price_0-Rst*2.618,DGS);
        }
        if(Level==280.9){
                Price=NormalizeDouble(Price_0-Rst*2.809,DGS);
        }
        if(Level==300){
                Price=NormalizeDouble(Price_0-Rst*3.000,DGS);
        }
        if(Level==323.6){
                Price=NormalizeDouble(Price_0-Rst*3.236,DGS);
        }
        if(Level==338.2){
                Price=NormalizeDouble(Price_0-Rst*3.382,DGS);
        }
        if(Level=350){
                Price=NormalizeDouble(Price_0-Rst*3.5,DGS);
        }
        if(Level==361.8){
                Price=NormalizeDouble(Price_0-Rst*3.618,DGS);
        }
        if(Level==380.9){
                Price=NormalizeDouble(Price_0-Rst*3.809,DGS);
        }
        if(Level==400){
                Price=NormalizeDouble(Price_0-Rst*4.000,DGS);
        }
        if(Level==423.6){
                Price=NormalizeDouble(Price_0-Rst*4.236,DGS);
        }        
  return(Price);
}