Как определить между какими ценами находится цена

 

Пишу советника и в данный момент столкнулся с такой проблемой. У меня есть 13 рассчитанных переменных (значения цен на графике по сути уровни) . К примеру цена в данный момент находится между двумя соседними уровнями (поддержка и сопротивление) и как определить между какими именно и вернуть их значения?

 
У каждого уровня есть цена, уровни пронумерованы, задайте ещё переменными количество диапозонов от 1 до 6 например. Сравнивайте значение Bid, если оно не выше верхнего уровня (1) но выше предыдущего(2) то это диапазон 1 например. Что то типа такого...
 
miha91:

Пишу советника и в данный момент столкнулся с такой проблемой. У меня есть 13 рассчитанных переменных (значения цен на графике по сути уровни) . К примеру цена в данный момент находится между двумя соседними уровнями (поддержка и сопротивление) и как определить между какими именно и вернуть их значения?


тот подход который мне видится:

1) создаете массив A[], перераспределяете под него память,вносите значения с ваших переменных (13 в вашем случаи)

2) проводите сортировку в массиве (по возрастанию, например) - реализуется циклом в цикле

3) ищите в цикле когда текущее значение цены окажется меньше одного и больше другого значений массива

4) берете эти два значения и в цикле ищете каким переменным они соответствуют (между какими переменными у вас цена).

п.с. не надо флудить - где бы вы не написали вопрос - вас увидят.

хотите помощи - приводите код - хоть кривой, но приводите.

халявы тут не любят.

 
ALXIMIKS:


тот подход который мне видится:

1) создаете массив A[], перераспределяете под него память,вносите значения с ваших переменных (13 в вашем случаи)

2) проводите сортировку в массиве (по возрастанию, например) - реализуется циклом в цикле

3) ищите в цикле когда текущее значение цены окажется меньше одного и больше другого значений массива

4) берете эти два значения и в цикле ищете каким переменным они соответствуют (между какими переменными у вас цена).

Это в лоб, а можно гораздо проще: в один проход и ничего не сортируя.

1) пробежаться по всем уровням, произведя поиск максимума из всех уровней, меньших заданной цены, и минимума всех уровней, больших заданной цены.

Всё))

 
Я вроде так и делал, но при тесте MT4 почему то выводил я кобы цена находится в 6 диапазонах т. есть Пример: "Диапазон от P - M2" после "Диапазон от M2 - S1" ..... и до последнего, а затем всё повторяется
//Определение точки входа до обеда (торговля на продажу), выставление профита и лося

 if ( Bid <= P /*&& Bid <= ima*/)
     {
      //if ( P <= ima)
       // {
         switch (Diapazons_sell())
          { 
           case 1 : Print( "Диапазон от P - M2");
           case 2 : Print( "Диапазон от M2 - S1");
           case 3 : Print( "Диапазон от S1 - M1");
           case 4 : Print( "Диапазон от M1 - S2");
           case 5 : Print( "Диапазон от S2 - M0");
           case 6 : Print( "Диапазон от M0 - S3");
          }        
       // }
     } 
  if (Ask >= P /*&& Ask >= ima*/)
     {
       //if ( P >= ima)
        //{
          switch (Diapazons_buy())
          { 
           case 1 : Print( "Диапазон от P - M3");
           case 2 : Print( "Диапазон от M3 - R1");
           case 3 : Print( "Диапазон от R1 - M4");
           case 4 : Print( "Диапазон от M4 - R2");
           case 5 : Print( "Диапазон от R2 - M5");
           case 6 : ( "Диапазон от M5 - R3");
          } 
        //}
     }
  //Функция определения диапазона в котором находится цена в данный момент (при продажах)

double Diapazons_sell()
{
 //Получение ежидневных цен

ArrayCopyRates(rates_d1, Symbol(), PERIOD_D1);

yesterday_close = rates_d1[1][4];
yesterday_open = rates_d1[1][1];
today_open = rates_d1[0][1];
yesterday_high = rates_d1[1][3];
yesterday_low = rates_d1[1][2];
day_high = rates_d1[0][3];
day_low = rates_d1[0][2];

P = (yesterday_high + yesterday_low + yesterday_close) / 3;

S1 = (2*P)-yesterday_high;
S2 = P-(yesterday_high - yesterday_low);
S3 = (2*P)-((2* yesterday_high)-yesterday_low);

M0 = (S2+S3)/2;
M2 = (P+S1)/2;
M1 = (S1+S2)/2;

  if ( Bid < P && Bid > M2)
   {
    return (1);
   }
    if (Bid < M2 && Bid > S1)
     {
      return (2);
     }
      if (Bid < S1 && Bid > M1)
       {
        return (3);
       }
        if (Bid < M1 && Bid > S2)
         {
          return (4);
         }
          if (Bid < S2 && Bid > M0)
            {
             return (5);
            }
             if (Bid < M0 && Bid > S3)
              {
               return (6);
              }
}

//Функция определения диапазона в котором находится цена в данный момент (при окупках)

double Diapazons_buy()
{
 //Получение ежидневных цен

ArrayCopyRates(rates_d1, Symbol(), PERIOD_D1);

yesterday_close = rates_d1[1][4];
yesterday_open = rates_d1[1][1];
today_open = rates_d1[0][1];
yesterday_high = rates_d1[1][3];
yesterday_low = rates_d1[1][2];
day_high = rates_d1[0][3];
day_low = rates_d1[0][2];

P = (yesterday_high + yesterday_low + yesterday_close) / 3;

R1 = (2*P)-yesterday_low;
R2 = P+(yesterday_high - yesterday_low);
R3 = (2*P)+(yesterday_high-(2*yesterday_low));

M3 = (P+R1)/2;
M4 = (R1+R2)/2;
M5 = (R2+R3)/2;

  if ( Ask > P && Ask < M3)
   {
    return (1);
   }
    if (Ask > M3 && Ask < R1)
     {
      return (2);
     }
      if (Ask > R1 && Ask < M4)
       {
        return (3);
       }
        if (Ask > M4 && Ask < R2)
         {
          return (4);
         }
          if (Ask > R2 && Ask < M5)
            {
             return (5);
            }
             if (Ask > M5 && Ask < R3)
              {
               return (6);
              }
}
 

Когда то делал по "тупому", но работало) что то типа такого ...

double   R3;                     // Уровни пивотов
double   R2;
double   R1;
double   P;
double   S1;
double   S2;
double   S3;
int      Piv_Diapasone_1;        // Диапазон пивотов сверху вниз
int      Piv_Diapasone_2;
int      Piv_Diapasone_3;
int      Piv_Diapasone_4;
int      Piv_Diapasone_5;
int      Piv_Diapasone_6;
int      Piv_Diapasone_Block;

////////////////////////////////////////////
   // Уровни пивотов
   R3 = NormalizeDouble((iCustom(NULL,0,"FXI Pivots",0,0)),Digits);
   R2 = NormalizeDouble((iCustom(NULL,0,"FXI Pivots",1,0)),Digits);
   R1 = NormalizeDouble((iCustom(NULL,0,"FXI Pivots",2,0)),Digits);
   P = NormalizeDouble((iCustom(NULL,0,"FXI Pivots",3,0)),Digits);
   S1 = NormalizeDouble((iCustom(NULL,0,"FXI Pivots",4,0)),Digits);
   S2 = NormalizeDouble((iCustom(NULL,0,"FXI Pivots",5,0)),Digits);
   S3 = NormalizeDouble((iCustom(NULL,0,"FXI Pivots",6,0)),Digits);
////////////////////////////////////////////
   // Pivots Level
   if ((Bid > R3) || (Bid < S3)) Piv_Diapasone_Block = 1; else Piv_Diapasone_Block = 0; // если вышли за уровень пивотов то не торгуем
   // Определяем в каком пивот диапазоне находится цена
   if ((Bid > R2) && (Bid < R3)) Piv_Diapasone_1 = 1; else Piv_Diapasone_1 = 0;
   if ((Bid > R1) && (Bid < R2)) Piv_Diapasone_2 = 1; else Piv_Diapasone_2 = 0;
   if ((Bid > P) && (Bid < R1)) Piv_Diapasone_3 = 1; else Piv_Diapasone_3 = 0;   
   if ((Bid > S1) && (Bid < P)) Piv_Diapasone_4 = 1; else Piv_Diapasone_4 = 0;
   if ((Bid > S2) && (Bid < S1)) Piv_Diapasone_5 = 1; else Piv_Diapasone_5 = 0;
   if ((Bid > S3) && (Bid < S2)) Piv_Diapasone_6 = 1; else Piv_Diapasone_6 = 0;
 
Спасибо буду разбираться!)))
 
Я даже и не знал,что уровни можно загнать в советник,правда я много чего не знал.пока не попал на форум сюда.
 

По-моему, вот так тоже можно. Знатоки поправьте если что не так.

double Level1, Level2, Level3, Level4, Level5, Level6, Level7;
int PriceLevel;

PriceLevel = 0;
if(Bid>Level1) PriceLevel = 1;
if(Bid>Level2) PriceLevel = PriceLevel +1; // in the 2nd zone because PriceLevel = 2;
if(Bid>Level3) PriceLevel = PriceLevel +1; // in the 3rd zone because PriceLevel = 3;
if(Bid>Level4) PriceLevel = PriceLevel +1; // in the 4th zone because PriceLevel = 4;
if(Bid>Level5) PriceLevel = PriceLevel +1; // in the 5th zone because PriceLevel = 5;
if(Bid>Level6) PriceLevel = PriceLevel +1; // in the 6th zone because PriceLevel = 6;
if(Bid>Level7) PriceLevel = PriceLevel +1; // in the 7th zone because PriceLevel = 7;

if (PriceLevel==3) { ...your trade action here... } // is above Level3 but still below Level4
 
pro_:

По-моему, вот так тоже можно. Знатоки поправьте если что не так.


Здорова,это для меня целое открытие,спасибо,применю в свой советник и буду юзать.
 
int GetLevel(double &Levels[])
  {
   for(int L=0; Bid < Levels[L]; L++) {;}
   return (L);
  }
Причина обращения: