Помогите немного поправить индикатор

У Вас есть идея, под которую нужен торговый робот? А, быть может, требуется создание нового индикатора или адаптация старого к МТ5? Бесплатно советники и индикаторы под Ваше техническое задание!

Помогите немного поправить индикатор

Сообщение mfcoder » 15 май 2015, 10:58

lisa писал(а):
mfcoder писал(а):из выше написанного кода следует, что сигнал будет при прикпеплении индикатора к графику и далее каждый раз при появлении нового бара..
а какого типа alert ?


Сам алерт прилеплен к сигналу-стрелке.
Вот весь код:

Код: выделить все
if (Rs > 90.0)
   {
   Buffer2[i] = High[i] + 10 * Point;
     if(i==0&&(alert!=Time[1]))
       {
       if(Sound){PlaySound("Alert.wav");Alert("Sell");}
       }
     alert=Time[1];
   }


Ну и для противоположного сигнала, тоже самое.

Сейчас алерт появляется на 0 баре, при выполнении условий сигнала-стреки.
Но появляется почему то не всегда :nez-nayu:

Желательно, чтобы алерт так же был прилеплен с сигналу-стрелке.
При появлении стрелки чтобы сразу выскакивает алерт, 1 раз. Если стрелка пропадает и появляется снова, опять алерт.


тогда код нужно немного по другому написать
Код: выделить все
// так должен быть задан параметр alert
   static int alert=0;

// отдельно заполнение значений
   if(Rs>90.0)
     {
      Buffer2[i]=High[i]+10*Point;
     }
   else
     {
      Buffer2[i]=0;
      alert=0;
     }

   if(Rs<10.0)
     {
      Buffer1[i]=Low[i]-10*Point;
     }
   else
     {
      Buffer1[i]=0;
      alert=0;
     }

// отдельно сигналы
   if(i==0 && alert!=Time[1] && Buffer2[i]!=0)
     {
      if(Sound)
        {
         PlaySound("alert");
         Alert("Sell");
        }
      alert=Time[1];
     }

   if(i==0 && alert!=Time[1] && Buffer1[i]!=0)
     {
      if(Sound)
        {
         PlaySound("alert");
         Alert("Buy");
        }
      alert=Time[1];
     }
Аватар пользователя
mfcoder
 
Сообщений: 1531
Зарегистрирован: 29 июл 2013, 11:55
Средств на руках: 26.85 Доллар
Группа: Базовая
Благодарил (а): 78 раз.
Поблагодарили: 423 раз.

Помогите немного поправить индикатор

Сообщение lisa » 15 май 2015, 11:17

mfcoder писал(а):
Код: выделить все
// так должен быть задан параметр alert
   static int alert=0;


Это надо прописать в самом начале кода, в настройках?
Аватар пользователя
lisa
 
Сообщений: 77
Зарегистрирован: 05 ноя 2014, 09:37
Средств на руках: 4.50 Доллар
Группа: Базовая
Благодарил (а): 54 раз.
Поблагодарили: 3 раз.

Помогите немного поправить индикатор

Сообщение lisa » 15 май 2015, 11:29

Что то не то. Сейчас, пока выполнено условие сигнала, алерт трезвонит на каждом тике :nez-nayu:
Аватар пользователя
lisa
 
Сообщений: 77
Зарегистрирован: 05 ноя 2014, 09:37
Средств на руках: 4.50 Доллар
Группа: Базовая
Благодарил (а): 54 раз.
Поблагодарили: 3 раз.

Помогите немного поправить индикатор

Сообщение mfcoder » 15 май 2015, 11:37

lisa писал(а):Что то не то. Сейчас, пока выполнено условие сигнала, алерт трезвонит на каждом тике :nez-nayu:


прицепи полный код индикатора
Аватар пользователя
mfcoder
 
Сообщений: 1531
Зарегистрирован: 29 июл 2013, 11:55
Средств на руках: 26.85 Доллар
Группа: Базовая
Благодарил (а): 78 раз.
Поблагодарили: 423 раз.

Помогите немного поправить индикатор

Сообщение lisa » 15 май 2015, 11:54

mfcoder писал(а):прицепи полный код индикатора


Код: выделить все
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Blue
#property indicator_color2 Red

extern int Per =2;
extern bool Sound =true;
static int alert=0;

double Buffer1[];
double Buffer2[];
//--------------------

int init()
 {
  SetIndexStyle(0, DRAW_ARROW, 0, 1);
  SetIndexArrow(0, 233);
  SetIndexBuffer(0, Buffer1);

  SetIndexStyle(1, DRAW_ARROW, 0, 1);
  SetIndexArrow(1, 234);
  SetIndexBuffer(1, Buffer2);

  return(0);
 }
//--------------------
 
int start()
 {
  int ExtCountedBars = IndicatorCounted();
  if (ExtCountedBars > 0) ExtCountedBars--;
  for (int i=Bars - ExtCountedBars-1;i>=0; i--)

 
   {
    double Rs = iRSI(NULL,0,Per,PRICE_CLOSE,i);
    Buffer2[i] = 0;
    Buffer1[i] = 0;

//--------------------   
   if(Rs>90.0)
     {
      Buffer2[i]=High[i]+10*Point;
     }
   else
     {
      Buffer2[i]=0;
      alert=0;
     }
//--------------------
   if(Rs<10.0)
     {
      Buffer1[i]=Low[i]-10*Point;
     }
   else
     {
      Buffer1[i]=0;
      alert=0;
     }
//--------------------
   if(i==0 && alert!=Time[1] && Buffer2[i]!=0)
     {
      if(Sound)
        {
         PlaySound("alert");
         Alert("Sell");
        }
      alert=Time[1];
     }
//--------------------
   if(i==0 && alert!=Time[1] && Buffer1[i]!=0)
     {
      if(Sound)
        {
         PlaySound("alert");
         Alert("Buy");
        }
      alert=Time[1];
     }
//--------------------       
   }
 
  return (0);
 }
//--------------------
Аватар пользователя
lisa
 
Сообщений: 77
Зарегистрирован: 05 ноя 2014, 09:37
Средств на руках: 4.50 Доллар
Группа: Базовая
Благодарил (а): 54 раз.
Поблагодарили: 3 раз.

Помогите немного поправить индикатор

Сообщение mfcoder » 15 май 2015, 18:59

ну, что, получилось понять почему индикатор не работет ?
Аватар пользователя
mfcoder
 
Сообщений: 1531
Зарегистрирован: 29 июл 2013, 11:55
Средств на руках: 26.85 Доллар
Группа: Базовая
Благодарил (а): 78 раз.
Поблагодарили: 423 раз.

Помогите немного поправить индикатор

Сообщение lisa » 16 май 2015, 07:24

mfcoder писал(а):ну, что, получилось понять почему индикатор не работет ?


Даже не знаю, просто сейчас проверить не могу, выходные.

Возможно для алерта надо было буфер прописать, а static int alert =0; вставить в блок int init, хотя это только предположение :nez-nayu:
Аватар пользователя
lisa
 
Сообщений: 77
Зарегистрирован: 05 ноя 2014, 09:37
Средств на руках: 4.50 Доллар
Группа: Базовая
Благодарил (а): 54 раз.
Поблагодарили: 3 раз.

Помогите немного поправить индикатор

Сообщение lisa » 18 май 2015, 11:33

Не работает :cry_ing:
Аватар пользователя
lisa
 
Сообщений: 77
Зарегистрирован: 05 ноя 2014, 09:37
Средств на руках: 4.50 Доллар
Группа: Базовая
Благодарил (а): 54 раз.
Поблагодарили: 3 раз.

Помогите немного поправить индикатор

Сообщение mfcoder » 18 май 2015, 12:55

lisa писал(а):Не работает :cry_ing:


как-то так..
Код: выделить все
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Blue
#property indicator_color2 Red
#property  strict
extern int Per=2;
extern bool Sound=true;
extern bool norm = false;

double Buffer1[];
double Buffer2[];
int lastAlert=EMPTY;
//--------------------

int OnInit()
  {
   SetIndexStyle(0,DRAW_ARROW,0,1);
   SetIndexArrow(0,233);
   SetIndexBuffer(0,Buffer1);

   SetIndexStyle(1,DRAW_ARROW,0,1);
   SetIndexArrow(1,234);
   SetIndexBuffer(1,Buffer2);

   return(INIT_SUCCEEDED);
  }
//--------------------
int OnCalculate(const int rates_total,// размер входных таймсерий
                const int prev_calculated,  // обработано баров на предыдущем вызове
                const datetime &time[],     // Time
                const double &open[],       // Open
                const double &high[],       // High
                const double &low[],        // Low
                const double &close[],      // Close
                const long &tick_volume[],  // Tick Volume
                const long &volume[],       // Real Volume
                const int &spread[]         // Spread
                )

  {
   
   static int lasttime=0;
   int alert=EMPTY;
 
   double Rs;
   string s;
   int i;

   int bars=IndicatorCounted();
   if(bars < 0) return(-1);
   i=Bars-bars-1;

   while(i>=0)
     {
      Rs=iRSI(NULL,0,Per,PRICE_CLOSE,i);
      alert=EMPTY;
      if(lasttime<Time[0]) lastAlert=EMPTY;

      if(N(Rs-90.0)>0)
        {
         Buffer2[i]=High[i]+10*Point;
         Buffer1[i]=0;
         if(i==0 && (lastAlert==EMPTY || lastAlert==OP_BUY))
           {
            alert=OP_SELL;
            lastAlert=OP_SELL;
           }
        }
      if(N(Rs-10.0)<0)
        {
         Buffer1[i]=Low[i]-10*Point;
         Buffer2[i]=0;
         if(i==0 && (lastAlert==EMPTY || lastAlert==OP_SELL))
           {
            alert=OP_BUY;
            lastAlert=OP_BUY;
           }
        }
      if(N(Rs-10.)>=0 && N(Rs-90.)<=0)
        {
         Buffer2[i]=0;
         Buffer1[i]=0;
        }     

      if(alert==OP_SELL)
        {
         if(Sound)
           {
            PlaySound("alert");
            Alert("Sell");// lastAlert: "+lastAlert+" alert: "+alert+" Rs: "+DoubleToStr(Rs,0)+s," norm: ",norm);
           }
        }
      if(alert==OP_BUY)
        {
         if(Sound)
           {
            PlaySound("alert");
            Alert("Buy");// lastAlert: "+lastAlert+" alert: "+alert+" Rs: "+DoubleToStr(Rs,0)+s," norm: ",norm);
           }
        }
      i--;
     }
   
   lasttime=(int)Time[0];
   return (0);
  }
//--------------------
double N(double v)
  {
   if(norm)
     {
      return(NormalizeDouble(v,Digits));
     }
   else
     {
      return(v);
     }
//

  }
//+------------------------------------------------------------------+
Аватар пользователя
mfcoder
 
Сообщений: 1531
Зарегистрирован: 29 июл 2013, 11:55
Средств на руках: 26.85 Доллар
Группа: Базовая
Благодарил (а): 78 раз.
Поблагодарили: 423 раз.

Помогите немного поправить индикатор

Сообщение lisa » 20 май 2015, 18:44

mfcoder писал(а):как-то так..


А вот этот можно еще чуток подправить, чтобы алерт был на 0 баре, сразу при пересечении :smu:sche_nie:

Так все работает, но сейчас алерт на закрытии бара, а надо чтобы был сразу при пересечении, в реальном времени.
Вложения
тест.mq4
(1.87 KB) Скачиваний: 17
Последний раз редактировалось lisa 20 май 2015, 18:48, всего редактировалось 1 раз.
Аватар пользователя
lisa
 
Сообщений: 77
Зарегистрирован: 05 ноя 2014, 09:37
Средств на руках: 4.50 Доллар
Группа: Базовая
Благодарил (а): 54 раз.
Поблагодарили: 3 раз.


Вернуться в Торговые советники на заказ

Кто сейчас на форуме?

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 438

Права доступа к форуму

Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

cron