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

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

スポンサーサイト

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

SAR (ボラティリティーランナー用インジケータ)のソースコード

ボラティリティーランナーで使うインジケータのソースコードです

ファンクションAvgTrueRangeを使っています

パラメータ:
multirange は値幅の倍数を設定します
atrlength は値幅平均の期間を設定します

コメント:
m_Positionが1の時は買いポジション有り
m_Positionがー1の時は売りポジション有り
m_Positionが0の時はポジションなし

ポジションを作る条件は、ストラテジーと同じです

ポジションの有無と売買で条件分けをします

ポジションが出来ると保有期間のバーの本数を数えます
この期間の終値の高値安値を計算します

これを基にSARを計算します

反対ポジションが出来ると保有期間をリセットします

問題点:
インジケータを表示させてしばらく時間が経つと
現在バーの表示が突然動き始めます
この時、チャートのインジケータの始めの部分の位置が変わります

インジケータをセットし直すと動きが止まります

原因不明です

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

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

namespace Broker.StrategyLanguage.Indicator
{
public class SAR : BaseIndicator
{

private int m_atrlength = 22;

private AvgTrueRange m_avgtruerange1;

private SeriesVar m_atr;

private int countB;

private int countS;

private double m_multirange = 1;

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

[Input]
public double multirange{
get { return m_multirange; }
set { m_multirange = value; }
}

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

private SeriesVar m_lowerband;

private SeriesVar m_upperband;

private SeriesVar SARlineB;

private SeriesVar SARlineS;

private int m_Position;

private IPlot Plot1;

private IPlot Plot2;





protected override void Construct() {

m_avgtruerange1 = new AvgTrueRange(this);

m_atr = new SeriesVar(this);

m_lowerband = new SeriesVar(this);
m_upperband = new SeriesVar(this);


SARlineB = new SeriesVar(this);
SARlineS = new SeriesVar(this);

Plot1 =
AddPlot(new PlotInfo("SARlineB", ((0)), ColorTranslator.FromWin32(((16776960))),
ColorTranslator.FromWin32(((0))), 0, 0, true));
Plot2 =
AddPlot(new PlotInfo("SARlineS", ((0)), ColorTranslator.FromWin32(((255))),
ColorTranslator.FromWin32(((0))), 0, 0, true));
}





protected override void Initialize() {

m_avgtruerange1.length = new SeriesExpression(delegate { return atrlength; });

m_atr.DefaultValue = 0;

countB = 0;
countS = 0;
m_Position = 0;
m_lowerband.DefaultValue = 0;
m_upperband.DefaultValue = 0;
SARlineB.DefaultValue = 0;
SARlineS.DefaultValue = 0;
}



protected override void Execute(){

m_atr.Value = m_avgtruerange1[0];

if (m_Position == 0)
{
countB = countB + 1;
countS = countS + 1;

m_lowerband.Value = Functions.Lowest(Bars.Close, countS, 1);
SARlineB.Value = m_lowerband.Value + m_atr.Value * multirange;
if (Functions.CrossesOver(this,Bars.High,SARlineB)){
m_Position = 1;
countB = 0;
countS = 0;
}

m_upperband.Value = Functions.Highest(Bars.Close, countB, 1);
SARlineS.Value = m_upperband.Value - m_atr.Value * multirange;
if (Functions.CrossesOver(this,SARlineS,Bars.Low)){
m_Position = -1;
countB = 0;
countS = 0;
}
}

if(m_Position == -1){

countS = countS + 1;

m_lowerband.Value = Functions.Lowest(Bars.Close, countS, 1);
SARlineB.Value = m_lowerband.Value + m_atr.Value * multirange;

if (Functions.CrossesOver(this,Bars.High,SARlineB)){
m_Position = 1 ;
countS = 0;
}
}


if(m_Position == 1){

countB = countB + 1;

m_upperband.Value = Functions.Highest(Bars.Close, countB, 1);
SARlineS.Value = m_upperband.Value - m_atr.Value * multirange;

if (Functions.CrossesOver(this,SARlineS,Bars.Low)){
m_Position = -1;
countB = 0;
}
}

Plot1.Set( SARlineB.Value);
Plot2.Set( SARlineS.Value);


}
}
}


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

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

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

初めての方はこちらから
ストラテジートレーダー超入門 自動売買プログラミング編

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

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

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

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

人気blogランキング






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

コメント

問題点について

お世話になります。

推測で申し訳ないのですが、countBとcountSに+ 1している部分だと思います。

例えば、+1していくと、Lowestで安値を判定するBarの数が増えて行きますので、
何かしらの不具合でcountBとcountSがどんどん増えて行くと安値が更新されるため、
変動が発生するのではないでしょうか。
Functions.Lowest(Bars.Close, countS, 1);

どの様な仕組みなのか私が分かってないだけかもしれませんがお役に立てれば幸いです。

  • 2011/02/08(火) 09:48:12 |
  • URL |
  • Red #-
  • [ 編集]

度々すみません。

度々すみません。

countB、countSをプラスしている各行にプリントデバッグを入れては如何でしょうか。

全て同一の内容で対応出来るようにしとくと楽かもしれません。
Output.WriteLine("m_Position:{0}, countB:{1}, countS:{2}", m_Position, countB, countS);

  • 2011/02/08(火) 09:52:17 |
  • URL |
  • Red #-
  • [ 編集]

Re: 問題点について

> お世話になります。
>
> 推測で申し訳ないのですが、countBとcountSに+ 1している部分だと思います。
>
> 例えば、+1していくと、Lowestで安値を判定するBarの数が増えて行きますので、
> 何かしらの不具合でcountBとcountSがどんどん増えて行くと安値が更新されるため、
> 変動が発生するのではないでしょうか。
> Functions.Lowest(Bars.Close, countS, 1);
>
> どの様な仕組みなのか私が分かってないだけかもしれませんがお役に立てれば幸いです。

REDさん
こんばんは

コメントありがとうございます
原因はご指摘の通り「countBとcountSに+ 1している部分」でした
この代わりにBars.CurrentBarを使って
現在バーの番号からエントリーしたバーの番号を引き算して
ポジション保有中のバーの数を計算すると上手く行きました

詳しくは本稿に掲載します


  • 2011/02/09(水) 19:47:15 |
  • URL |
  • bingodog #-
  • [ 編集]

コメントの投稿


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

トラックバック

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

FC2Ad

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