[ВНИМАНИЕ, ТЕМА ЗАКРЫТА!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда. - страница 332

 
Stepan241 >>:

Пытаюсь написать индикатор. Идея простая: УСРЕДНЯЕМ (СИЛА БЫКОВ-СИЛА МЕДВЕДЕЙ). Естественно за определенный период.



int start()
{
int i=Bars-IndicatorCounted()-1;
while(i>=0)
{
Bears_array[i]=iBearsPower(NULL,0,PeriodPower,PRICE_CLOSE,i);
Bulls_array[i]=iBullsPower(NULL,0,PeriodPower,PRICE_CLOSE,i);
MA_Bears[i]=iMAOnArray(Bears_array,0,MA_Period,0,MODE_EMA,i);
MA_Bulls[i]=iMAOnArray(Bulls_array,100,MA_Period,0,MODE_SMA,i);
Buf_0[i]=MA_Bulls[i];
i--;
}
return;
}

на экран вывожу для контроля только СГЛАЖЕННЫХ быков Buf_0[i]=MA_Bears[i];Это сделано для контроля на определенном этапе построения индюка. и сразу вижу что эти сглаженные быки нифига не совпадают с обычными встроенными. Даже ПРИМЕРНО. Если сглаживать периодом 1, то они по идее вообще должны повторять ввстроенных быков. Отсюда вывод что то не так в строчке MA_Bulls[i]=iMAOnArray(Bulls_array,100,MA_Period,0,MODE_SMA,i); Что именно не пойму...ПОМОГИТЕ!!!! УЖЕ 3 ДНЯ по справочникам и документации лазаю. СПАСИБО!


Вы сначало сформируйте массивы данных от быков и медведей а потом следующим циклом их гладьте, а то вы его ещё не сформировали а уже сглаживание применяете там данных то ещё нет что сглаживать?

 
Urain писал(а) >>

Вы сначало сформируйте массивы данных от быков и медведей а потом следующим циклом их гладьте, а то вы его ещё не сформировали а уже сглаживание применяете там данных то ещё нет что сглаживать?

Перевод

int start()
{
  int i, limit=Bars-IndicatorCounted()-1;
  for (i=limit;i>=0;i--){
    Bears_array[i]=iBearsPower(NULL,0,PeriodPower,PRICE_CLOSE,i);
    Bulls_array[i]=iBullsPower(NULL,0,PeriodPower,PRICE_CLOSE,i);
  }
  for (i=limit;i>=0;i--){
    MA_Bears[i]=iMAOnArray(Bears_array,0,MA_Period,0,MODE_EMA,i); 
    MA_Bulls[i]=iMAOnArray(Bulls_array,100,MA_Period,0,MODE_SMA,i); 
  }
  return;
}
 

costy_ писал(а) >>

extern string xxxxxxxxxxxxx="x=0 сегодня х=1 вчера итд";
extern int х=0;
int середина=(iHigh(0,PERIOD_D1,х)-iLow(0,PERIOD_D1,х))/2;
if(Bid>середина)...;
if(Ask<середина)...;


extern datetime some_time=D'14:56';
int середина_some_time=(iHigh(0,0,iBarShift(0,0,some_time))-iLow(0,0,iBarShift(0,0,some_time)))/2;
if(Bid>середина_some_time)...;
if(Ask<середина_some_time)...;

Большое спасибо, я всё ближе. Один момент не совсем ясен.

'14:56' - date literal string is incomplete такое предупреждение мне выдал комп.

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

 
alsu >>:

А зачем вам вообще их через иКастом вызывать? Для унификации что-ли? Ну, напишите для каждого отдельный индикатор-обертку, и вызывайте уже их через иКастом...

Проблема в том, что эти два индикатора (AO и AC) я переделал, и теперь хочу, чтобы бары окрашивались в соответствии с модифицированными индикаторами. Или есть еще варианты как можно сделать? Просто MQL недавно только начал разбирать...

 
Necron >>:

Проблема в том, что эти два индикатора (AO и AC) я переделал, и теперь хочу, чтобы бары окрашивались в соответствии с модифицированными индикаторами. Или есть еще варианты как можно сделать? Просто MQL недавно только начал разбирать...

Дык то, что вы переделали и вызывайте, в чем проблема? Например, если переделанные индикаторы у Вас так и называются АО, АС, то вызов будет

iCustom(0,0,"AO",0,shift);
iCustom(0,0,"AС",0,shift);

ну или параметры там добавьте если свои какие-то сделали

 
future >>:

Большое спасибо, я всё ближе. Один момент не совсем ясен.

'14:56' - date literal string is incomplete такое предупреждение мне выдал комп.

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


string час="15";
string мин="15";
datetime some_time=D'Year().Month().Day() час:мин';//попробуй так ____ но на тестере не будет работать, так как текущие год месяц и день 
привяжитесь к барам так проще вместо iBarShift(0,0,some_time) номер бара
 

costy_ писал(а) >>

future >>:

Большое спасибо, я всё ближе. Один момент не совсем ясен.

'14:56' - date literal string is incomplete такое предупреждение мне выдал комп.

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


string час="15";
string мин="15";
datetime some_time=D'Year().Month().Day() час:мин';//попробуй так ____ но на тестере не будет работать, так как текущие год месяц и день 
привяжитесь к барам так проще вместо iBarShift(0,0,some_time) номер бара

Всё-таки хочу докопаться, возможно ли выдержать привязку ко времени. В как вообще на языке MQL4 сказать цена Bid в 14.00 каждого торгового дня?

 

skifodessa 05.12.2009 14:07
  

Всем доброго дня.

Подскажите пожалуста как подсчитать кол-во пересечений ценой определеного уровня. Я хочу что бы ордер открывался не после первого пересечения уровня, а после 3 (4,5...)

Спасибо.
------------------------------------------------------------

Можно попробовать алгоритм


Если (Цена текущего бара>уровеня И цена предыдущего бара <уровня)То{счетчик увеличить на один}

Если (счетчик>3) То {открыть ордер; счетчик сбросить в ноль}

Теперь напишем все тоже самое на привычном языке (пишу только блоки. сами их вставите в нужные места)

Extern int Chet=10; // после скольки пересечений открывать ордер

Extern double Uroven=1.6566; //после пересечения ценой какого уровня начать считать

в функции старт условия будут примерно такие

int k;

if(Open[0]>Uroven && Open[1]<Uroven)k=k+1;// здесь рассмотрено пересечение ВВЕРХ

if(k>Chet){OrderSend(.......);k=0};

А вообще вопрос довольно не очень сложный.В учебнике по МКЛ хорошо расписаны эти основы АЛГОРИТМИКИ

 

ДЛЯ Vinin писал(а) >>

Спасибо за внимание. но этим делу не поможешь. Так как вы просто заменили цикл While циклом FOR

ДЛЯ Urain писал(а) >>

Следующими двумя строками как раз и формируется нужный массив.

  Bears_array[i]=iBearsPower(NULL,0,PeriodPower,PRICE_CLOSE,i);
  Bulls_array[i]=iBullsPower(NULL,0,PeriodPower,PRICE_CLOSE,i);

Urain Вы наверно подумали что в функцию iMAOnArray нужно передавать уже законченный сформированный массив.Формирование его циклами  FOR не помогло. Потому как в эту функцию (iMAOnArray) передается не массив а его ИМЯ. А массив обрабатывается ПОЭЛЕМЕНТНО. 

посредством изменения i в строке MA_Bears[i]=iMAOnArray(Bears_array,0,MA_Period,0,MODE_SMA,i);

С проблеммой разобрался. Она гораздо глубже чем кажется. Если применять эту обработку только в советнике то проблемм нет, но если строить график по ней, то по любому грабли. Дело все в ИНВЕРСНОМ индексировании массивов. Функция iMAOnArray имеет прямое (слева на право) индексирование, а графики индексируются справа на лево. За это пояснение спасибо Garfich у.



 
Stepan241 >>:

ДЛЯ Vinin писал(а) >>

Спасибо за внимание. но этим делу не поможешь. Так как вы просто заменили цикл While циклом FOR

ДЛЯ Urain писал(а) >>

Следующими двумя строками как раз и формируется нужный массив.

Bears_array[i]=iBearsPower(NULL,0,PeriodPower,PRICE_CLOSE,i);
Bulls_array[i]=iBullsPower(NULL,0,PeriodPower,PRICE_CLOSE,i);

Urain Вы наверно подумали что в функцию iMAOnArray нужно передавать уже законченный сформированный массив.Формирование его циклами FOR не помогло. Потому как в эту функцию (iMAOnArray) передается не массив а его ИМЯ. А массив обрабатывается ПОЭЛЕМЕНТНО.

посредством изменения i в строке MA_Bears[i]=iMAOnArray(Bears_array,0,MA_Period,0,MODE_SMA,i);

С проблеммой разобрался. Она гораздо глубже чем кажется. Если применять эту обработку только в советнике то проблемм нет, но если строить график по ней, то по любому грабли. Дело все в ИНВЕРСНОМ индексировании массивов. Функция iMAOnArray имеет прямое (слева на право) индексирование, а графики индексируются справа на лево. За это пояснение спасибо Garfich у.

Не знаю какая была проблема но Vinin правильно написал (не важно for или while) главное что сначало циклом формируется массив данных а затем следующим циклом формируем от него iMA,

а строка Bears_array[i]=iBearsPower(NULL,0,PeriodPower,PRICE_CLOSE,i); заполняет лишь одно i-тое значение массива.,

те без цикла массив сформирован не будет.

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