Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Melisa
39
Melisa  

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

Evgeniy Trofimov
2379
Evgeniy Trofimov  

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

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
Melisa
39
Melisa  
//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);
}
вот у меня такой бред, примерно такой, щас изменила, но суть в том, разные тайм фреймы и разные валюты и если пятизначная система, преобразуем в четырех значную. Но! когда находит модель, дальше, при каждом тике вываливается сообщении, без умолку. и еще хорошо чтобы звук был, писк какой нить.
Melisa
39
Melisa  
Просто суть в том, чтобы не листать таймфреймы и не циплять советника на все валютные пары
Evgeniy Trofimov
2379
Evgeniy Trofimov  

Если использовать вашу логику, то правильней будет вот так:

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);
}

Звуки можно поменять в настройках программы:

Evgeniy Trofimov
2379
Evgeniy Trofimov  

А вот так ещё компактней:

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);
}
Melisa
39
Melisa  
//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 минут через каждые пять минут будет оповещение что была найдете свеча?
Evgeniy Trofimov
2379
Evgeniy Trofimov  

Вы абсолютно правы!

Тогда делаем так:

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

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

12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий