Из серии "не знал но забыл" - страница 2

 
Mickey Moose:

Как я понял все должно быть вот тут и примерно так не ставя его на график? C получением значения буфера напрямую

Только буферы 2 и 3

 
Alexey Viktorov:

Только буферы 2 и 3

обращение icustom из Oncalculate не видит другой индикатор это норма?

 
Mickey Moose:

обращение icustom из Oncalculate не видит другой индикатор это норма?

Неправда

Это EURUSD период М15 время 12:30 сегодня.

 

вроде так работает - но неточно 

//+------------------------------------------------------------------+
//|                                            Alert Heiken_Ashi.mq5 |
//|                   Copyright 2009-2017, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2009-2017, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
//--- indicator settings
#property indicator_chart_window
#property indicator_buffers 5
#property indicator_plots   1
#property indicator_type1   DRAW_COLOR_CANDLES
#property indicator_color1  DodgerBlue, Red
#property indicator_label1  "Heiken Ashi Open;Heiken Ashi High;Heiken Ashi Low;Heiken Ashi Close"

input int NumberofAlerts=2;
//--- indicator buffers
double ExtOBuffer[];
double ExtHBuffer[];
double ExtLBuffer[];
double ExtCBuffer[];
double ExtColorBuffer[];

int counter=0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ExtOBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,ExtHBuffer,INDICATOR_DATA);
   SetIndexBuffer(2,ExtLBuffer,INDICATOR_DATA);
   SetIndexBuffer(3,ExtCBuffer,INDICATOR_DATA);
   SetIndexBuffer(4,ExtColorBuffer,INDICATOR_COLOR_INDEX);
//---
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
//--- sets first bar from what index will be drawn
   IndicatorSetString(INDICATOR_SHORTNAME,"Alert Heiken_Ashi");
//--- sets drawing line empty value
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0);
//--- initialization done
  }
//+------------------------------------------------------------------+
//| Heiken Ashi                                                      |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   int i,limit;
//--- preliminary calculations
   if(prev_calculated==0)
     {
      //--- set first candle
      ExtLBuffer[0]=low[0];
      ExtHBuffer[0]=high[0];
      ExtOBuffer[0]=open[0];
      ExtCBuffer[0]=close[0];
      limit=1;
     }
   else
      limit=prev_calculated-1;
//--- the main loop of calculations
   for(i=limit; i<rates_total && !IsStopped(); i++)
     {
      double haOpen=(ExtOBuffer[i-1]+ExtCBuffer[i-1])/2;
      double haClose=(open[i]+high[i]+low[i]+close[i])/4;
      double haHigh=MathMax(high[i],MathMax(haOpen,haClose));
      double haLow=MathMin(low[i],MathMin(haOpen,haClose));
      ExtLBuffer[i]=haLow;
      ExtHBuffer[i]=haHigh;
      ExtOBuffer[i]=haOpen;
      ExtCBuffer[i]=haClose;
      //--- set candle color
      if(haOpen<haClose)
         ExtColorBuffer[i]=0.0; // set color DodgerBlue
      else
         ExtColorBuffer[i]=1.0; // set color Red
      //--- the main loop of calculations
      if(haOpen<haClose)
        {
         ExtColorBuffer[i]=0.0; // set color DodgerBlue
         if(i>0)
           {
            if(counter<=NumberofAlerts)
              {
               Alert("Alert Heiken_Ashi ",EnumToString(Period())," ",Symbol()," ");
               counter++;
              }
           }
         else
            counter=0;
        }
      if(haOpen>haClose)
        {
         ExtColorBuffer[i]=1.0; // set color Red
         if(i<0)
           {
            if(counter<=NumberofAlerts)
              {
               Alert("Alert Heiken_Ashi ",EnumToString(Period())," ",Symbol()," ");
               counter++;
              }
           }
         else
            counter=0;
        }
     }
//--- done
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
SanAlex:

вроде так работает - но неточно 

в одну сторону точно работает , а вот во вторую вроде работает а вроде и нет  

 
SanAlex:

в одну сторону точно работает , а вот во вторую вроде работает а вроде и нет  

i<0 только в момент запуска

 
Igor Zakharov:

i<0 только в момент запуска

сейчас попробую так 

         if(i>=0)

верх точно срабатывает 

Файлы:
o7ev2l.PNG  96 kb
 
SanAlex:

сейчас попробую так 

не уверен, что на 100% понял вашу идею, но если описывать алгоритм алертов, то проще и правильнее делать так:

после основного цикла проверить, новый ли бар. если старый, вернуть rates_total

если новый, проверить бар с индексом 1 и бар с индексом 2. если они в одну сторону, снова вернуть rates_total

если в разные - выдать алерт о направлении бара 1

 
Igor Zakharov:

не уверен, что на 100% понял вашу идею, но если описывать алгоритм алертов, то проще и правильнее делать так:

после основного цикла проверить, новый ли бар. если старый, вернуть rates_total

если новый, проверить бар с индексом 1 и бар с индексом 2. если они в одну сторону, снова вернуть rates_total

если в разные - выдать алерт о направлении бара 1

я слабенький в написание кодов - я методом тыканья, просто смотрю из кодобазы коды как пишут профессионалы, ну и подбираю может подойдёт  

я так понял нужно единицу добавить вот так?

         ExtColorBuffer[i-1]=0.0; // set color DodgerBlue
 

Благодарю всем за помощь, сделал макет на оценку, работает хреново пока не понял в чем дело, но работает. Принт показывает, но звука часто нет.

//+------------------------------------------------------------------+
//|                                                         хай1.mq4 |
//|                        Copyright 2014, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window



//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+

extern int StartBar=1; //С какого бара по счету давать звук
extern int Alerts=1;           //Количество проигрываний сигнала


//----------------------------------
double RandomValue2=0;
double RandomValue3=0;
double RandomValue4=0;
 
//----------------------------------

#define SIGNAL_BAR 1
//---теперь код сигнала для последующей модификации
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
//--- ставим проверку на новый бар
static int PrevSignal=0,PrevTime=0;
if(SIGNAL_BAR>0 && Time[0]<=PrevTime)
return(0);
PrevTime=Time[0];
//---
   return(INIT_SUCCEEDED);
  }
  
  
  
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {   
RandomValue2=iCustom(NULL,0,"Heiken_Ashi",2,StartBar);
RandomValue3=iCustom(NULL,0,"Heiken_Ashi",3,StartBar);
RandomValue4=iCustom(NULL,0,"Heiken_Ashi",4,StartBar);

for(int i=0; i<=Alerts; Alerts--) 
     {
      if (RandomValue3<RandomValue4&&RandomValue3<RandomValue2) //белая свеча 3 меньше 4 и 3 меньше 2e4)
        {
         PlaySound("expert.wav");
        // Print("первый",RandomValue2);
        }
      if (RandomValue3>RandomValue4&&RandomValue3>RandomValue2)// красная свеча 3 больше 4 и 3 больше 2
        {
         PlaySound("news.wav");
        //  Print("второй",RandomValue2);
        }     
     }
   return(rates_total);
  }
Причина обращения: