Может быть так:
int Отрыв = 10; //Минимальное количество пунктов для отрыва свечи от тренда //+------------------------------------------------------------------+ int start(){ //Выполняем операцию только 1 раз для одной свечи static datetime LastTime; if(LastTime==Time[0]) return(0); LastTime=Time[0]; //Определение тренда if(Close[4]>Close[3] && Close[3]>Close[2] && Close[2]>Close[1]){ //Тренд медвежий if(Open[1]<Close[2]-Отрыв*Point){ //Произошёл отрыв больший, чем указанно в исходных параметрах Alert("Захват за пояс (бычий)"); } } return(0); }//start()
Только ещё не забудьте про измерение силы сигнала (Чем меньше нижняя тень (в идеале — ее отсутствие), тем сильнее сигнал.)
Это индикатор.
Файлы:
zahvat.mq4
2 kb
//1.12345 to 1.1234 // for Alpari client void tofour(double &value1, double &value2, double &value3, double &value4) { NormalizeDouble(value1, 4); NormalizeDouble(value2, 4); NormalizeDouble(value3, 4); NormalizeDouble(value4, 4); } void my_alert() { double iclose; double iopen; double ilow; double ihigh; //buy eurusd iclose = iClose("EURUSD", PERIOD_M5, 1); iopen = iOpen("EURUSD", PERIOD_M5, 1); ilow = iLow("EURUSD", PERIOD_M5, 1); ihigh = iHigh("EURUSD", PERIOD_M5, 1); tofour(iopen, iclose, ilow, ihigh); if(iclose > iopen) if(iopen == ilow) if(ihigh >= iclose) Alert("EURUSD M5 BUY"); iclose = iClose("EURUSD", PERIOD_M15, 1); iopen = iOpen("EURUSD", PERIOD_M15, 1); ilow = iLow("EURUSD", PERIOD_M15, 1); ihigh = iHigh("EURUSD", PERIOD_M15, 1); tofour(iopen, iclose, ilow, ihigh); if(iclose > iopen) if(iopen == ilow) if(ihigh >= iclose) Alert("EURUSD M15 BUY"); //buy eurjpy iclose = iClose("EURJPY", PERIOD_M5, 1); iopen = iOpen("EURJPY", PERIOD_M5, 1); ilow = iLow("EURJPY", PERIOD_M5, 1); ihigh = iHigh("EURJPY", PERIOD_M5, 1); NormalizeDouble(iopen, 2); NormalizeDouble(iclose, 2); NormalizeDouble(ilow, 2); NormalizeDouble(ihigh, 2); if(iclose > iopen) if(iopen == ilow) if(ihigh >= iclose) Alert("EURJPY M5 BUY"); iclose = iClose("EURJPY", PERIOD_M15, 1); iopen = iOpen("EURJPY", PERIOD_M15, 1); ilow = iLow("EURJPY", PERIOD_M15, 1); ihigh = iHigh("EURJPY", PERIOD_M15, 1); NormalizeDouble(iopen, 2); NormalizeDouble(iclose, 2); NormalizeDouble(ilow, 2); NormalizeDouble(ihigh, 2); if(iclose > iopen) if(iopen == ilow) if(ihigh >= iclose) Alert("EURJPY M15 BUY"); } int init() { my_alert(); return(0); } int deinit() { return(0); } int start() { init(); return(0); }вот у меня такой бред, примерно такой, щас изменила, но суть в том, разные тайм фреймы и разные валюты и если пятизначная система, преобразуем в четырех значную. Но! когда находит модель, дальше, при каждом тике вываливается сообщении, без умолку. и еще хорошо чтобы звук был, писк какой нить.
Просто суть в том, чтобы не листать таймфреймы и не циплять советника на все валютные пары
Если использовать вашу логику, то правильней будет вот так:
double tofour(double &value1) { return(NormalizeDouble(value1, 4)); } void my_alert() { double iclose; double iopen; double ilow; double ihigh; //buy eurusd iclose = iClose("EURUSD", PERIOD_M5, 1); iopen = iOpen("EURUSD", PERIOD_M5, 1); ilow = iLow("EURUSD", PERIOD_M5, 1); ihigh = iHigh("EURUSD", PERIOD_M5, 1); iopen=tofour(iopen); iclose=tofour(iclose); ilow=tofour(ilow); ihigh=tofour(ihigh); if(iclose > iopen) if(iopen == ilow) if(ihigh >= iclose) Alert("EURUSD M5 BUY"); iclose = iClose("EURUSD", PERIOD_M15, 1); iopen = iOpen("EURUSD", PERIOD_M15, 1); ilow = iLow("EURUSD", PERIOD_M15, 1); ihigh = iHigh("EURUSD", PERIOD_M15, 1); iopen=tofour(iopen); iclose=tofour(iclose); ilow=tofour(ilow); ihigh=tofour(ihigh); if(iclose > iopen) if(iopen == ilow) if(ihigh >= iclose) Alert("EURUSD M15 BUY"); //тоже самое для eurjpy //.... //.... } int init() { return(0); } int deinit() { return(0); } int start() { //Выполняем операцию только 1 раз для одной свечи static datetime LastTime; if(LastTime==iTime(Symbol(),PERIOD_M5,0) return(0); LastTime=iTime(Symbol(),PERIOD_M5,0); my_alert(); return(0); }
Звуки можно поменять в настройках программы:
А вот так ещё компактней:
double tofour(double &value1) { return(NormalizeDouble(value1, 4)); } void Sygnal(string MySymbol){ double iclose; double iopen; double ilow; double ihigh; //buy iclose = iClose(MySymbol, PERIOD_M5, 1); iopen = iOpen(MySymbol, PERIOD_M5, 1); ilow = iLow(MySymbol, PERIOD_M5, 1); ihigh = iHigh(MySymbol, PERIOD_M5, 1); iopen=tofour(iopen); iclose=tofour(iclose); ilow=tofour(ilow); ihigh=tofour(ihigh); if(iclose > iopen) if(iopen == ilow) if(ihigh >= iclose) Alert(""+MySymbol+" M5 BUY"); iclose = iClose(MySymbol, PERIOD_M15, 1); iopen = iOpen(MySymbol, PERIOD_M15, 1); ilow = iLow(MySymbol, PERIOD_M15, 1); ihigh = iHigh(MySymbol, PERIOD_M15, 1); iopen=tofour(iopen); iclose=tofour(iclose); ilow=tofour(ilow); ihigh=tofour(ihigh); if(iclose > iopen) if(iopen == ilow) if(ihigh >= iclose) Alert(""+MySymbol+" M15 BUY"); }//Sygnal() void my_alert() { Sygnal("EURUSD"); Sygnal("EURJPY"); } int start() { //Выполняем операцию только 1 раз для одной свечи static datetime LastTime; if(LastTime==iTime(Symbol(),PERIOD_M5,0)) return(0); LastTime=iTime(Symbol(),PERIOD_M5,0); my_alert(); return(0); }
//1.12345 to 1.1234 // for Alpari client void normalizedouble(double &value1, double &value2, double &value3, double &value4, int num) { NormalizeDouble(value1, num); NormalizeDouble(value2, num); NormalizeDouble(value3, num); NormalizeDouble(value4, num); } //get price void get_price(string symbol, double &iopen, double &iclose, double &ilow, double &ihigh, int timeframe) { iclose = iClose(symbol, timeframe, 1); iopen = iOpen(symbol, timeframe, 1); ilow = iLow(symbol, timeframe, 1); ihigh = iHigh(symbol, timeframe, 1); } void my_alert(string my_symbol) { double iclose; double iopen; double ilow; double ihigh; int normalize; if(my_symbol == "EURJPY") normalize = 2; else normalize = 4; get_price(my_symbol, iopen, iclose, ilow, ihigh, PERIOD_M5); normalizedouble(iopen, iclose, ilow, ihigh, normalize); if(iclose > iopen) if(iopen == ilow) if(ihigh >= iclose) Alert(""+my_symbol+" M5 BUY"); get_price(my_symbol, iopen, iclose, ilow, ihigh, PERIOD_M15); normalizedouble(iopen, iclose, ilow, ihigh, normalize); if(iclose > iopen) if(iopen == ilow) if(ihigh >= iclose) Alert(""+my_symbol+" M15 BUY"); get_price(my_symbol, iopen, iclose, ilow, ihigh, PERIOD_M30); normalizedouble(iopen, iclose, ilow, ihigh, normalize); if(iclose > iopen) if(iopen == ilow) if(ihigh >= iclose) Alert(""+my_symbol+" M30 BUY"); } int init() { return(0); } int deinit() { return(0); } int start() { static datetime LastTime; if(LastTime == iTime(Symbol(), PERIOD_M5, 0)) return(0); LastTime = iTime(Symbol(), PERIOD_M5, 0); my_alert("EURUSD"); my_alert("EURJPY"); return(0); }Вот что получилось в итоге. Я так понимаю, что каждые 5 минут будут вызываться функции my_alert("EURUSD") и my_alert("EURUSD") и проверять условия. Но если на М15 была найдена нужная свеча, то следующие пятнадцать минут через каждые пять минут будет оповещение о найденной свече? Я правильно понимаю? А если на М30 найдется свеча, то следующие 30 минут через каждые пять минут будет оповещение что была найдете свеча?
Вы абсолютно правы!
Тогда делаем так:
double tofour(double &value1) { return(NormalizeDouble(value1, 4)); } void Sygnal(string MySymbol, int MyPeriod){ static datetime LastTime[43201]; double iclose; double iopen; double ilow; double ihigh; //Выполняем операцию только 1 раз для одной свечи if(LastTime[MyPeriod]==iTime(Symbol(),MyPeriod,0)) return(0); LastTime[MyPeriod]=iTime(Symbol(),MyPeriod,0); //buy iclose = iClose(MySymbol, MyPeriod, 1); iopen = iOpen(MySymbol, MyPeriod, 1); ilow = iLow(MySymbol, MyPeriod, 1); ihigh = iHigh(MySymbol, MyPeriod, 1); iopen=tofour(iopen); iclose=tofour(iclose); ilow=tofour(ilow); ihigh=tofour(ihigh); if(iclose > iopen) if(iopen == ilow) if(ihigh >= iclose) Alert("" + MySymbol + " " + MyPeriod + " BUY"); }//Sygnal() void my_alert() { Sygnal("EURUSD", PERIOD_M5); Sygnal("EURUSD", PERIOD_M15); Sygnal("EURJPY", PERIOD_M5); Sygnal("EURJPY", PERIOD_M15); } int start() { my_alert(); return(0); }
//1.12345 to 1.1234 // for Alpari client void normalizedouble(double &value1, double &value2, double &value3, double &value4, int num) { NormalizeDouble(value1, num); NormalizeDouble(value2, num); NormalizeDouble(value3, num); NormalizeDouble(value4, num); } //get price void get_price(string symbol, double &iopen, double &iclose, double &ilow, double &ihigh, int timeframe) { iclose = iClose(symbol, timeframe, 1); iopen = iOpen(symbol, timeframe, 1); ilow = iLow(symbol, timeframe, 1); ihigh = iHigh(symbol, timeframe, 1); } void m5_alert() { double iclose; double iopen; double ilow; double ihigh; get_price("EURUSD", iopen, iclose, ilow, ihigh, PERIOD_M5); normalizedouble(iopen, iclose, ilow, ihigh, 4); if(iclose > iopen) if(iopen == ilow) if(ihigh >= iclose) Alert("EURUSD M5 BUY"); get_price("EURJPY", iopen, iclose, ilow, ihigh, PERIOD_M5); normalizedouble(iopen, iclose, ilow, ihigh, 2); if(iclose > iopen) if(iopen == ilow) if(ihigh >= iclose) Alert("EURJPY M5 BUY"); } void m15_alert() { double iclose; double iopen; double ilow; double ihigh; get_price("EURUSD", iopen, iclose, ilow, ihigh, PERIOD_M15); normalizedouble(iopen, iclose, ilow, ihigh, 4); if(iclose > iopen) if(iopen == ilow) if(ihigh >= iclose) Alert("EURUSD M15 BUY"); get_price("EURJPY", iopen, iclose, ilow, ihigh, PERIOD_M15); normalizedouble(iopen, iclose, ilow, ihigh, 2); if(iclose > iopen) if(iopen == ilow) if(ihigh >= iclose) Alert("EURJPY M15 BUY"); } int init() { return(0); } int deinit() { return(0); } int start() { static datetime LastTime; if(LastTime == iTime(Symbol(), PERIOD_M5, 0)) ; else { LastTime = iTime(Symbol(), PERIOD_M5, 0); m5_alert(); } if(LastTime == iTime(Symbol(), PERIOD_M15, 0)) ; else { LastTime = iTime(Symbol(), PERIOD_M15, 0); m5_alert(); } return(0); }Так правильно? Каждые пять минут вызывать функцию для проверки пятиминутных баров, каждые пятнадцать минут вызывать функцию для проверки 15 минутных баров?
пока писал, появился еще вариант)) спасибо, щас буду разбирать
Я смотрю, пока ты писал появился не только вариант, но ещё и пол поменялся с женского на мужской :)

Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Помогите пожалуйста в написание советника. Нужно чтобы советник издал звук(пробовала использовать "\a" в выводе сообщения, не помогает) при обнаружении свечной модели на разных тайм фреймах и на разных валютных парах. Я не прошу полностью написать, просто нужен старт, чтобы хотя бы на двух тайм фреймах искал вот эту модель(захват за пояс, так вроде называется) и на двух валютных парах(неважно каких). Просто пыталась, но увы( То найдет, но без остановки выдает сообщение, то вообще не видит, так как алпари, пятизначная система и последняя цифарка разная, хотя роли не играет, для меня) ну вы меня поняли. Пыталась делить на 10, чтобы избавится от 5 знака после запятой, все равно не выходит. Если не сложно, помогите чуть чуть=) Код выкладывать не буду, и смех и грех, неправильный, не работает.