Podskazyte pozalsta formulu iz MT4 indikatora

 
Nuzna formula "Standart Deviation Channel" iz nabora standartnyx grafi4eskix objektax. Napishyte please :-)

Jiesli nislozno, bylo by xorosho uznat' formuly i drugix standartnyx grafi4eskix objektax.
 
Samo opisanije sdies' - "Канал Стандартных Отклонений"

A formuly netu....

Mozet kto v MQL4 napisat' kak custom indicator ili xot' formulu ras4itanija to4ek linij dat'? :-)
 
Формула простая, Ищем сумму [ Close[i]-Y(i) ]^2, где Y=A+B*i, и требуем чтобы эта сумма была минимальна , то есть диффиренцируем. Получаем систему из двух уравнений. Решаем ее и получаем коэффициенты А и В.
 
   int n=m_pos[1]-m_pos[0]+1;
//---- рассчитаем значения цен
   double value=close[m_pos[0]];
   double a,b;
   double sumy=value;
   double sumx=0.0;
   double sumxy=0.0;
   double sumx2=0.0;
   for(i=1; i<n; i++)
     {
      value=close[m_pos[0]+i];
      sumy+=value;
      sumxy+=value*i;
      sumx+=i;
      sumx2+=i*i;
     }
   b=(sumxy*n-sumx*sumy)/(sumx2*n-sumx*sumx);
   a=(sumy-sumx*b)/n;
   m_value[0]=a;
   m_value[1]=a+b*n;
//---- найдём максимальное отклонение
   double sma=sumy/n;
   double maxdev=0;
   double deviation=0;
   for(i=0; i<n; i++)
     {
      deviation=close[m_pos[0]+i]-sma;
      maxdev+=deviation*deviation;
     }
   deviation=maxdev/n;
   maxdev=sqrt(deviation)*m_scale/100.0;


где m_pos[0] и m_pos[1] - номера начального и конечного баров канала
m_value[0] и m_value[1] - соответствующие ценовые значения для средней линии канала
maxdev - половина ширины канала

ps все формулы взяты из открытых источников. так что, яндекс Вам в руки и вперёд

 
Spasibo.

Paproboval napisat' svoju versiju:

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

#property indicator_chart_window
#property indicator_buffers 0
//---- input parameters
extern int       PriceBars=350;
extern int       Shift;
extern bool      Comments=true;
//---- buffers
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
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); 
}


int init()
  {
//---- indicators
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//---- 
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int counter;
   double DevAvg=0;
   double DevPlus1=0;
   double DevMinus1=0;
   double DevPlus2=0;
   double DevMinus2=0;
   double DevAvg1=0;
   double DevAvg2=0;
   double PriceDiff;
   double HighLow;
   
   if (Bars < (PriceBars * 2 + Shift)) return(0);

   // Calculate mean price and Highest/Lowest price difference for entire period

   DevAvg=iMA(Symbol(),Period(),PriceBars+Shift,0,MODE_SMA,PRICE_MEDIAN,Shift);  
   HighLow=High [Highest (NULL,0,MODE_HIGH,PriceBars,Shift)] - Low [Lowest (NULL,0,MODE_HIGH,PriceBars,Shift)];

   // Calculate sum of squared deviations
   
   for (counter=(PriceBars + Shift);counter >=Shift;counter--)
   {
   //PriceDiff = (High[counter] + Low[counter] + Open[counter]) / 3;
   PriceDiff = (HighLow + Open[counter]) / 3;
   DevAvg+= MathPow((PriceDiff - DevAvg),2);   
   }
   
   // Calculate average deviation
   DevAvg = MathSqrt(DevAvg) / PriceBars; 
   
   // Calculate deviation channel +/- starting points
   DevPlus1 = (HighLow + Open[PriceBars + Shift]) / 3 + DevAvg;
   DevMinus1 = (HighLow + Open[PriceBars + Shift]) / 3 - DevAvg;  
  
   // Calculate deviation channel current +/- points
   DevPlus2 = (HighLow + Open[Shift]) / 3 + DevAvg;
   DevMinus2 = (HighLow + Open[Shift]) / 3 - DevAvg;

   // Calculate deviation channel starting/current average deviation prices
   DevAvg1 = (DevPlus1 + DevMinus1 + (HighLow + Open[PriceBars + Shift]) / 3) / 3;
   DevAvg2 = (DevPlus2 + DevMinus2 + (HighLow + Open[Shift]) / 3) / 3;
  
   if (Comments) Comment(Symbol()," DevAvg=",DevAvg," DevAvg1=",DevAvg1," DevAvg2=",DevAvg2," DevPlus1=",DevPlus1," DevMinus1=",DevMinus1," DevPlus2=",DevPlus2," DevMinus2=",DevMinus2);

   //Draw channel
   SetObject(Symbol()+"_StdDev+",OBJ_TREND,Time[PriceBars + Shift],DevPlus1,Time[Shift],DevPlus2,Blue,1,STYLE_SOLID);
   ObjectSetText(Symbol()+"_StdDev+","Standart Deviation Resistance", 8, "Arial", Green);
   SetObject(Symbol()+"_StdDev-",OBJ_TREND,Time[PriceBars + Shift],DevMinus1,Time[Shift],DevMinus2,Blue,1,STYLE_SOLID);
   ObjectSetText(Symbol()+"_StdDev-","Standart Deviation Support", 8, "Arial", Green);
   SetObject(Symbol()+"_StdDevAvg",OBJ_TREND,Time[PriceBars + Shift],DevAvg1,Time[Shift],DevAvg2,Red,1,STYLE_SOLID);
   ObjectSetText(Symbol()+"_StdDevAvg","Standart Deviation Average", 8, "Arial", Green);
   
//---- 
//----
   return(0);
  }
//+------------------------------------------------------------------+



Posle zapuska niponiatnyje 4isla vidny v komentarii - "1.INF", "1.IND" i t.d... 4to eto za..? :-)

Kompilirujetsia bez oshybok. Gde oshybka?

 
Я вообще не понял алгоритма (идею). А числа "1.INF", "1.IND" означают или слишком большие по модулю значения, или неопределнное значение типа 0/0 (я так думаю).
 
Ideja ot siuda:
http://www.stockcharts.com/education/IndicatorAnalysis/indic_standardDev.html

Ja tol'ko beru ni samuju cenu, a uklonenije ceny ot (High-Low) / 2

Paprobuite zapustit' na svajom MT4.
 
А числа "1.INF", "1.IND" означают или слишком большие по модулю значения, или неопределнное значение типа 0/0 (я так думаю).

да, именно так. это - переполнение порядка float (1.INF) и переполнение порядка double (1.IND). перед делением надо проверять делитель на 0
 
Ideja ot siuda:
http://www.stockcharts.com/education/IndicatorAnalysis/indic_standardDev.html

Ja tol'ko beru ni samuju cenu, a uklonenije ceny ot (High-Low) / 2

Paprobuite zapustit' na svajom MT4.


Мне честно говоря, времени жалко все проверять, я и так честно старался понять твой код, почти понял что в нем задумано, но нет желания копать и показывать где ошибка. Если бы сам привел комментарии , что типа здесь я делаю то-то, то есть описание идеи. А так, идей много в жизни, и проверить их все жизни не хватит. Так что извини.
 
Hi,

Nashol oshybki, popravil :-)

Etot idikator xorosho saidiot tem, kto zanimajutsia support/resist urovniami. Kokda cena probivajut support/resist granicy mojevo indikatora i xodit dalshe - imejem stabil'nyj trend... :-)

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

#property indicator_chart_window
#property indicator_buffers 0
//---- input parameters
extern int       PriceBars=350;
extern int       Shift;
extern bool      Comments=false;
//---- buffers
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
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); 
}


int init()
  {
//---- indicators
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//---- 
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int counter;
   double DevAvg=0;
   double DevPlus1=0;
   double DevMinus1=0;
   double DevPlus2=0;
   double DevMinus2=0;
   double DevAvg1=0;
   double DevAvg2=0;
   double PriceDiff;
   double deviance,Max,Min;
   
   if (Bars < (PriceBars * 2 + Shift)) return(0);

   // Calculate mean price and Highest/Lowest price difference for entire period

   deviance=iMA(Symbol(),Period(),PriceBars+Shift,0,MODE_SMA,PRICE_MEDIAN,Shift);
   Max=High [Highest (NULL,0,MODE_HIGH,PriceBars,Shift)];
   Min=Low [Lowest (NULL,0,MODE_HIGH,PriceBars,Shift)];
   DevAvg=MathPow((Max + Min + deviance) / 3,2);  

   // Calculate sum of squared deviations
   
   for (counter=(PriceBars + Shift);counter >=Shift;counter--)
   {
   PriceDiff = (Max + Min + Open[counter]) / 3;
   deviance+= MathPow((PriceDiff - DevAvg),2);   
   }
   
   // Calculate average deviation
   deviance = deviance / (PriceBars + 1);
   DevAvg = MathSqrt(deviance/Point) * Point; 
   //DevAvg = deviance;

   //if (IndicatorCounted() == 0) Print(Symbol()," Max=",Max," Min=",Min," deviance=",deviance);
   
   // Calculate deviation channel +/- starting points
   DevPlus1 = (Min+Max + Open[PriceBars + Shift]) / 3 + DevAvg;
   DevMinus1 = (Min+Max + Open[PriceBars + Shift]) / 3 - DevAvg;     
  
   // Calculate deviation channel current +/- points
   DevPlus2 = (Min+Max + Open[Shift]) / 3 + DevAvg;
   DevMinus2 = (Min+Max + Open[Shift]) / 3 - DevAvg;

   // Calculate deviation channel starting/current average deviation prices
   DevAvg1 = (DevPlus1 + DevMinus1 + (Max + Min + Open[PriceBars + Shift]) / 3) / 3;
   DevAvg2 = (DevPlus2 + DevMinus2 + (Max + Min + Open[Shift]) / 3) / 3;
  
   if (Comments) Comment(Symbol()," DevAvg=",DevAvg," DevAvg1=",DevAvg1," DevAvg2=",DevAvg2," DevPlus1=",DevPlus1," DevMinus1=",DevMinus1," DevPlus2=",DevPlus2," DevMinus2=",DevMinus2);

   //Draw channel
   SetObject(Symbol()+"_StdDev+",OBJ_TREND,Time[PriceBars + Shift],DevPlus1,Time[Shift],DevPlus2,Blue,1,STYLE_SOLID);
   ObjectSetText(Symbol()+"_StdDev+","Standart Deviation Resistance", 8, "Arial", Green);
   SetObject(Symbol()+"_StdDev-",OBJ_TREND,Time[PriceBars + Shift],DevMinus1,Time[Shift],DevMinus2,Blue,1,STYLE_SOLID);
   ObjectSetText(Symbol()+"_StdDev-","Standart Deviation Support", 8, "Arial", Green);
   SetObject(Symbol()+"_StdDevAvg",OBJ_TREND,Time[PriceBars + Shift],DevAvg1,Time[Shift],DevAvg2,Red,1,STYLE_SOLID);
   ObjectSetText(Symbol()+"_StdDevAvg","Standart Deviation Average", 8, "Arial", Green);
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
Причина обращения: