iADX Определение точки пересечения нулевого бара

 

Здравствуйте!

Использую в своем советнике индикатор ADX, при пересечении +di -di открываю ордер в зависимости от положение +di и -di после пересечения.

double main=iADX("EURUSD",15,14,PRICE_CLOSE,MODE_MAIN,0);

double plusDi=iADX("EURUSD",15,14,PRICE_CLOSE,MODE_PLUSDI,0);

double minusDi=iADX("EURUSD",15,14,PRICE_CLOSE,MODE_MINUSDI,0);

double LastplusDi=iADX("EURUSD",15,14,PRICE_CLOSE,MODE_PLUSDI,1);

double LastminusDi=iADX("EURUSD",15,14,PRICE_CLOSE,MODE_MINUSDI,1);

if(plusDi > minusDi){
razn=plusDi-minusDi;
}
if(plusDi < minusDi){
razn=minusDi-plusDi;
}
if(razn < 1){
// открываем
}else{
if(plusDi < minusDi){
if(LastplusDi > LastminusDi){
//открываем
}
}
if(plusDi > minusDi){
if(LastplusDi < LastminusDi){
//открываем
}
}


Возникла проблема позднего определения точки пересечения, потому что координаты графика обновляются только на линиях то есть в 0 минут 15 30 45 .... и иногда если пересечение на графике произошло между периодом, то соответствующие координаты новой линии (то есть 0 15 30 45 минуты ) которые позволяют определить пересечении не сразу меняются (+di не становиться выше или ниже -di относительно предыдущей линии)

Кто нибудь сталкивался с этой проблемой ? Поможет мне исправить проблему пересчет нулевого бара в индикаторе?

 
Вот Срабатывает но гдето есть прокол надо искать идея твоя
nt Sygnal()                        // Пользовательская функция
  {
   string Sym=Symbol();

//--------------------------------------------------------------- 4 --
   // Параметры технич. индикат:
double main=iADX(Sym,0,14,PRICE_CLOSE,MODE_MAIN,0);
double plusDiSHELL=iADX(Sym,0,14,PRICE_CLOSE,MODE_PLUSDI,0);
double minusDiSHELL=iADX(Sym,0,14,PRICE_CLOSE,MODE_MINUSDI,0);
double plusDiSHELL1 =iADX(Sym,0,14,PRICE_CLOSE,MODE_PLUSDI,1);
double minusDiSHELL1 =iADX(Sym,0,14,PRICE_CLOSE,MODE_MINUSDI,1);
double plusDiBUY =iADX(Sym,0,14,PRICE_OPEN,MODE_PLUSDI,0);
double minusDiBUY =iADX(Sym,0,14,PRICE_OPEN,MODE_MINUSDI,0);
double plusDiBUY1 =iADX(Sym,0,14,PRICE_OPEN,MODE_PLUSDI,1);
double minusDiBUY1 =iADX(Sym,0,14,PRICE_OPEN,MODE_MINUSDI,1);
  
//--------------------------------------------------------------- 5 --
   // Вычисление торговых критериев
// -----------BUY
double DeltaBUY=plusDiBUY - minusDiBUY;
double DeltaBUY1=plusDiBUY1-minusDiBUY1;

if(DeltaBUY > 0 && DeltaBUY1 <0){
   return(10);                      // Открытие Buy 
} 
if(plusDiBUY < plusDiBUY){
      return(11);                      // Закрытие Buy    
}
//--------------SHELL
double DeltaSHELL=plusDiSHELL - minusDiSHELL;
double DeltaSHELL1=plusDiSHELL1-minusDiSHELL1;
if(DeltaSHELL < 0 && DeltaSHELL1 >0){
   return(20);                      // Открытие Sell 
} 
if(minusDiSHELL < minusDiSHELL1){
      return(21);                      // Закрытие Sell         
}   
   
   

//--------------------------------------------------------------- 6 --
   return(0);                          // Выход из пользов. функции
  }
//-----------------
 
Dronnikkl :

Здравствуйте!

Использую в своем советнике индикатор ADX, при пересечении +di -di открываю ордер в зависимости от положение +di и -di после пересечения.

double main=iADX("EURUSD",15,14,PRICE_CLOSE,MODE_MAIN,0);

double plusDi=iADX("EURUSD",15,14,PRICE_CLOSE,MODE_PLUSDI,0);

double minusDi=iADX("EURUSD",15,14,PRICE_CLOSE,MODE_MINUSDI,0);

double LastplusDi=iADX("EURUSD",15,14,PRICE_CLOSE,MODE_PLUSDI,1);

double LastminusDi=iADX("EURUSD",15,14,PRICE_CLOSE,MODE_MINUSDI,1);

if(plusDi > minusDi){
razn=plusDi-minusDi;
}
if(plusDi < minusDi){
razn=minusDi-plusDi;
}
if(razn < 1){
// открываем
}else{
if(plusDi < minusDi){
if(LastplusDi > LastminusDi){
//открываем
}
}
if(plusDi > minusDi){
if(LastplusDi < LastminusDi){
//открываем
}
}


Возникла проблема позднего определения точки пересечения, потому что координаты графика обновляются только на линиях то есть в 0 минут 15 30 45 .... и иногда если пересечение на графике произошло между периодом, то соответствующие координаты новой линии (то есть 0 15 30 45 минуты ) которые позволяют определить пересечении не сразу меняются (+di не становиться выше или ниже -di относительно предыдущей линии)

Кто нибудь сталкивался с этой проблемой ? Поможет мне исправить проблему пересчет нулевого бара в индикаторе?


Здравствуйте. Гляньте здесь - бейте подобное.
 
Roman. :

Здравствуйте.

Отладил работает но пользы нет так как этот инструмент больше для фондовой биржи, работал безупречно на М1, а запоздание происходит из-за установки периода в iADX или в другом любом индекаторе где есть ТаймФрейм- это время сробатывания, надо ставить минимальный

double MidIndx = 17;
  // Параметры технич. индикат:
double main=iADX(Sym,1,MidIndx,PRICE_CLOSE,MODE_MAIN,0);
double plusDi=iADX(Sym,1,MidIndx,PRICE_CLOSE,MODE_PLUSDI,0);
double minusDi=iADX(Sym,1,MidIndx,PRICE_CLOSE,MODE_MINUSDI,0);
double plusDi1 =iADX(Sym,1,MidIndx,PRICE_CLOSE,MODE_PLUSDI,1);
double minusDi1 =iADX(Sym,1,MidIndx,PRICE_CLOSE,MODE_MINUSDI,1);
  
//--------------------------------------------------------------- 5 --
   // Вычисление торговых критериев
// -----------BUY
double Delta0=plusDi-minusDi;
double Delta1=plusDi1-minusDi1;
//--------------SHELL
// -----------BUY
if(Delta0 > 0 && Delta1 <0 && main < plusDi){
   Comment("Открытие Buy Delta=" ,Delta0," Delta1=" ,Delta1,"\n","+DI=",plusDi," -DI=",minusDi," +DI1=",plusDi1," -DI1=",minusDi1);
   return(10);                      // Открытие Buy
} 
if(minusDi < minusDi1){
      Comment("Закрытие Buy Delta=" ,Delta0," Delta1=" ,Delta1,"\n","+DI=",plusDi," -DI=",minusDi," +DI1=",plusDi1," -DI1=",minusDi1);
      return(11);                      // Закрытие Buy
}   
//--------------SHELL
if(Delta0 < 0 && Delta1 >0 && main > minusDi1 ){
   Comment("Открытие Sell Delta=" ,Delta0," Delta1=" ,Delta1,"\n","+DI=",plusDi," -DI=",minusDi," +DI1=",plusDi1," -DI1=",minusDi1);   
   return(20);                      // Открытие Sell
}
if( plusDi < plusDi1){
      Comment("Закрытие Sell Delta=" ,Delta0," Delta1=" ,Delta1,"\n","+DI=",plusDi," -DI=",minusDi," +DI1=",plusDi1," -DI1=",minusDi1);
      return(21);                      // Закрытие Sell
}
   

а запоздание происходит из-за установки периода в iADX или в другом любом индекаторе где есть ТаймФрейм- это время сробатывания, надо ставить минимальный

// берем два соседних значения Быстрой МА
double fast0=iMA(Symbol(),PERIOD_M1, 10, 0, MODE_EMA, PRICE_CLOSE, 0);
double fast1=iMA(Symbol(), PERIOD_M1, 10, 0, MODE_EMA, PRICE_CLOSE, 1);
 
// берем два значения Медленной МА
double slow0=iMA(Symbol(), PERIOD_M1, 20, 0, MODE_EMA, PRICE_CLOSE, 0);
double slow1=iMA(Symbol(), PERIOD_M1, 20, 0, MODE_EMA, PRICE_CLOSE, 1);
 
// сравниваем значения и определяем направление пересечения
if (fast0>slow0 && fast1<slow1) Print("Пересечение ВВЕРХ");
if (fast0<slow0 && fast1>slow1) Print("Пересечение ВНИЗ");

 
AT-2000 :


Попробуйте отказаться от использования нулевого бара. Т.е. пользуйте вместо "0" - первый "1", вместо "1" - второй "2".

Или вместо прайс_клозе бейте цены открытия:

double fast0=iMA(Symbol(),PERIOD_M1, 10, 0, MODE_EMA, PRICE_OPEN, 0);
double fast1=iMA(Symbol(), PERIOD_M1, 10, 0, MODE_EMA, PRICE_OPEN, 1);
 
Roman.:


Попробуйте отказаться от использования нулевого бара. Т.е. пользуйте вместо "0" - первый "1", вместо "1" - второй "2".

Или вместо прайс_клозе бейте цены открытия:


цены открытия не меняется на протяжении всего таймфрейма т.е. если стоит у вас часовой таймфрейм то и цена открытия у вас в течении часа одинаковая
 
Dronnikkl:

Здравствуйте!

Использую в своем советнике индикатор ADX, при пересечении +di -di открываю ордер в зависимости от положение +di и -di после пересечения.Возникла проблема позднего определения точки пересечения, потому что координаты графика обновляются только на линиях то есть в 0 минут 15 30 45 .... и иногда если пересечение на графике произошло между периодом, то соответствующие координаты новой линии (то есть 0 15 30 45 минуты ) которые позволяют определить пересечении не сразу меняются (+di не становиться выше или ниже -di относительно предыдущей линии)

Кто нибудь сталкивался с этой проблемой ? Поможет мне исправить проблему пересчет нулевого бара в индикаторе?

Простое и довольно элементарное решение :

if ((ADXLine[Index+2]<=AlertSignal)&&(ADXLine[Index+1]>AlertSignal)) Signal=1;
if ((ADXLine[Index+2]>=AlertSignal)&&(ADXLine[Index+1]<AlertSignal)) Signal=-1;

ADXLine - Буфер данных, AlertSignal - Уровень отработки сигнала - в данном случае показано отработка по открытию ..

 
forte928:

Простое и довольно элементарное решение :

ADXLine - Буфер данных, AlertSignal - Уровень отработки сигнала - в данном случае показано отработка по открытию ..


Решение содержит некритическую ошибку.

В правых частях условий лучше применять то же условие, что и в левых, иначе иногда будем запаздывать.

В смысле - условие нестрогое :)

 
tara:


Решение содержит некритическую ошибку.

В правых частях условий лучше применять то же условие, что и в левых, иначе иногда будем запаздывать.

В смысле - условие нестрогое :)

Наверное нужно поменять условия с равенством местами тогда условие будет уточняяющим - это будет незапаздывающее..

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