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

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

スポンサーサイト

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

RBreakerTSのソースコード

パラメータを変更したばかりのRBreakerですが、
以前から動作が不完全だったバー本数での手仕舞のところの
ソースコードを改善しました。

変更点

1  ポジションが出来てからexlengthのバー本数が経過すると強制的に手仕舞する
   仕様になっているのですが、場合によってバー本数を数えることがリセットされて
   ポジション維持が継続することが有りました。
   これを条件文を追加することによって、確実に手仕舞動作するようにしました。
   (ソースコードの赤字部分)

2  トレール動作を追加しました。(ソースコードの青字部分)
   ポジションが出来てから反対側の高値安値ラインを越えると
   指定した量だけストップ注文を変更します

概要:

安値高値を更新してからすぐに反転した場合にポジションを作ります

損切りの逆指値を直近の安値高値近辺に設定するので
損切り値が比較的小さくなります

その分、負け数が多く成りますが
勝った時の利益を大きくして儲けます

大きく負けたくない人に向きそうです

手仕舞は、逆サインのドテンと経過バー本数によります
他の手仕舞方法があっても良いような気がします

入力項目:

1 plength  PriceChannelの期間(過去の高値安値の期間)
2 ylength  エントリーをさせないための現在バーからのバー本数
       例えばylengthを4にすると、
       過去の高値安値のバーが現在バーから4本以上過去になる場合のみエントリー条件が成立する
これによって、高値安値を連続して更新している場合のドテンが禁止されます
3 exlength ポジションが出来てからこの数のバー本数が経過すると強制的に手仕舞する
4 stopmargin 逆指値を過去の高値安値からstopmarginだけ離して設定する
5 trailstep ストップラインをこの量だけ変更する

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


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

namespace Broker.StrategyLanguage.Strategy {
public class RBreakerTS : BaseStrategyAdvisor {

private int m_plength = 20;

private int m_ylength = 2;

private int m_exlength = 10;

private int m_stopmargin = 100;

private int m_trailstep = 100;

private double m_Profit_Target_Amount = 1000;

private SeriesVar< Double> m_lowerband;

private SeriesVar< Double> m_upperband;

public RBreakerTS(object _ctx):base(_ctx){}

[Input]
public int plength{
get { return m_plength; }
set { m_plength = value; }
}

[Input]
public int ylength{
get { return m_ylength; }
set { m_ylength = value; }
}
[Input]
public int exlength{
get { return m_exlength; }
set { m_exlength = value; }
}
[Input]
public int stopmargin{
get { return m_stopmargin; }
set { m_stopmargin = value; }
}
[Input]
public int trailstep{
get { return m_trailstep; }
set { m_trailstep = value; }
}
[Input]
public double Profit_Target_Amount{
get { return m_Profit_Target_Amount; }
set { m_Profit_Target_Amount = value; }
}

private IPriceOrder buy_order;

private IPriceOrder sell_order;

private IPriceOrder Exlong_order;

private IPriceOrder Exshort_order;

private IMarketOrder ExitS_order;

private IMarketOrder ExitB_order;

private double m_myvalH;

private int m_mybarH;

private double m_myvalL;

private int m_mybarL;

private int m_value1;

private double m_stopB;

private double m_stopS;

private int m_entrybarB;

private int m_entrybarS;


protected override void Construct() {

m_lowerband = new SeriesVar< Double>(this);

m_upperband = new SeriesVar< Double>(this);

ExitS_order = OrdersFactory.CreateMarketNextBar(new OrdersCreateParams(Lots.Default,"ExitS", OrderAction.BuyToCover));

ExitB_order = OrdersFactory.CreateMarketNextBar(new OrdersCreateParams(Lots.Default,"ExitB", OrderAction.Sell));

Exshort_order = OrdersFactory.CreateStop(new OrdersCreateParams(Lots.Default,"stopS", OrderAction.BuyToCover));

Exlong_order = OrdersFactory.CreateStop(new OrdersCreateParams(Lots.Default,"stopL", OrderAction.Sell));

sell_order = OrdersFactory.CreateStop(new OrdersCreateParams(Lots.Default,"Sell", OrderAction.SellShort));

buy_order = OrdersFactory.CreateStop(new OrdersCreateParams(Lots.Default,"Buy", OrderAction.Buy));
}
protected override void Initialize() {

m_lowerband.DefaultValue = 0;
m_upperband.DefaultValue = 0;

m_myvalH = 0;
m_mybarH = 0;
m_myvalL = 0;
m_mybarL = 0;
m_value1 = 0;
}


protected override void Execute(){

m_myvalH = Bars.High[1];
m_mybarH = 0;
for (m_value1 = 1; m_value1 <= plength - 1; ++m_value1){
if (Functions.DoubleGreater(Bars.High[m_value1], m_myvalH)){
m_mybarH = m_value1;
}
}

m_myvalL = Bars.Low[1];
m_mybarL = 0;
for (m_value1 = 1; m_value1 <= plength - 1; ++m_value1){
if (Functions.DoubleLess(Bars.Low[m_value1], m_myvalL)){
m_mybarL = m_value1;
}
}

m_lowerband.Value = Functions.Lowest(Bars.Low, plength, 1);
m_upperband.Value = Functions.Highest(Bars.High, plength, 1);

if (StrategyInfo.MarketPosition <= 0){
if ((Functions.DoubleGreater( m_lowerband[0],Bars.Close[0]) )
& (Functions.DoubleGreater(m_mybarL, ylength))){
buy_order.Generate(m_lowerband[0]);
m_entrybarB = Bars.CurrentBar;
}
}

if (StrategyInfo.MarketPosition >= 0){
if ((Functions.DoubleGreater(Bars.Close[0],m_upperband[0]) )
& (Functions.DoubleGreater(m_mybarH, ylength))){
sell_order.Generate(m_upperband[0]);
m_entrybarS = Bars.CurrentBar;
}
}


if (StrategyInfo.MarketPosition > 0){

if (Bars.CurrentBar==(m_entrybarB+1)){
if (Functions.DoubleLess(Bars.Low[0],Bars.Low[1])){
m_stopB=Bars.Low[0];
}
if (Functions.DoubleLessEquals(Bars.Low[1],Bars.Low[0])){
m_stopB=Bars.Low[1];
}
}

if ((Functions.DoubleGreater(Bars.High[0],m_upperband[0]))
& (Functions.DoubleGreater(m_upperband[0],CurrentPosition.OpenTrades[0].Entry.Price))){
m_stopB = m_stopB+(m_trailstep*Bars.Point);
}



if (Functions.DoubleGreater(m_exlength,(Bars.CurrentBar - m_entrybarB))){
Exlong_order.Generate(m_stopB-m_stopmargin*Bars.Point);
}
else {
ExitB_order.Generate();
}
}

if (StrategyInfo.MarketPosition < 0){

if (Bars.CurrentBar==(m_entrybarS+1)){
if (Functions.DoubleGreater(Bars.High[0],Bars.High[1])){
m_stopS=Bars.High[0];
}
if (Functions.DoubleGreaterEquals(Bars.High[1],Bars.High[0])){
m_stopS=Bars.High[1];
}
}

if ((Functions.DoubleLess(Bars.Low[0],m_lowerband[0]))
& (Functions.DoubleLess(m_lowerband[0],CurrentPosition.OpenTrades[0].Entry.Price))){
m_stopS = m_stopS-(m_trailstep*Bars.Point);
}


if (Functions.DoubleGreater(m_exlength,(Bars.CurrentBar - m_entrybarS))){
Exshort_order.Generate(m_stopS+m_stopmargin*Bars.Point);
}
else {
ExitS_order.Generate();
}
}
if (Functions.DoubleGreater(Profit_Target_Amount, 0)){
GenerateProfitTarget(Profit_Target_Amount);
}
}
}
}

スポンサーサイト

コメント

コメントの投稿


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

トラックバック

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

FC2Ad

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