Индикаторы: Индикатор корреляции - страница 2

 
Вот, примерно так - https://www.mql5.com/ru/code/183. Суть в том, что копирование данных с других символов выполняется не всё сразу, а по одному бару, по времени. При таком копировании, с других символов, будет копироваться бар точно соответствующий времени бара графика, на котором индикатор отображается. Если соответствующего бара нет, то с более раннего бара (как функция iBarShift() в MQL4). В этом индикаторе по одному бару копируется, а для корреляции, может быть, надо будет копировать количество, соответствующее периоду корреляции. Можно по другому - копировать по одному бару и укладывать в индикаторный буфер. Используя буфер можно вообще все максимально быстро сделать (конечно за счет большего расхода памяти). Можно и без лишнего буфера это сделать, с парой статических переменных... Это долго объяснять, наверно статью надо писать:)
 
pusheax:

Ладно, вчера немного погорячились, наверно Вы тоже отмечали "День пограничника" как и я.

Не дадите ссылку на правильную синхронизацию баров,а то я тоже использую примерно такой способ синхронизации по последнему бару и все?

Ссылку не дам (тк ещё не встречал ни у кого), но метод опишу.

метод касается именно синхронизации разных инструментов, хотя может использоваться и для синхронизации запросто с разных ТФ.

Я занимался этой проблемой довольно долго, и даже в СД сделали багофикс по выявленным мной багам этого метода.

Проблема синхронизации связана с тем что на разных инструментах имеется разное количество баров. Примерно одинаково - это ложный критерий, всё должно быть точно. Бар в бар. Иначе теряется смысл синхронизации.

Второй аспект этой проблемы как отобразить бар если на текущем инструменте его нет?

Так вот суть метода проста: данные по инструменту запрашиваются строго по таймам...

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

а образец тайма берётся из стандартного буфера индикатора time[]. Таким образом вы всегда точно знаете что перед вами бар пришедший синхронно с баром на другом инструменте.

Опять же если такого бара в текущем инструменте нет, то вы не будуте его запрашивать. А если в запрашиваемом инструменте нет такого бара как образец то вы получите в count ноль и сможете нормально обработать это исключение, в зависимости от логики вашей программы.

 

Реализация синхронизации (на MQL4) для любого количества ФИ (отсюда):

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;
}

По аналогии для двух символов (отсюда):

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;
}
Т.е. все довольно просто. Другое дело, что классическое побаровое (постоянная временная дискретность) представление ценовых ВР не является единственным, тем более всегда правильным. Иногда крайне полезно синхронизировать ценовые ВР другого временного измерения. Т.е. внося нелинейные с точки зрения классического времени искажения. Соответственно, тогда и корреляция будет показывать нелинейные взаимосвязи двух классических цВР.
 

Спасибо за помощь!

Был не прав признаю, не думал, что так сложно происходит синхронизация.

Попробую разобраться и прямо на этом индикаторе синхронизовать бары так как он мне очень нужен.

 

Спасибо всем за информацию!

Немного переписал индикатор. Теперь, по идее, он должен пропускать плохие участки истории.

Раз уж начали, прошу проверить на наличие ошибок :) 

Файлы:
 
Выскажусь все же еще раз за необходимость для всех индикаторов алгоритмической оптимизации. А также за встроенный механизм расчета значений индикатора в память (файл), чтобы во время тестерной оптимизации индикатор не вычислял одно и то же, а брал уже готовые значения оттуда.
 
hrenfx:
Выскажусь все же еще раз за необходимость для всех индикаторов алгоритмической оптимизации. А также за встроенный механизм расчета значений индикатора в память (файл), чтобы во время тестерной оптимизации индикатор не вычислял одно и то же, а брал уже готовые значения оттуда.
Не могли бы Вы показать пример, где такое уже сделано?
 

Алгоритмическая оптимизация для каждого индикатора своя. Для разных способов использования корреляции делал, например, так и так.

Считывание же из памяти заранее рассчитанных на всей истории значений индикаторов проделывал лишь только в своей считалке. Т.е. универсального механизма у меня нет, т.к. использую лишь свои решения, собранные совсем не красиво. Но т.к. ратую за улучшение всего и вся, было бы здорово иметь подобный универсальный механизм на случай оптимизатора тестера MT5, т.к. это дает ускорение на несколько порядков (опыт использования в своей считалке), т.е. затмевает Cloud по эффективности.

 

Приветик

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

На этот раз я попытался бы исказить этот замечательный индикатор, и пытались сделать что-то вроде этого:

- Рисование просто линия, а не пунктирной заговор



#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

 

- Чтобы добавить много символов, таких как

//--- input parametres
input string _SecondSymbol="EURGBP"; // Symbol

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

 

 Затем, чтобы создать 2 варианта исходного кода:

- Визуальный вариант: цветной линии для каждого из валютных пар корреляции 1 толстой линией, которая является просто среднее из 7 линий ((A+B+C+D+E+F+G)/7)

- Без визуального вариант: всего 1 строку, то есть в результате приведенной выше формуле ((A+B+C+D+E+F+G)/7)

Практически все равно, что добавить 7 (или 8) оригинал Индикатор корреляции, но все суммируется таким образом, чтобы просто средние, как с версией, одна из которых 7 строк + 1 (в среднем), и другая версия с 1 линия (только в среднем).

 

что-то вроде этого: 

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; // simple average of values.


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

 

По ряду причин искаженного кода не делать то, что я хочу сделать, потому что полностью логических ошибок.

Основная проблема заключается в буферы, синхронизации и рекурсивной отступ часть кода:

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

   

 + а также другие логические ошибки.

некоторые Print() функции были добавлены, чтобы помочь в деле отслеживания значений переменных и return 0 инструкции были прокомментировал для того, чтобы найти, где код логически не получается.

 

код и файл

//+------------------------------------------------------------------+
//| Correlation.mq5 |
//| Copyright 2012, iC |
//| http://www.icreator.biz/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2012, iC"
#property link "http://www.icreator.biz/"
#property version "1.00"
//--- indicator settings
#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

*/

//--- defines
#define MAX_COL 64
//--- structures
struct CRGB
{
int r;
int g;
int b;
};
//--- input parametres
input string _SecondSymbol="EURGBP"; // Symbol

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

input int _SettPeriod=100; // Period
input ENUM_APPLIED_PRICE _AppliedPrice=PRICE_CLOSE; // Price
input color _Color1=clrLightGray; // Min correlation
input color _Color2=clrLime; // Max correlation

//--- indicator buffers
double buf[],buf2[]
,buf3[],buf4[],buf5[],buf6[],buf7[],buf8[];

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

double colors1[],colors2[];

//--- MA handles
int h1,h2,
h3,h4,h5,h6,h7,h8;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
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); // first symbol
SetIndexBuffer(5,arr2,INDICATOR_CALCULATIONS); // second symbol


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

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

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

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

/* 
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,colors3,INDICATOR_COLOR_INDEX);

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

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

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

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

// etc...
*/

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)+","); // etc...

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);

// added values.
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;
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
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];
//--- synchronization symbols
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;
}
//--- check for data

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);

// indent the if each others until the minBars is find. // to check out if logic is correct

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;
} 

//--- we can copy not all data
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; // simple average of values.


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

//+------------------------------------------------------------------+
//| setPlotColor |
//+------------------------------------------------------------------+
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);
}
//+------------------------------------------------------------------+

 

Файлы:
Причина обращения: