昨日のBTC祭りといい、今年はとにかくビットコインのとしでしたね。私は全く手を付けてなかったのですが、世の中ビットコイン長者と破産者をたくさん出したようで・・・。
まぁさて置き、USDを基準とした通貨強弱のラストです。
予告通り乖離率をベースに順位付けしたチャートを作成しました。
上が昨日のインデックス、下が乖離率ベースです。
どうでしょうか?正直ノリで作ってみただけと言った感じなので、研究もなにもないです。いまからですね。ただ、インデックスと比較すると頂点がはっきりでるのと、実際のピークアウトかなり前に乖離率はピークアウトするので、シグナルが早いように思われます。
その意味では、比較先となる現在価格に対する平滑化をもう少し大きくかけてみてもいいのかもしれません。
比較先終わり値に対する平滑化を10にしてみたチャートと比較してみましょう。
上が平滑化期間4、下が10です。乖離率ベースなのは同じです。
きざきざが収まった分、かなり見やすいチャートになっていますね。
さて、、ここで一点いままでのチャートと少し元データが異なる事に気がついた方はもう目を皿のようにしてチャートを見ている人だと思います。
今回の画像はNZDを省いてXAUSUD(金ドル)を加えています。物価代表として金に登場してもらいました。日本の業者では難しいのですが、AlpariやXMなどではMT4で金ドルもトレード可能ですので、このようなチャートも作成できます。画像のチャートの中では、ドル安の流れの中で、金が先にピークアウトしていたりするので、なかなか参考になりそうな気がしています。
・・・同じようなインジケータばかり4つも作成してしまいました(笑)
どのように役に立つかはいまからですが、EAに取り込んでいきたいと思っています。作成したチャートはFX-ONにアップロードしました。
・・・・久しぶりにアップロードしたら、製品紹介ページにすら飛べずにどうやってURLだせばいいのかかなり悩んだ・・・。どーいうこと??汗。とりあえずURLの登録ID書き換えて飛びました・・・・。
一旦諦めて、昔の通貨強弱インジケータのファイルをアップデートしました。
FX-ONのダウンロードはこちらから。
ダウンロード
ソースコードは記事の最後に乗せています。
[MT4インジケータ]通貨の強弱をUSDを基準に表示する。その2
[MT4インジケータ]通貨の強弱をUSDを基準に表示する。その3
[MT4インジケータ]通貨の強弱をUSDを基準にその4とFX-ONへのアップロード
「MT4でFXを勝ち抜く研究をするブログ」で公開している無料インジケータは、こちらの一覧から。
インジケータ一覧
Twitterもよろしくお願いします。
https://twitter.com/mt4program
Trading View プロフィール
ブログランキングにご協力よろしくお願いします。m(._.)m
にほんブログ村 |
お約束ですが、本ブログは、投資に対する利益を約束する物ではありません。最終的には自己責任によるご判断よろしくお願いいたします。
//------------------------------------------------------------------
// 通貨強弱 インデックス比較インジケータ(N本前履歴、通貨間平均値基準)
#property copyright "Copyright 2017, Daisuke"
#property link "http://mt4program.blogspot.jp/"
#property version "1.00"
#property strict
#property indicator_separate_window
#property indicator_level1 100
#include <Arrays/ArrayString.mqh>
//バッファーを指定する。
#property indicator_buffers 9
input string sep00 = ""; //【通貨】
input string Currency1 = "EUR"; // 対象通貨1
input color Color1 = clrDodgerBlue; // 対象通貨1色
input string Currency2 = "GBP"; // 対象通貨2
input color Color2 = clrMagenta; // 対象通貨2色
input string Currency3 = "AUD"; // 対象通貨3
input color Color3 = clrGreen ; // 対象通貨3色
input string Currency4 = "NZD"; // 対象通貨4
input color Color4 = clrSilver; // 対象通貨4色
input string Currency5 = "USD"; // 対象通貨5
input color Color5 = clrAqua; // 対象通貨5色
input string Currency6 = "CAD"; // 対象通貨6
input color Color6 = clrPink; // 対象通貨6色
input string Currency7 = "CHF"; // 対象通貨7
input color Color7 = clrPaleGreen; // 対象通貨7色
input string Currency8 = "JPY"; // 対象通貨8
input color Color8 = clrRed; // 対象通貨8色
input string sep10 = ""; //【計算設定】
input int MaPeriodBase = 300; // 比較元移動平均期間(ある程度大きな値でもOK)
input ENUM_MA_METHOD MaMode = MODE_EMA;// 比較元移動平均種別
input int MaPeriodTarget = 4; // 比較先移動平均期間(小さい値推奨)
input string sep20 = ""; //【その他】
input string CurrencyPrefix = ""; // 通貨ペア名の前に付く文字列
input string CurrencyPostfix = ""; // 通貨ペア名の後に付く文字列
input int LabelDistance = 3; // 通貨名ラベル描画スペース
//バッファ
double m_buffer1[];
double m_buffer2[];
double m_buffer3[];
double m_buffer4[];
double m_buffer5[];
double m_buffer6[];
double m_buffer7[];
double m_buffer8[];
//通貨一覧
CArrayString m_currencies;
//通貨ペア一覧
CArrayString m_currencyPairs;
//USDインデックス
int m_usdIndex = -1;
//オブジェクト名
#define OBJECT_NAME "OBJ_CURR_KAIRI"
//色配列
color m_colors[8];
//------------------------------------------------------------------
// 初期化
int OnInit()
{
ClearObjects();
IndicatorBuffers(8);
int count = 0 ;
SetIndexStyle(count, DRAW_LINE, STYLE_SOLID, 1, Color1);
SetIndexBuffer(count++, m_buffer1);
SetIndexStyle(count, DRAW_LINE, STYLE_SOLID, 1, Color2);
SetIndexBuffer(count++, m_buffer2);
SetIndexStyle(count, DRAW_LINE, STYLE_SOLID, 1, Color3);
SetIndexBuffer(count++, m_buffer3);
SetIndexStyle(count, DRAW_LINE, STYLE_SOLID, 1, Color4);
SetIndexBuffer(count++, m_buffer4);
SetIndexStyle(count, DRAW_LINE, STYLE_SOLID, 1, Color5);
SetIndexBuffer(count++, m_buffer5);
SetIndexStyle(count, DRAW_LINE, STYLE_SOLID, 1, Color6);
SetIndexBuffer(count++, m_buffer6);
SetIndexStyle(count, DRAW_LINE, STYLE_SOLID, 1, Color7);
SetIndexBuffer(count++, m_buffer7);
SetIndexStyle(count, DRAW_LINE, STYLE_SOLID, 1, Color8);
SetIndexBuffer(count++, m_buffer8);
m_currencies.Add(Currency1);
m_currencies.Add(Currency2);
m_currencies.Add(Currency3);
m_currencies.Add(Currency4);
m_currencies.Add(Currency5);
m_currencies.Add(Currency6);
m_currencies.Add(Currency7);
m_currencies.Add(Currency8);
m_colors[0] = Color1;
m_colors[1] = Color2;
m_colors[2] = Color3;
m_colors[3] = Color4;
m_colors[4] = Color5;
m_colors[5] = Color6;
m_colors[6] = Color7;
m_colors[7] = Color8;
m_usdIndex = -1;
for( int i = 0; i < m_currencies.Total(); i++)
{
if(m_currencies.At(i) == "USD")
{
m_usdIndex = i;
break;
}
}
if( m_usdIndex < 0 )
{
//USDが見つからない場合、パラメータ異常
return INIT_PARAMETERS_INCORRECT;
}
//USDに対する通貨ペアを生成する。
for( int i = 0; i < m_currencies.Total(); i++)
{
if( m_currencies.At(i) == "" )
{
m_currencyPairs.Add("");
continue;
}
if( i < m_usdIndex )
{
m_currencyPairs.Add(CurrencyPrefix + m_currencies.At(i) + "USD" + CurrencyPostfix);
}
else if( i > m_usdIndex )
{
m_currencyPairs.Add(CurrencyPrefix + "USD" + m_currencies.At(i) + CurrencyPostfix);
}
else
{
m_currencyPairs.Add("USDUSD");
}
//線のラベルを設定する。
SetIndexLabel(i, m_currencies.At(i));
}
ChartSetInteger(0, CHART_SHIFT, true);
ChartSetDouble(0, CHART_SHIFT_SIZE, 12);
return(INIT_SUCCEEDED);
}
//------------------------------------------------------------------
//終了処理
void OnDeinit( const int reason )
{
ClearObjects();
}
//------------------------------------------------------------------
//計算イベント
int OnCalculate(
const int rates_total, //各レート要素数
const int prev_calculated, //計算済み要素数
const datetime &time[], //要素ごとの時間配列
const double &open[], //オープン価格配列
const double &high[], //高値配列
const double &low[], //安値配列
const double &close[], //クローズ価格配列
const long &tick_volume[], //ティック数(要素の更新回数)
const long &volume[], //実ボリューム(?)
const int &spread[]) //スプレット
{
int total = m_currencyPairs.Total();
//通貨の中心地をとるためにいったんの確保用配列を用意する。
double currentValues[];
ArrayResize(currentValues, total);
for( int i = rates_total - prev_calculated - 1; i >= 0; i--)
{
//インデックス範囲外の場合は、飛ばす。
if( i >= rates_total - MaPeriodBase ) continue;
//通貨のインデックス値と平均値を求める。
double average = 0;
for( int j = 0; j < total; j++)
{
string pair = m_currencyPairs.At(j);
if(pair == "USDUSD" )
{
currentValues[j] = 100;
}
else
{
double baseValue = iMA(pair, PERIOD_CURRENT, MaPeriodBase, 0, MaMode, PRICE_CLOSE, i);
double targetValue = iMA(pair, PERIOD_CURRENT, MaPeriodTarget, 0, MODE_LWMA, PRICE_CLOSE, i);
if( j < m_usdIndex )
{
if( baseValue != 0 && baseValue != EMPTY_VALUE )
{
currentValues[j] = targetValue / baseValue * 100;
}
}
else
{
if( targetValue != 0 && targetValue != EMPTY_VALUE )
{
currentValues[j] = baseValue / targetValue * 100;
}
}
}
average += currentValues[j];
}
average /= total;
if( average > 0 )
{
//平均値をベースに再度値を計算しなおす(割合ベース)
for( int j = 0; j < total; j++)
{
SetValue(j, currentValues[j] / average * 100.0, i);
}
}
}
DrawCurrencyLabels();
ArrayFree(currentValues);
return rates_total - 1;
}
//------------------------------------------------------------------
//通貨ラベルを描画する。
void DrawCurrencyLabels()
{
//ソート行う。
//とりあえずバブルソート
int index[8];
double rates[8];
ArrayInitialize(index, 0);
ArrayInitialize(rates, 0);
int total = m_currencyPairs.Total();
for( int i = 0 ; i < total; i++ )
{
index[i] = i;
rates[i] = GetValue(i, 0);
}
//ソート行う。
//とりあえずバブルソート
for( int b = 1 ; b < total; b++ )
{
for( int j = 0; j < total - b; j++ )
{
if( rates[j] > rates[j + 1] )
{
double work = rates[j + 1];
rates[j + 1] = rates[j];
rates[j] = work;
int indexWork = index[j + 1];
index[j + 1] = index[j];
index[j] = indexWork;
}
}
}
//通貨ラベルを更新する。
ClearObjects();
int sub = WindowOnDropped();
double max = ChartGetDouble(0, CHART_PRICE_MAX, sub);
double min = ChartGetDouble(0, CHART_PRICE_MIN, sub);
double distance = ( max - min ) / (total + 2);
datetime writeTime = iTime(NULL, PERIOD_CURRENT, 0) + PeriodSeconds() * LabelDistance ;
for( int j = 0; j < total; j++)
{
//描画対象通貨(インデックス)
int currencyIndex = (int)index[j];
//価格テキストを追加する。
string objectName = StringFormat("%s_TXT_%d_%d", OBJECT_NAME, sub, j);
if( ObjectCreate(0, objectName, OBJ_TEXT, WindowOnDropped(),writeTime , min + distance * (j + 1)) )
{
// 表示文字列
ObjectSetString(0, objectName, OBJPROP_TEXT, m_currencies.At(currencyIndex));
// アンカー
ObjectSetInteger(0, objectName, OBJPROP_ANCHOR, ANCHOR_BOTTOM);
ObjectSetInteger(0, objectName, OBJPROP_COLOR, m_colors[currencyIndex]);
}
}
}
//------------------------------------------------------------------
//値を設定する。
void SetValue(
int i, //配列番号0~7
double value, //値
int shift) //シフト
{
switch(i)
{
case 0:
m_buffer1[shift] = value;
break;
case 1:
m_buffer2[shift] = value;
break;
case 2:
m_buffer3[shift] = value;
break;
case 3:
m_buffer4[shift] = value;
break;
case 4:
m_buffer5[shift] = value;
break;
case 5:
m_buffer6[shift] = value;
break;
case 6:
m_buffer7[shift] = value;
break;
case 7:
m_buffer8[shift] = value;
break;
}
}
//------------------------------------------------------------------
//値を取得する。
double GetValue(
int i, //配列番号0~7
int shift) //シフト
{
switch(i)
{
case 0:
return m_buffer1[shift];
case 1:
return m_buffer2[shift];
case 2:
return m_buffer3[shift];
case 3:
return m_buffer4[shift];
case 4:
return m_buffer5[shift];
case 5:
return m_buffer6[shift];
case 6:
return m_buffer7[shift];
case 7:
return m_buffer8[shift];
}
return EMPTY_VALUE;
}
//------------------------------------------------------------------
//オブジェクトをすべて削除する。
void ClearObjects()
{
long chartId = ChartID();
int sub = WindowOnDropped();
int total = ObjectsTotal( chartId, sub );
//生成したオブジェクトを削除する。
//0から削除するとインデックス位置がずれて
//正しく削除できないため、後ろから削除するようにする。
for( int i = total - 1; i >= 0 ; i--)
{
string name = ObjectName( chartId, i, sub );
// 先頭文字列がRangeRectangleNameと一致する場合、削除する。
if ( StringFind( name, OBJECT_NAME ) == 0 )
{
ObjectDelete( chartId, name );
}
}
}