iHighest как правильно вычислить? - страница 2

 
int cot;
string name="0";
double macd_1,macd_2,spot_1,spot_2,pik;
bool stepB_1,stepB_2,stepS_1,stepS_2;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int start()
{
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
macd_1=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);
macd_2=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,2);
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
name=DoubleToStr(cot,0);
if(macd_2<0&&macd_1>0)
{
stepB_1=true;
stepS_1=false;
spot_1=Time[1];
}
if(stepB_1&&macd_2<0.0004&&macd_1>0.0004)stepB_2=true;
if(stepB_2&&macd_1<0.0004)
{
stepB_2=false;
spot_2=Time[1];
pik=High[iHighest(NULL,0,MODE_TIME,spot_1,spot_2)];
if(pik!=0)
{
Print("pik-",pik," spot_1-",spot_1," spot_2-",spot_2);
spot_1=0;
spot_2=0;
ObjectCreate(name,OBJ_ARROW,0,pik,0);
ObjectSet(name,OBJPROP_ARROWCODE,234);
ObjectSet(name,OBJPROP_COLOR,Red);
cot++;
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//*****************************************************************************************************////////
if(macd_2>0&&macd_1<0)
{
stepS_1=true;
stepB_1=false;
spot_1=0;
}

}

 
вот пример над чем можно подумать. и мне подсказать где я туплю и всем будет зае....... а то уже дня 3 мозгггг рвет спс!!!
 
laveosa:
вот пример над чем можно подумать. и мне подсказать где я туплю и всем будет зае....... а то уже дня 3 мозгггг рвет спс!!!


С SRC надо:

int cot;
string name="0";
double macd_1,macd_2,spot_1,spot_2,pik;
bool stepB_1,stepB_2,stepS_1,stepS_2;
//////////////////////////////////////////////////////////////// 
int start()
{ 
////////////////////////////////////////////////////////////////
macd_1=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);
macd_2=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,2);
////////////////////////////////////////////////////////////////
name=DoubleToStr(cot,0);
if(macd_2<0&&macd_1>0)
{
stepB_1=true;
stepS_1=false;
spot_1=Time[1];
}
if(stepB_1&&macd_2<0.0004&&macd_1>0.0004)stepB_2=true;
if(stepB_2&&macd_1<0.0004)
{
stepB_2=false;
spot_2=Time[1];
pik=High[iHighest(NULL,0,MODE_TIME,spot_1,spot_2)];
if(pik!=0) 
{
Print("pik-",pik," spot_1-",spot_1," spot_2-",spot_2);
spot_1=0;
spot_2=0;
ObjectCreate(name,OBJ_ARROW,0,pik,0);
ObjectSet(name,OBJPROP_ARROWCODE,234);
ObjectSet(name,OBJPROP_COLOR,Red);
cot++;
}
}
////////////////////////////////////////////////////////////
//**********************************************************
if(macd_2>0&&macd_1<0)
{
stepS_1=true;
stepB_1=false;
spot_1=0;
}
}  

Для читабельности! :)
 
borilunad:

По формуле из Документации находим верхний экстремум за любое количество сформировавшихся баров. Например на ТФ5 за сутки нужно 288 баров:

Также находится на любых других ТФ, за нужный период, проставляя соответственное количестао баров. Удачи!

Это в общем случае не верно. Если за последние сутки, то сначала нужно найти начальный и конечный бар суток - количество баров ТФ5 мин может отличаться от 288 (бывают пропуски баров) и может начинаться не с 1 или 0 бара ;). Например, Вы определяете экстремум за вчера, но сегодня в обед. Простая подстановка 1 и 288 даст выборку баров от сегодняшнего обеда, до вчерашнего. А если экстремум был вчера рано утром ;) ?

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

Можно и сразу за один проход: в цикле проверять выполнение условия и искать экстремум. Но при этом иХайест не нужен.
 
borilunad:


С SRC надо:

Для читабельности! :)

о_0
 
VladislavVG:

Это в общем случае не верно. Если за последние сутки, то сначала нужно найти начальный и конечный бар суток - количество баров ТФ5 мин может отличаться от 288 (бывают пропуски баров) и может начинаться не с 1 или 0 бара ;). Например, Вы определяете экстремум за вчера, но сегодня в обед. Простая подстановка 1 и 288 даст выборку баров от сегодняшнего обеда, до вчерашнего. А если экстремум был вчера рано утром ;) ?

Аналогично, кстати, и для МАКДа если прям таки необходимо использовать иХайест - сначала определяем начальный/конечный бар, на котором выполнялось нужное условие (обратным циклом), затем подставляя в иХайест получаем результат.

Можно и сразу за один проход: в цикле проверять выполнение условия и искать экстремум. Но при этом иХайест не нужен.

Извините! Я имел в виду сутки необязательно с 0 часов до 24 часов! Как и пересечения в индикаторе!
 

Полную безошибочность не гарантирую (не компилировал и не проверял), но кое-какие мысли думаю увидеть можно.

#define _EMPTY   -1
#define _UP       2
#define _DOWN     1
//-----
#define _UP_TO_DOWN   3
#define _DOWN_TO_UP   4
//----



int direct = _EMPTY;
int lastCrossDirect = _EMPTY;
int lastCrossBar = _EMPTY;
int curCrossDirect;
int curCrossBar;


// Возвращает индекс экстремума.
int FindPick()
{
   int pick = _EMPTY;
   // Ищем эксремум от lastCrossBar до curCrossBar (если curCrossDirect устраивает)
   lastCrossDirect = curCrossDirect;
   lastCrossBar = curCrossBar;
   return(pick);
}

// Если пересечение произошло, функция вернет true.
bool Check(int curBar, double curPrice)
{
   // Определяем положение (больше или меньше нуля при первом запусе).
   if(direct == _EMPTY)   
   {
      if(curPrice < 0)
         direct = _DOWN;
      else
         direct = _UP;
      return(false);
   }
   
   // Определяем положение.
   int curDirect;
   if(direct == _UP)
   {
      if(curPrice < 0)   
         curDirect = _DOWN;
      else
         curDirect = _UP;
   }
   else
   {
      if(curPrice > 0)   
         curDirect = _UP;
      else
         curDirect = _DOWN;
   }
   
   // Пересечение.
   if(direct != curDirect)
   {
      direct = curDirect;
      // Это пересечение не первое.
      if(lastCrossDirect != _EMPTY)
      {
         if(direct == _UP)
            curCrossDirect = _DOWN_TO_UP;
         else
            curCrossDirect = _UP_TO_DOWN;
         curCrossBar = curBar;
         return(true);
      }
      if(direct == _UP)
         lastCrossDirect = _DOWN_TO_UP;
      else
         lastCrossDirect = _UP_TO_DOWN;
      lastCrossBar = curBar;
   }
   return(false);
}

int start()
{
   for(int i= 0;  i <  Bars;  ++ i)
   {
      double price = ...;
      if( Check(i, price) )
      {
         int pick = FindPick();
         if(pick != _EMPTY)
         {
            //.........
         }
      }
   }
}
 
220Volt:

Полную безошибочность не гарантирую (не компилировал и не проверял), но кое-какие мысли думаю увидеть можно.


даааааааа теперь начинаю понимать что такое почерк программиста ...........

при первом пересечении spot_1 получает значении, при втором пересечений spot_2 получает второе значение. оператор Print показывает их значение и при визуальном сравнение они правильны но сам оператор

pik=High[iHighest(NULL,0,MODE_OPEN,spot_1,spot_2)]; не правильный так как он показывает что макс.макс. это предпоследний бар от последнего вычисленного а не максимальный в этом промежутке и потом на функцию: if(pik!=0) он не реагирует.... короче реально маргарин... как правильно написать pik=High[iHighest(NULL,0,MODE_OPEN,spot_1,spot_2)]; ?

 

все урааа разобрался спс пиплы мне чтоб что-то понять надо просто попиз.... с кем то а там сам веду.... ещё раз спс

if(macd_2<0&&macd_1>0)
{
stepB_1=true;
stepS_1=false;
spot_1=Time[1];

}
if(stepB_1&&macd_2<0.0004&&macd_1>0.0004)stepB_2=t rue;
if(stepB_2&&macd_1<0.0004)
{
stepB_2=false;
jj=iBarShift(NULL,0,spot_1);
if(jj!=0)
{
pik=High[iHighest(NULL,0,MODE_HIGH,jj,3)];
jj=0;
}

для пособий....

 
laveosa:

все урааа разобрался спс пиплы мне чтоб что-то понять надо просто попиз.... с кем то а там сам веду.... ещё раз спс

if(macd_2<0&&macd_1>0)
{
stepB_1=true;
stepS_1=false;
spot_1=Time[1];

}
if(stepB_1&&macd_2<0.0004&&macd_1>0.0004)stepB_2=t rue;
if(stepB_2&&macd_1<0.0004)
{
stepB_2=false;
jj=iBarShift(NULL,0,spot_1);
if(jj!=0)
{
pik=High[iHighest(NULL,0,MODE_HIGH,jj,3)];
jj=0;
}

для пособий....

----------------/\
А SRC наверху /|\

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