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

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

スポンサーサイト

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

アベレージトゥルーレンジ(ボラティリティーランナーの定義)

ボラティリティーランナーの定義は次のようになっています

Ⅰ.定義

1.TH = 前日の終値と当日の高値の高い方
2.TL = 前日の終値と当日の安値の低い方
3.値幅 = TH-TL
4.値幅の平均値={前日の値幅の平均値 ×(n-1)+今日の値幅}÷n

4の値幅の平均値の式は、難しそうに書いてありますが普通の平均値の計算と同じです

ここでの値幅は、通常トゥルーレンジと呼ばれています
ストラテジートレイダーには全くそのまま使えるインジケータAverageTrueRange があります

ここでは、ちょっと構造的なところを押さえておきます

インジケータAverageTrueRange は、ファンクションAvgTrueRangeを使っています
そのファンクションAvgTrueRangeは、ファンクションTrueRangeを使っています
そしてファンクションTrueRangeは、ファンクションTrueHighとTrueLowを使っています

以下はファンクションTrueHighのソースコードです

********************

using System;

namespace Broker.StrategyLanguage.Function
{
public class TrueHigh : SimpleFunctionBase
{
private int m_datastream = 1;

public TrueHigh(BaseTechniqueService ctx) :
base(ctx) {}

public TrueHigh(BaseTechniqueService ctx, int data_stream) :
base(ctx, data_stream) { m_datastream = data_stream; }

protected override void Construct() {}

protected override void Initialize() {}

protected override void Destroy() {}

protected override Double Execute(){
Double _This = default(Double);
if (Functions.DoubleGreater(Bars.Close[1], Bars.High[0])){
_This = Bars.Close[1];
}
else{
_This = Bars.High[0];
}
return _This;
}
}
}

**********************

定義にある「前日の終値と当日の高値の高い方」というのが上のファンクションTrueHighです
前日の終値というのがBars.Close[1]で
当日の高値というのがBars.High[0]です

「前日の終値と当日の安値の低い方」というのは、ファンクションTrueLowですが
ソースコードは省略します

このTrueHighとTrueLowを使ってファンクションTrueRangeが出来ています

以下がソースコードです

*******************

using System;

namespace Broker.StrategyLanguage.Function
{
public class TrueRange : SimpleFunctionBase
{
private TrueHigh m_truehigh1;

private TrueLow m_truelow1;

private int m_datastream = 1;

public TrueRange(BaseTechniqueService ctx) :
base(ctx) {}

public TrueRange(BaseTechniqueService ctx, int data_stream) :
base(ctx, data_stream) { m_datastream = data_stream; }

protected override void Construct(){
m_truehigh1 = new TrueHigh(this, m_datastream);
m_truelow1 = new TrueLow(this, m_datastream);
}

protected override void Initialize() {}

protected override void Destroy() {}

protected override Double Execute(){
Double _This = default(Double);
_This = (m_truehigh1[0] - m_truelow1[0]);
return _This;
}
}
}

**************************

値幅の式は、m_truehigh1[0] - m_truelow1[0] となります 

これの単純平均値を求めるのがファンクションAvgTrueRangeです

以下がそのソースコードです

**********************

using System;

namespace Broker.StrategyLanguage.Function
{
public class AvgTrueRange : SimpleFunctionBase
{
private ISeries m_length;

private TrueRange m_truerange1;

private int m_datastream = 1;

public AvgTrueRange(BaseTechniqueService ctx) :
base(ctx) {}

public AvgTrueRange(BaseTechniqueService ctx, int data_stream) :
base(ctx, data_stream) { m_datastream = data_stream; }

public ISeries length{
get { return m_length; }
set { m_length = value; }
}

protected override void Construct(){
m_truerange1 = new TrueRange(this, m_datastream);
}

protected override void Initialize() {}

protected override void Destroy() {}

protected override Double Execute(){
Double _This = default(Double);
_This = Functions.Average(m_truerange1, length.Value);
return _This;
}
}
}

**********************

このファンクションAvgTrueRangeの結果をインジケータにしたのが
以下のAverageTrueRangeです

*********************
using System;
using System.Drawing;
using Broker.StrategyLanguage.Function;

namespace Broker.StrategyLanguage.Indicator
{
public class AverageTrueRange : BaseIndicator
{
private int m_atrlength = 14;

private int m_alertlength = 14;

//private int space=10;

private AvgTrueRange m_avgtruerange1;

private HighestBar m_highestbar1;

private LowestBar m_lowestbar1;

private SeriesVar m_atr;

private IPlot Plot1;

public AverageTrueRange(object ctx) :
base(ctx) {}

[Input]
public int atrlength{
get { return m_atrlength; }
set { m_atrlength = value; }
}

[Input]
public int alertlength{
get { return m_alertlength; }
set { m_alertlength = value; }
}

protected override void Construct(){
m_avgtruerange1 = new AvgTrueRange(this);
m_highestbar1 = new HighestBar(this);
m_lowestbar1 = new LowestBar(this);
m_atr = new SeriesVar(this);
Plot1 =
AddPlot(new PlotInfo("ATR", ((0)), ColorTranslator.FromWin32(((65535))),
ColorTranslator.FromWin32(((0))), 0, 0, true));
}

protected override void Initialize(){
m_avgtruerange1.length = new SeriesExpression(delegate { return atrlength; });
m_highestbar1.price = m_atr;
m_highestbar1.length = new SeriesExpression(delegate { return alertlength; });
m_lowestbar1.price = m_atr;
m_lowestbar1.length = new SeriesExpression(delegate { return alertlength; });
m_atr.DefaultValue = 0;
}

protected override void Destroy() {}

protected override void Execute(){
m_atr.Value = m_avgtruerange1[0];
m_atr.Value = m_avgtruerange1[0]/(Bars.Point*10);
Plot1.Set(0, m_atr.Value);
if ((m_highestbar1[0] == 0)){
Alerts.Alert("Indicator at high");
}
else{
if ((m_lowestbar1[0] == 0)){
Alerts.Alert("Indicator at low");
}
}
}
}
}

****************************

と言う訳でボラティリティーランナーの定義の「値幅の平均値」は
インジケータAverageTrueRangeを使えばよいことになります


話は違うのですが、このパラメータの atrlengthを1にしてチャートの表示を見ると
現在バーの変化に合わせてインジケータの値が変化します

ということは [0]は現在バーを示すことになります

一方、PriceChannelの表示は、現在バーが高値安値を更新しても変化しません

何が違うのか?????
よく分からなくなってきました



ちなみにストラテジートレイダーには、
インジケータTrueRangeAというのがあるのですが
これは何本か前のバーのレンジを示すインジケータのようです


[当サイトで使っている自動売買システム]

FXCMはMT4よりも優れていると言っています

中身の分からないストラテジーがいやで
自分でストラテジーを作って運営しています

Strategy Trader 紹介ビデオ 取扱説明 関連サイト

ストラテジートレーダー概要

ストラテジートレーダーβ版利用ガイド

[他の自動売買サイトを探す]

人気blogランキング






[相場の流れは]
FX ポータル
西原さん ユーロドルの下落に注意
松田さん ユーロはやっぱり売り
今井さん ドル円は戻り売り
吉田さん ECB利上げと財政危機の綱引き
陳さん  ユーロ高は中国が
スポンサーサイト

コメント

> 話は違うのですが、このパラメータの atrlengthを1にしてチャートの表示を見ると
> 現在バーの変化に合わせてインジケータの値が変化します
>ということは [0]は現在バーを示すことになります
>一方、PriceChannelの表示は、現在バーが高値安値を更新しても変化しません

atrlengthは実際に計算するBarの長さであり、0だろうと、1だろうと現在の変化するはずだと思います。
例えば0だと今のBarだけで計算しますが、200だと200本分で計算するので、値が変わりにくいだけではないでしょうか。
但し、描画に関しては下記が要因なのかなと推測しています。

PriceChannelの方をみましたが、displaceという変数が曲者です。
displaceを描画するBarの位置を指定している様なので。
> Plot1.Set(displace, m_upperband.Value);
> Plot2.Set(displace, m_lowerband.Value);

インディケータが再描画というか、常に値が変わるようになるにはdisplaceをを0にしていれば常に更新されると思います。

TrueRangeでは
> Plot1.Set(0, m_atr.Value);
と第一引数に0を入れているため、常に現在の値で変動する様になっているのではないでしょうか。


因みにデバッグではプリントデバッグもありですよ。
Strategy Language Editorの「Output」というボタンをクリックすると別のWindowが表示されるのですが、プログラム中にOutput.WriteLine()を使うとその別Windowに表示したい内容が表示されます。
こんな感じで使うとint型も表示出来て使いやすいと思います。
Output.WriteLine("m_lowerband:{0}, m_upperband:{1}", m_lowerband[0], m_upperband[0]);
又は、
Output.WriteLine("m_lowerband:" + m_lowerband[0].ToString() + ", m_upperband:" + m_upperband[0].ToString());

あとは、DrwTextを使ったりすると良いです!
Initializeで
this.DrwText.Create(new DrwCoordinate(DateTime.Now, Bars.Close[0]), "", true);
と適当にかいといて、Executeで位置とか内容を調整するとしりたい情報が描画されます!
this.DrwText.Active.Location = new DrwCoordinate(DateTime.Now, Bars.Close[0]);
this.DrwText.Active.Text = 0 < this.MarketPosition ? "BUY" : this.MarketPosition < 0 ? "SELL" : "Position Nothing";

  • 2011/02/07(月) 10:15:49 |
  • URL |
  • Red #-
  • [ 編集]

コメントの投稿


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

トラックバック

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

FC2Ad

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