ПОМОГИТЕ - страница 4

 

извините инет пропал

все правильно TimeFrame_2 обявлена в самом начале я просто думал что так понятнее будет

input ENUM_TIMEFRAMES TimeFrame_2=PERIOD_H1;


есть переменная для количества расчета баров

CountBar=500 баров это на м5

int dil=enumToTF(TimeFrame_2)/enumToTF(TimeFrame_1); функция переводит ENUM TimeFrame_2 в обычные минуты и 60/5 =12 5 минуток в часе

далее CountBar/dil =41 это значит что 500 баров на м5 то на часе это 41 бар

значит мы берем только 41 часовой бар (чтоб лишнего не считать)


функция

PoiskProboyaUP(iHigh(Symbol(),TimeFrame_1,s),s-1,endBar,i);

делает следующию проверку и записывает значения в буфер

void PoiskProboyaUP(double price,int startbar,int endbar,int day)
   {
      for(int a=startbar;a>=endbar;a--) старт проверки начинается от того бара где нашли пробой и до конца текущей часовой свечи
         {
            bufUP[a]=EMPTY_VALUE;     вот это я не уверен что правильно  
            bufDW[a]=EMPTY_VALUE;   надо ли сдесь обнулять буферы
            if(iHigh(Symbol(),TimeFrame_1,a)>price)    тут идет проверка если хай 5 минутки выше максимума пробойной свечи то записываем в буфер значение хая
               {
                  if(Signal==true&&_Period==enumToTF(TimeFrame_1)) проверка для того чтоб сигналы рисовались только на 5 минутном тайм фрейме
                     {
                        bufUP[a]=iHigh(Symbol(),TimeFrame_1,a);
                     }
                  if(Horizontal_Line==true&&_Period==enumToTF(TimeFrame_1)) 
                     {
                        GrafLine(day,iLow(Symbol(),TimeFrame_2,day),day-2);  а это просто рисует горизонтальную линию
                     }
                  break;
               }
         }
   }

хух вроде все

 
Mikhail Rudyk:


Я тут ранее ответил:

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

ПОМОГИТЕ

Karputov Vladimir, 2016.06.01 12:22

Прежде чем искать пробои:

      for(int s=startBar;s>=endBar;s--)
        {
         if(iClose(Symbol(),TimeFrame_1,s)<min)
           {
            PoiskProboyaUP(iHigh(Symbol(),TimeFrame_1,s),s-1,endBar,i);
            break;
           }
         if(iClose(Symbol(),TimeFrame_1,s)>max)
           {
            PoiskProboyaDW(iLow(Symbol(),TimeFrame_1,s),s-1,endBar,i);
            break;
           }
        }

по индикаторным буферам нужно пройтись и что-то записать - так как индикаторные буферы это динамические массивы. Иначе будет выход за пределы массива - в поисках пробоев идёт обращение к индексу индикаторного буфера, которого ещё нет.


 

тоесть надо по очереди пройтись по буферу и обнулить его?

 
я думал что он сразу создается и каждый его индекс записывается пустой
 
Mikhail Rudyk:
я думал что он сразу создается и каждый его индекс записывается пустой

А Вы возьмите и проверьте :). Сейчас накидаю проверочный индикатор...

//+------------------------------------------------------------------+
//|                                                   TestBuffer.mq5 |
//|                              Copyright © 2016, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 2 
#property indicator_plots   2

#property indicator_type1 DRAW_ARROW
#property indicator_color1 clrRed
#property indicator_width1 1
#property indicator_label1  "Breakdown_DW"

#property indicator_type2 DRAW_ARROW
#property indicator_color2 clrLime
#property indicator_width2 1
#property indicator_label2  "Breakdown_UP"

double bufUP[];
double bufDW[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
//---- превращение динамического массива в индикаторный буфер
   SetIndexBuffer(0,bufUP,INDICATOR_DATA);
//---- индексация элементов в буферах, как в таймсериях   
   ArraySetAsSeries(bufUP,true);
//---- символ для индикатора
   PlotIndexSetInteger(0,PLOT_ARROW,108);
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE);

//---- превращение динамического массива в индикаторный буфер
   SetIndexBuffer(1,bufDW,INDICATOR_DATA);
//---- индексация элементов в буферах, как в таймсериях   
   ArraySetAsSeries(bufDW,true);
//---- символ для индикатора
   PlotIndexSetInteger(1,PLOT_ARROW,108);
   PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,EMPTY_VALUE);
//---
   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[])
  {
//---
   Comment("bufUP[0]=",bufUP[0],", bufDW[0]=",bufDW[0],"\n",
           "bufUP[200]=",bufUP[200],", bufDW[200]=",bufDW[200]);
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Вот этот индикатор вешайте на любой график, а потом из окна "Обзор рынка" левой клавишей мышки перетаскивайте по-очереди другие символы на этот график. В итоге будет ошибка - выход за диапазон массива. 

Файлы:
 
Другими словами, закон таков: при заходе в OnCalculate() и если prev_calculated==0 - обязательно нужно пройтись по всему буферу на глубину от "0" до "rates_total-1".
 

ага вот теперь понял

ОГРОМНОЕ СПАСИБО ВАМ

 
Подскажите, индикаторы MA и MACD на выходе сколько знаков дают. MACD в терминале после нуля 6 знаков. Пытаюсь разобраться с советником, но в вычислениях вроде как 4 знака?
 
Кто-нибудь может написать советника?
 
Manoilinlv:
Кто-нибудь может написать советника?
Во Фрилансе могут.
Причина обращения: