Göstergeler: Korelasyon göstergesi - sayfa 2

 
İşte, yaklaşık olarak böyle - https://www.mql5.com/tr/code/183. Mesele şu ki, diğer sembollerden veri kopyalama işlemi bir kerede değil, her seferinde bir çubuk gerçekleştirilir. Bu tür kopyalama sırasında, diğer sembollerden, çubuk, göstergenin görüntülendiği grafik çubuğunun zamanına tam olarak karşılık gelecek şekilde kopyalanacaktır. Karşılık gelen bir çubuk yoksa, daha önceki bir çubuktan (MQL4'teki iBarShift() işlevi gibi). Bu göstergede her seferinde bir çubuk kopyalanır, ancak korelasyon için korelasyon dönemine karşılık gelen sayının kopyalanması gerekebilir. Bunu farklı şekilde yapabilirsiniz - her seferinde bir çubuk kopyalayın ve gösterge arabelleğine koyun. Tamponu kullanarak her şeyi olabildiğince hızlı yapabilirsiniz (elbette daha fazla bellek tüketimi pahasına). Bunu ekstra bir tampon olmadan, birkaç statik değişkenle yapabilirsiniz.... Açıklaması uzun, muhtemelen bir makale yazmak gerekir:)
 
pusheax:

Tamam, dün biraz fazla heyecanlandık, sanırım siz de benim gibi "Sınır Muhafızları Günü "nü kutladınız.

Bana çubukların doğru senkronizasyonu için bir link verebilir misiniz, çünkü ben de bu son çubukla senkronizasyon yöntemini kullanıyorum ve hepsi bu?

Size bir bağlantı vermeyeceğim (çünkü henüz tanışmadım), ancak yöntemi tarif edeceğim.

Yöntem farklı enstrümanların senkronizasyonu ile ilgilidir, ancak farklı TF'lerin senkronizasyonu için de kullanılabilir.

Bu sorunla uzun süredir uğraşıyorum ve hatta SD bu yöntemin tespit ettiğim hataları üzerinde bir hata düzeltmesi yaptı.

Senkronizasyon sorunu, farklı enstrümanların farklı sayıda çubuğa sahip olmasıyla ilgilidir. Yaklaşık olarak aynı olması yanlış bir kriterdir, her şey tam olmalıdır. Çubuktan çubuğa. Aksi takdirde senkronizasyonun anlamı kaybolur.

Bu sorunun ikinci yönü, mevcut enstrümanda çubuk yoksa bir çubuğun nasıl görüntüleneceğidir?

Yani yöntemin özü basittir: enstrümandaki veriler kesinlikle zamanlara göre talep edilir ...

count=CopyRates(symbol,tf,time0,time1,rates); если нужно несколько баров
или
count=CopyRates(symbol,tf,time0,1,rates); если нужен один

ve zaman örneği time[] göstergesinin standart tamponundan alınır. Böylece, başka bir enstrümandaki bir çubukla eşzamanlı olarak gelen bir çubukla karşı karşıya olduğunuzdan her zaman emin olursunuz.

Yine, mevcut enstrümanda böyle bir çubuk yoksa, bunu talep etmeyeceksiniz. Ve talep edilen enstrümanda örnek olarak böyle bir çubuk yoksa, sayımda bir sıfır alırsınız ve programınızın mantığına bağlı olarak normalde bu istisnayı işleyebilirsiniz.

 

Herhangi bir sayıda FI için senkronizasyon uygulaması (MQL4'te)(buradan):

double GetPrice( string Symb, int time )
{
  double Price;
 
  Price = iClose(Symb, Period(), iBarShift(Symb, Period(), time));
 
  return(Price);
}
 
int GetNextTime( int CurrTime )
{
  static int Pos[MAX_AMOUNTSYMBOLS];
  int i, MinTime, Tmp = -1;
 
  for (i = 0; i < AmountSymbols; i++)
  {
    Pos[i] = iBarShift(Symbols[i], Period(), CurrTime) - 1;
 
    if (Pos[i] >= 0)
      Tmp = i;
  }
 
  if (Tmp < 0)
    return(Time[0]);
 
  MinTime = iTime(Symbols[Tmp], Period(), Pos[Tmp]);
 
  i = Tmp - 1;
 
  while (i >= 0)
  {
    if (Pos[i] >= 0)
    {
      Tmp = iTime(Symbols[i], Period(), Pos[i]);
 
      if (Tmp < MinTime)
        MinTime = Tmp;
    }
 
    i--;
  }
 
  return(MinTime);
}
 
void GetBaseMatrix()
{
  int i, NextTime;
 
  NextTime = GetNextTime(CurrTime);
 
  while (NextTime < Time[0])
  {
    CurrTime = NextTime;
 
    for (i = 0; i < AmountSymbols; i++)
      BaseMatrix[i][MatrixRows] = 1000 * MathLog(GetPrice(Symbols[i], CurrTime));
 
    Times[MatrixRows] = CurrTime;
 
    MatrixRows++;
 
    NextTime = GetNextTime(CurrTime);
  }
 
  return;
}

İki sembol için analoji ile(buradan):

double GetPrice( string Symb, int time )
{
  double Price;
 
  Price = iClose(Symb, Period(), iBarShift(Symb, Period(), time));
 
  return(Price);
}
 
int GetNextTime( int CurrTime )
{
  static int Pos[TWO_SYMBOLS];
  int i, MinTime, Tmp = -1;
 
  for (i = 0; i < TWO_SYMBOLS; i++)
  {
    Pos[i] = iBarShift(Symbols[i], Period(), CurrTime) - 1;
 
    if (Pos[i] >= 0)
      Tmp = i;
  }
 
  if (Tmp < 0)
    return(Time[0]);
 
  MinTime = iTime(Symbols[Tmp], Period(), Pos[Tmp]);
 
  i = Tmp - 1;
 
  while (i >= 0)
  {
    if (Pos[i] >= 0)
    {
      Tmp = iTime(Symbols[i], Period(), Pos[i]);
 
      if (Tmp < MinTime)
        MinTime = Tmp;
    }
 
    i--;
  }
 
  return(MinTime);
}
 
void GetBaseMatrix()
{
  int i, NextTime;
 
  NextTime = GetNextTime(CurrTime);
 
  while (NextTime < Time[0])
  {
    CurrTime = NextTime;
 
    for (i = 0; i < TWO_SYMBOLS; i++)
      BaseMatrix[i][MatrixRows + Shifts[i]] = MathLog(GetPrice(Symbols[i], CurrTime));
 
    Times[MatrixRows] = CurrTime;
 
    MatrixRows++;
 
    NextTime = GetNextTime(CurrTime);
  }
 
  return;
}
Yani her şey oldukça basittir. Başka bir şey de, fiyat BP'lerinin klasik barometrik (sabit zamanlı ayrıklaştırma) gösteriminin tek olmadığı, hatta her zaman doğru olmadığıdır. Bazen başka bir zaman boyutundaki fiyat BP'lerini senkronize etmek son derece yararlıdır. Yani, klasik zaman açısından doğrusal olmayan bozulmalar ortaya koyarak. Buna bağlı olarak, korelasyon iki klasik VR'nin doğrusal olmayan karşılıklı ilişkilerini gösterecektir.
 

Yardımlarınız için teşekkürler!

Hatalıydım, itiraf ediyorum, senkronizasyonun bu kadar karmaşık olduğunu düşünmemiştim.

Bunu anlamaya çalışacağım ve çubukları doğrudan bu gösterge üzerinde senkronize edeceğim çünkü buna çok ihtiyacım var.

 

Bilgi için hepinize teşekkür ederim!

Göstergeyi biraz yeniden yazdım. Şimdi, sözde, tarihin kötü kısımlarını atlaması gerekiyor.

Başladığımızdan beri, lütfen hataları kontrol edin :)

Dosyalar:
 
Tüm göstergeler için algoritmik optimizasyonun gerekliliği konusunda bir kez daha konuşacağım. Ve ayrıca gösterge değerlerini bellekte (dosya) hesaplamanın yerleşik mekanizması için, böylece test cihazı optimizasyonu sırasında gösterge aynı şeyi hesaplamaz, ancak oradan hazır değerleri alır.
 
hrenfx:
Tüm göstergeler için algoritmik optimizasyonun gerekliliği konusunda bir kez daha konuşacağım. Ve ayrıca gösterge değerlerini bellekte (dosya) hesaplamak için yerleşik bir mekanizma için, böylece test cihazı optimizasyonu sırasında gösterge aynı şeyi hesaplamaz, ancak oradan hazır değerleri alır.
Bunun zaten yapıldığı bir örnek gösterebilir misiniz?
 

Her gösterge için algoritmik optimizasyon farklıdır. Korelasyonu kullanmanın farklı yolları için, örneğin bunu ve bunu yaptım.

Tüm geçmiş için önceden hesaplanan göstergelerin değerlerini hafızadan okumak sadece hesap makinemde yapıldı. Yani, evrensel bir mekanizmam yok, çünkü sadece kendi çözümlerimi kullanıyorum, ki bunlar hiç de güzel değil. Ancak her şeyin iyileştirilmesinden yana olduğum için, MT5 test cihazının optimize edicisi durumunda böyle evrensel bir mekanizmaya sahip olmak harika olurdu, çünkü birkaç büyüklük sırasına göre hızlanma sağlıyor (hesap makinemde kullanma deneyimi), yani verimlilik açısından Cloud'u gölgede bırakıyor.

 

Merhabalar

Bazen başkalarının kodlarını bozmak için zaman harcıyorum, genellikle eksik veya tamamlanmamış bir programın sonuçları, hem zaman eksikliği hem de beceri eksikliği.

Bu sefer bu harika göstergeyi bozmaya çalışacaktım ve şöyle bir şey yapmaya çalıştım:

- Noktalı bir çizim çizgisi değil, sadece bir çizgi çizmek



#property indicator_type1 DRAW_COLOR_LINE
#property indicator_width1 2

// #property indicator_type2 DRAW_COLOR_HISTOGRAM
// #property indicator_style2 STYLE_DOT
// #property indicator_width2 1

- Gibi birçok sembol eklemek için

//--- giriş parametreleri
input string _SecondSymbol="EURGBP"; // Sembol

input string _ThirdSymbol="EURAUD"; // Sembol
input string _FourthSymbol="EURCAD"; // Sembol
input string _FifthSymbol="EURCHF"; // Sembol
input string _SixthSymbol="EURNZD"; // Sembol
input string _SeventhSymbol="EURHKD"; // Sembol
input string _EighthSymbol="EURTRY"; // Sembol

Ardından kaynak kodun 2 varyantını oluşturmak için:

- Görsel varyant: döviz çiftlerinin her biri için renkli bir çizgi korelasyon Sadece 7 çizginin ortalaması olan 1 kalın çizgi ((A+B+C+D+E+F+G)/7)

- Görsel varyant yok: Sadece 1 satır, yukarıdaki formülün sonucudur ((A+B+C+D+E+F+G)/7)

Neredeyse 7 (veya 8) orijinal Korelasyon Göstergesi eklemek gibi, ancak hepsi toplanır, böylece biri 7 satır + 1 (ortalama) ve diğer versiyon 1 satır (sadece ortalama) olan versiyonda olduğu gibi ortalamalar alınır.

Bunun gibi bir şey:

buf[i]= (
(v1/sqrt(v2*v3))+
(v4/sqrt(v2*v6))+
(v7/sqrt(v2*v9))+
(v10/sqrt(v2*v12))+
(v13/sqrt(v2*v15))+
(v16/sqrt(v2*v18))+
(v19/sqrt(v2*v21)) 
)/7; // değerlerin basit ortalaması.


buf2[i]=buf[i];
c=getPlotColor(buf[i]);
colors1[i]=c;
colors2[i]=c;

Bir dizi nedenden dolayı, tamamen mantıksal hatalar nedeniyle bozuk kod yapmak istediğim şeyi yapmıyor.

Ana sorun, kodun arabellekler, senkronizasyon ve özyinelemeli girinti kısmı ile ilgilidir:

if(bars1>bars2)
{
minBars=bars2;
bars2=bars1-bars2;
etc...

+ ve diğer mantıksal hatalar.

değişken değerlerinin izlenmesi durumunda yardımcı olması için bazı Print() fonksiyonları eklenmiş ve kodun mantıksal olarak nerede başarısız olduğunu bulmak için return 0 talimatları yorumlanmıştır.

 

kod ve dosya

//+------------------------------------------------------------------+
//| Korelasyon.mq5 |
//| Telif Hakkı 2012, iC |
//| http://www.icreator.biz/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2012, iC"
#property link "http://www.icreator.biz/"
#property version "1.00"
//--- gösterge ayarları
#property indicator_separate_window

#property indicator_minimum -1
#property indicator_maximum 1

#property indicator_buffers 25
#property indicator_plots 2

#property indicator_type1 DRAW_COLOR_LINE
#property indicator_width1 2

// #property indicator_type2 DRAW_COLOR_HISTOGRAM
// #property indicator_style2 STYLE_DOT
// #property indicator_width2 1

/*

#property indicator_type2 DRAW_COLOR_LINE
#property indicator_width2 2

#property indicator_type3 DRAW_COLOR_LINE
#property indicator_width3 2

#property indicator_type4 DRAW_COLOR_LINE
#property indicator_width4 2

#property indicator_type5 DRAW_COLOR_LINE
#property indicator_width5 2

#property indicator_type6 DRAW_COLOR_LINE
#property indicator_width6 2

#property indicator_type7 DRAW_COLOR_LINE
#property indicator_width7 2

#property indicator_type8 DRAW_COLOR_LINE
#property indicator_width8 2

*/

//--- tanımlar
#define MAX_COL 64
//--- yapılar
struct CRGB
{
int r;
int g;
int b;
};
//--- giriş parametreleri
input string _SecondSymbol="EURGBP"; // Sembol

input string _ThirdSymbol="EURAUD"; // Sembol
input string _FourthSymbol="EURCAD"; // Sembol
input string _FifthSymbol="EURCHF"; // Sembol
input string _SixthSymbol="EURNZD"; // Sembol
input string _SeventhSymbol="EURHKD"; // Sembol
input string _EighthSymbol="EURTRY"; // Sembol

input int _SettPeriod=100; // Dönem
input ENUM_APPLIED_PRICE _AppliedPrice=PRICE_CLOSE; // Fiyat
input color _Color1=clrLightGray; // Min korelasyon.
input color _Color2=clrLime; // Maksimum korelasyon.

//--- gösterge tamponları
double buf[],buf2[]
,buf3[],buf4[],buf5[],buf6[],buf7[],buf8[];

double arr1[],arr2[]
,arr3[],arr4[],arr5[],arr6[],arr7[],arr8[];

double colors1[],colors2[];

//--- MA kolları
int h1,h2,
h3,h4,h5,h6,h7,h8;
//+------------------------------------------------------------------+
//| Özel gösterge başlatma işlevi |
//+------------------------------------------------------------------+
int OnInit()
{
SetIndexBuffer(0,buf);
SetIndexBuffer(1,colors1,INDICATOR_COLOR_INDEX);

SetIndexBuffer(2,buf2);
SetIndexBuffer(3,colors2,INDICATOR_COLOR_INDEX);

SetIndexBuffer(4,arr1,INDICATOR_CALCULATIONS); // ilk sembol
SetIndexBuffer(5,arr2,INDICATOR_CALCULATIONS); // ikinci sembol


SetIndexBuffer(6,arr3,INDICATOR_CALCULATIONS); //3.
SetIndexBuffer(7,arr4,INDICATOR_CALCULATIONS); //4.

SetIndexBuffer(8,arr5,INDICATOR_CALCULATIONS); //5.
SetIndexBuffer(9,arr6,INDICATOR_CALCULATIONS); //6.

SetIndexBuffer(10,arr7,INDICATOR_CALCULATIONS); //7.

SetIndexBuffer(11,arr8,INDICATOR_CALCULATIONS); //8.

/* 
SetIndexBuffer(12,arr9,INDICATOR_CALCULATIONS);
SetIndexBuffer(13,arr10,INDICATOR_CALCULATIONS);

SetIndexBuffer(14,arr11,INDICATOR_CALCULATIONS);
SetIndexBuffer(15,arr12,INDICATOR_CALCULATIONS);

SetIndexBuffer(16,buf3);
SetIndexBuffer(17,colours3,INDICATOR_COLOR_INDEX);

SetIndexBuffer(18,buf4);
SetIndexBuffer(19,colours4,INDICATOR_COLOR_INDEX);

SetIndexBuffer(20,buf5);
SetIndexBuffer(21,colours5,INDICATOR_COLOR_INDEX);

SetIndexBuffer(22,buf6);
SetIndexBuffer(23,colours6,INDICATOR_COLOR_INDEX);

SetIndexBuffer(24,buf7);
SetIndexBuffer(25,colours7,INDICATOR_COLOR_INDEX);

// vb..
*/

PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);
PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,0);

PlotIndexSetInteger(0,PLOT_SHOW_DATA,0);
IndicatorSetInteger(INDICATOR_DIGITS,3); 

IndicatorSetString(INDICATOR_SHORTNAME,_Symbol+"/"+_SecondSymbol+", "+IntegerToString(_SettPeriod)+", "+EnumToString(_AppliedPrice)+","); // vb...

setPlotColor(0,_Color1,_Color2);
setPlotColor(1,_Color1,_Color2);

h1=iMA(_Symbol,0,1,0,MODE_EMA,_AppliedPrice);
h2=iMA(_SecondSymbol,0,1,0,MODE_EMA,_AppliedPrice);

// eklenen değerler.
h3=iMA(_ThirdSymbol,0,1,0,MODE_EMA,_AppliedPrice);
h4=iMA(_FourthSymbol,0,1,0,MODE_EMA,_AppliedPrice);
h5=iMA(_FifthSymbol,0,1,0,MODE_EMA,_AppliedPrice);
h6=iMA(_SixthSymbol,0,1,0,MODE_EMA,_AppliedPrice);
h7=iMA(_SeventhSymbol,0,1,0,MODE_EMA,_AppliedPrice);
h8=iMA(_EighthSymbol,0,1,0,MODE_EMA,_AppliedPrice);

return 0;
}
//+------------------------------------------------------------------+
//| Özel gösterge yineleme işlevi |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const int begin,
const double &price[])
{
int i,j,c,limit,bars1,bars2
,bars3,bars4,bars5,bars6,bars7,bars8, 
minBars,toCopy;
double averX1=0,averX2=0
,averX3=0,averX4=0,averX5=0,averX6=0,averX7=0,averX8=0,
v1=0,v2=0,v3=0
,v4=0,v5=0,v6=0,v7=0,v8=0
,v9=0,v10=0,v11=0,v12=0
,v13=0,v14=0,v15=0,v16=0,v17=0
,v18=0,v19=0,v20=0,v21=0;
datetime t1[1],t2[1],
t3[1],t4[1],t5[1],t6[1],t7[1],t8[1];
//--- senkronizasyon sembolleri
if( 
(
CopyTime(_Symbol,0,0,1,t1)<1 || 
CopyTime(_SecondSymbol,0,0,1,t2)<1 || 

CopyTime(_ThirdSymbol,0,0,1,t3)<1 || 
CopyTime(_FourthSymbol,0,0,1,t4)<1 || 
CopyTime(_FifthSymbol,0,0,1,t5)<1 || 
CopyTime(_SixthSymbol,0,0,1,t6)<1 || 
CopyTime(_SeventhSymbol,0,0,1,t7)<1 || 
CopyTime(_EighthSymbol,0,0,1,t8)<1
) 
|| 

(
t1[0]!=t2[0]
|| t1[0]!=t3[0]
|| t1[0]!=t4[0]
|| t1[0]!=t5[0]
|| t1[0]!=t6[0]
|| t1[0]!=t7[0]
|| t1[0]!=t8[0]
)
) 
{
Print("Synchronization failed!");
// return 0;
}
//--- veri olup olmadığını kontrol edin

bars1=rates_total;
bars2=Bars(_SecondSymbol,0);

bars3=Bars(_ThirdSymbol,0);
bars4=Bars(_FourthSymbol,0);
bars5=Bars(_FifthSymbol,0);
bars6=Bars(_SixthSymbol,0);
bars7=Bars(_SeventhSymbol,0);
bars8=Bars(_EighthSymbol,0);

// minBars bulunana kadar if'leri birbirlerine girintileyin. // mantığın doğru olup olmadığını kontrol etmek için

if(bars1>bars2)
{
minBars=bars2;
bars2=bars1-bars2;
bars1=0;
Print("bars1>bars2; minBars(",minBars,"),=bars2(",bars2,")=bars1(",bars1,")-bars2(",bars2,");");
// }
//else 
if(bars1>bars3)
{
minBars=bars3;
bars3=bars1-bars3;
bars1=0;
Print("bars1>bars3; minBars(",minBars,"),=bars3(",bars3,")=bars1(",bars1,")-bars3(",bars3,");");
// } 
//else 
if(bars1>bars4)
{
minBars=bars4;
bars4=bars1-bars4;
bars1=0;
Print("bars1>bars4; minBars(",minBars,"),=bars4(",bars4,")=bars1(",bars1,")-bars4(",bars4,");");
// } 
//else 
if(bars1>bars5)
{
minBars=bars5;
bars5=bars1-bars5;
bars1=0;
Print("bars1>bars5; minBars(",minBars,"),=bars5(",bars5,")=bars1(",bars1,")-bars5(",bars5,");");
// } 
//else 
if(bars1>bars6)
{
minBars=bars6;
bars6=bars1-bars6;
bars1=0;
Print("bars1>bars6; minBars(",minBars,"),=bars6(",bars6,")=bars1(",bars1,")-bars6(",bars6,");");
// } 
//else 
if(bars1>bars7)
{
minBars=bars7;
bars7=bars1-bars7;
bars1=0;
Print("bars1>bars7; minBars(",minBars,"),=bars7(",bars7,")=bars1(",bars1,")-bars7(",bars7,");");
// } 
//else 
if(bars1>bars8)
{
minBars=bars8;
bars8=bars1-bars8;
bars1=0;
Print("bars1>bars8; minBars(",minBars,"),=bars8(",bars8,")=bars1(",bars1,")-bars8(",bars8,");");
} }}}}}} 

else
{
minBars=bars1;
bars1=bars2-bars1;
bars2=0;
Print("bars1!>bars2,3,4,5,6,7,8; minBars(",minBars,"),=bars1(",bars1,")=bars2(",bars2,")-bars1(",bars1,");");
}
if(minBars<_SettPeriod)
{
Print("Bars is not enough to calculate!");
// return 0;
}
if(BarsCalculated(h1)<minBars)
{
Print("Not all data of MA1 is calculated. Error ",GetLastError());
// return 0;
}
if(BarsCalculated(h2)<minBars)
{
Print("Not all data of MA2 is calculated. Error ",GetLastError());
// return 0;
}
if(BarsCalculated(h3)<minBars)
{
Print("Not all data of MA3 is calculated. Error ",GetLastError());
// return 0;
}
if(BarsCalculated(h4)<minBars)
{
Print("Not all data of MA4 is calculated. Error ",GetLastError());
// return 0;
}
if(BarsCalculated(h5)<minBars)
{
Print("Not all data of MA5 is calculated. Error ",GetLastError());
// return 0;
}
if(BarsCalculated(h6)<minBars)
{
Print("Not all data of MA6 is calculated. Error ",GetLastError());
// return 0;
}
if(BarsCalculated(h7)<minBars)
{
Print("Not all data of MA7 is calculated. Error ",GetLastError());
// return 0;
}
if(BarsCalculated(h8)<minBars)
{
Print("Not all data of MA8 is calculated. Error ",GetLastError());
// return 0;
} 

//--- tüm verileri kopyalayamayız
if(prev_calculated>rates_total || 
prev_calculated<=0)
toCopy=minBars;
else
toCopy=rates_total-prev_calculated+1;

if(CopyBuffer(h1,0,0,minBars,arr1)<minBars || 
CopyBuffer(h2,0,0,minBars,arr2)<minBars || 

CopyBuffer(h3,0,0,minBars,arr3)<minBars || 
CopyBuffer(h4,0,0,minBars,arr4)<minBars || 
CopyBuffer(h5,0,0,minBars,arr5)<minBars || 
CopyBuffer(h6,0,0,minBars,arr6)<minBars || 
CopyBuffer(h7,0,0,minBars,arr7)<minBars || 
CopyBuffer(h8,0,0,minBars,arr8)<minBars) 

{
Print("Getting MA buffer failed. Error ",GetLastError());
// return 0;
}
if(prev_calculated>rates_total || 
prev_calculated<=0)
limit=bars1+bars2+_SettPeriod-1
+bars3+bars4+bars5+bars6+bars7+bars8;

else
limit=prev_calculated-1;
//--- 
for(i=limit;i<rates_total;i++)
{
averX1=0; averX2=0; 
averX3=0;averX4=0;averX5=0;averX6=0;averX7=0;averX8=0;
for(j=0;j<_SettPeriod;j++)
{
averX1+=arr1[i-j-bars1]/_SettPeriod;
averX2+=arr2[i-j-bars2]/_SettPeriod;

averX3+=arr3[i-j-bars3]/_SettPeriod;
averX4+=arr4[i-j-bars4]/_SettPeriod;
averX5+=arr5[i-j-bars5]/_SettPeriod;
averX6+=arr6[i-j-bars6]/_SettPeriod;
averX7+=arr7[i-j-bars7]/_SettPeriod;
averX8+=arr8[i-j-bars8]/_SettPeriod;
}

v1=0; v2=0; v3=0;
v4=0;v5=0;v6=0;v7=0;v8=0;
v9=0;v10=0;v11=0;v12=0;v13=0;
v14=0;v15=0;v16=0;v17=0;v18=0;
v19=0;v20=0;v21=0; 
for(j=0;j<_SettPeriod;j++)
{
v1+=(arr1[i-j-bars1]-averX1)*(arr2[i-j-bars2]-averX2);
v2+=pow((arr1[i-j-bars1]-averX1),2);
v3+=pow((arr2[i-j-bars2]-averX2),2);

v4+=(arr1[i-j-bars1]-averX2)*(arr3[i-j-bars3]-averX3);
// v5+=pow((arr1[i-j-bars1]-averX1),2);
v6+=pow((arr3[i-j-bars3]-averX3),2);

v7+=(arr1[i-j-bars1]-averX1)*(arr4[i-j-bars4]-averX4);
// v8+=pow((arr1[i-j-bars1]-averX1),2);
v9+=pow((arr4[i-j-bars4]-averX4),2);

v10+=(arr1[i-j-bars1]-averX1)*(arr5[i-j-bars5]-averX5);
// v11+=pow((arr1[i-j-bars1]-averX1),2);
v12+=pow((arr5[i-j-bars5]-averX5),2);

v13+=(arr1[i-j-bars1]-averX1)*(arr6[i-j-bars6]-averX6);
// v14+=pow((arr1[i-j-bars1]-averX1),2);
v15+=pow((arr6[i-j-bars6]-averX6),2);

v16+=(arr1[i-j-bars1]-averX1)*(arr7[i-j-bars7]-averX7);
// v17+=pow((arr1[i-j-bars1]-averX1),2);
v18+=pow((arr7[i-j-bars7]-averX7),2);

v19+=(arr1[i-j-bars1]-averX1)*(arr8[i-j-bars8]-averX8);
// v20+=pow((arr1[i-j-bars1]-averX1),2);
v21+=pow((arr8[i-j-bars8]-averX8),2);

}
buf[i]= (
(v1/sqrt(v2*v3))+
(v4/sqrt(v2*v6))+
(v7/sqrt(v2*v9))+
(v10/sqrt(v2*v12))+
(v13/sqrt(v2*v15))+
(v16/sqrt(v2*v18))+
(v19/sqrt(v2*v21)) 
)/7; // değerlerin basit ortalaması.


buf2[i]=buf[i];
c=getPlotColor(buf[i]);
colors1[i]=c;
colors2[i]=c;
}
return rates_total;
}

//+------------------------------------------------------------------+
//| setPlotColour |
//+------------------------------------------------------------------+
void setPlotColor(int plot,color col1,color col2)
{
int i;
CRGB c1,c2;
double dr,dg,db;
string s;
//--- 
PlotIndexSetInteger(plot,PLOT_COLOR_INDEXES,MAX_COL);
ColorToRGB(col1,c1);
ColorToRGB(col2,c2);
dr=(double)(c2.r-c1.r)/MAX_COL;
dg=(double)(c2.g-c1.g)/MAX_COL;
db=(double)(c2.b-c1.b)/MAX_COL;
for(i=0;i<MAX_COL;i++)
{
s=StringFormat("%i,%i,%i",
c1.r+(int)NormalizeDouble(dr*(i+1),0),
c1.g+(int)NormalizeDouble(dg*(i+1),0),
c1.b+(int)NormalizeDouble(db*(i+1),0));
PlotIndexSetInteger(plot,PLOT_LINE_COLOR,i,StringToColor(s));
}
}
//+------------------------------------------------------------------+
//| getPlotColor |
//+------------------------------------------------------------------+
int getPlotColor(double current)
{
return((int)NormalizeDouble((MAX_COL-1)*fabs(current),0));
}
//+------------------------------------------------------------------+
//| ColorToRGB |
//+------------------------------------------------------------------+
void ColorToRGB(color col,CRGB &res)
{
string s,s2;
int n;
//---
s=ColorToString(col);
n=StringFind(s,",");
s2=StringSubstr(s,0,n);
res.r=(int)StringToInteger(s2);
s=StringSubstr(s,n+1);
n=StringFind(s,",");
s2=StringSubstr(s,0,n);
res.g=(int)StringToInteger(s2);
s=StringSubstr(s,n+1);
s2=StringSubstr(s,0);
res.b=(int)StringToInteger(s2);
}
//+------------------------------------------------------------------+
Dosyalar: