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

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

スポンサーサイト

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

function MinusDI のマルチタイムフレーム化 

Directional Movement のマルチタイムフレーム化です。

前回は、PlusDI を計算するファンクションを作りました。
今回は、MinusDI のファンクションを作ります。

高値の引き算をするか安値の引き算をするかの違いです。
以下にソースコードを掲載します。

実際に動作させるには、func_barminute() というファンクションがインストールされている必要があります。
モジュール集からコピーしてください。
モジュール集の目次

/////////////////////////////////////////////
//表示させたい時間足のMinusDIラインを計算する

function func_MinusDI_multi;
input period(number), timeframe(number) , NYclose_time(number) ;
result res(series) ;
vars i(number), j(number),k(number), m(number),line_high(series),line_low(series),
tmp(number),mdm(series), range(series),
barminute(number), interval(number), count(number) ,Whigh(number), Wlow(number) ;

begin

barminute := func_barminute() ; { 自動的に使用チャ-トの時間足を定めます }
interval := timeframe/barminute ; { 時間足の期間のバ-の本数 }
if interval < 1 then return ;

{ チャ-トの始めのバ-から1日分のバ-の間。はじめてのNYクロ-ズ時刻だけを探すためです }
for i := front(high) to front(high)+1440/barminute-1 do begin

    { NYクロ-ズの時刻から始めます }
if hour(timestamp[i])= NYclose_time and minute(timestamp[i]) = 0 then begin
 
Whigh := close[i] ;
Wlow := close[i] ;
count := 1 ;

for k := i to back(high) do begin
if high[k] > Whigh then Whigh := high[k]; { 高値の更新 }
if low[k] < Wlow then Wlow := low[k];  { 安値の更新 }

count := count + 1 ; { 期間内のバ-本数を数えます }
if count = 1+interval then begin  { 期間の最後のバ-になると高値安値ラインを引きます }

for j := k-interval+1 to k do begin
line_high[j] := Whigh ;
line_low[j] := Wlow ;
end;

count := 1 ; { 時間足期間のラインを引くとリセットします }
Whigh := close[k] ;
Wlow := close[k] ;
end;
end;

{ 直近の期間のラインを引きます }
for m :=back(high) downto back(high)-count+2 do begin
if high[m] > Whigh then Whigh := high[m];
if low[m] > Wlow then Wlow := low[m];
line_high[m] := Whigh ;
line_low[m] := Wlow ;
end;

for m := i + interval to back(high) do begin
tmp := line_low[m - interval] - line_low[m];
if tmp < 0 then
tmp := 0;
mdm[m] := tmp;

range[m] := line_high[m] - line_low[m] ;

end;

res := 100 * mma(mdm, period*interval) / mma(range, period*interval );
end;
end;

end
////////////////////////////////////

参考になったらクリックよろしく 人気blogランキング

検証にはGFTのdealbook360を使っています
GFT
GFTの紹介ブログ記事

システム売買ルール

モジュール集の目次

自前の検証をお勧めします
口座開設はこちらから
FX
スポンサーサイト

コメント

たびたびすみません。
質問よろしいでしょうか?

私が?な部分は、
indicator内、もしくはstrategy内によく使われている。無いとサインが出ない?
クラッシュ防止のおまじないなど、言われている。これなどです。

lst := back(close);
if lst < front(close)+1 then return;
これは、ありえないを指示してクラッシュ防止?

前回説明していただいた。
lst := back(close);
if lst <= front(close)+1440/5 then return;
など
ここら辺がすごく理解に毎回苦しみます^^
色々なモジュールを見てさらに混乱しています。
たとえば、初めの、
lst := back(close);
if lst < front(close)+1 then return;は

lst := back(close);
if lst < front(close)+2 then return;
でもOK?などなど、

lst := back(close);
if lst <= front(close)+1440/5 then return;
前回のこれも私には思いもつかないものでした。
ご教授いただけるとありがたいです。
よろしくお願いいたします。

まだまだです

有効なストラテジーではありません。
と出てしまいます。
見よう見まねで作ってあまり理解できていません。どこか悪いところがあるのでしょうが分かりません。ご指摘お願いいたします。
連投ですみません。

strategy MYstr_heikinnashi_cross_filter_ADXR;

input lots = 1;

vars open_line(series), close_line(series), ADXR_line(series), lst(number);

begin

////////////////////////////////////////////////////////////////////
Directional_Movement_ADXR();
ADXR_line := Directional_Movement_ADXR.line;

lst := back(close);
if lst < front(close)+1 then return;
////////////////////////////////////////////////////////////////////



////////////////////////////////////////////////////////////////////
ind_heikinashi_openclose();
open_line := ind_heikinashi_openclose.open_line;
close_line := ind_heikinashi_openclose.close_line;

lst := back(close);
if lst < front(close)+1 then return;
////////////////////////////////////////////////////////////////////



if (ADXR_line[lst-1] < ADXR_line_[lst]) then begin

if crossup (close_line,open_line) then buy(lots);

if crossdown (close_line,open_line) then sell(lots);

end;


if crossdown (close_line,open_line) then exitlong();

if crossup (close_line,open_line) then exitshort();

end.


もうひとつもだめです。

strategy MYstr_heikinnashi_up_down_firuter_ADXR;

input lots = 1;

vars open_line_kasai(series), close_line(series), ADXR_line(series), lst(number);

begin

////////////////////////////////////////////////////////////////////
Directional_Movement_ADXR();
ADXR_line := Directional_Movement_ADXR.line;

lst := back(close);
if lst < front(close)+1 then return;
////////////////////////////////////////////////////////////////////



////////////////////////////////////////////////////////////////////
ind_heikinashi_openclose();
open_line := ind_heikinashi_openclose.open_line;
close_line := ind_heikinashi_openclose.close_line;

lst := back(close);
if lst < front(close)+1 then return;
////////////////////////////////////////////////////////////////////



if (ADXR_line[lst-1] < ADXR_line_[lst]) then begin

if (close_line[lst-1] < close_line[lst]) and (open_line[lst-1] < open_line[lst]) then buy(lots);

if (close_line[lst-1] > close_line[lst]) and (open_line[lst-1] > open_line[lst]) then sell(lots);

end;

if (close_line[lst-1] >= close_line[lst]) then exitlong();

if (close_line[lst-1] <= close_line[lst]) then exitshort();

end.
これも、有効なストラテジーでは無いそうです。
フィルターの掛け方を参考にしてみたつもりなのですが詰まってしまいました。
ご指摘よろしくお願いいたします。

Re: タイトルなし

kouzyさん
今晩は

> lst := back(close);
> if lst < front(close)+1 then return;
これが必要な理由ですが、正式な理由は知りません。
どこかに書いてあるのを読んだことはありません。

私の推察に過ぎませんが、以下のように理解しています。

ストラテジーの場合、プログラムの実行をチャートの一番初め(左端)から始めます。
実行しているインデックスはbackと考えます。
チャートの一番初め(左端)のインデックスはfrontで1(0だったかもしれません?)です。
従って、一番初め(左端)を実行しているとき
if lst < front(close)+1 then return; は
1<1+1 が成り立つのでreturn してプログラムの初めに戻ります。
2番目では 2<1+1 が成り立たないのでプログラムの次の行に進みます。

次に進んでプログラムを実行しようとした時に、必要とするデータが得られないと
そこでプログラムは停止します。
インジケータを使用している場合、チャートの初めにインジケータのラインが存在していない場合があります。
このような場合、プログラムは停止します。
これを避けるのに if lst < front(close)+1 then return; を使います。
データの無い期間はプログラムの初めに戻して、停止するのを防ぎます。

if lst < front(close)+1 then return;の場合、2番目からプログラムを実行します。
if lst < front(close)+50 then return;の場合、51番目からプログラムを実行します。
インジケータの状態によってプラス幾つにするか決めます。

以上のように考えると納得がいくので、そう考えています。
本当の理由は別にあるかもしれませんが???

SMAを使ったストラテジーには if lst < front(close)+50 then return;等がいりません。
何故だかよくわかりません。

そうだからそうだ、ということにしています。








  • 2009/11/09(月) 20:52:22 |
  • URL |
  • bingodog #-
  • [ 編集]

承認待ちコメント

このコメントは管理者の承認待ちです

  • 2009/11/09(月) 21:02:14 |
  • |
  • #
  • [ 編集]

Re: まだまだです

kuzyさん

以下のようにしたら動きました。
比較検討してみてください。

strategy MYstr_heikinnashi_cross_filter_ADXR;
input lots = 1;
vars open_line(series), close_line(series), ADXR_line(series), lst(number);

begin

lst := back(close);
if lst < front(close)+41 then return;

Directional_Movement_ADXR();
ADXR_line := Directional_Movement_ADXR.line;
ind_heikinashi_openclose();
open_line := ind_heikinashi_openclose.open_line;
close_line := ind_heikinashi_openclose.close_line;


if (ADXR_line[lst-1] < ADXR_line[lst]) then begin

if crossup (close_line,open_line) then buy(lots);

if crossdown (close_line,open_line) then sell(lots);

end;


if crossdown (close_line,open_line) then exitlong();

if crossup (close_line,open_line) then exitshort();

end.

  • 2009/11/09(月) 21:29:03 |
  • URL |
  • bingodog #-
  • [ 編集]

承認待ちコメント

このコメントは管理者の承認待ちです

  • 2009/11/09(月) 22:56:17 |
  • |
  • #
  • [ 編集]

Re: たびたびすみません

kouzyさん

チャートの初めでインジケータが表示していないバーの本数を数えました。

  • 2009/11/10(火) 20:44:57 |
  • URL |
  • bingodog #-
  • [ 編集]

コメントの投稿


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

トラックバック

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

FC2Ad

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