Problemy sviazanny s propuskajemami barami i ras4itanija ugola mezdu cen i barov

 
Privet,

Ja davno mu4ajus' s takoj problemoj i nikak nimogu reshyt:

Sdelal indikator, katoryj kladajet trendline mezdu dvux cen v istoriji i pods4itajet skol'ko pipsov cena
izmeniajetsia za 1 bar. Problema na4inajetsia, kokda ja probuju ras4itat' aktual'nuju tekus4aju cenu posle ras4itanija ugola,
4toby mog kladit' vtoruju liniju na liniju trenda. Eto sviazanno s propuskajemami barami s servera kokda cena nimeniajetsia.

Renat i drugije, mozete v etom pamo4'?

Formuly takije:
Ugol = (zadannaja cena - cena ot katoroj s4itajem) / skol'ko barov mezdu etix cen

Tekus4iaja to4ka ras4itajetsia tak:

Jesli ceny idut v verx, pribavliajem k na4al'noj ceny i umnozajem na ugol raznicu barov
To4ka = na4alnaja cena + (Ugol * raznica barov mezdu na4al'noj ceny i tekus4ej)
Jiesli ceny idut v niz, ortnimajem:
To4ka = na4alnaja cena - (Ugol * raznica barov mezdu na4al'noj ceny i tekus4ej)

Pri kalkuliaciji etoj to4ki ras4itajetsia cena nipravel'no iz za propus4ennyx barov, i nikak nipolu4ajetsia sdelat' 4toby xorosho pods4italo.

Vot moj indikator trenda, posle zapuska sami uvidite kak ras4itajetsia vsio. Paproibute naiti oshyvku v etom indikatore pri ras4itaniji cen, a jiesli tam oshybki net, mozet byt kak nibut' v samom metatrader4 eto mozno reshyt':

//+------------------------------------------------------------------+
//|                                                   TrendLevel.mq4 |
//|       Copyright © 2005, Arunas Pranckevicius (T-1000), Lithuania |
//|                                            irc://irc.omnitel.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, Arunas Pranckevicius (T-1000), Lithuania"
#property link      "irc://irc.omnitel.net"

#property indicator_chart_window
//---- input parameters
extern int       PricePeriod=200;
extern int       Shift=0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
Print(Symbol()," ",TimeToStr(CurTime(),TIME_DATE),": ","Trend Level v1.0, Copyright © 2005, Arunas Pranckevicius (T-1000), Lithuania, loaded.");
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//---- 
   
//----
   return(0);
  }
void SetObject(string ObjName,int ObjType,datetime ObjTime1,double ObjPrice1,datetime ObjTime2=0,double ObjPrice2=0,color ObjColor=Red,int ObjSize=1,int ObjStyle=STYLE_SOLID,datetime ObjTime3=0,double ObjPrice3=0)
{

if (ObjectFind(ObjName) != -1) ObjectDelete(ObjName);
ObjectCreate(ObjName, ObjType, 0,ObjTime1 , ObjPrice1, ObjTime2, ObjPrice2, ObjTime3, ObjPrice3);
ObjectSet(ObjName,OBJPROP_COLOR,ObjColor); 
ObjectSet(ObjName,OBJPROP_STYLE,ObjStyle); 
ObjectSet(ObjName,OBJPROP_WIDTH,ObjSize); 
}


//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
{
   if (Bars < PricePeriod) return(0);
   int counter, Angle,TrendStartBar,TrendBar,MaxPriceBar,MinPriceBar,TrendCheckPoint;
   double MaxPrice,MinPrice,TrendStart,TrendLevel,TimeDiff,TrendAngle,TrendAngleTMP,TrendLine,NoisePts;    
   bool Revert=false;
   Angle = 0;
   TrendBar = 0;
   TrendLine = 0;
   TrendAngle = 0;
   TrendCheckPoint = 0;
   MaxPriceBar = Highest (NULL,0,MODE_HIGH,PricePeriod+Shift,Shift);
   MinPriceBar = Lowest (NULL,0,MODE_LOW,PricePeriod+Shift,Shift);  
   MaxPrice = High[MaxPriceBar];
   MinPrice = Low[MinPriceBar];   
   NoisePts=(MaxPrice - MinPrice) * 0.118;
   if (MaxPriceBar < MinPriceBar) Angle = 1;
   if (MaxPriceBar > MinPriceBar) Angle = 2;
   
   if (Angle == 1) 
   {
    // Set initial Trend Level bar
   TrendStartBar = MinPriceBar;
   TrendStart = Low[MinPriceBar];
   TrendBar = MinPriceBar;
   TrendLine = Low[MinPriceBar];
   }
   if (Angle == 2) 
   {
    // Set initial Trend Level bar
   TrendStartBar = MaxPriceBar;
   TrendStart = High[MaxPriceBar];
   TrendBar = MaxPriceBar;
   TrendLine = High[MaxPriceBar];
   }
   //Print("TrendStartBar:",TrendStartBar," TrendStartBarTime:",TimeToStr(Time[TrendStartBar],TIME_DATE));
   for (counter=PricePeriod+Shift;counter>=Shift;counter--)
   {

   if (!Revert
       && Angle == 1 
       && Open[counter] < Open[PricePeriod])
   {
   // We have bad trend starting checkpoint, try to reallign it
   Angle = 2;
   MaxPriceBar = Highest (NULL,0,MODE_HIGH,PricePeriod+Shift,Shift);
   TrendStartBar = MaxPriceBar;
   TrendStart = High[MaxPriceBar];
   counter = PricePeriod;
   TrendBar = MaxPriceBar;
   TrendLine = High[MaxPriceBar];
   TrendAngle=0;
   Revert = true;
   }
   
   if (!Revert
       && Angle == 2 
       && Open[counter] > Open[PricePeriod])
   {
   // We have bad trend starting checkpoint, try to reallign it
   Angle = 1;
   MinPriceBar = Lowest (NULL,0,MODE_LOW,PricePeriod+Shift,Shift);  
   TrendStartBar = MinPriceBar;
   TrendStart = Low[MinPriceBar];
   counter = PricePeriod;
   TrendBar = MinPriceBar;
   TrendLine = Low[MinPriceBar];
   Revert = true;
   TrendAngle=0;
   }
   
   
   if (Angle == 1)
   {
   MaxPriceBar = Highest (NULL,0,MODE_HIGH,TrendBar-counter+1,counter);
   MinPriceBar = Lowest (NULL,0,MODE_LOW,TrendBar-counter+1,counter);
   MaxPrice = High[MaxPriceBar];
   MinPrice = Low[MinPriceBar];
	//Print(Symbol()," DEBUG: BAR=",counter," MaxPriceBar=",MaxPriceBar," MinPriceBar=",MinPriceBar);
   
   if (TrendCheckPoint == 0 
       && TrendLine < Low[counter] - NoisePts
      && TrendStartBar > counter      
      && TrendBar > counter)      
   {
    // Set initial Trend Level bar
   TrendBar = counter;
   TrendLine = High[counter];   
    //Print(Symbol()," DEBUG: BAR=",counter," MaxPriceTime:",TimeToStr(Time[MaxPriceBar],TIME_DATE)," MaxPriceBar=",MaxPriceBar," MinPriceBar=",MinPriceBar," TrendAngle=",TrendAngle," TrendBar=",TrendBar," Trend Time:",TimeToStr(Time[TrendBar]));
   }

   if (TrendCheckPoint == 0
      && MaxPriceBar > MinPriceBar
      && counter < TrendBar
      && High[counter] < TrendLine - NoisePts)
   
   TrendCheckPoint = 1;
       
   if (TrendCheckPoint == 1 
       && Low[counter] < TrendLine - NoisePts
       && counter < TrendStartBar
      && TrendBar > counter
      )      
      {
      // Set new Trend Line checkpoint for calculating actual trend level
  		TimeDiff = iBarShift(Symbol(),Period(),Time[TrendStartBar]) - iBarShift(Symbol(),Period(),Time[TrendBar]);
  		if (TimeDiff == 0) TimeDiff = 1;
      TrendBar = counter;
      TrendLine = Low[counter];         
	   TrendAngle = (Low[counter] - TrendStart) / TimeDiff; // Calculate trend triangle line angle / bar
	   //if (TrendAngle > 0) 
      //Print(Symbol()," DEBUG: BAR=",counter," TrendStartBar:",TrendStartBar," MaxPriceBar=",MaxPriceBar," MinPriceBar=",MinPriceBar," TrendAngle=",TrendAngle," TrendBar=",TrendBar," Trend Time:",TimeToStr(Time[TrendBar]));
      }     
   }

   if (Angle == 2)
   {
   MaxPriceBar = Highest (NULL,0,MODE_HIGH,TrendBar-counter+1,counter);
   MinPriceBar = Lowest (NULL,0,MODE_LOW,TrendBar-counter+1,counter);
   MaxPrice = High[MaxPriceBar];
   MinPrice = Low[MinPriceBar];
	//Print(Symbol()," DEBUG: BAR=",counter," MaxPriceBar=",MaxPriceBar," MinPriceBar=",MinPriceBar);
   
   if (TrendCheckPoint == 0 
       && TrendLine > Low[counter] + NoisePts
      && TrendStartBar > counter      
      && TrendBar > counter)      
   {
    // Set initial Trend Level bar
   TrendBar = counter;
   TrendLine = Low[counter];   
    //Print(Symbol()," DEBUG: BAR=",counter," MaxPriceTime:",TimeToStr(Time[MaxPriceBar],TIME_DATE)," MaxPriceBar=",MaxPriceBar," MinPriceBar=",MinPriceBar," TrendAngle=",TrendAngle," TrendBar=",TrendBar," Trend Time:",TimeToStr(Time[TrendBar]));
   }

   if (TrendCheckPoint == 0
      && MaxPriceBar < MinPriceBar
      && counter < TrendBar
      && Low[counter] > TrendLine + NoisePts)
   
   TrendCheckPoint = 1;
       
   if (TrendCheckPoint == 1 
       && High[counter] > TrendLine + NoisePts
       && counter < TrendStartBar
      && TrendBar > counter
      )      
      {
      // Set new Trend Line checkpoint for calculating actual trend level
  		TimeDiff = iBarShift(Symbol(),Period(),Time[TrendStartBar]) - iBarShift(Symbol(),Period(),Time[TrendBar]);
  		if (TimeDiff == 0) TimeDiff = 1;
      TrendBar = counter;
      TrendLine = High[counter];         
	   TrendAngle = (TrendStart - High[counter]) / TimeDiff; // Calculate trend triangle line angle / bar
	   //if (TrendAngle > 0) 
      //Print(Symbol()," DEBUG: BAR=",counter," TrendStartBar:",TrendStartBar," MaxPriceBar=",MaxPriceBar," MinPriceBar=",MinPriceBar," TrendAngle=",TrendAngle," TrendBar=",TrendBar," Trend Time:",TimeToStr(Time[TrendBar]));
      }     
   }
}
//---- 
MaxPriceBar = Highest (NULL,0,MODE_HIGH,PricePeriod+Shift,Shift);
MinPriceBar = Lowest (NULL,0,MODE_LOW,PricePeriod+Shift,Shift);  
if (TrendAngle == 1) TrendAngle = 0;
TimeDiff = iBarShift(Symbol(),Period(),Time[PricePeriod+Shift]) - iBarShift(Symbol(),Period(),Time[Shift]);
if (TimeDiff == 0) TimeDiff = 1;

if (TrendAngle > 0) 
{
   if (Angle == 1) 
   TrendLevel = Low[TrendStartBar] + (TimeDiff * TrendAngle); 
   if (Angle == 2) 
   TrendLevel = High[TrendStartBar] - (TimeDiff * TrendAngle);

   SetObject("TREND_LEVEL",OBJ_HLINE,Time[PricePeriod+Shift+1],TrendLevel,Time[Shift],TrendLevel,Red,1,STYLE_DASHDOT);
}
else
{
 if (ObjectFind("TREND_LEVEL") != -1) ObjectDelete("TREND_LEVEL");
}

SetObject("Trend",OBJ_TREND,Time[TrendStartBar],TrendStart,Time[TrendBar],TrendLine,Red,1,STYLE_SOLID);
ObjectSetText("Trend","Projected Trend", 8, "Arial", Green);

SetObject("TriangleEnd",OBJ_TREND,Time[Shift],Open[MaxPriceBar],Time[Shift],Open[MinPriceBar],Yellow,1,STYLE_DASHDOT);

if (Angle == 1) Comment("Trend Level (c) T-1000, Lithuania 2005\nTrend: UP","\nTrend Level: ",TrendLevel,"\nTrend Start: ",TimeToStr(Time[TrendStartBar],TIME_DATE|TIME_MINUTES),"\nTrend Start Price:",TrendStart,"\nTrend Checkpoint Start: ",TimeToStr(Time[TrendBar],TIME_DATE|TIME_MINUTES),"\nTrend Checkpoint Price: ",TrendLine,"\nNoisePts: ",NoisePts / Point);
if (Angle == 2) Comment("Trend Level (c) T-1000, Lithuania 2005\nTrend: DOWN","\nTrend Level: ",TrendLevel,"\nTrend Start: ",TimeToStr(Time[TrendStartBar],TIME_DATE|TIME_MINUTES),"\nTrend Checkpoint Start: ",TimeToStr(Time[TrendBar],TIME_DATE|TIME_MINUTES),"\nTrend Checkpoint Price: ",TrendLine,"\nNoisePts: ",NoisePts / Point);
   
//----
   return(0);
}
//+------------------------------------------------------------------+



Te, kto umejet programirovat', mozete pamo4' toze? Etot indikator obleg4ajet rabotu kokda nado trend ustanovit' i na grafike narisovat', s etim indikatorom eto uze avtomati4eski risujetsia... :-)

 
Ghm, nikomu eto nienteresno..?
 
я уже задавал подобный вопрос. Ответ был, что ничего изменено, не будет! проблема осталась и нормального решения ей пока найти не удалось.

ЗЫ: Господа разработчики! Может, есть смысл ввести понятие минусового бара? так как работа с будущим по Time некорректна...
 
Na klient-server pravda, nie4evo i ninado meniat', no na grafik(xot' dlia funkcii nize) nuzno risovat' dublikaty tak kak vremia vsio taki tikajet :-)

4toby takije funkciji kak Bars, iBarShift(), ArrayCopySeries() rabotali korektno, nuzno zapolniat' dublikaty cen 4toby indikatory i experty vsiegda smogli vziat' kakaja cena byla na kazdyj bar n barov nazad v istoriju i nebylo propuska barov...

Slawa, Renat, kakoje vashe mnenija nad etom?
 
Xm, poxoze 4to zabyli otvetit', zdiom... :-)

P.S. v rezultate vsiegda nuzny cifry, a kak ze ix vyvesti po drugomu iz trendline na tekus4ij moment, kokda trendline zarisovanna v istoriji 4erez 2 to4ki, i tiepier' nuzna 1 iz to4ek nad etoj liniji..
 
Очень неудобно читать латиницу, но попробую помочь предложив следующее решение:

думаю лишних слов не надо
визуально на истории будет перемещаться, и может некорректно показывать прошлые значения, но для рассчитываемой точки все будет "путем"

2nsi2000
ЗЫ: Господа разработчики! Может, есть смысл ввести понятие минусового бара? так как работа с будущим по Time некорректна...

может попробовать использовать смещение SetIndexShift
 

визуально на истории будет перемещаться, и может некорректно показывать прошлые значения, но для рассчитываемой точки все будет "путем"


A vot eti Cnew i ras4ityvajutsia ploxo iz za propus4ennyx barov, posmotri moj indokator, katorovo kod sdies' kinul.
 
A vot eti Cnew i ras4ityvajutsia ploxo iz za propus4ennyx barov, posmotri moj indokator, katorovo kod sdies' kinul.

почему же плохо, на мой взгляд элементарно
BC - известно, BC'=BC
AB'=AB(известно) + количество пропущенных баров (посчитать не сложно)
реальное отношение катетов = AB' / B'C'
AD'=AD + количество пропущенных баров (до новой точки)
D'C'new=B'C' * AD' / AB'
соответственно искомая DCnew = D'C'new
 
A vot eti Cnew i ras4ityvajutsia ploxo iz za propus4ennyx barov, posmotri moj indokator, katorovo kod sdies' kinul.

почему же плохо, на мой взгляд элементарно
BC - известно, BC'=BC
AB'=AB(известно) + количество пропущенных баров (посчитать не сложно)
реальное отношение катетов = AB' / B'C'
AD'=AD + количество пропущенных баров (до новой точки)
D'C'new=B'C' * AD' / AB'
соответственно искомая DCnew = D'C'new


Sam grafik OK, no pods4itat' eto - uze problema, tak kak cifra propus4ennyx barov izmeniajetsia posle to4ki AB. Prosto polu4ajetsia tak, 4to ot to4ki A do to4ki B - odno koli4estvo propus4ennyx barov, a posle to4ki B uze
drugoje koli4estvo, i my polu4ajem uklonenije na storonu.
 
no pods4itat' eto - uze problema, tak kak cifra propus4ennyx barov izmeniajetsia posle to4ki AB. Prosto polu4ajetsia tak, 4to ot to4ki A do to4ki B - odno koli4estvo propus4ennyx barov, a posle to4ki B uze
drugoje koli4estvo, i my polu4ajem uklonenije na storonu.

естесственно количество пропущенных баров может измениться(увеличиться), но их количество посчитать думаю не трудно:
нормализованное время точки A - нормализованное время точки B разделенное на значение т-ф и на 60 будет равно количеству баров (с учетом пропущенных)
тоже самое для второй точки
если хочешь исключить неторговое время, тогда нужно его определить и вычесть
 
no pods4itat' eto - uze problema, tak kak cifra propus4ennyx barov izmeniajetsia posle to4ki AB. Prosto polu4ajetsia tak, 4to ot to4ki A do to4ki B - odno koli4estvo propus4ennyx barov, a posle to4ki B uze
drugoje koli4estvo, i my polu4ajem uklonenije na storonu.

естесственно количество пропущенных баров может измениться(увеличиться), но их количество посчитать думаю не трудно:
нормализованное время точки A - нормализованное время точки B разделенное на значение т-ф и на 60 будет равно количеству баров (с учетом пропущенных)
тоже самое для второй точки
если хочешь исключить неторговое время, тогда нужно его определить и вычесть


Paprobuj modificirovat' etot moj indikator tak, 4toby na to4ke gde sxodit "Triangle End" i "Trend" vsegda ulozylsia i "TREND_LEVEL". Jiesli polu4itsia(v etom somnevajus'), eto mozet byt' kak "quickfix" dlia situaciji.