Помогите люди добрые. Дайте совет где я ошибаюсь. - страница 3

 
Lomov:


Я понял так, что нужно найти мультифреймовый индикатор ADX, а технический ADX для моего случая не подходит? 


Нет, найдите любой МТФ индикатор - там есть часть кода, отвечающая за прорисовку. Могу, если хотите сразу код написать, но уверен - самостоятельно разобраться полезней. Подсказка - Вы цикл пропустили: после iBarShift должен быть цикл. Количество баров - по соотношению таймфреймов. А Вы только начальный бар нашли.
 
Понял. Значит надо определить 
VladislavVG:

Нет, найдите любой МТФ индикатор - там есть часть кода, отвечающая за прорисовку. Могу, если хотите сразу код написать, но уверен - самостоятельно разобраться полезней. Подсказка - Вы цикл пропустили: после iBarShift должен быть цикл. Количество баров - по соотношению таймфреймов. А Вы только начальный бар нашли.
Понял. Сначало надо определить тф графика к которому прикреплен индикатор, потом цикл для пересчета баров этого графика к H4.
 
Lomov:
Понял. Значит надо определить Понял. Сначало надо определить тф графика к которому прикреплен индикатор, потом цикл для пересчета баров этого графика к H4.


Точно
 
VladislavVG:

Точно

Понять конечно я понял, а как это сделать не знаю. тф графика к которому присоединен индикатор определил, отношение периодов нашел, а как сделать чтобы происходила смена буфера только при совпадении if... и в зависимости от отношения периодов не могу. Кстати просмотрел несколько "кодов рабочих мультитаймфреймовых индикаторов"  там также как у меня один цикл и сдвиг организован также. Так что в тех кодах, которые я смог понять, ничего не нашел:( И еще, почему iBarShift принимает значения только 0 или 1 тоже не пойму. И поэтому прошу, если у Вас есть возможность, допишите чего там у меня не достает. Я пойму и на своем коде, а на чужом очень тяжело учиться.

//---- Установки индикатора
#property  indicator_chart_window
#property  indicator_buffers 2
#property  indicator_color1  Red
#property  indicator_color2  Blue

#property  indicator_width1  3
#property  indicator_width2  3

//---- Параметры индикатора
extern int Period_MA=21;
extern int Mode_MA=1;   // 0-SMA, 1-EMA, 2-SMMA, 3-LWMA
extern int Shift_MA=0;
extern int Time_ADX=240;
extern int ADX_period=14;
//---- Буферы для индикатора
double     MA_1[];
double     MA_2[];
int Koef;
bool Work;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- drawing settings
   IndicatorDigits(Digits+1);
   SetIndexStyle(0,DRAW_LINE);
   SetIndexStyle(1,DRAW_LINE);
//---- indicator buffers mapping
   SetIndexBuffer(0,MA_1);
   SetIndexBuffer(1,MA_2);
//---- name for DataWindow and indicator subwindow label
   IndicatorShortName("MA_(ADX)");
   SetIndexLabel(0,"ADX растет");
   SetIndexLabel(1,"ADX падает");
   if(GetTF()==0)
      {
      Alert("Не тот таймфрейм! Только(M1,M5,M15,M30,H1,H4)!");
      Work=false;
      return(0);
      }
   Koef=Time_ADX/GetTF();
   Work=true;      
//---- initialization done
   return(0);
  }
//+------------------------------------------------------------------+
int start()
  {
   if(Work==false) return(0);
   int counted_bars=IndicatorCounted();
//---- last counted bar will be recounted
   if(counted_bars>0) counted_bars--;
   int limit=Bars-counted_bars;
// Первый буфер
// Рисуется при условии растущей ADX 
   for(int i=limit; i>0; i--)
   {
      int li_Bar = iBarShift (NULL, Time_ADX, Time[i],false);
      if (iADX ( NULL, Time_ADX, ADX_period, PRICE_CLOSE, MODE_MAIN, li_Bar) <= iADX (NULL, Time_ADX, ADX_period, PRICE_CLOSE, MODE_MAIN, li_Bar-1))   
         MA_1[i]=iMA(NULL,0,Period_MA,Shift_MA,Mode_MA,PRICE_CLOSE,i);
         else
// Вторй буфер
// Рисуется при условии падающей ADX
            MA_2[i]=iMA(NULL,0,Period_MA,Shift_MA,Mode_MA,PRICE_CLOSE,i);

   }      
   //---- done
   
    Comment
      (
         "\n ТФ =  ",GetTF(),
         "\n li_Bar =  ",li_Bar,
         "\n Коэффициент =  ",Koef
      );
  
   return(0);
  }
//+------------------------------------------------------------------+
int GetTF(int TimeFrame=0)
{
   if (TimeFrame==0) TimeFrame=Period();
      switch (TimeFrame)
      {
         case PERIOD_M1:  return(1);
         case PERIOD_M5:  return(5);
         case PERIOD_M15: return(15);
         case PERIOD_M30: return(30);
         case PERIOD_H1:  return(60);
         case PERIOD_H4:  return(240);
         case PERIOD_D1:  return(0);
         case PERIOD_W1:  return(0);
         case PERIOD_MN1: return(0);
         default:         return(0);
      }
}

 

 

 

 
Lomov:

Понять конечно я понял, а как это сделать не знаю. тф графика к которому присоединен индикатор определил, отношение периодов нашел, а как сделать чтобы происходила смена буфера только при совпадении if... и в зависимости от отношения периодов не могу. Кстати просмотрел несколько "кодов рабочих мультитаймфреймовых индикаторов"  там также как у меня один цикл и сдвиг организован также. Так что в тех кодах, которые я смог понять, ничего не нашел:( И еще, почему iBarShift принимает значения только 0 или 1 тоже не пойму. И поэтому прошу, если у Вас есть возможность, допишите чего там у меня не достает. Я пойму и на своем коде, а на чужом очень тяжело учиться.

 

 

 

Простой алгоритм (в котором можно обойтись одним циклом - точнее второй цикл - это iBarShift() и есть ;) ):

1. Считаем показания индикатора на 4-х часовом т\ф 

2. По выбранному бару по истории раьочего т\ф (счетчик цикла) выбираем бар 4-х часовго т\ф, в который входит выбранный бар рабочего т\ф (iBarShift)

3 Присваиваем (или используем как нам нужно) значение, полученное с 4-х часового бара

 

Пример :

    
    //     
    // Расчет показаний индикатора на старшем т\ф и заполнение mtfIndikatorBuff[]
    // 

    for( i=iBars(IndTF)*(IndTF/Period())-1; i>=0; i--)
    {
        int j  = iBarShift(symb,IndTF,Time[i]);
        if(mtfIndikatorBuff[j]>0)
            {
                CurIndBuffer_Buff_Up[i] = mtfIndikatorBuff[j];
                CurIndBuffer_Buff_Dn[i] = EMPTY_VALUE;
            }
        if(mtfIndikatorBuff[j]<0)
            {
                CurIndBuffer_Buff_Dn[i] = mtfIndikatorBuff[j];
                CurIndBuffer_Buff_Up[i] = EMPTY_VALUE;
            }
    }

 

 Просто, но с недостатками ;) - разбирайтесь.....

 ЗЫ Ваша ошибка здесь :

 

int li_Bar = iBarShift (NULL, Time_ADX, Time[i],false);
      if (iADX ( NULL, Time_ADX, ADX_period, PRICE_CLOSE, MODE_MAIN, li_Bar) <= iADX (NULL, Time_ADX, ADX_period, PRICE_CLOSE, MODE_MAIN, li_Bar-1))   
         MA_1[i]=iMA(NULL,0,Period_MA,Shift_MA,Mode_MA,PRICE_CLOSE,i);
         else
// Вторй буфер
// Рисуется при условии падающей ADX
            MA_2[i]=iMA(NULL,0,Period_MA,Shift_MA,Mode_MA,PRICE_CLOSE,i);
 

Люди добрые! "Плясать" нужно "не туда"!!! 

int start()
{
    int limit, counted_bars = IndicatorCounted(), li_Bar;
//---- last counted bar will be recounted
    if (counted_bars > 0) counted_bars--;
    limit = Bars - 1 - counted_bars;
  
    if (limit > 1) limit = Bars - 1;
    for (int i = limit; i >= 0; i--)
    {      
        li_Bar = iBarShift (NULL, Time_ADX, Time[i]);
        //---- Первый буфер
        //---- Рисуется при условии растущей ADX 
        if (iADX (NULL, Time_ADX, ADX_period, PRICE_CLOSE, MODE_MAIN, li_Bar) > iADX (NULL, Time_ADX, ADX_period, PRICE_CLOSE, MODE_MAIN, li_Bar + 1))
        {
            MA_1[i] = iMA (NULL, 0, Period_MA, Shift_MA, Mode_MA, PRICE_CLOSE, i);
            if (MA_2[i+1] != EMPTY_VALUE) MA_1[i+1] = MA_2[i+1];
        }
        //---- Вторй буфер
        //---- Рисуется при условии падающей ADX 
        else
        {
            MA_2[i] = iMA (NULL, 0, Period_MA, Shift_MA, Mode_MA, PRICE_CLOSE, i);
            if (MA_1[i+1] != EMPTY_VALUE) MA_2[i+1] = MA_1[i+1];
        }
        
    }
//---- done
    return (0);
}

 Хотя - как кому нравится... ;)

 
TarasBY:

Люди добрые! "Плясать" нужно "не туда"!!! 

 Хотя - как кому нравится... ;)

Спасибо за Ваш вариант, но он к сожалению все правильно рисует только на H4 (прорисовывает даже до нулевого бара до его закрытия), а на меньших тф у него возникают "фонтазии", а жаль. Действительно надо заморачиваться с пересчетом тф.

Скрин:
 
Lomov:
Спасибо за Ваш вариант, но он к сожалению все правильно рисует только на H4 (прорисовывает даже до нулевого бара до его закрытия), а на меньших тф у него возникают "фонтазии", а жаль. Действительно надо заморачиваться с пересчетом тф.

Скрин:

Поправил свой код:

int start()
{
    int limit, counted_bars = IndicatorCounted(), li_Bar;
//---- last counted bar will be recounted
    if (counted_bars > 0) counted_bars--;
    limit = Bars - 1 - counted_bars;
    if (limit > 1) limit = Bars - 1;
    if (counted_bars < limit)
    {
        for (int li_BUF = 0; li_BUF < 2; li_BUF++)
        {SetIndexEmptyValue (li_BUF, EMPTY_VALUE);}
    }
    for (int i = limit; i >= 0; i--)
    {      
        li_Bar = iBarShift (NULL, Time_ADX, Time[i]);
        //---- Первый буфер
        //---- Рисуется при условии растущей ADX 
        if (iADX (NULL, Time_ADX, ADX_period, PRICE_CLOSE, MODE_MAIN, li_Bar) > iADX (NULL, Time_ADX, ADX_period, PRICE_CLOSE, MODE_MAIN, li_Bar + 1))
        {
            MA_1[i] = iMA (NULL, 0, Period_MA, Shift_MA, Mode_MA, PRICE_CLOSE, i);
            if (MA_2[i+1] != EMPTY_VALUE) if (MA_1[i+1] == EMPTY_VALUE) MA_2[i] = MA_1[i];
        }
        //---- Вторй буфер
        //---- Рисуется при условии падающей ADX 
        else
        {
            MA_2[i] = iMA (NULL, 0, Period_MA, Shift_MA, Mode_MA, PRICE_CLOSE, i);
            if (MA_1[i+1] != EMPTY_VALUE) if (MA_2[i+1] == EMPTY_VALUE) MA_1[i] = MA_2[i];
        }
        
    }
//---- done
    return (0);
}

Вот ещё вариант:

int start()
{
    int limit, counted_bars = IndicatorCounted(), li_Bar = 0, li_preBar;
//---- last counted bar will be recounted
    if (counted_bars > 0) counted_bars--;
    limit = Bars - 1 - counted_bars;
    if (limit > 1) limit = Bars - 1;
    if (counted_bars < limit)
    {
        for (int li_BUF = 0; li_BUF < 2; li_BUF++)
        {SetIndexEmptyValue (li_BUF, EMPTY_VALUE);}
    }
    li_preBar = iBarShift (NULL, Time_ADX, Time[limit]);
    for (int i = limit; i >= 0; i--)
    {      
        li_Bar = iBarShift (NULL, Time_ADX, Time[i]);
        if (li_Bar == li_preBar) if (li_Bar > 0) continue;
        li_preBar = li_Bar;
        //---- Первый буфер
        //---- Рисуется при условии растущей ADX 
        if (iADX (NULL, Time_ADX, ADX_period, PRICE_CLOSE, MODE_MAIN, li_Bar) > iADX (NULL, Time_ADX, ADX_period, PRICE_CLOSE, MODE_MAIN, li_Bar + 1))
        {
            int li_MA = i;
            while (iTime (NULL, Time_ADX, li_Bar + 1) <= Time[li_MA])
            {
                MA_1[li_MA] = iMA (NULL, 0, Period_MA, Shift_MA, Mode_MA, PRICE_CLOSE, li_MA);
                li_MA++;
            }
        }
        //---- Вторй буфер
        //---- Рисуется при условии падающей ADX 
        else
        {
            li_MA = i;
            while (iTime (NULL, Time_ADX, li_Bar + 1) <= Time[li_MA])
            {
                MA_2[li_MA] = iMA (NULL, 0, Period_MA, Shift_MA, Mode_MA, PRICE_CLOSE, li_MA);
                li_MA++;
            }
        }
        
    }
//---- done
    return (0);
}
Показывают НЕОДИНАКОВО, НО есть выбор... :)
 
TarasBY:

Поправил свой код:

Вот ещё вариант:

Показывают НЕОДИНАКОВО, НО есть выбор... :)

:)) Спасибо за Ваше внимание к моей проблеме, на опять как то не то получается.

Первый вариант рисует так же как и предыдущий рисовал, с "фонтазией". Скрин:

 

 а у второго, чем меньше тф графика тем больше он отступает от нулевого бара при рисовании. Скрин:

 

Я сейчас пробую отсортировать бары по которым надо изменять используемый буфер с помощью iTime()

  ...... 
for (int i = limit; i >= 0; i--)
   {      
      li_Bar = iBarShift (NULL, Time_ADX, Time[i]);
//---- Первый буфер
//---- Рисуется при условии растущей ADX 
      if(iTime(NULL, Time_ADX, i)==iTime(NULL, GetTF(), i))
      {
         if (iADX (NULL, Time_ADX, ADX_period, PRICE_CLOSE, MODE_MAIN, li_Bar) > iADX (NULL, Time_ADX, ADX_period, PRICE_CLOSE, MODE_MAIN, li_Bar + 1))
         {
            MA_1[i] = iMA (NULL, 0, Period_MA, Shift_MA, Mode_MA, PRICE_CLOSE, i);
            if (MA_2[i+1] != EMPTY_VALUE) MA_1[i+1] = MA_2[i+1];
         }
//---- Вторй буфер
//---- Рисуется при условии падающей ADX 
         else
         {
            MA_2[i] = iMA (NULL, 0, Period_MA, Shift_MA, Mode_MA, PRICE_CLOSE, i);
            if (MA_1[i+1] != EMPTY_VALUE) MA_2[i+1] = MA_1[i+1];
         }
      }
....
Правда тоже как то не получается, рисует только на H4, а на остальных не хочет находить совпадения по времени у баров, ну ничего все равно я его достану.....
 
Lomov:
 

 а у второго, чем меньше тф графика тем больше он отступает от нулевого бара при рисовании. Скрин:

Во втором варианте сверьте код. У меня нормально рисует.

 

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