インディケータ: ピアソン相関指標 - ページ 2

 
ここでは、おおよそ次のようになる -https://www.mql5.com/ja/code/183。 ポイントは、他のシンボルからのデータコピーは一度に行われるのではなく、1バーずつ行われることです。他のシンボルからのコピーでは、インジケータが表示されているチャートのバーの時間に正確に対応するバーがコピーされます。対応するバーがない場合は、それ以前のバーからコピーされます(MQL4のiBarShift()関数のようなものです)。このインディケータでは、一度に1つのバーがコピーされますが、相関のために、相関期間に対応する数をコピーする必要があるかもしれません。一度に1つのバーをコピーし、それをインジケーターバッファーに入れます。バッファを使用することで、すべてを可能な限り高速に行うことができます(もちろん、より多くのメモリを消費します)。余分なバッファを使わなくても、静的変数を2つほど使えばできます。説明すると長くなるので、おそらく記事を書く必要があるでしょう:)
 
pusheax:

さて、昨日は少し興奮しすぎましたね。あなたも私と同じように「国境警備隊の日」を祝ったのでしょう。

小節の正しい同期のリンクを教えてくれませんか?私もこの最後の小節で同期する方法を使っているのですが、それだけなんです。

リンクは教えませんが(まだ出会っていないので)、その方法を説明します。

この方法は、異なるTFの同期にも使えますが、異なる楽器の同期に関するものです。

私はかなり長い間この問題に取り組んできたし、SDも私が特定したこの方法のバグをバグフィックスした。

同期の問題は、商品によってバーの数が 異なるという事実に関連しています。ほぼ同じというのは誤った基準で、すべてが正確でなければなりません。バーとバーの間です。そうでなければ、同期の意味が失われる。

この問題の第二の側面は、現在の楽器にバーがない場合、どのようにバーを表示するかということです。

つまり、この方法の本質は単純である。

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

時間のサンプルは、インジケータtime[]の標準バッファから取得されます。従って、他のインストゥルメントのバーと同期したバーがあることを常に確実に知ることができます。

繰り返しになりますが、現在の計器にそのようなバーがない場合、そのバーは要求されません。また、要求されたインストゥルメントにサンプルとしてそのようなバーがない場合、カウントにゼロが表示され、プログラムのロジックに応じて、通常はこの例外を処理できます。

 

任意の数のFIに対する(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;
}

2つのシンボルに対する類推(ここから):

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;
}
つまり、すべてが非常にシンプルなのだ。もうひとつは、価格BPの古典的なバロメトリック(一定時間離散化)表現が唯一のものではなく、ましてや常に正しいものでもないということです。別の時間次元の価格BPを同期させることが非常に有効な場合もある。つまり、古典的な時間の観点からは非線形の歪みを導入することである。それに対応して、相関関係は2つの古典的VRの非線形相互関係を示すことになる。
 

助けてくれてありがとう!

同期がこんなに複雑だとは思いませんでした。

このインジケーターで直接バーを同期させる必要があるので、やってみます。

 

皆さん、情報をありがとうございました!

インジケーターを少し書き直しました。これで、おそらくヒストリーの悪い部分はスキップされるはずです。

せっかく始めたので、エラーがないかチェックしてみてください :)

ファイル:
 
すべてのインジケーターについて、アルゴリズムによる最適化が必要であることを、あらためて主張します。また、インジケーターの値をメモリー(ファイル)で計算するメカニズムが組み込まれているため、テスターの最適化中にインジケーターが同じものを計算することなく、そこから既製の値を取り込むことができます。
 
hrenfx:
すべてのインジケーターについて、アルゴリズムによる最適化が必要であることを、あらためて主張します。また、インジケータの値をメモリ(ファイル)上で計算するメカニズムが組み込まれていれば、テスターによる最適化の際に、インジケータは同じものを計算することなく、そこから既製の値を取り込むことができます。
これがすでに行われている例を示していただけますか?
 

各指標のアルゴリズム最適化は異なる。相関の使い方の違いについては、例えばこれと これを やった。

全履歴について事前に計算した指標の値を記憶から読み出すことは、私の計算機でのみ行った。つまり、私は普遍的なメカニズムを持っていないのだ。なぜなら、私は私自身の解しか使わないからで、それは決して美しいものではない。というのも、MT5テスターのオプティマイザーは、数桁の加速を与えてくれるからである(私の計算機での使用経験)。

 

こんにちは

時々、他の人のコードを歪めることに時間を費やすことがある。大抵は、不完全なプログラム、時間不足と技術不足の両方の結果である。

今回、私はこの素晴らしいインジケーターを歪めようと思い、次のようなことをやってみた:

- 点線ではなく、ただの線を引くこと



#property indicator_type1 DRAW_COLOR_LINE
#property indicator_width1 2

// #プロパティ indicator_type2 DRAW_COLOR_HISTOGRAM
// #プロパティ indicator_style2 STYLE_DOT
// #プロパティ indicator_width2 1

- などの記号をたくさん追加する。

//--- 入力パラメータ
input string _SecondSymbol="EURGBP"; // 記号

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





- ビジュアルバリアント:各通貨ペアの相関線に色をつけた1本の太線 上記の計算式の結果である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; // 値の単純平均。


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命令がコメントアウトされている。

 

コードとファイル

//+------------------------------------------------------------------+
//| 相関.mq5
||著作権2012年、iC|。
//|http://www.icreator.biz/
//+------------------------------------------------------------------+
#property copyright "Copyright 2012, iC"
#property link "http://www.icreator.biz/"
#property version "1.00"
//--- インジケーターの設定
#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

// #プロパティ indicator_type2 DRAW_COLOR_HISTOGRAM
// #プロパティ indicator_style2 STYLE_DOT
// #プロパティ 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_type5DRAW_COLOR_LINE
#プロパティインジケータ_width5 2

#プロパティインジケータ_type6 DRAW_COLOR_LINE
#プロパティインジケータ_width6 2

#プロパティインジケータ_type7 DRAW_COLOR_LINE
#プロパティインジケータ_width7 2

#プロパティインジケータ_type8 DRAW_COLOR_LINE
#プロパティインジケータ_width8 2

*/

//--- を定義する。
#define MAX_COL 64
//--- 構造体
struct CRGB
{
int r;
int g;
int b;
};
//--- 入力パラメータ
input string _SecondSymbol="EURGBP"; // 記号

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

input int _SettPeriod=100; // 期間
input ENUM_APPLIED_PRICE _AppliedPrice=PRICE_CLOSE; // 価格
input color _Color1=clrLightGray; // 最小相関。
input color _Color2=clrLime; // 最大相関。

//--- インジケータ・バッファ
double buf[],buf2[]
,buf3[],buf4[],buf5[],buf6[],buf7[],buf8[];

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

double colors1[],colors2[];

//--- MA ハンドル
int h1,h2,
h3,h4,h5,h6,h7,h8;
//+------------------------------------------------------------------+
//| カスタムインジケータ初期化関数
//+------------------------------------------------------------------+
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); // 最初のシンボル
SetIndexBuffer(5,arr2,INDICATOR_CALCULATIONS); // 第2シンボル


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

// など。...
*/

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)+","); // その他...

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

// 値を追加した。
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;
}
//+------------------------------------------------------------------+
//| カスタム・インジケータ反復関数
//+------------------------------------------------------------------+
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];
//--- 同期記号
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!");
// 0を返す;
}
//--- データをチェックする

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が見つかるまで、それぞれのifをインデントする。// ロジックが正しいかチェックする

if(bars1>bars2)
{
minBars=bars2;
bars2=bars1-bars2;
bars1=0;
Print("bars1>bars2; minBars(",minBars,"),=bars2(",bars2,")=bars1(",bars1,")-bars2(",bars2,");");
// }
//それ以外 
if(bars1>bars3)
{
minBars=bars3;
bars3=bars1-bars3;
bars1=0;
Print("bars1>bars3; minBars(",minBars,"),=bars3(",bars3,")=bars1(",bars1,")-bars3(",bars3,");");
// } 
//それ以外 
if(bars1>bars4)
{
minBars=bars4;
bars4=bars1-bars4;
bars1=0;
Print("bars1>bars4; minBars(",minBars,"),=bars4(",bars4,")=bars1(",bars1,")-bars4(",bars4,");");
// } 
//それ以外 
if(bars1>bars5)
{
minBars=bars5;
bars5=bars1-bars5;
bars1=0;
Print("bars1>bars5; minBars(",minBars,"),=bars5(",bars5,")=bars1(",bars1,")-bars5(",bars5,");");
// } 
//それ以外 
if(bars1>bars6)
{
minBars=bars6;
bars6=bars1-bars6;
bars1=0;
Print("bars1>bars6; minBars(",minBars,"),=bars6(",bars6,")=bars1(",bars1,")-bars6(",bars6,");");
// } 
//それ以外 
if(bars1>bars7)
{
minBars=bars7;
bars7=bars1-bars7;
bars1=0;
Print("bars1>bars7; minBars(",minBars,"),=bars7(",bars7,")=bars1(",bars1,")-bars7(",bars7,");");
// } 
//それ以外 
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!");
// 0を返す;
}
if(BarsCalculated(h1)<minBars)
{
Print("Not all data of MA1 is calculated. Error ",GetLastError());
// 0を返す;
}
if(BarsCalculated(h2)<minBars)
{
Print("Not all data of MA2 is calculated. Error ",GetLastError());
// 0を返す;
}
if(BarsCalculated(h3)<minBars)
{
Print("Not all data of MA3 is calculated. Error ",GetLastError());
// 0を返す;
}
if(BarsCalculated(h4)<minBars)
{
Print("Not all data of MA4 is calculated. Error ",GetLastError());
// 0を返す;
}
if(BarsCalculated(h5)<minBars)
{
Print("Not all data of MA5 is calculated. Error ",GetLastError());
// 0を返す;
}
if(BarsCalculated(h6)<minBars)
{
Print("Not all data of MA6 is calculated. Error ",GetLastError());
// 0を返す;
}
if(BarsCalculated(h7)<minBars)
{
Print("Not all data of MA7 is calculated. Error ",GetLastError());
// 0を返す;
}
if(BarsCalculated(h8)<minBars)
{
Print("Not all data of MA8 is calculated. Error ",GetLastError());
// 0を返す;
} 

//--- すべてのデータをコピーできるわけではない
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());
// 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; // 値の単純平均。


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);
}
//+------------------------------------------------------------------+
ファイル: