Я понял так, что нужно найти мультифреймовый индикатор ADX, а технический ADX для моего случая не подходит?
Нет, найдите любой МТФ индикатор - там есть часть кода, отвечающая за прорисовку. Могу, если хотите сразу код написать, но уверен - самостоятельно разобраться полезней. Подсказка - Вы цикл пропустили: после iBarShift должен быть цикл. Количество баров - по соотношению таймфреймов. А Вы только начальный бар нашли.
Нет, найдите любой МТФ индикатор - там есть часть кода, отвечающая за прорисовку. Могу, если хотите сразу код написать, но уверен - самостоятельно разобраться полезней. Подсказка - Вы цикл пропустили: после iBarShift должен быть цикл. Количество баров - по соотношению таймфреймов. А Вы только начальный бар нашли.
Понял. Сначало надо определить тф графика к которому прикреплен индикатор, потом цикл для пересчета баров этого графика к H4.
Lomov: Понял. Значит надо определить Понял. Сначало надо определить тф графика к которому прикреплен индикатор, потом цикл для пересчета баров этого графика к H4.
Понять конечно я понял, а как это сделать не знаю. тф графика к которому присоединен индикатор определил, отношение периодов нашел, а как сделать чтобы происходила смена буфера только при совпадении 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//---- Параметры индикатораexternint Period_MA=21;
externint Mode_MA=1; // 0-SMA, 1-EMA, 2-SMMA, 3-LWMAexternint Shift_MA=0;
externint Time_ADX=240;
externint ADX_period=14;
//---- Буферы для индикатораdouble MA_1[];
double MA_2[];
int Koef;
bool Work;
//+------------------------------------------------------------------+//| Custom indicator initialization function |//+------------------------------------------------------------------+int init()
{
//---- drawing settingsIndicatorDigits(Digits+1);
SetIndexStyle(0,DRAW_LINE);
SetIndexStyle(1,DRAW_LINE);
//---- indicator buffers mappingSetIndexBuffer(0,MA_1);
SetIndexBuffer(1,MA_2);
//---- name for DataWindow and indicator subwindow labelIndicatorShortName("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 donereturn(0);
}
//+------------------------------------------------------------------+int start()
{
if(Work==false) return(0);
int counted_bars=IndicatorCounted();
//---- last counted bar will be recountedif(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);
}
//---- doneComment
(
"\n ТФ = ",GetTF(),
"\n li_Bar = ",li_Bar,
"\n Коэффициент = ",Koef
);
return(0);
}
//+------------------------------------------------------------------+int GetTF(int TimeFrame=0)
{
if (TimeFrame==0) TimeFrame=Period();
switch (TimeFrame)
{
casePERIOD_M1: return(1);
casePERIOD_M5: return(5);
casePERIOD_M15: return(15);
casePERIOD_M30: return(30);
casePERIOD_H1: return(60);
casePERIOD_H4: return(240);
casePERIOD_D1: return(0);
casePERIOD_W1: return(0);
casePERIOD_MN1: return(0);
default: return(0);
}
}
Понять конечно я понял, а как это сделать не знаю. тф графика к которому присоединен индикатор определил, отношение периодов нашел, а как сделать чтобы происходила смена буфера только при совпадении if... и в зависимости от отношения периодов не могу. Кстати просмотрел несколько "кодов рабочих мультитаймфреймовых индикаторов" там также как у меня один цикл и сдвиг организован также. Так что в тех кодах, которые я смог понять, ничего не нашел:( И еще, почему iBarShift принимает значения только 0 или 1 тоже не пойму. И поэтому прошу, если у Вас есть возможность, допишите чего там у меня не достает. Я пойму и на своем коде, а на чужом очень тяжело учиться.
Простой алгоритм (в котором можно обойтись одним циклом - точнее второй цикл - это iBarShift() и есть ;) ):
Спасибо за Ваш вариант, но он к сожалению все правильно рисует только на H4 (прорисовывает даже до нулевого бара до его закрытия), а на меньших тф у него возникают "фонтазии", а жаль. Действительно надо заморачиваться с пересчетом тф.
Lomov: Спасибо за Ваш вариант, но он к сожалению все правильно рисует только на H4 (прорисовывает даже до нулевого бара до его закрытия), а на меньших тф у него возникают "фонтазии", а жаль. Действительно надо заморачиваться с пересчетом тф.
Скрин:
Поправил свой код:
int start()
{
int limit, counted_bars = IndicatorCounted(), li_Bar;
//---- last counted bar will be recountedif (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];
}
}
//---- donereturn (0);
}
Вот ещё вариант:
int start()
{
int limit, counted_bars = IndicatorCounted(), li_Bar = 0, li_preBar;
//---- last counted bar will be recountedif (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++;
}
}
}
//---- donereturn (0);
}
:)) Спасибо за Ваше внимание к моей проблеме, на опять как то не то получается.
Первый вариант рисует так же как и предыдущий рисовал, с "фонтазией". Скрин:
а у второго, чем меньше тф графика тем больше он отступает от нулевого бара при рисовании. Скрин:
Я сейчас пробую отсортировать бары по которым надо изменять используемый буфер с помощью 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, а на остальных не хочет находить совпадения по времени у баров, ну ничего все равно я его достану.....
Я понял так, что нужно найти мультифреймовый индикатор ADX, а технический ADX для моего случая не подходит?
Нет, найдите любой МТФ индикатор - там есть часть кода, отвечающая за прорисовку. Могу, если хотите сразу код написать, но уверен - самостоятельно разобраться полезней. Подсказка - Вы цикл пропустили: после iBarShift должен быть цикл. Количество баров - по соотношению таймфреймов. А Вы только начальный бар нашли.
Нет, найдите любой МТФ индикатор - там есть часть кода, отвечающая за прорисовку. Могу, если хотите сразу код написать, но уверен - самостоятельно разобраться полезней. Подсказка - Вы цикл пропустили: после iBarShift должен быть цикл. Количество баров - по соотношению таймфреймов. А Вы только начальный бар нашли.
Понял. Значит надо определить Понял. Сначало надо определить тф графика к которому прикреплен индикатор, потом цикл для пересчета баров этого графика к H4.
Точно
Точно
Понять конечно я понял, а как это сделать не знаю. тф графика к которому присоединен индикатор определил, отношение периодов нашел, а как сделать чтобы происходила смена буфера только при совпадении if... и в зависимости от отношения периодов не могу. Кстати просмотрел несколько "кодов рабочих мультитаймфреймовых индикаторов" там также как у меня один цикл и сдвиг организован также. Так что в тех кодах, которые я смог понять, ничего не нашел:( И еще, почему iBarShift принимает значения только 0 или 1 тоже не пойму. И поэтому прошу, если у Вас есть возможность, допишите чего там у меня не достает. Я пойму и на своем коде, а на чужом очень тяжело учиться.
Понять конечно я понял, а как это сделать не знаю. тф графика к которому присоединен индикатор определил, отношение периодов нашел, а как сделать чтобы происходила смена буфера только при совпадении if... и в зависимости от отношения периодов не могу. Кстати просмотрел несколько "кодов рабочих мультитаймфреймовых индикаторов" там также как у меня один цикл и сдвиг организован также. Так что в тех кодах, которые я смог понять, ничего не нашел:( И еще, почему iBarShift принимает значения только 0 или 1 тоже не пойму. И поэтому прошу, если у Вас есть возможность, допишите чего там у меня не достает. Я пойму и на своем коде, а на чужом очень тяжело учиться.
Простой алгоритм (в котором можно обойтись одним циклом - точнее второй цикл - это iBarShift() и есть ;) ):
1. Считаем показания индикатора на 4-х часовом т\ф
2. По выбранному бару по истории раьочего т\ф (счетчик цикла) выбираем бар 4-х часовго т\ф, в который входит выбранный бар рабочего т\ф (iBarShift)
3 Присваиваем (или используем как нам нужно) значение, полученное с 4-х часового бара
Пример :
Просто, но с недостатками ;) - разбирайтесь.....
ЗЫ Ваша ошибка здесь :
Люди добрые! "Плясать" нужно "не туда"!!!
Хотя - как кому нравится... ;)
Люди добрые! "Плясать" нужно "не туда"!!!
Хотя - как кому нравится... ;)
Скрин:
Спасибо за Ваш вариант, но он к сожалению все правильно рисует только на H4 (прорисовывает даже до нулевого бара до его закрытия), а на меньших тф у него возникают "фонтазии", а жаль. Действительно надо заморачиваться с пересчетом тф.
Скрин:
Поправил свой код:
Вот ещё вариант:
Показывают НЕОДИНАКОВО, НО есть выбор... :)Поправил свой код:
Вот ещё вариант:
Показывают НЕОДИНАКОВО, НО есть выбор... :):)) Спасибо за Ваше внимание к моей проблеме, на опять как то не то получается.
Первый вариант рисует так же как и предыдущий рисовал, с "фонтазией". Скрин:
а у второго, чем меньше тф графика тем больше он отступает от нулевого бара при рисовании. Скрин:
Я сейчас пробую отсортировать бары по которым надо изменять используемый буфер с помощью iTime()
Правда тоже как то не получается, рисует только на H4, а на остальных не хочет находить совпадения по времени у баров, ну ничего все равно я его достану.....а у второго, чем меньше тф графика тем больше он отступает от нулевого бара при рисовании. Скрин:
Во втором варианте сверьте код. У меня нормально рисует.