Помогите немного)

 

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

 

Может быть так:

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 минутных баров?
 
пока писал, появился еще вариант)) спасибо, щас буду разбирать
 

Я смотрю, пока ты писал появился не только вариант, но ещё и пол поменялся с женского на мужской :)

Причина обращения: