FX取引ルール確立のために

取引方針が定まらぬ臆病者の外国為替証拠金取引の行方。 取引ルールの柱にテクニカルな売買サインを導入中。システム開発状況を全て公開。

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

1時間足RSI 固定タイプ マルチタイムフレ-ム対応

1時間足RSIを短い足のチャートで表示するインジケータの改良版です。
1時間の間は、一定のRSIの値にします。
誤差を少なくするのが目的です。

考え方:
1 1時間単位の終値を求める(1時間足と同じ終値)
2 1時間に1つの終値をもとにしてRSIを計算する

CTL:
1 RSIの計算にはファンクションmmaのCTLを使う。
2 初期値の計算には、RSI期間を数えるためにカウンターを使う
3 0分のバーの時だけ計算式を働かせる
4 それ以外のバーの時は、0分バーで計算した値をそのまま使う。

CTLは続きを読むを参照してください

結果:
ぴったり同じ数値が出るものと思っていましたが、期間が長くなると誤差があります。
チャート上での終値は1時間足チャートと同じです。
期間を小さくするとRSIが一致するので、計算過程で何かが起きていると思われます。
RSIマルチ固定タイプ
判明したら報告します。

ランキング低迷中、励みのクリックよろしく 人気blogランキング
banner_11.gif

検証にはGFTのdealbook360を使っています
自前の検証をお勧めします
dealbook360口座開設はこちらから
FX



/* 1時間足RSI 固定タイプ マルチタイムフレ-ム対応 時間足自動判別 */

indicator ind_RSI60_multiA;
input period = 14;
draw line("line");
vars i(number), k(number), lst(number),fst(number),au(series),ad(series), d(series),u(series),
dif(number), line_close(series), barminute(number), tempU(number),multi(number),
tempD(number), countH(number) ;
begin
barminute := func_barminute();
multi := 60 / barminute ;

lst := back(close);
fst := front(close);
line :=makeseries(fst,lst,0);

if frac(multi)<>0 then return ; { 正しく表示できない場合は表示させない }

if lst < fst+ multi*period then return;

/*1時間ごとのcloseライン */
line_close[lst] := close[lst] ;
for i := lst-1 downto fst do begin
if minute(timestamp[i+1]) = 0 then
line_close[i] := close[i]
else
line_close[i] := line_close[i+1] ;
end;

/* RSI計算 */
for i := fst + multi+1 to lst do begin
dif := line_close[i] - line_close[i - multi];
if dif > 0 then begin
u[i] := dif;
d[i] := 0;
end else begin
u[i] := 0;
d[i] := -dif;
end;
end;
/* 初期値を求める */
tempU := 0 ;
tempD := 0 ;
countH := 0 ;

for i := fst+multi+1 to fst+multi*(period+1)+1 do begin

if minute(timestamp[i]) = 0 then begin
countH := countH + 1 ;
tempU := tempU + u[i] ;
tempD := tempD + d[i] ;


if countH = period then begin
au[i] := tempU / period ;
ad[i] := tempD / period ;
k := i ;
end;
end;
end;
/* その後の計算 */
for i := k+1 to lst do begin

if minute(timestamp[i]) = 0 then begin

au[i] := au[i-1] + (u[i] - au[i-1]) / period ;
ad[i] := ad[i-1] + (d[i] - ad[i-1]) / period ;

end else begin
au[i] := au[i-1] ;
ad[i] := ad[i-1] ;

end;
end;

line := 100 * au / (au + ad) ;
end.
スポンサーサイト

テーマ:FXでシステムトレード - ジャンル:株式・投資・マネー

コメント

RSI_H1

bingodogさん、おはようございます!

私も確かめてみようと思って次のようなソースコードを書きました。60の約数の分足しか意識してない簡単なものですが(笑)

----- ここから下 -----
indicator RSI_H1;

input period = 14;
draw line("RSI_H1");
vars i(number), old(number), new(number), j(number), close_H1(series);

begin
old := front(close);
new := back(close);

j := new;
close_H1[new] := close[j];
for i := new-1 downto old do
if hour(timestamp[i+1]) <> hour(timestamp[i]) then begin
j := j - 1;
close_H1[j] := close[i];
end;

Relative_Strength(close_H1, period);

j := back(Relative_Strength.line);
line[new] := Relative_Strength.line[j];
for i := new-1 downto old do
if hour(timestamp[i+1]) <> hour(timestamp[i]) then begin
j := j - 1;
line[i] := Relative_Strength.line[j];
end else
line[i] := line[i+1];
end.
----- ここまで -----

EUR/USDのRSI(14)において、10分より短いと誤差が生じますね。どこで誤差が生じているのか、判明するのを楽しみにしております!

Re: RSI_H1

理系研究員さん

RSIの誤差の原因は、計算を始める初期値の違いと思われます。
RSIのCTL中にmmaを使っています。
mmaの初期値は単純に期間の平均値ですが、
その後の計算は
res[i] := res[i - 1] + (s[i] - res[i - 1]) / period;
となっていて、ひとつ前のrsi値に付け足す様な計算をしています。
初期値の違いがチャートの初めでは大きく影響します。
計算をすすめるとだんだん過去の影響が小さくなるので、似たような値になるようです。
その結果として、分足が大きくなると時間足データ数が大きくなるので誤差が小さく、1分や5分チャートでは、時間足データ数が少ないために誤差が大きくなります。
想像ですが、同じ時間足チャートでもチャートの表示期間を変えると、
同じ日の同じ時間のRSIが異なる値になると思われます。
チャートのはじめと中間では違うという感じです。

下記のソースコードですが、いつもながら要領を得た構成で感心しております。私が作ったのは、多少無理やりっぽい感じに見えます。
下記に質問を書き込みました。簡単に返信していただけるとありがたいのですが。

> bingodogさん、おはようございます!
>
> 私も確かめてみようと思って次のようなソースコードを書きました。60の約数の分足しか意識してない簡単なものですが(笑)
>
> ----- ここから下 -----
> indicator RSI_H1;
>
> input period = 14;
> draw line("RSI_H1");
> vars i(number), old(number), new(number), j(number), close_H1(series);
>
> begin
> old := front(close);
> new := back(close);
>
> j := new;
> close_H1[new] := close[j];
> for i := new-1 downto old do
> if hour(timestamp[i+1]) <> hour(timestamp[i]) then begin
> j := j - 1;
> close_H1[j] := close[i];
> end;
質問1:ここまでで1時間足と同じ終値をclose_H1として記憶したわけですね

> Relative_Strength(close_H1, period);
質問2:これでRSIの計算をしたことになるんでしょうか?
質問3: 以後、Relative_Strengthといえば、ここでの計算値を指すという理解でいいのでしょうか?

> j := back(Relative_Strength.line);
> line[new] := Relative_Strength.line[j];
> for i := new-1 downto old do
> if hour(timestamp[i+1]) <> hour(timestamp[i]) then begin
> j := j - 1;
> line[i] := Relative_Strength.line[j];
> end else
> line[i] := line[i+1];
> end.
> ----- ここまで -----
>
> EUR/USDのRSI(14)において、10分より短いと誤差が生じますね。どこで誤差が生じているのか、判明するのを楽しみにしております!

  • 2009/02/28(土) 16:13:14 |
  • URL |
  • bingodog #-
  • [ 編集]

sampl_rsi

bingodogさん、おはようございます!

ひねりの無い私のソースコードを褒めてくださって有難う御座います。回答するまでもなく、全てその通りです。

Relative_Strengthの使い方も、CTLのヘルプの中にある数少ない戦略サンプルであるsample_rsiを見ていただければ御理解いただけると思います。

私はヘルプのサンプルコードを真似てCTLのインジケーターなどを作っているだけなので、そこに書かれていない機能があっても知りません。CTLのインジケーターを百個ぐらい作れば、上のようなソースコードは数分で作れるでしょう。CTLはMQLより凝ったことをするのが難しいですが、ちょっと試しに表示させてみる程度のインジケーターを作るのは容易ですね! 凝ったことをしようとチャレンジされているbingodogさんやALさんに敬服いたします。

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバックURLはこちら
http://fxrun.blog55.fc2.com/tb.php/1057-23837b0f
この記事にトラックバックする(FC2ブログユーザー)

FC2Ad

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。