Пишу советника и в данный момент столкнулся с такой проблемой. У меня есть 13 рассчитанных переменных (значения цен на графике по сути уровни) . К примеру цена в данный момент находится между двумя соседними уровнями (поддержка и сопротивление) и как определить между какими именно и вернуть их значения?
тот подход который мне видится:
1) создаете массив A[], перераспределяете под него память,вносите значения с ваших переменных (13 в вашем случаи)
2) проводите сортировку в массиве (по возрастанию, например) - реализуется циклом в цикле
3) ищите в цикле когда текущее значение цены окажется меньше одного и больше другого значений массива
4) берете эти два значения и в цикле ищете каким переменным они соответствуют (между какими переменными у вас цена).
п.с. не надо флудить - где бы вы не написали вопрос - вас увидят.
хотите помощи - приводите код - хоть кривой, но приводите.
халявы тут не любят.
тот подход который мне видится:
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
По-моему, вот так тоже можно. Знатоки поправьте если что не так.
Здорова,это для меня целое открытие,спасибо,применю в свой советник и буду юзать.
int GetLevel(double &Levels[]) { for(int L=0; Bid < Levels[L]; L++) {;} return (L); }

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