「マネー」カテゴリーアーカイブ

名波はるか&Kumaさんが教える!![日経225&mini]で始めるシステムトレード入門

名波はるか&Kumaさんが教える!![日経225&mini]で始めるシステムトレード入門 名波はるか&Kumaさんが教える!![日経225&mini]で始めるシステムトレード入門

名波 はるか Kuma

扶桑社 2008-05-23

売り上げランキング : 305594

Amazonで詳しく見る

by G-Tools

★★★☆☆(当時はよかったが、今は不要?)

名波はるかというちょっと過激な方のグラビアアイドル(私はよく知りませんでしたが)が、Kuma さんという人の作った単一のシステムトレードプログラムを紹介するという、なんとも不思議な構成の本。

エクセルのマクロで作られたトレードシステム「Kuma システム」の入った CD-ROM が付属。

データを自分で打ち込む必要がありますし、資金も結構必要ですし、勝率は低いしプロフィットファクターも低そうで、MetaTrader4 で FX をやるのに比べると敷居が10倍は高いですね。

それにこれをやったからといって、他人のロジックをそのまま使うだけ。

勝っても負けても他人任せなので、自分に進歩がないし、うまくいかなくなっても原因がわかりません。

FX のほうをお勧めします。デモ口座で練習できますからね。

###

]]>

最大ドローダウンについて

おまえのつくる EA は「最大ドローダウンがどれも 10%超えていて使えない」とか思っておられる方がおられるかもしれませんが、それは誤解です。

たとえば本日紹介した VQ システム(クラウドフィルタ付き)ですが、

ここでのテストは10万通貨に統一しています。

もし2万通貨でテストするとこうなります。

10万通貨 2万通貨
総損益$ 23470 4693(23470 の2割)
プロフィットファクター 2.12 2.12
勝率% 44.94 4.94
最大ドローダウン% 13.11 4.71

プロフィットファクター、勝率は掛け金(ロット数)に無関係ですが、総損益は掛け金に比例します。

最大ドローダウンは掛け金とそのときの資金額に左右されます。

ブログや雑誌に最大ドローダウンが高めとか批評を書いている人がいますが、ロット数を考慮しないと意味がないです。

損益の評価も、最大ドローダウン(%)あたりの年利回り(%)で比較するのがいいと思います。これもロットに影響されますけれど。

リスクあたりのリターンということです。

*

実際に運用するときは最大ドローダウンを2回連続で食らっても資金の5%以内ですむようにロットを調整するのがお勧めです。

上の場合(元金は10000$=約120万円の口座)では2万通貨の場合2回連続最大ドローダウンを食らうと 5%を超えてしまいます。

1万通貨で行うべきですね。

最大ドローダウンを短い期間に2回くらう可能性は1%未満だと思いますので、勇気のある方は2万通貨でも結構ですが。

さらに男気のある方は10万通貨で・・・・

###

超シンプルな自動売買プログラム(EA)

以下のサンプルプログラムを元にして自分の好きな EA を作ることができます。

//
// yasciiSimple01
//

#define MAGIC  42101        //マジックナンバーの定義

//パラメーターの設定//
extern double Lots = 1.0;     //取引ロット数
extern int Slip = 10;         //許容スリッページ数
extern string Comments =  "Simple01"; //コメント

//変数の設定//
int Ticket_L = 0; //買い注文の結果をキャッチする変数
int Ticket_S = 0; //売り注文の結果をキャッチする変数
int Exit_L = 0;   //買いポジションの決済注文の結果をキャッチする変数
int Exit_S = 0;   //売りポジションの決済注文の結果をキャッチする変数
int OS1 ;
int OS2 ;
double   OOPL;
double   OOPS;

int start()
  {

   if (Volume[0]>1 || IsTradeAllowed() == false) return(0) ;

   //買いポジションのエグジット
   OS1 = OrderSelect(Ticket_L, SELECT_BY_TICKET);  
   OOPL = OrderOpenPrice();   
   if( Ticket_L != 0 && Ticket_L != -1 ) // 決済条件をつける場合はここに&&で続けて書く
    {     
      Exit_L = OrderClose(Ticket_L,Lots,Bid,Slip,Blue);
      if( Exit_L ==1 ) {Ticket_L = 0;}
    }    

   //売りポジションのエグジット
   OS2 = OrderSelect(Ticket_S, SELECT_BY_TICKET); 
   OOPS = OrderOpenPrice();
   if( Ticket_S != 0 && Ticket_S != -1) // 決済条件をつける場合はここに&&で続けて書く
    {     
      Exit_S = OrderClose(Ticket_S,Lots,Ask,Slip,Red);
      if( Exit_S ==1 ) {Ticket_S = 0;} 
    }   

   //買いエントリー
   if( Close[1] < Open[1] // 買いのための条件
       && ( Ticket_L == 0 || Ticket_L == -1 ) 
       && ( Ticket_S == 0 || Ticket_S == -1 ))
    {  
      Ticket_L = OrderSend(Symbol(),OP_BUY,Lots,Ask,Slip,0,0,Comments,MAGIC,0,Blue);
    }

   //売りエントリー
   if( Close[1] > Open[1] //売りのための条件
       && ( Ticket_S == 0 || Ticket_S == -1 )
       && ( Ticket_L == 0 || Ticket_L == -1 ))
    {   
      Ticket_S = OrderSend(Symbol(),OP_SELL,Lots,Bid,Slip,0,0,Comments,MAGIC,0,Red);         } 

   return(0);
  }

ちなみに上のプログラムは決済条件をつけていませんので、実行すると

足が確定したときに保有ポジションを持っていると有無を言わせず決済します。

決済条件をつけたい場合は Ticket_S != 0 && Ticket_S != –1 のところを

((Ticket_S != 0 && Ticket_S != -1) || (条件)) と変更してください。

エントリにはとりあえずの条件が付けてありますが、ここを変えるとご自分のロジックを試せます。

サンプルではとりあえずの条件として、

Close[1] < Open[1] つまり前の足が陰線なら買い、Close[1] > Open[1] つまり前の足が陽線なら売り

を しかけるようになっています。

試しに日足のチャートにて走らせますと、 「前日が上昇したときは売り、下降したときは買い」という超単純な逆張りロジック になるわけです。

*

こんな簡単なもので利益が出るわけない?

結果 USDCAD(米ドル加ドル)日足 2014/1/1-2015/1/1

利益でてまっせ。年率 91.6%も。

こういう地域関連性の強い通貨ペアは一方的なトレンドは発生しにくいですからね。

昨日上がったから今日は下げた方がいいな、と思う人が圧倒的にいるのでしょう。

結果 EURUSD(ユーロ米ドル)日足 2014/1/1-2015/1/1

利益でてまっせ。年率 197.8%。

結果 AUDUSD(豪ドル米ドル)日足 2014/1/1-2015/1/1

利益でてまっせ。年率 216%。

上は去年1年の結果ですが、今年も使えるかな?

今月(2015/1/1-1/31)のテストでは EURUSD だけ利益が出ています。

###

 

 

クラウドフィルタ考案(2)

昨日の記事「クラウドフィルタ考案」で発案したクラウドフィルタですが、かけ方を変えてみました。

プライスが雲の中にあるときはエントリしないことにするわけですが、「雲の上にあるときは買いのみ、下にあるときは売りのみ」の条件をはずして、「中にあるときのみエントリしない」としてみました。

ドル円4時間足(2014/1/1 – 2015/1/1)で VQ システムにて評価します。

プロフィットファクターは前回より低下していますが、勝率はわずかにアップし、なにより最大ドローダウンが減少しています。

回数もあまり削減されていません(フィルタなしの場合は 205)。

収益はむしろアップ(フィルタなしの場合は 22017)。

効果はいいようです。

ちなみに前回(「雲の上にあるときは買いのみ、下にあるときは売りのみ」)は、 こちら。

まとめ

フィルタなし 前回(クラウド:強め) 今回(クラウド:弱め)
総損益$ 22017 13269.44 23470.13
PF 1.87 2.50 2.12
勝率% 43.41 43.37 44.94
最大ドローダウン% 14.41 32.77 13.11
最大勝ち$ 4777.44 4777.44 4777.44
最大負け$ -906 -591.79 -906
勝数 89 36 80
負数 116 47 98
取引回数 205 83 178

前回との比較では最大ドローダウンが約1/3 なので安心感が違いますね。

関連記事

クラウドフィルタ考案

クラウドフィルタ(弱め)のプログラムソース解説

1 宣言部にこれを加える。

int       Tenkan_sen=9;
int       Kijun_sen=26;
double    Senkou_span_b=52;

2 start 関数内に次の2行を加える。

     double cla1 = iIchimoku( NULL, 0, Tenkan_sen, Kijun_sen, Senkou_span_b, 3, Kijun_sen);
     double clb1 = iIchimoku( NULL, 0, Tenkan_sen, Kijun_sen, Senkou_span_b, 4, Kijun_sen);

3 売買条件に次の条件を加える。

&& ((Close[1]> cla1 && Close[1]>clb1)||(Close[1]< cla1 && Close[1]<clb1))

 

###

 

 

 

 

クラウドフィルタ考案

一目均衡表は大好きですが、それで使われるミステリアスな雲をフィルタにしてみようと思いつきました。

雲とは先行スパンA と 先行スパンB の間の領域です。

上でオレンジのラインが先行スパンA で、水色のラインが先行スパンB です。

プライスがこの間、つまり雲の中にあるときはエントリしないことにします。

雲の上にあるときは買いのみ、下にあるときは売りのみ、中にあるときはエントリしない・・・

このルールをクラウドフィルタと名付けることにします。

ドル円4時間足(2014/1/1 – 2015/1/1)で VQ システムにて評価します。

フィルタなし

まあまあの結果ですね。

クラウドフィルタあり

昨年前半のトレンドレスのところで、もっとロスをカットできるかと思ったら十分とりきれていませんね。

勝率は不変ですが、プロフィットファクタはアップ。最大ドローダウンがやや下がってめでたしめでたし。

面白いことに勝率はロングポジションで下がっているのにショートポジションではアップ。

トレード回数が 4割に減っているのに総損益は 6割になっており、効率がよくなっています。

他のフィルタと組み合わせてみましょうか。

###

BBW フィルタの使い方 / 決済編

BBW フィルタの2つめの使い方として、急騰あるいは急落後に ちゃぶついたときの決済というのを挙げましたが、次のチャートで説明します。

ドル円 5分足です。

バンドウォークで急落していますが、AとCのところで、ボリンバンドの収縮が始まっているのがサブウィンドゥの「BBWがシグナルを下抜けて」いることで示されています。そこでいったん決済です。

Bで再びボリンバンドが拡大し始めていますね。サブウィンドゥの「BBWがシグナルを上抜けて」いますから。A でできた下ヒゲが抵抗線になっていますから、それを下に越えたところで再び売りです。

それでCで手仕舞い。

おまけ

下は同じ期間の一目均衡表です。

Aですでに陰転していた雲を下抜け、転換線もクロスなので売りでしょう。

B(先ほどのチャートのAに相当)でのちゃぶつきは BBW を見れば決済してもいいですね。普通は持続でしょうが。

CではBBW を見れば決済ですね。遅行線が上向きかけているので、一目均衡表でも決済するでしょうが。

裁量トレードなら一目均衡表がわかりやすいですよね。

関連記事

Bollinger BandWidth について

###

ブレイクアウトシステムと BBW フィルタ

自作ブレイクアウトシステム(yasciiBreakout05)に BBW フィルタを組み込んでみました。

ドル円 4時間足 2014/1/1-2015/1/1

1つの負けが減って、1つ勝ちが増えただけのようです。

ちなみに前作はこちら。

まあ、ブレイクアウトするときは当然 BBW の値は増加しているわけで、やらずもがな(意味がなかった)というオチかなとも思っていましたが、1つだけでも改善したのはもうけものです。

プログラムソース

 

//
// yasciiBreakout06.mq4
//
//    with BBW filter

//マジックナンバーの定義
#define MAGIC  42882        

//パラメーターの設定//
extern double Lots = 1.0;     //取引ロット数
extern int Slip = 10;         //許容スリッページ数
extern string Comments =  "Breakout06"; //コメント

extern int Fast_period = 14 ;
extern int Slow_period = 40 ;
extern int Range_period = 21 ;
extern double margin = 0.0 ;
extern double Range_threshold = 550.0 ;

extern int       BB_Period=20;
double    Deviation=1.0;

extern double ILC = 160.0 ;
// extern double TP = 1100 ;

//変数の設定//
int Ticket_L = 0; //買い注文の結果をキャッチする変数
int Ticket_S = 0; //売り注文の結果をキャッチする変数
int Exit_L = 0;   //買いポジションの決済注文の結果をキャッチする変数
int Exit_S = 0;   //売りポジションの決済注文の結果をキャッチする変数
int OS1 ;
int OS2 ;

double   OOPL;
double   OOPS;

int start()
  {

   double FastHH1 = Close[iHighest(NULL, 0, MODE_CLOSE, Fast_period, 1)];
   double FastLL1 = Close[iLowest(NULL, 0, MODE_CLOSE, Fast_period, 1)];

   OS1 = OrderSelect(Ticket_L, SELECT_BY_TICKET);  

   //買いポジションのエグジット
   if( Bid < FastLL1-margin 
       && ( Ticket_L != 0 && Ticket_L != -1 ))
    {     
      Exit_L = OrderClose(Ticket_L,Lots,Bid,Slip,Red);
      if( Exit_L ==1 ) {Ticket_L = 0;}
    }    

   OS2 = OrderSelect(Ticket_S, SELECT_BY_TICKET); 

   //売りポジションのエグジット
   if( Ask> FastHH1+margin
       && ( Ticket_S != 0 && Ticket_S != -1 ))
    {     
      Exit_S = OrderClose(Ticket_S,Lots,Ask,Slip,Blue);
      if( Exit_S ==1 ) {Ticket_S = 0;} 
    }   

   if (Volume[0]>1 || IsTradeAllowed() == false) return(0) ;

   double FastHH2 = Close[iHighest(NULL, 0, MODE_CLOSE, Fast_period, 2)];
   double FastLL2 = Close[iLowest(NULL, 0, MODE_CLOSE, Fast_period, 2)];
   double SlowHH2 = Close[iHighest(NULL, 0, MODE_CLOSE, Slow_period, 2)];
   double SlowLL2 = Close[iLowest(NULL, 0, MODE_CLOSE, Slow_period, 2)];

   double value_range = High[iHighest(NULL, 0, MODE_HIGH, Range_period, 2)]-Low[iHighest(NULL, 0, MODE_LOW, Range_period, 2)];

   double bbw1 = iBands( NULL, 0, BB_Period, Deviation, 0, PRICE_CLOSE, 1, 1) -  iBands( NULL, 0, BB_Period, Deviation, 0, PRICE_CLOSE, 0, 1);
   double bbw2 = iBands( NULL, 0, BB_Period, Deviation, 0, PRICE_CLOSE, 1, 2) -  iBands( NULL, 0, BB_Period, Deviation, 0, PRICE_CLOSE, 0, 2);

   double lc = ILC;
   if(( Digits ==3 ) ||(Digits ==5)) lc = lc*10.0 ;

   //買いポジションのエグジット
   OS1 = OrderSelect(Ticket_L, SELECT_BY_TICKET);  
   OOPL = OrderOpenPrice();   
   if( ( (Close[2] >=FastLL2-margin && Close[1] < FastLL2-margin) || ( OOPL - lc*Point >= Close[1] ) ) //|| ( OOPL+TP*Point <= Close[1] ))
       && ( Ticket_L != 0 && Ticket_L != -1 ))
    {     
      Exit_L = OrderClose(Ticket_L,Lots,Bid,Slip,Blue);
      if( Exit_L ==1 ) {Ticket_L = 0;}
    }    

   //売りポジションのエグジット
   OS2 = OrderSelect(Ticket_S, SELECT_BY_TICKET); 
   OOPS = OrderOpenPrice();
   if(    ((Close[2] <=FastHH2+margin && Close[1] > FastHH2+margin) ||( OOPS + lc*Point <= Close[1] ))  //|| ( OrderOpenPrice()-TP*Point >= Close[1] ))
       && ( Ticket_S != 0 && Ticket_S != -1 ))
    {     
      Exit_S = OrderClose(Ticket_S,Lots,Ask,Slip,Red);
      if( Exit_S ==1 ) {Ticket_S = 0;} 
    }   

   //買いエントリー
   if(    Close[2] <= SlowHH2+margin && Close[1] > SlowHH2+margin && value_range < Range_threshold*Point && bbw1 > bbw2
       && ( Ticket_L == 0 || Ticket_L == -1 ) 
       && ( Ticket_S == 0 || Ticket_S == -1 ))
    {  
      Ticket_L = OrderSend(Symbol(),OP_BUY,Lots,Ask,Slip,0,0,Comments,MAGIC,0,Blue);
    }

   //売りエントリー
   if(    Close[2] >= SlowLL2-margin && Close[1] < SlowLL2-margin  && value_range < Range_threshold*Point && bbw1 > bbw2
       && ( Ticket_S == 0 || Ticket_S == -1 )
       && ( Ticket_L == 0 || Ticket_L == -1 ))
    {   
      Ticket_S = OrderSend(Symbol(),OP_SELL,Lots,Bid,Slip,0,0,Comments,MAGIC,0,Red);     
    } 

   return(0);
  }

###

VQ システムとフィルタ

本日、Boliinger BandWidth のプログラムを作りましたが、それをもとに BBW フィルタを作り、VQ を使った自作 EA に組み込んでみました。

このシステムにはすでに、

  1. Damiani フィルタ
  2. QQE フィルタ

を組み込んだものを作っています。

それぞれのフィルタの効果を調べてみました。

ドル円 4時間足 2014/1/1 – 2015/1/1

なし

Damiani

QQE

BBW

QQE+BBW

総損益$

22017

22141

10489

8149

3112

PF

1.87

1.88

2.15

2.26

1.87

勝率%

43.41

43.63

41.25

45.9

46.88

最大ドローダウン

39.22

14.32

45.83

16.64

26.75

最大勝ち$

4777.44 4777.44 4777.44

2727.81

1805.5

最大負け$

-906 -906

-591.79

-522.94

-519.2

勝数

89 89 33 28 15

負数

116 115 47 33 17

取引回数

205 204 80 61 32
  1. Damiani は 1回しか削減しませんでしたが、かなり大きな負けをカットしてくれたようで最大ドローダウンが激減しています。まあ、たまたまでしょうが。
  2. QQE は最大負けをカット。最大勝ちの分はカットせず。勝率やドローダウンはかえって少し悪くなったものの、PF(プロフィットファクター)は改善。回数が減るのがイタイですね。
  3. BBW はさらに回数が減ったが、勝率とPFはいい。ただ最大勝ちの分をカットしたのは残念。
  4. QQE+BBW ではその傾向がさらに顕著に。勝率 47.06%は魅力的ですがねぇ。

さらにいいフィルタを考え出すことにします。

システムによってフィルタの相性があるでしょうね。

たとえば BBW はブレイクアウトシステムにはもってこいだと思います。

関連記事

###

Bollinger BandWidth について

ボリンジャーバンド Bollinger Band という、投資家にとってはなくてはならないものがあります。

ご存じでない方、メインチャートに表示されている、平均足を上下から包むような緑のバンドがそれですよ。

これなくては投資の判断ができません (EA に任せきりの私が言っても説得力はないですが)。

Bollinger BandWidth というのはこのバンド幅のことです。

+σバンドとセンターバンドとの幅をとれば、StandardDeviation(この場合はインディケーター) と全く同じです。

*

ところが、この値は%表示ではなく、元となる値(ここでは価格)によって絶対値がそれぞれ異なってきます。

このような値は上昇や下降の判定が難しくなるので、シグナル(たいてい移動平均線)を作って、それとの大小関係をもって判断します。

そのもののカーブを時間軸方向にずらしたものもシグナル線として使えますが。

で、Bollinger BandWidth とシグナルが出るインディケーターを自作してみました。

上のチャートの黄色のVと緑のAは私があとで適当に書き加えました。

で、これがなんの役に立つのかというと、私の知る限り2つあります。

急激な上昇または下降の始まりを知る

「緑のA」をつけた部分では、Bollinger BandWidth がシグナルを上抜けていますが、これはトレンド発生(の可能性)を示します。

ブレイクアウトなどでエントリの判定基準の一つ(つまりフィルタ)に使えますね。

上昇か下降かの判定はできませんので、他の指標(VQ とか ADXDMI とかいろいろあるでしょ)で判断してください。

バンドウォークなどの利益確定に使う

「黄色のV」をつけた部分では、Bollinger BandWidth がシグナルを下抜けていますが、これはトレンド衰退の開始(の可能性)を示します。

バンドウォーク時などトレンドに乗っていると、最後の最後はだんだん ちゃぶついて来ますよね。

そのときにどこかで一度利益確定をしておこうかと思いますが、どこでやるのか非常に迷います。

そういうときの判断に役立つわけです。

シグナルを下抜けたところで早めに利益確定しておくと、すばやく頭を切り替えて次の勝負に取り掛かれますから。

プログラムソース

//+------------------------------------------------------------------+
//|                                            BBWRatio_S.mq4
//|                                                Yascii             
//|               MA_Period が 1 のときは単に曲線を1つずらします 
//+------------------------------------------------------------------+

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 Orange
#property indicator_color2 Aqua
#property indicator_width1 2
#property indicator_width2 1

//---- input parameters
extern int       BB_Period=20;
extern int       MA_Period=5;
extern double    Deviation=1.0;

double buf1[];
double buf2[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   IndicatorBuffers(2);
   IndicatorDigits(MarketInfo(Symbol(), MODE_DIGITS));
   SetIndexDrawBegin(0,BB_Period);
   SetIndexLabel(0,"BBandWidthRatio");
   SetIndexBuffer(0, buf1);
   SetIndexDrawBegin(1,BB_Period);
   SetIndexBuffer(1, buf2);
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----

//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {

   int i ;
   if(Bars<=BB_Period) return(0);
   int counted_bars=IndicatorCounted();
   int limit = Bars - counted_bars;
   if(counted_bars>BB_Period) i=Bars-counted_bars-1;

   i=Bars-BB_Period;

   for (i=limit - BB_Period; i>=0; i--)
   {
      buf1[i] = iBands( NULL, 0, BB_Period, Deviation, 0, PRICE_CLOSE, 1, i) -  iBands( NULL, 0, BB_Period, Deviation, 0, PRICE_CLOSE, 0, i);
    }

    if(MA_Period >1){
      for (i=limit - BB_Period; i>=0; i--)
      {
         buf2[i] = iMAOnArray(buf1,0,MA_Period,0,MODE_EMA,i);
      }
   }
   else     // MA_Period が 1 のとき
   {
      for (i=limit - BB_Period; i>=0; i--)
      {
         buf2[i] = buf1[i+1];
      }
   }
    return(0);

  }
//+------------------------------------------------------------------+

###

平均足システムの別種 / Heiken_Ashi_Realで平均足の移動平均線クロス(2)

前回の記事「平均足システムの別種 / Heiken_Ashi_Realで平均足の移動平均線クロス」 でご紹介したシステムを若干改良してみました。

改良点は、以前に作った従来の平均足システムの売買条件と決済条件を加えたこと。

売買の際は

  • 1つ前の足が売り買いと同じ方向を向いている場合に限定(アンド条件)・・・これはおそらく無意味

イクシットの際には

  • 1つ前と2つ前の足が売り買いと逆の方向を向いている場合も決済する(オア条件)

結果(ドル円 4時間足 2014/1/1 – 2015/1/1)

最大ドローダウンが減少し、総損益が上昇。

売買回数が増えていますが、早く抜けている分、次の売り買いのタイミングを逃さないですむからでしょうね。

ちなみに前作(yasciiHA03)の結果

 

関連記事

プログラムソース

//
// yasciiHA03a.mq4
//           Heiken_Ashi_Real(移動平均線クロス)を使用
//         通常平均足との組み合わせ

//マジックナンバーの定義
#define MAGIC  42218        

//パラメーターの設定//
extern double Lots = 1.0;     //取引ロット数
extern int Slip = 10;         //許容スリッページ数
extern string Comments =  "HA03a"; //コメント

extern int Fast_period = 14 ;
extern double margin = 0.0 ;

extern double ILC = 20.0 ;

//変数の設定//
int Ticket_L = 0; //買い注文の結果をキャッチする変数
int Ticket_S = 0; //売り注文の結果をキャッチする変数
int Exit_L = 0;   //買いポジションの決済注文の結果をキャッチする変数
int Exit_S = 0;   //売りポジションの決済注文の結果をキャッチする変数
int OS1 ;
int OS2 ;
double   OOPL;
double   OOPS;

int start(){

    //暴落対策(始め)

   double FastHH1 = Close[iHighest(NULL, 0, MODE_CLOSE, Fast_period, 1)];
   double FastLL1 = Close[iLowest(NULL, 0, MODE_CLOSE, Fast_period, 1)];

   //買いポジションのエグジット
   OS1 = OrderSelect(Ticket_L, SELECT_BY_TICKET);  
   if( Bid < FastLL1-margin 
       && ( Ticket_L != 0 && Ticket_L != -1 ))
    {     
      Exit_L = OrderClose(Ticket_L,Lots,Bid,Slip,Red);
      if( Exit_L ==1 ) {Ticket_L = 0;}
    }    

   //売りポジションのエグジット
   OS2 = OrderSelect(Ticket_S, SELECT_BY_TICKET); 
   if( Ask> FastHH1+margin
       && ( Ticket_S != 0 && Ticket_S != -1 ))
    {     
      Exit_S = OrderClose(Ticket_S,Lots,Ask,Slip,Blue);
      if( Exit_S ==1 ) {Ticket_S = 0;} 
    }   

   //暴落対策(終わり)

    if (Volume[0]>1 || IsTradeAllowed() == false) return(0) ;

       double HA_open1 = ( Open[2] + Close[2] ) / 2.0 ;
       double HA_close1 = ( Open[1] + Close[1] + High[1] + Low[1] ) / 4.0 ;
       double HA_open2 = ( Open[3] + Close[3] ) / 2.0 ;
       double HA_close2 = ( Open[2] + Close[2] + High[2] + Low[2] ) / 4.0 ;

       double HA_openMA1 = iCustom(NULL,0,"Downloads\\Heiken_Ashi_Real",2,1);
       double HA_openMA2 = iCustom(NULL,0,"Downloads\\Heiken_Ashi_Real",2,2);
       double HA_closeMA1 = iCustom(NULL,0,"Downloads\\Heiken_Ashi_Real",3,1);
       double HA_closeMA2 = iCustom(NULL,0,"Downloads\\Heiken_Ashi_Real",3,2);

   double lc = ILC;
   if(( Digits ==3 ) ||(Digits ==5)) lc = lc*10.0 ;

   //買いポジションのエグジット
    OS1 = OrderSelect(Ticket_L, SELECT_BY_TICKET);  
    OOPL = OrderOpenPrice();
    if(    ((HA_openMA1 > HA_closeMA1 && HA_openMA2 > HA_closeMA2) || ( HA_open1 > HA_close1 && HA_open2 > HA_close2) ||( OOPL - lc*Point >= Close[1] ) ) 
            && ( Ticket_L != 0 && Ticket_L != -1 ))
    {     
      Exit_L = OrderClose(Ticket_L,Lots,Bid,Slip,Red);
      if( Exit_L ==1 ) {Ticket_L = 0;}
    }    

   //売りポジションのエグジット
     OS2 = OrderSelect(Ticket_S, SELECT_BY_TICKET); 
     OOPS = OrderOpenPrice();
   if(    ((HA_openMA1 < HA_closeMA1 && HA_openMA2 < HA_closeMA2)||( HA_open1 < HA_close1 && HA_open2 < HA_close2)||( OOPS + lc*Point <= Close[1] ) ) 
          && ( Ticket_S != 0 && Ticket_S != -1 ))
    {     
      Exit_S = OrderClose(Ticket_S,Lots,Ask,Slip,Aqua);
      if( Exit_S ==1 ) {Ticket_S = 0;} 
    }   

   //買いエントリー
   if( HA_openMA1 < HA_closeMA1 && HA_openMA2 < HA_closeMA2 && HA_open1 < HA_close1
       && ( Ticket_L == 0 || Ticket_L == -1 ) 
       && ( Ticket_S == 0 || Ticket_S == -1 ))
    {  
      Ticket_L = OrderSend(Symbol(),OP_BUY,Lots,Ask,Slip,0,0,Comments,MAGIC,0,Red);
    }

   //売りエントリー
   if( HA_openMA1 > HA_closeMA1 && HA_openMA2 > HA_closeMA2 && HA_open1 > HA_close1 
       && ( Ticket_S == 0 || Ticket_S == -1 )
       && ( Ticket_L == 0 || Ticket_L == -1 ))
    {   
      Ticket_S = OrderSend(Symbol(),OP_SELL,Lots,Bid,Slip,0,0,Comments,MAGIC,0,Aqua);     
    } 

   return(0);

  }

###

いろんなシステムの総括

QQE の弱点を前回指摘しましたが、メインウィンドゥに

  1. 平均足移動平均線クロス
  2. ADXcross(赤と青の矢印)

を表示して、サブウィンドゥに、

  1. QQE
  2. VQ
  3. TII(Schaff Trend Cycle と似ています)

を表示してみました。

見比べてください。

売買サインが表示されていない平均足クロス、QQE、TII ではそれぞれの線のクロスでサインが出るとお考えください。

*

比較すると、売買サインがよく一致するのは、平均足クロス、ADXcross、VQ で、TII と QQE はトレンドはまずまずですが、レンジでボロが出ますね。

パラメーターの調整ではカバーしきれないくらいです。

*

平均足クロスはもともとの原理ではそもそもパラメーターがないのです。

調整しようがないわけですが、調整なんかしなくても優れているってことはやっぱり優れているってことですね。

オーバーフィッティング(カーブフィッティング)にならないわけですから。

###

QQE を使った自動売買ソフト(3)

前回の記事「QQE を使った自動売買ソフト(2) 」でご紹介した、QQE という指標を使った EA(expert advisor)ですが、昨日のテストではさんざんな結果に。

チャートの楕円で示したようにここのところドル円相場は規則正しい上下のボックス相場~三角もち合いですが、QQE はその動きに全くついていけておりません。

メインウィンドゥに表示した平均足クロスがきっちり値幅をとれているのと比較してください。

楕円以外のところを比較しても、平均足クロスに比べて QQE のクロスはポイントをかなりはずしていますね。

ということで、QQE システムは長ーいトレンドがないと、一方的に損失をふくらませてしまう欠点があるようです。

関連記事

###

平均足システムの別種 / Heiken_Ashi_Realで平均足の移動平均線クロス

Heiken_Ashi_Real というインディケーターが MetaTrader4 で無料ダウンロードできます。

平均足の始値と終値で別々に移動平均線を作って、そのクロスを売買シグナルに利用するというものです。

ピンクと黄色(わかりやすいように色をデフォルトとは変えてあります)の2本の移動平均線がクロスした次の足の始値で売買すればいいようです。

本当に役立つのか試しに自動売買プログラム(EA)化してみました。

ドル円 4時間足 2014/1/1 – 2015/1/1

プロフィットファクター1.98、勝率46.93% となかなかいいではないですか。

最大ドローダウンが 29.71%と高いですが。

資産曲線

昨年3ヶ月間(2014/10/1 – 2015/1/1) ならこんな具合。

やはりトレンド相場には強いですね。

いちおう、昨年のドル円相場のちゃぶついている時期の1月1日から8月1日の期間(下の楕円で囲んだ部分)の成績をとってみました。

 

2014/1/1 – 2014/8/1

なんと! 前半は苦しいが、後半の4月以降で(むしろ前半より値幅が減少しているのに!)取り戻しています。

トレンドがなくても勝てる可能性があるってことでしょうか。

もっと短い時間足(ミニトレンドが多いはず)では成績は悪くなるようなのですがナゾですね。

もう少し研究してみます。

プログラムソース(Heiken_Ashi_Real.ex4 が必要)

 

//
// yasciiHA03.mq4
//           Heiken_Ashi_Real(移動平均線クロス)を使用
//

//マジックナンバーの定義
#define MAGIC  42218        

//パラメーターの設定//
extern double Lots = 1.0;     //取引ロット数
extern int Slip = 10;         //許容スリッページ数
extern string Comments =  "HA03"; //コメント

extern int Fast_period = 14 ;
extern double margin = 0.0 ;

extern double ILC = 20.0 ;

//変数の設定//
int Ticket_L = 0; //買い注文の結果をキャッチする変数
int Ticket_S = 0; //売り注文の結果をキャッチする変数
int Exit_L = 0;   //買いポジションの決済注文の結果をキャッチする変数
int Exit_S = 0;   //売りポジションの決済注文の結果をキャッチする変数
int OS1 ;
int OS2 ;
double   OOPL;
double   OOPS;

int start(){

    //暴落対策(始め)

   double FastHH1 = Close[iHighest(NULL, 0, MODE_CLOSE, Fast_period, 1)];
   double FastLL1 = Close[iLowest(NULL, 0, MODE_CLOSE, Fast_period, 1)];

   //買いポジションのエグジット
   OS1 = OrderSelect(Ticket_L, SELECT_BY_TICKET);  
   if( Bid < FastLL1-margin 
       && ( Ticket_L != 0 && Ticket_L != -1 ))
    {     
      Exit_L = OrderClose(Ticket_L,Lots,Bid,Slip,Red);
      if( Exit_L ==1 ) {Ticket_L = 0;}
    }    

   //売りポジションのエグジット
   OS2 = OrderSelect(Ticket_S, SELECT_BY_TICKET); 
   if( Ask> FastHH1+margin
       && ( Ticket_S != 0 && Ticket_S != -1 ))
    {     
      Exit_S = OrderClose(Ticket_S,Lots,Ask,Slip,Blue);
      if( Exit_S ==1 ) {Ticket_S = 0;} 
    }   

   //暴落対策(終わり)

    if (Volume[0]>1 || IsTradeAllowed() == false) return(0) ;

       double HA_openMA1 = iCustom(NULL,0,"Downloads\\Heiken_Ashi_Real",2,1);
       double HA_openMA2 = iCustom(NULL,0,"Downloads\\Heiken_Ashi_Real",2,2);
       double HA_closeMA1 = iCustom(NULL,0,"Downloads\\Heiken_Ashi_Real",3,1);
       double HA_closeMA2 = iCustom(NULL,0,"Downloads\\Heiken_Ashi_Real",3,2);

   double lc = ILC;
   if(( Digits ==3 ) ||(Digits ==5)) lc = lc*10.0 ;

   //買いポジションのエグジット
    OS1 = OrderSelect(Ticket_L, SELECT_BY_TICKET);  
    OOPL = OrderOpenPrice();
    if(    ((HA_openMA1 > HA_closeMA1 && HA_openMA2 > HA_closeMA2) || ( OOPL - lc*Point >= Close[1] ) ) 
            && ( Ticket_L != 0 && Ticket_L != -1 ))
    {     
      Exit_L = OrderClose(Ticket_L,Lots,Bid,Slip,Red);
      if( Exit_L ==1 ) {Ticket_L = 0;}
    }    

   //売りポジションのエグジット
     OS2 = OrderSelect(Ticket_S, SELECT_BY_TICKET); 
     OOPS = OrderOpenPrice();
   if(    ((HA_openMA1 < HA_closeMA1 && HA_openMA2 < HA_closeMA2)||( OOPS + lc*Point <= Close[1] ) ) 
          && ( Ticket_S != 0 && Ticket_S != -1 ))
    {     
      Exit_S = OrderClose(Ticket_S,Lots,Ask,Slip,Aqua);
      if( Exit_S ==1 ) {Ticket_S = 0;} 
    }   

   //買いエントリー
   if( HA_openMA1 < HA_closeMA1 && HA_openMA2 < HA_closeMA2
       && ( Ticket_L == 0 || Ticket_L == -1 ) 
       && ( Ticket_S == 0 || Ticket_S == -1 ))
    {  
      Ticket_L = OrderSend(Symbol(),OP_BUY,Lots,Ask,Slip,0,0,Comments,MAGIC,0,Red);
    }

   //売りエントリー
   if( HA_openMA1 > HA_closeMA1 && HA_openMA2 > HA_closeMA2 
       && ( Ticket_S == 0 || Ticket_S == -1 )
       && ( Ticket_L == 0 || Ticket_L == -1 ))
    {   
      Ticket_S = OrderSend(Symbol(),OP_SELL,Lots,Bid,Slip,0,0,Comments,MAGIC,0,Aqua);     
    } 

   return(0);

  }

//終わり

###

ADX インディケーターについて

4つのサブウインドゥはいずれも ADX インディケーターです。

上から

  1. 標準の ADXDMI
  2. Advanced_ADX
  3. MW_ADXDMI
  4. 自作(yasciiADX)

です。

問題は、「標準の ADXDMI」の ADX値は白線で表されているのですが、「Advanced_ADX」の ADX値(峰の高さで示されている)と形状が違うことです。

「MW_ADXDMI」は「えつこチャート」で使うものですが、この ADX値はスケールが違うものの「標準の ADXDMI」の ADX値と一致します。

よく見ると、「MW_ADXDMI」、「標準の ADXDMI」の両者には「Advanced_ADX」にはないパラメーターがあり、それが「Smooth」と名付けられています。

もしや平滑化しているのかと思い、ADX のナマの値とそれを Smooth で表された期間で平滑化した値(いわゆるシグナル:ADXRと呼ぶ人も)の2つを表示させるインディケーターを自作したところ、疑問が氷解。

  1. 「MW_ADXDMI」、「標準の ADXDMI」では平滑化された ADXを表示
  2. 「Advanced_ADX」はナマのADX値を使っている

ということですね。

自作のインディケーターは ADX の上昇を知るためにも使えます。

  • 「ADX>平滑化したシグナル」 なら上昇過程
  • 「ADX<平滑化したシグナル」 なら下降過程

ですね。

ADX がある範囲(18~38)を上昇するときはトレンドが強まっているとき(儲けどき)なんです。

プログラムソース(yasciiADX)

//+------------------------------------------------------------------+
//|               yasciiADX
//|               ADX and Signal
//+------------------------------------------------------------------+
#property copyright "yascii"

#property indicator_separate_window
#property indicator_buffers 2

#property indicator_color1 Red
#property indicator_color2 Turquoise

#property indicator_minimum 0
// #property indicator_maximum 100
#property indicator_level1 18
#property indicator_level2 38
#property indicator_level3 50

//---- input parameters
extern int DMIPeriod=14;
extern int Smooth=10;
//---- buffers

double ADXs_S[];
double ADXs[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {

   IndicatorBuffers(2);
   SetIndexBuffer(0,ADXs);
   SetIndexBuffer(1,ADXs_S);
   IndicatorShortName("ADX("+DMIPeriod+","+Smooth+")");

   SetIndexLabel(0,"ADX");
   SetIndexLabel(1,"Signal");

   SetIndexDrawBegin(0,DMIPeriod);
   SetIndexDrawBegin(1,DMIPeriod);

//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Average Directional Movement Index                               |
//+------------------------------------------------------------------+
int start()
  {
   int counted_bars=IndicatorCounted();
   if(Bars<=DMIPeriod) return(0);
   int   limit = Bars - counted_bars;
   if(limit == Bars) limit -= Smooth-1;
   for(int i=limit-1; i>=0; i--)
   {
       ADXs[i] = iADX(NULL, 0, DMIPeriod, PRICE_CLOSE,MODE_MAIN, i);
   }
   for (i=limit-1; i>=0; i--)
   {
       ADXs_S[i] = iMAOnArray(ADXs,0,Smooth,0,MODE_EMA,i);
   }

      return(0);
  }
//+------------------------------------------------------------------+

###

VQ を使った自動売買ソフト

昔一世を風靡したインディケーターに VQ があります。

最近なぜか人気は下火になっていますが、実力はA級だと思っています。

これもトレンドに強い指標ですね。

 

サブウィンドゥが VQ です。

この矢印の通りに売買すれば結構勝てる気がしませんか?

ちゃぶついているところはミスショットが多いですが、ミニトレンドは結構最初から最後まできれいにとってくれています。

で、この矢印とおりに売買するソフトを作ってテストしてみました。

USDJPY 4時間足(2014/1/1-2015/1/1)

フィルタなしでも結構うまくいっています。

取引数も結構多いので、ここからフィルタをかけて磨けばなかなかよくなりそうな予感がします。

資産曲線

ドローダウンも埋めていけそうな気がしますね。

###

Trend Intensity Index を使った EA(2) Damiani filter版

以前の記事で紹介した Trend Intensity Index(TII) という指標で作った EA ですが、Damiani フィルタにより ノントレンドのときのエントリをカットしてみました。

バックテスト結果(2014/1/1-2015/1/4)USDJPY 1時間足

プロフィットファクター 1.69、勝率 39.84%、最大ドローダウン 15.37% と若干改善。資金は 2.26倍に。

もう少し効きのいいフィルタがほしいですが。

ちなみに改善前

収益曲線

ちなみに改善前

ドローダウンは見るからに改善しましたね。Damiani、やるじゃん。

関連記事

プログラムソース

//
//    yasciiTII03
//            with Damiani
//   動作には TII_RLH.ex4 が必要

//マジックナンバーの定義
#define MAGIC  42239        

//パラメーターの設定//
extern double Lots = 1.0;     //取引ロット数
extern int Slip = 10;         //許容スリッページ数
extern string Comments =  "TII03"; //コメント

extern int Major_Period=16;
extern int Minor_Period=11;
int Major_MaMode=1; //0=sma, 1=ema, 2=smma, 3=lwma, 4=lsma
extern int Major_PriceMode=0;//0=close, 1=open, 2=high, 3=low, 4=median(high+low)/2, 5=typical(high+low+close)/3, 6=weighted(high+low+close+close)/4
color LevelColor=Silver;
extern int BuyLevel=35;
int MidLevel=50;
extern int SellLevel=77;
extern int R1Level=3;
extern int R2Level=97;
extern int Fast_period = 14 ;
extern double margin = 0.0 ;

extern double ILC = 60.0 ;

//---- input parameters damiani_filter用
extern int       Viscosity=13;
extern int       Sedimentation=50;
extern double    Threshold_level=1.3;
extern bool      lag_supressor=true;

//変数の設定//
int Ticket_L = 0; //買い注文の結果をキャッチする変数
int Ticket_S = 0; //売り注文の結果をキャッチする変数
int Exit_L = 0;   //買いポジションの決済注文の結果をキャッチする変数
int Exit_S = 0;   //売りポジションの決済注文の結果をキャッチする変数
int OS1 ;
int OS2 ;
double   OOPL;
double   OOPS;

//damiani_filter用
double    lag_s_K=0.5;
double   s0 = 0; 
double   s1= 0;
double   s2 = 0;
double   s3 = 0;
double   vol=0;
double t=Threshold_level;

int damiani_f()
{

      double sa=iATR(NULL,0,Viscosity,1);
      double ia = iATR(NULL,0,Sedimentation,1) ;
      if(lag_supressor){
         if (ia == 0) vol = 1.0 ;
         else vol= sa/ia + lag_s_K*(s1-s3);   
      }else{
         if (ia == 0) vol = 1.0 ;
         else vol= sa/ia;   
      }

      double anti_thres=iStdDev(NULL,0,Viscosity,0,MODE_LWMA,PRICE_TYPICAL,1);

      double isd = iStdDev(NULL,0,Sedimentation,0,MODE_LWMA,PRICE_TYPICAL,1) ;
      if (isd == 0) anti_thres = 1.0 ;
      else anti_thres = anti_thres/isd ;

      t=t-anti_thres;

      s3 = s2; s2 = s1; s1= s0; 
      s0 = vol;

      if (vol>t){
      	return(1);
      }else{
      	return(0);
      }
}

int start(){

    //暴落対策(始め)

   double FastHH1 = Close[iHighest(NULL, 0, MODE_CLOSE, Fast_period, 1)];
   double FastLL1 = Close[iLowest(NULL, 0, MODE_CLOSE, Fast_period, 1)];

   //買いポジションのエグジット
   OS1 = OrderSelect(Ticket_L, SELECT_BY_TICKET);  
   if( Bid < FastLL1-margin 
       && ( Ticket_L != 0 && Ticket_L != -1 ))
    {     
      Exit_L = OrderClose(Ticket_L,Lots,Bid,Slip,Red);
      if( Exit_L ==1 ) {Ticket_L = 0;}
    }    

   //売りポジションのエグジット
   OS2 = OrderSelect(Ticket_S, SELECT_BY_TICKET); 
   if( Ask> FastHH1+margin
       && ( Ticket_S != 0 && Ticket_S != -1 ))
    {     
      Exit_S = OrderClose(Ticket_S,Lots,Ask,Slip,Blue);
      if( Exit_S ==1 ) {Ticket_S = 0;} 
    }   

   //暴落対策(終わり)

    if (Volume[0]>1 || IsTradeAllowed() == false) return(0) ;

       double tii1 = iCustom(NULL, 0,"TII_RLH", Major_Period, Major_MaMode, Major_PriceMode, Minor_Period, LevelColor , BuyLevel, MidLevel , SellLevel, 0 , 1);
       double tii2 = iCustom(NULL, 0,"TII_RLH", Major_Period, Major_MaMode, Major_PriceMode, Minor_Period, LevelColor , BuyLevel, MidLevel , SellLevel, 0 , 2);
       double tii3 = iCustom(NULL, 0,"TII_RLH", Major_Period, Major_MaMode, Major_PriceMode, Minor_Period, LevelColor , BuyLevel, MidLevel , SellLevel, 0 , 3);       
       double tii4 = iCustom(NULL, 0,"TII_RLH", Major_Period, Major_MaMode, Major_PriceMode, Minor_Period, LevelColor , BuyLevel, MidLevel , SellLevel, 0 , 4);   
       double tiiSM1 = (tii1+tii2+tii3) / 3.0 ;
       double tiiSM2 = (tii4+tii2+tii3) / 3.0 ;

   double lc = ILC;
   if(( Digits ==3 ) ||(Digits ==5)) lc = lc*10.0 ;

   //買いポジションのエグジット
    OS1 = OrderSelect(Ticket_L, SELECT_BY_TICKET);  
    OOPL = OrderOpenPrice();
    if(    ((tii1 < R2Level && tii2 > R2Level) || (tii1 < tiiSM1 && tii2 > tiiSM2 && tii1 > BuyLevel && tii1 < R2Level) || ( OOPL - lc*Point >= Close[1] ) ) 
            && ( Ticket_L != 0 && Ticket_L != -1 ))
    {     
      Exit_L = OrderClose(Ticket_L,Lots,Bid,Slip,Red);
      if( Exit_L ==1 ) {Ticket_L = 0;}
    }    

   //売りポジションのエグジット
   OS2 = OrderSelect(Ticket_S, SELECT_BY_TICKET); 
   OOPS = OrderOpenPrice();
   if(    ((tii1 > R1Level && tii2 < R1Level )|| (tii1 > tiiSM1 && tii2 < tiiSM2 && tii1 > R1Level && tii1 < SellLevel)||( OOPS + lc*Point <= Close[1] ) ) 
          && ( Ticket_S != 0 && Ticket_S != -1 ))
    {     
      Exit_S = OrderClose(Ticket_S,Lots,Ask,Slip,Blue);
      if( Exit_S ==1 ) {Ticket_S = 0;} 
    }   

   //買いエントリー
   if( ((tii1 > BuyLevel && tii2 < BuyLevel) || (tii1 > tiiSM1 && tii2 < tiiSM2 && tii1 > BuyLevel && tii1 < R2Level) ) && damiani_f() ==1
       && ( Ticket_L == 0 || Ticket_L == -1 ) 
       && ( Ticket_S == 0 || Ticket_S == -1 ))
    {  
      Ticket_L = OrderSend(Symbol(),OP_BUY,Lots,Ask,Slip,0,0,Comments,MAGIC,0,Red);
    }

   //売りエントリー
   if(( (tii1 < SellLevel && tii2 > SellLevel) || (tii1 < tiiSM1 && tii2 > tiiSM2 && tii1 > R1Level && tii1 < SellLevel)) && damiani_f() ==1
       && ( Ticket_S == 0 || Ticket_S == -1 )
       && ( Ticket_L == 0 || Ticket_L == -1 ))
    {   
      Ticket_S = OrderSend(Symbol(),OP_SELL,Lots,Bid,Slip,0,0,Comments,MAGIC,0,Blue);     
    } 

   return(0);

  }
// 終わり

###

Trend Intensity Index を使った EA

以前の記事で紹介した Trend Intensity Index(TII) という指標で作った EA ですが、実際にサーバー上で運用すると致命的バグを発見。

修正したコードを載せます。

バックテスト結果(2014/1/1-2015/1/4)USDJPY 1時間足です。

プロフィットファクター 1.38、勝率 37.50%、最大ドローダウン 26.90% と散々な結果でした。

レンジ相場を除くとまずまずかもしれませんが。

関連記事

プログラソース(TII_RLH.ex4 が必要)

//
//    yasciiTII02
//

//マジックナンバーの定義
#define MAGIC  42235        

//パラメーターの設定//
extern double Lots = 1.0;     //取引ロット数
extern int Slip = 10;         //許容スリッページ数
extern string Comments =  "TII02"; //コメント

extern int Major_Period=18;
extern int Minor_Period=12;
int Major_MaMode=1; //0=sma, 1=ema, 2=smma, 3=lwma, 4=lsma
extern int Major_PriceMode=0;//0=close, 1=open, 2=high, 3=low, 4=median(high+low)/2, 5=typical(high+low+close)/3, 6=weighted(high+low+close+close)/4
color LevelColor=Silver;
extern int BuyLevel=37;
int MidLevel=50;
extern int SellLevel=65;
extern int R1Level=3;
extern int R2Level=97;

extern int Fast_period = 14 ;
extern double margin = 0.0 ;

extern double ILC = 60.0 ;
// extern double TP = 110 ;

//変数の設定//
int Ticket_L = 0; //買い注文の結果をキャッチする変数
int Ticket_S = 0; //売り注文の結果をキャッチする変数
int Exit_L = 0;   //買いポジションの決済注文の結果をキャッチする変数
int Exit_S = 0;   //売りポジションの決済注文の結果をキャッチする変数
int OS1 ;
int OS2 ;
double   OOPL;
double   OOPS;

int start(){

    //暴落対策(始め)

   double FastHH1 = Close[iHighest(NULL, 0, MODE_CLOSE, Fast_period, 1)];
   double FastLL1 = Close[iLowest(NULL, 0, MODE_CLOSE, Fast_period, 1)];

   OS1 = OrderSelect(Ticket_L, SELECT_BY_TICKET);  

   //買いポジションのエグジット
   if( Bid < FastLL1-margin 
       && ( Ticket_L != 0 && Ticket_L != -1 ))
    {     
      Exit_L = OrderClose(Ticket_L,Lots,Bid,Slip,Red);
      if( Exit_L ==1 ) {Ticket_L = 0;}
    }    

   OS2 = OrderSelect(Ticket_S, SELECT_BY_TICKET); 

   //売りポジションのエグジット
   if( Ask> FastHH1+margin
       && ( Ticket_S != 0 && Ticket_S != -1 ))
    {     
      Exit_S = OrderClose(Ticket_S,Lots,Ask,Slip,Blue);
      if( Exit_S ==1 ) {Ticket_S = 0;} 
    }   

   //暴落対策(終わり)

    if (Volume[0]>1 || IsTradeAllowed() == false) return(0) ;

       double tii1 = iCustom(NULL, 0,"TII_RLH", Major_Period, Major_MaMode, Major_PriceMode, Minor_Period, LevelColor , BuyLevel, MidLevel , SellLevel, 0 , 1);
       double tii2 = iCustom(NULL, 0,"TII_RLH", Major_Period, Major_MaMode, Major_PriceMode, Minor_Period, LevelColor , BuyLevel, MidLevel , SellLevel, 0 , 2);
       double tii3 = iCustom(NULL, 0,"TII_RLH", Major_Period, Major_MaMode, Major_PriceMode, Minor_Period, LevelColor , BuyLevel, MidLevel , SellLevel, 0 , 3);       
       double tii4 = iCustom(NULL, 0,"TII_RLH", Major_Period, Major_MaMode, Major_PriceMode, Minor_Period, LevelColor , BuyLevel, MidLevel , SellLevel, 0 , 4);   
       double tiiSM1 = (tii1+tii2+tii3) / 3.0 ;
       double tiiSM2 = (tii4+tii2+tii3) / 3.0 ;

   double lc = ILC;
   if(( Digits ==3 ) ||(Digits ==5)) lc = lc*10.0 ;

   //買いポジションのエグジット
    OS1 = OrderSelect(Ticket_L, SELECT_BY_TICKET);  
    OOPL = OrderOpenPrice();
    if(    ((tii1 < R2Level && tii2 > R2Level) || (tii1 < tiiSM1 && tii2 > tiiSM2 && tii1 > BuyLevel && tii1 < R2Level) || ( OOPL - lc*Point >= Close[1] ) ) //|| ( OOPL+TP <= Close[1] ))
            && ( Ticket_L != 0 && Ticket_L != -1 ))
    {     
      Exit_L = OrderClose(Ticket_L,Lots,Bid,Slip,Red);
      if( Exit_L ==1 ) {Ticket_L = 0;}
    }    

   //売りポジションのエグジット
   OS2 = OrderSelect(Ticket_S, SELECT_BY_TICKET); 
   OOPS = OrderOpenPrice();
   if(    ((tii1 > R1Level && tii2 < R1Level )|| (tii1 > tiiSM1 && tii2 < tiiSM2 && tii1 > R1Level && tii1 < SellLevel)||( OOPS + lc*Point <= Close[1] ) ) //|| ( OrderOpenPrice()-TP >= Close[1] ))
          && ( Ticket_S != 0 && Ticket_S != -1 ))
    {     
      Exit_S = OrderClose(Ticket_S,Lots,Ask,Slip,Blue);
      if( Exit_S ==1 ) {Ticket_S = 0;} 
    }   

   //買いエントリー
   if( ((tii1 > BuyLevel && tii2 < BuyLevel) || (tii1 > tiiSM1 && tii2 < tiiSM2 && tii1 > BuyLevel && tii1 < R2Level) )
       && ( Ticket_L == 0 || Ticket_L == -1 ) 
       && ( Ticket_S == 0 || Ticket_S == -1 ))
    {  
      Ticket_L = OrderSend(Symbol(),OP_BUY,Lots,Ask,Slip,0,0,Comments,MAGIC,0,Red);
    }

   //売りエントリー
   if(( (tii1 < SellLevel && tii2 > SellLevel) || (tii1 < tiiSM1 && tii2 > tiiSM2 && tii1 > R1Level && tii1 < SellLevel))
       && ( Ticket_S == 0 || Ticket_S == -1 )
       && ( Ticket_L == 0 || Ticket_L == -1 ))
    {   
      Ticket_S = OrderSend(Symbol(),OP_SELL,Lots,Bid,Slip,0,0,Comments,MAGIC,0,Blue);     
    } 

   return(0);

  }
###

QQE を使った自動売買ソフト(2)

前回の記事「QQE を使った自動売買ソフト」でご紹介した、QQE という指標を使った EA(expert advisor)ですが、プログラムソースを載せます。

QQE_with_Alerts.ex4 というインディケーターが必要ですが、MetaTrader4 からダウンロードできます。

USDJPY 4時間足(2014/1/1-2015/1/1)の結果

パラメーターは SF = 4、LossCut = 20。

プロフィットファクター4.57(過去最高)。勝率 59.38%(過去最高)。最大ドローダウン 6.75%(過去最低=最良)。

ただ、売買回数が少ないです。11日に1回です。

そのため、資産は 3.2倍にしかなりません。^^

USDJPY 1時間足(2014/1/1-2015/1/1)の結果

パラメーターは SF = 5、LossCut = 40。

プロフィットファクター 2.26。勝率 50.00%。最大ドローダウン 8.59% と数字は悪くなりますが、売買回数は倍以上になります。

資産は 1.8倍どまり。なかなかうまくいきません。

いずれにしろトレンド相場でしか稼げないタイプです。

ちなみに時間足が短くなれば成績は悪化します。

関連記事

プログラムソース

//
// yasciiQQEcross01.mq4
//              QQE_with_Alerts.ex4 が必要
//                

//マジックナンバーの定義
#define MAGIC  42527        

//パラメーターの設定//
extern double Lots = 1.0;     //取引ロット数
extern int Slip = 10;         //許容スリッページ数
extern string Comments =  "QQE01"; //コメント

extern int SF = 5;
extern double LossCut = 40.0 ;

//変数の設定//
int Ticket_L = 0; //買い注文の結果をキャッチする変数
int Ticket_S = 0; //売り注文の結果をキャッチする変数
int Exit_L = 0;   //買いポジションの決済注文の結果をキャッチする変数
int Exit_S = 0;   //売りポジションの決済注文の結果をキャッチする変数

double   QQE_MAIN1 ;
double   QQE_Signal1 ;
double   QQE_MAIN2 ;
double   QQE_Signal2 ;

int OS ;

int start()
  {

    if (Volume[0]>1 || IsTradeAllowed() == false) return(0) ;

   QQE_MAIN1 = iCustom(NULL, 0, "Downloads\\QQE_with_Alerts" ," --- INDICATOR SETTINGS ---",SF," --- Alerts ---",50,true,true,"alert.wav",false ,0, 1 );
   QQE_Signal1 = iCustom(NULL, 0, "Downloads\\QQE_with_Alerts" ," --- INDICATOR SETTINGS ---",SF," --- Alerts ---",50,true,true,"alert.wav",false ,1, 1 );
   QQE_MAIN2 = iCustom(NULL, 0, "Downloads\\QQE_with_Alerts" ," --- INDICATOR SETTINGS ---",SF," --- Alerts ---",50,true,true,"alert.wav",false ,0, 2 );
   QQE_Signal2 = iCustom(NULL, 0, "Downloads\\QQE_with_Alerts" ," --- INDICATOR SETTINGS ---",SF," --- Alerts ---",50,true,true,"alert.wav",false ,1, 2 );

   double lc = LossCut;
   if(( Digits ==3 ) ||(Digits ==5)) lc = lc*10.0 ;

   //買いポジションのエグジット
   OS = OrderSelect(Ticket_L, SELECT_BY_TICKET);  
   if(    ((QQE_MAIN1 < QQE_Signal1  &&  QQE_MAIN2 > QQE_Signal2) || ( OrderOpenPrice() - lc * Point >= Close[1] ))
       && ( Ticket_L != 0 && Ticket_L != -1 ))
    {     
      Exit_L = OrderClose(Ticket_L,Lots,Bid,Slip,Red);
      if( Exit_L ==1 ) {Ticket_L = 0;}
    }    

   //売りポジションのエグジット
   OS = OrderSelect(Ticket_S, SELECT_BY_TICKET); 
   if(    ((QQE_MAIN1 > QQE_Signal1  &&  QQE_MAIN2 < QQE_Signal2) ||( OrderOpenPrice() + lc * Point <= Close[1] ))
       && ( Ticket_S != 0 && Ticket_S != -1 ))
    {     
      Exit_S = OrderClose(Ticket_S,Lots,Ask,Slip,Blue);
      if( Exit_S ==1 ) {Ticket_S = 0;} 
    }   

   //買いエントリー
   if(    QQE_MAIN1 > QQE_Signal1  &&  QQE_MAIN2 < QQE_Signal2  && QQE_MAIN1 > 50.0
       && ( Ticket_L == 0 || Ticket_L == -1 ) 
       && ( Ticket_S == 0 || Ticket_S == -1 ))
    {  
      Ticket_L = OrderSend(Symbol(),OP_BUY,Lots,Ask,Slip,0,0,Comments,MAGIC,0,Red);
    }

   //売りエントリー
   if(    QQE_MAIN1 < QQE_Signal1  &&  QQE_MAIN2 > QQE_Signal2 && QQE_MAIN1 <= 50.0
       && ( Ticket_S == 0 || Ticket_S == -1 )
       && ( Ticket_L == 0 || Ticket_L == -1 ))
    {   
      Ticket_S = OrderSend(Symbol(),OP_SELL,Lots,Bid,Slip,0,0,Comments,MAGIC,0,Blue);     
    } 

   return(0);
  }

 

###

QQE を使った自動売買ソフト

QQE という RSI を元にした指標がありまして、結構精度が高いので気になっていました。

オシレーターの部類なのですが、シグナルを出るように改良した QQE_with_Alerts.ex4 というインディケーターを入手して分析。

それを使って自動売買ソフト(EA: expert advisor)を作ってバックテストしてみました。

こんな感じです。

 

ロジックとしては、青い実線(QQE)が黄色の点線(シグナル)を上抜ければ買い、下抜ければ売りなのですが、そのまま売買すると結構ロスが出ます。

そこで、QQE が 50以上のときに買いのみ、50未満のときは売りのみという制限をつけますと、非常にいい感じになりました。

USDJPY 1時間足で、2014/6/1-2015/1/23 (日時を合わせるのを忘れてこうなりました) での結果です。

 

約8ヶ月の結果としては結構いいのではないでしょうか。

資金が 1.8倍になりました。

なにより最大ドローダウンが 8.87% と過去最良で安心感バツグンです。

プロフィットファクター 2.09、勝率 50% も文句なしです。

ドル円相場はこの期間は前半はレンジ、後半は上りトレンドでした。

レンジ相場で損失を出しておりませんし、トレンド相場でショート方向の勝率もロング方向とほぼ同じというのもありがたいですね。

うちの3番バッターになりそうな予感です。

ちょっと改良してから試験運用してみます。

関連記事

###

実戦デイトレーディング―株取引、革命バイブル / 串田 誠一

実戦デイトレーディング―株取引、革命バイブル (ホームマネジメントシリーズ) 実戦デイトレーディング―株取引、革命バイブル (ホームマネジメントシリーズ)

串田 誠一

ローカス 2000-01

売り上げランキング : 1492136

Amazonで詳しく見る

by G-Tools

★★☆☆☆(そうかもしれないが、やる気は起きない)

これも大昔に買った株の本。著者は弁護士とか。

寄りつきで買ってすぐにリミットを入れ、一日の終わりに売れていなければ手じまうという簡単なもの。

当時は OCO 注文ができなかったものと思われます。

今なら当然 OCO でしょ。

一日の変動で小さな利益を抜くので、一方的な下げのときは利益を得られませんね。

小さい勝ちを積み上げても大きな負けで破滅しそうな気もしますが、今のような安い手数料なら十分通用するかもしれません。

チャートと組み合わせて、もうすこし利幅をとりたいところですね。

###

株 デイトレード常勝のルール / 二階堂 重人

株 デイトレード常勝のルール 株 デイトレード常勝のルール

二階堂 重人

すばる舎 2008-02-20

売り上げランキング : 361489

Amazonで詳しく見る

by G-Tools

★★★☆☆(ごく初歩)

大昔に買って読んだはずの本ですが、読んだ記憶がない・・・

デイトレードのマインドについては他にいい本がありますが、初心者向けの簡単なテクニックを教えてくれるという点で、まあこのページ数では妥当な内容です。

カンではなくルールを作り、それに従うことが重要ということです。となれば、いわゆるシステムトレードなのですが。

株より FX のほうがそれはやりやすいのですから、私は株をやろうとは思いません。

株をやるなら少なくともこの本と、他に20冊くらい読まなきゃ怖くて投資できませんね。

関連記事

###

スローな TII にしてくれ

TII をさらに使いやすくする方法を考えました。

下のチャートのサブウィンドウに3種類の TII すなわち、

  1. オリジナルの TII
  2. TII にシグナルを付加したもの(自作)
  3. TII のシグナルをさらに平滑化したシグナルのシグナルを付加したもの(自作)

を表示してみました。

 

スローストキャステクスっぽくなってしまいましたネ。

*

この手の指標は 0からの上離れと 100からの下離れを売買指標にするわけ(一番下のサブウィンドウでの↑↓の部位)ですが、それはこの3種類のどれでも簡単に判定できます。

問題は 50付近での絡み合いの部分です(○で囲った部分)。

ここで S字カーブを描いたり、場合によっては元来た方へ戻る場合があり、それぞれの処理が必要となります。

S字カーブを描いたりする場合、右の○のように TII が連峰状(六ヶ岳?)になるとシグナルがない場合はドテン売買がその都度発生し、ロスがふくらみます。

シグナルとのクロスで 2回までに減らせますし、シグナルと「シグナルのシグナル」とのクロスではパラメーター次第ですがさらに回数を減らせます。

*

裁量の方にはたいした違いはないのですが、EA化するのには重要な処置になります。

関連記事

*

プログラムソース(オリジナルの TII_RLH を改変)

//+--------------------------------------------------------------------+
//|                                                   TII_RLH_S2       |
//|                                    Copyright ゥ 2006, Robert Hill   |
//|                                       http://www.metaquotes.net/   |
//+--------------------------------------------------------------------+                                                                   |

#property  copyright "Copyright 2006, Robert Hill "
#property  link      "http://www.metaquotes.net/"
//---- indicator settings
#property  indicator_separate_window
#property  indicator_buffers 3
#property  indicator_color1  Red
#property  indicator_color2  Aqua
#property  indicator_color3  Green

#property  indicator_width1  2
#property  indicator_width2  1
#property  indicator_width3  1

//----
extern int Major_Period=60;
extern int Major_MaMode=1; //0=sma, 1=ema, 2=smma, 3=lwma, 4=lsma
extern int Major_PriceMode=0;//0=close, 1=open, 2=high, 3=low, 4=median(high+low)/2, 5=typical(high+low+close)/3, 6=weighted(high+low+close+close)/4
extern int Minor_Period=30;
extern color LevelColor=Silver;
extern int BuyLevel=20;
extern int MidLevel=50;
extern int SellLevel=80;

extern int SigPeriod1 = 8;
extern int SigPeriod2 = 10;

//---- buffers
double ma[];
double ma_dev[];
double tii[];

double tiis[];
double tiis2[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- drawing settings
   IndicatorBuffers(5);
   SetIndexStyle(0,DRAW_LINE);
   SetIndexDrawBegin(0,Major_Period);
   IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS)+2);
//---- 3 indicator buffers mapping
   SetIndexBuffer(0,tii);
   SetIndexBuffer(1,tiis);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexDrawBegin(1,Major_Period);

   SetIndexBuffer(2,tiis2);
   SetIndexStyle(2,DRAW_LINE);
   SetIndexDrawBegin(2,Major_Period);

   SetIndexBuffer(3,ma_dev);
   SetIndexBuffer(4,ma);

//---- name for DataWindow and indicator subwindow label
   IndicatorShortName(" TII  ,  Major_Period ( "+Major_Period+" )  ,  Minor_Period  ( "+Minor_Period+" ), ");
   SetLevelStyle(STYLE_DASH,1,LevelColor);
   SetLevelValue(0,BuyLevel);
   SetLevelValue(1,MidLevel);
   SetLevelValue(2,SellLevel);
//---- initialization done
   return(0);
  }
//+------------------------------------------------------------------+
//| LSMA with PriceMode                                              |
//| PrMode  0=close, 1=open, 2=high, 3=low, 4=median(high+low)/2,    |
//| 5=typical(high+low+close)/3, 6=weighted(high+low+close+close)/4  |
//+------------------------------------------------------------------+
double LSMA(int Rperiod,int prMode,int shift)
  {
   int i;
   double sum,pr;
   int length;
   double lengthvar;
   double tmp;
   double wt;
//----
   length=Rperiod;
   sum=0;
   for(i=length; i>=1;i--)
     {
      lengthvar=length+1;
      lengthvar/=3;
      tmp=0;
      switch(prMode)
        {
         case 0: pr=Close[length-i+shift];break;
         case 1: pr=Open[length-i+shift];break;
         case 2: pr=High[length-i+shift];break;
         case 3: pr=Low[length-i+shift];break;
         case 4: pr=(High[length-i+shift] + Low[length-i+shift])/2;break;
         case 5: pr=(High[length-i+shift] + Low[length-i+shift] + Close[length-i+shift])/3;break;
         case 6: pr=(High[length-i+shift] + Low[length-i+shift] + Close[length-i+shift] + Close[length-i+shift])/4;break;
        }
      tmp =(i - lengthvar)*pr;
      sum+=tmp;
     }
   wt=sum*6/(length*(length+1));
//----
   return(wt);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   int i,j,limit;
   double sdPos,sdNeg;

   int counted_bars=IndicatorCounted();
   if(counted_bars<0) return(-1);
   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;
   if(counted_bars==0) limit-=1+MathMax(Major_Period,Minor_Period);

//----
   for(i=limit; i>=0; i--)
     {
      if(Major_MaMode==4)
        {
         ma[i]=LSMA(Major_Period,Major_PriceMode,i);
        }
      else
        {
         ma[i]=iMA(NULL,0,Major_Period,0,Major_MaMode,Major_PriceMode,i);
        }
      ma_dev[i]=Close[i]-ma[i];
     }
//========== COLOR CODING ===========================================               
   for(i=0; i<=limit; i++)
     {
      sdPos=0;
      sdNeg=0;

      for(j=i;j<i+Minor_Period;j++)
        {
         if(ma_dev[j]>=0) sdPos=sdPos+ma_dev[j];
         if(ma_dev[j]<0) sdNeg=sdNeg+ma_dev[j];
        }
      tii[i]=100*sdPos/(sdPos-sdNeg);
     } 
   for(i=0; i<=limit; i++)
     {
      tiis[i] = iMAOnArray(tii,0,SigPeriod1,0,MODE_EMA,i); 
     }
   for(i=0; i<=limit; i++)
     {
      tiis2[i] = iMAOnArray(tiis,0,SigPeriod2,0,MODE_EMA,i); 
     }

//----
   return(0);
  }

//+------------------------------------------------------------------+

###

究極のテクニカル分析 / 黒岩 泰

究極のテクニカル分析 究極のテクニカル分析

黒岩 泰

オーエス出版 2004-03-19

売り上げランキング : 231964

Amazonで詳しく見る

by G-Tools

★★☆☆☆

株式投資について書かれていますが、テクニカルの教科書なので FX にも応用できるかなと思って買いました。

「窓」と「ひげ」について持論を述べておられますが、ちょっと強引なところもあり、曖昧模糊な部分もあり。

ということで、実際に役に立つ印象ではないですね。

最後のテクニカル指標のランク付けが一番よかったかも。一目均衡表 とストキャスティクスの点が高いですね。

###

Schaff Trend Cycle について

Schaff Trend Cycle は私の好きな指標の一つで、MACD のストキャスをストキャスしたものです。

0%(売られすぎ=下げトレンド) と 100%(買われすぎ=上げトレンド) に張り付いていることが多いですが、トレンドが変わるときに大きく動きます。

ダマシが少ない特長と敏感さを併せ持つ、なかなか使えるヤツです。

下のチャートはサブウィンドゥが4つありますが、上から

  1. Schaff Trend Cycle.ex4 (MetaTrader4 標準添付)
  2. STC_pure.ex4 (temjin さん作)
  3. Schaff_Trend_s.ex4 (Schaff Trend Cycle.ex4 にシグナルを付加したもの)
  4. STC_pure.ex4 (STC_pure.ex4 にシグナルを付加したもの)

です。

パラメーターは、MA_Short=8 、 MA_Long=13 、 MA_Cycle=5 、Sig_Period=8 に合わせてあります。

 

標準の Schaff Trend Cycle.ex4 は欠点がありまして、下のチャートのようにペアを入れ替えたり、新しい足が立ったりすると計算が狂って、ほとんどゼロになってしまうことです。

Schaff_Trend_s.ex4 にも当然同じ欠点があります。

計算値が狂うと EA にしたときに売買ができなくなるので困るのです。

そこで重宝するのが STC_pure.ex4 でして、temjin さんのお作りになったものです。

計算値が Schaff Trend Cycle.ex4 と全く同じにならない(おそらく Schaff Trend Cycle.ex4 のほうが正しい)のですが、上記のような欠点がありません。

STC_pure.ex4 は残念ながらシグナルが出ませんが、出た方が絶対に便利なので、シグナルが出るように私が改変してみました。

要するに、STCがシグナルと交差して上抜けると「買い」、下抜けると「売り」になります。

STC_pure_S.mq4 (改変 by やすきー)

//+------------------------------------------------------------------+
//|                               STC_pure_S.mq4(Schaff Trend Cycle) |
//|                           Copyright (c) 2009, temjin.m@gmail.com |
//|                                   http://temjins.blog43.fc2.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright (c) 2009, temjin.m@gmail.com"
#property link      "http://temjins.blog43.fc2.com/"

#property indicator_separate_window
#property indicator_buffers 2 //改変 by やすきー
#property indicator_color1 Turquoise
#property indicator_color2 Yellow

#property indicator_minimum 0
#property indicator_maximum 100
#property indicator_level1 5
#property indicator_level2 95
#property indicator_levelcolor LightSlateGray
//---- input parameters
extern int MA_Short=8;
extern int MA_Long=13;
extern int MA_Cycle=5;
extern int PriceType=0;
extern int SigPeriod=23; //改変 by やすきー

//---- buffers
double mcd[];
double stc1[];
double stc2[];
double pf1[];
double pf2[];
double pfs[]; //改変 by やすきー
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   IndicatorShortName("Schaff Trend Cycle("+MA_Short+","+MA_Long+","+MA_Cycle+")");
   IndicatorBuffers(6); //改変 by やすきー
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,pf2);
   SetIndexLabel(0,"STC");
   SetIndexBuffer(1, pfs); //改変 by やすきー
   SetIndexStyle(1,DRAW_LINE); //改変 by やすきー
   SetIndexBuffer(2, mcd); //改変 by やすきー
   SetIndexBuffer(3, stc1); //改変 by やすきー
   SetIndexBuffer(4, stc2); //改変 by やすきー
   SetIndexBuffer(5, pf1); //改変 by やすきー
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int   limit = Bars - IndicatorCounted();
   int   n;
   double   ema_s,ema_l;
   double   llv, hhv;
   double   smconst = 0.5;

   if(limit == Bars) limit -= MA_Long-1;
   for(int i=limit-1; i>=0; i--)
   {
      //MACDの計算
      ema_s = iMA(NULL,0,MA_Short,0, MODE_EMA, PriceType,i);
      ema_l = iMA(NULL,0,MA_Long,0, MODE_EMA, PriceType,i);
      mcd[i] = ema_s - ema_l;

      //MACDのストキャス計算
      for (n = 0; n < MA_Cycle; n++)
      {
         if (n == 0)
         {
            llv = mcd[i];
            hhv = mcd[i];
         }
         else
         {
            if (llv > mcd[i+n]) llv = mcd[i+n];
            if (hhv < mcd[i+n]) hhv = mcd[i+n];
         }
      }
      if (hhv - llv > 0)
         stc1[i] = ((mcd[i] - llv)/(hhv - llv)) * 100;
      else
         stc1[i] = 50;  

      //ストキャス値の指数平滑
      pf1[i] = smconst * (stc1[i] - pf1[i+1]) + pf1[i+1];

      //2回目のストキャス計算
      for (n = 0; n <MA_Cycle; n++)
      {
         if (n==0)
         {
            llv = pf1[i];
            hhv = pf1[i];
         }
         else
         {
            if (llv > pf1[i+n]) llv = pf1[i+n];
            if (hhv < pf1[i+n]) hhv = pf1[i+n];
         }
      }
      if (hhv - llv > 0)
         stc2[i] = ((pf1[i] - llv)/(hhv - llv)) * 100;
      else
         stc2[i] = 50;  

      //ストキャス値の指数平滑
      pf2[i] = smconst * (stc2[i] - pf2[i+1]) + pf2[i+1];
   }
   for(int k = limit-1 ; k>=0 ; k--)  //改変 by やすきー
   {
      pfs[k] = iMAOnArray(pf2, 0, SigPeriod, 0, MODE_EMA, k);  //改変 by やすきー
   }

   return(0);
  }
//+------------------------------------------------------------------+

Trend Intensity Index という指標

Schaff Trend Cycle について調べていたら、似たような指標 Trend Intensity Index について書かれたブログを見つけました。

> Trend Intensity IndexにAlert をつける。

早速、インディケーターの TII_RLH.mq4 をダウンロードさせていただき、自前の EA に組み込んでみました。

バックテストを行うと、これが過去最高の成績に。

USDJPY 1時間足 2014/1/1~2015/1/1

なんと、プロフィットファクター 2.97!

勝率も44%となかなかいい。

ドローダウンも低めで安心感があります。

ちょっと改良しがいがありそうです。

GBPJPY H4 も成績がいいです。

GBPJPY H4 2014/1/1-2015/1/1

Minor_period =7, Major_period = 20 に変更しています。

プロフィットファクター 3.06!投資資金 3.8倍は魅力的。

 

 

しめしめと思ったら落とし穴が・・・

関連記事

プログラムソース(重大なバグあり使用不可)

//
//    yasciiTII01
//         動作にはTII_RLH.mq4 が必要

//マジックナンバーの定義
#define MAGIC  42235        

//パラメーターの設定//
extern double Lots = 1.0;     //取引ロット数
extern int Slip = 10;         //許容スリッページ数
extern string Comments =  "TII01"; //コメント

extern int Major_Period=18;
extern int Minor_Period=12;
int Major_MaMode=1; //0=sma, 1=ema, 2=smma, 3=lwma, 4=lsma
extern int Major_PriceMode=0;//0=close, 1=open, 2=high, 3=low, 4=median(high+low)/2, 5=typical(high+low+close)/3, 6=weighted(high+low+close+close)/4
color LevelColor=Silver;
extern int BuyLevel=35;
int MidLevel=50;
extern int SellLevel=75;

extern int Fast_period = 14 ;
extern double margin = 0.0 ;

extern double ILC = 100.0 ;
// extern double TP = 1100 ;

//変数の設定//
int Ticket_L = 0; //買い注文の結果をキャッチする変数
int Ticket_S = 0; //売り注文の結果をキャッチする変数
int Exit_L = 0;   //買いポジションの決済注文の結果をキャッチする変数
int Exit_S = 0;   //売りポジションの決済注文の結果をキャッチする変数
int OS1 ;
int OS2 ;
double   OOPL;
double   OOPS;

int start(){

    //暴落対策(始め)

   double FastHH1 = Close[iHighest(NULL, 0, MODE_CLOSE, Fast_period, 1)];
   double FastLL1 = Close[iLowest(NULL, 0, MODE_CLOSE, Fast_period, 1)];

   //買いポジションのエグジット
   OS1 = OrderSelect(Ticket_L, SELECT_BY_TICKET);  
   if( Bid < FastLL1-margin 
       && ( Ticket_L != 0 && Ticket_L != -1 ))
    {     
      Exit_L = OrderClose(Ticket_L,Lots,Bid,Slip,Red);
      if( Exit_L ==1 ) {Ticket_L = 0;}
    }    

   //売りポジションのエグジット
   OS2 = OrderSelect(Ticket_S, SELECT_BY_TICKET); 
   if( Ask> FastHH1+margin
       && ( Ticket_S != 0 && Ticket_S != -1 ))
    {     
      Exit_S = OrderClose(Ticket_S,Lots,Ask,Slip,Blue);
      if( Exit_S ==1 ) {Ticket_S = 0;} 
    }   

   //暴落対策(終わり)

    if (Volume[0]>1 || IsTradeAllowed() == false) return(0) ;

       double tii1 = iCustom(NULL, 0,"TII_RLH", Major_Period, Major_MaMode, Major_PriceMode, Minor_Period, LevelColor , BuyLevel, MidLevel , SellLevel, 0 , 1);
       double tii2 = iCustom(NULL, 0,"TII_RLH", Major_Period, Major_MaMode, Major_PriceMode, Minor_Period, LevelColor , BuyLevel, MidLevel , SellLevel, 0 , 2);
       double tii3 = iCustom(NULL, 0,"TII_RLH", Major_Period, Major_MaMode, Major_PriceMode, Minor_Period, LevelColor , BuyLevel, MidLevel , SellLevel, 0 , 3);       
       double tii4 = iCustom(NULL, 0,"TII_RLH", Major_Period, Major_MaMode, Major_PriceMode, Minor_Period, LevelColor , BuyLevel, MidLevel , SellLevel, 0 , 4);   
       double tiiSM1 = (tii1+tii2+tii3) / 3.0 ;
       double tiiSM2 = (tii4+tii2+tii3) / 3.0 ;

   double lc = ILC;
   if(( Digits ==3 ) ||(Digits ==5)) lc = lc*10.0 ;

   //買いポジションのエグジット
    OS1 = OrderSelect(Ticket_L, SELECT_BY_TICKET);  
    OOPL = OrderOpenPrice();
    if(    ((tii1 < SellLevel && tii2 > SellLevel) || ( OOPL - lc*Point >= Close[1] ) ) //|| ( OOPL+TP <= Close[1] ))
            && ( Ticket_L != 0 && Ticket_L != -1 ))
    {     
      Exit_L = OrderClose(Ticket_L,Lots,Bid,Slip,Red);
      if( Exit_L ==1 ) {Ticket_L = 0;}
    }    

   //売りポジションのエグジット
    OS2 = OrderSelect(Ticket_S, SELECT_BY_TICKET); 
    OOPS = OrderOpenPrice();
    if(    ((tii1 > BuyLevel && tii2 < BuyLevel )||( OOPS + lc*Point <= Close[1] ) ) //|| ( OrderOpenPrice()-TP >= Close[1] ))
          && ( Ticket_S != 0 && Ticket_S != -1 ))
    {     
      Exit_S = OrderClose(Ticket_S,Lots,Ask,Slip,Blue);
      if( Exit_S ==1 ) {Ticket_S = 0;} 
    }   

   //買いエントリー
   if( ((tii1 > BuyLevel && tii2 < BuyLevel) || (tii1 > tiiSM1 && tii2 < tiiSM2) )
       && ( Ticket_L == 0 || Ticket_L == -1 ) 
       && ( Ticket_S == 0 || Ticket_S == -1 ))
    {  
      Ticket_L = OrderSend(Symbol(),OP_BUY,Lots,Ask,Slip,0,0,Comments,MAGIC,0,Red);
    }

   //売りエントリー
   if(( (tii1 < SellLevel && tii2 > SellLevel) || (tii1 < tiiSM1 && tii2 > tiiSM2))
       && ( Ticket_S == 0 || Ticket_S == -1 )
       && ( Ticket_L == 0 || Ticket_L == -1 ))
    {   
      Ticket_S = OrderSend(Symbol(),OP_SELL,Lots,Bid,Slip,0,0,Comments,MAGIC,0,Blue);     
    } 

   return(0);

  }

 

###

スイスフラン暴騰騒動(2)

以前の記事「スイスフラン暴騰騒動」でも書きましたが、スイス銀行のおかげでスイスフランが一瞬で高騰し、いろんな人が迷惑を被りました。

なんと、世界最大級の FX 業者であるアルパリ(UK) Limited までもが破綻しました。

私も子会社のアルパリジャパンにデモ口座を開いていたのですが、現在は以下のチャートのようにサーバーがあの日から停止しています。

 

 

MetaTrader4 のストラテジテスターは使えるのですが、サーバーから現在のデータを取得する「現在のスプレッド値」を使用することはできません。

他の業者(FX-CMジャパン、OANDAジャパン)にも口座を持っているので私には全く問題はないのですが、まあ歴史的な事件だったってことで、ここに記念としてチャートを残しておくことにします。 ^^

*

デモ口座を開いているFX-CMジャパンも親会社の米FX-CMがつぶれかけた(株価が 1/10 になった!)そうですが、何とか借金して乗り切ったそうな。

私が唯一リアル口座を開いている OANDA はまったく大丈夫だったもよう。

スイス銀行のかけたハシゴにみんな乗っかかっていたのをドカンとはずしたわけですが、こんな大きなハシゴはそうそうなかったでしょう。

スイス銀行もスイスイ、いやせいせいしたのではないでしょうか。

###

FX 2015/1/20 デモトレード

昨日 2015/1/20 のデモトレードでは円安が進行したので、3つの自作 EA が複数起動し、驚くほどの利益を出してくれました。

下のチャート(USDJPY 1時間足:時間表示は日本時間より7時間遅れ)では平均足、QQE、VQ、Schaff Trend Cycle、ADXcross のいずれも買いマークを出しており、その後最高で 1円40銭近く上昇しました。

一時は利益が 52万円ほどいきましたが、その後調整に。

プログラムの入れ替えのため、23:00(サーバーの時間は日本より 7時間遅れています)に手動で停止しました。

次のような結果になりました。

2015-01-16 17:00:00 buy  1   usdjpy 117.044 2015-01-20 16:00:30 118.525  148100
2015-01-16 20:00:00 sell 1   gbpusd 1.51471 2015-01-20 16:01:54 1.5193   -54414
2015-01-16 20:00:00 buy  1   usdjpy 117.557 2015-01-19 04:00:00 117.157  -40000
2015-01-19 15:14:27 buy  1.1 usdjpy 117.42  2015-01-20 11:00:00 118.075   72050
2015-01-19 15:15:00 buy  0.9 usdjpy 117.447 2015-01-20 16:00:37 118.533   97740
2015-01-19 16:00:00 buy  1   usdjpy 117.466 2015-01-20 16:00:33 118.53   106400
2015-01-19 20:00:00 buy  1   usdchf 0.87859 2015-01-20 10:01:08 0.87713  -19669
2015-01-20 13:37:20 buy  1.1 usdjpy 118.58  2015-01-20 16:00:56 118.514   -7260
2015-01-20 13:51:25 buy  1.1 usdjpy 118.691 2015-01-20 13:55:26 118.711    2200

合計 305147円。バーチャルだけどねっ。

一日の記録としてはもちろん過去(EA を作り始めて1ヶ月だけど)最高。

  • gbpusd は Nikkori という他人作のブレイクアウトシステム。 これ、TP と LC が固定のため、途中で反転するとアウトなんです。
  • usdchf は kolachi という他人作の移動平均線クロスシステム。 前日から起動しており、反転をまともにくらったようです。
  • usdjpy のはどれも自作のシステム(3種類)で、トレード数が 3つを超えているのは時間足の違うチャートで動いているのが一斉に発火したため。

まあ、こんな調子のいい日は年に数回もないと思います。

そろそろリアル口座で少額(デモの 1/10程度)でのテストに入ろうかと思います。

余談その1

私の現段階での考えは「レンジ相場はリスクも多いので無視してもいい。2-3割ほどあるトレンド相場で利益を確実にいただければそれで十分」というものです。

短い時間足で見るとレンジ相場の中にもトレンドは潜んでいますし(その分長期に比べリスクも高いですが)。

余談その2

平均足、QQE、VQ、Schaff Trend Cycle、ADXcross の組み合わせが最高と思っているのですが、なかなかプログラミングできないで試行錯誤中。

今回も VQ の最後の反転で手じまっていればもっと取れたはず。

###

簡単な平均足システム (2)

以前の記事「簡単な平均足システム」で作った簡単な平均足システムを改良してみました。

改良その1

エントリシグナルの 「陽線の平均足が3本連続したら買い、陰線の平均足が3本連続したら売り 」の3本を4本に。

結果(2014/1/1-2015/1/1 USDJPY H4 以下同じ)

オリジナルより悪化した・・・

改良その2

決済シグナルの 「売り待ちの際に陰線に変われば決済、買い待ちの際に陽線に変われば決済 」を「売り待ちの際に陰線が2本連続すれば決済、買い待ちの際に陽線が2本連続すれば決済 」に。

結果

オリジナルよりはるかに改善されました。

改良その3

改良その1とその2を両方加えてみました。

結果

その1にその2(オリジナルよりよかったもの)を加えたのにその1よりもさらに悪くなった・・・

総評

意外なことに改良その2がバツグンですね。

オリジナルより勝率は悪いが、最大勝ちと平均勝ちの金額がグンと伸びたことが効いています。

オリジナルではトレンドから早く飛び降りすぎていたようです。

その2はちょっと粘ってみただけの改良なのですが、それだけでトレンドにより長くしがみつくことができています。

で、改良その3はなんでこんなにダメになってしまうのでしょうか。

関連記事

簡単な平均足システム

 

###

スイスフラン暴騰騒動

今朝こんなメールが来てました。使っている FX 業者の OANDA からです。

件名:スイスフラン関連の状況および弊社対応内容について

平素よりご高配を請け賜わり、誠に有難うございます。
スイス中央銀行(国立銀行)が2011年9月以来設定していた
EUR/CHFにおける1.2000フランの上限ラインを廃止すると
突然発表した事により、スイスフランは対ユーロで一時約40%急騰し、
為替市場には大変な混乱が訪れました。

​このため、お客様方だけでなく、FX業者や市場参加者などが
多くの損失を被りました。

しかしながら、OANDA JAPAN株式会社ならびにOANDAグループでは、
十分な資本金を確保しており、各国の規制も遵守し、
自己資本規制比率などの財務状況の数値も問題ございません。

お取引、ご入金、ご出金等も通常通り、
滞りなく実施できますので、どうぞご安心ください。

OANDAは「価格の透明性-Transparency」は会社の経営哲学上、
非常に重要な事だと考えております。

今回の出来事は、弊社でも少なからず損失が発生しましたが、
OANDAグループ発足以来のポリシーである
「約定拒否なし、再クオートなし」は今回も同様に徹底し、
実施させていただきました。

弊社でお取引いただいているお客様につきましては、
約定価格の事後の変更などはございません。

今後もご信頼いただきお取引を実施頂ければ幸いです。

OANDA自身もお客も大変な事態だったみたいですね。

歴史的なできごとだったのは確かですから。

私も30万円ほど損しましたが、デモ口座のバーチャル資金だったので全然応えておりません。

ちなみに本日のデモ口座ではすでに 30万円は取り返しております。

クリックで拡大します

 

バーチャルだけどねっ。

関連記事

FX 大ダメージ 暴落対策用コードの導入

スイスフラン暴騰騒動(2)

###

簡単な平均足システム

平均足(コマ足)という価格表示の方法があります。

ローソク足の代わりに使うもので、トレンドがわかりやすいという特徴があります。

超シンプルな平均足システムを作ってみました。

  • エントリシグナル: 陽線の平均足が3本連続したら買い、陰線の平均足が3本連続したら売り
  • 決済シグナル: 売り待ちの際に陰線に変われば決済、買い待ちの際に陽線に変われば決済あるいは最初に決めたロスカットを割った場合

ロスカットは無意味のはずなのですが、なぜか設定値によって結果が変わります。

意外なことによけいなフィルタなしでも、そこそこいい結果。

USDJPY H4 2014/1/1-2015/1/1

 

全然だめだろうと思ったら、勝率40%、プロフィットファクター 1.40 は立派。

 

トレンドがないとまったくダメなタイプですので、トレンド用のフィルタを加えて仕上げていこうかと思います。

プログラムソース

//
// yasciiHA01.mq4
//           超シンプルな平均足システム

//マジックナンバーの定義
#define MAGIC  42211        

//パラメーターの設定//
extern double Lots = 1.0;     //取引ロット数
extern int Slip = 10;         //許容スリッページ数
extern string Comments =  ""; //コメント

extern double ILC = 45 ;

//変数の設定//
int Ticket_L = 0; //買い注文の結果をキャッチする変数
int Ticket_S = 0; //売り注文の結果をキャッチする変数
int Exit_L = 0;   //買いポジションの決済注文の結果をキャッチする変数
int Exit_S = 0;   //売りポジションの決済注文の結果をキャッチする変数
int OS1 ;
int OS2 ;
double   OOPL;
double   OOPS;

int start(){

    if (Volume[0]>1 || IsTradeAllowed() == false) return(0) ;

       double HA_open1 = ( Open[2] + Close[2] ) / 2.0 ;
       double HA_close1 = ( Open[1] + Close[1] + High[1] + Low[1] ) / 4.0 ;
       double HA_open2 = ( Open[3] + Close[3] ) / 2.0 ;
       double HA_close2 = ( Open[2] + Close[2] + High[2] + Low[2] ) / 4.0 ;
       double HA_open3 = ( Open[4] + Close[4] ) / 2.0 ;
       double HA_close3 = ( Open[3] + Close[3] + High[3] + Low[3] ) / 4.0 ;

   double lc = ILC;
   if(( Digits ==3 ) ||(Digits ==5)) lc = lc*10.0 ;

   //買いポジションのエグジット
    OS1 = OrderSelect(Ticket_L, SELECT_BY_TICKET);  
    OOPL = OrderOpenPrice();

    if(    (HA_open1 > HA_close1 || ( OOPL - lc*Point >= Close[1] ) ) 
            && ( Ticket_L != 0 && Ticket_L != -1 ))
    {     
      Exit_L = OrderClose(Ticket_L,Lots,Bid,Slip,Red);
      if( Exit_L ==1 ) {Ticket_L = 0;}
    }    

   //売りポジションのエグジット
     OS2 = OrderSelect(Ticket_S, SELECT_BY_TICKET); 
     OOPS = OrderOpenPrice();

   if(    (HA_open1 < HA_close1 ||( OOPS + lc*Point <= Close[1] ) ) 
          && ( Ticket_S != 0 && Ticket_S != -1 ))
    {     
      Exit_S = OrderClose(Ticket_S,Lots,Ask,Slip,Blue);
      if( Exit_S ==1 ) {Ticket_S = 0;} 
    }   

   //買いエントリー
   if( HA_open1 < HA_close1 && HA_open2 < HA_close2 && HA_open3 < HA_close3
       && HA_close1 > HA_close2 && HA_close2 > HA_close3 
       && ( Ticket_L == 0 || Ticket_L == -1 ) 
       && ( Ticket_S == 0 || Ticket_S == -1 ))
    {  
      Ticket_L = OrderSend(Symbol(),OP_BUY,Lots,Ask,Slip,0,0,Comments,MAGIC,0,Red);
    }

   //売りエントリー
   if( HA_open1 > HA_close1 && HA_open2 > HA_close2 && HA_open3 > HA_close3
       && HA_close1 < HA_close2 && HA_close2 < HA_close3 
       && ( Ticket_S == 0 || Ticket_S == -1 )
       && ( Ticket_L == 0 || Ticket_L == -1 ))
    {   
      Ticket_S = OrderSend(Symbol(),OP_SELL,Lots,Bid,Slip,0,0,Comments,MAGIC,0,Blue);     
    } 

   return(0);
  }

関連記事

簡単な平均足システム (2)

###

FX 現在稼働中のオリジナルシステム

現在 Windows VPS 上で稼働中の自作システムは3種類。

簡単にまとめてみます。

  1. yasciiADXcross02
  2. yasciiMACD_3cross07
  3. yasciiBreakout05

いずれも 2-3 日に一度くらい改良を加えています(最後の数字はメジャーバージョンアップを意味)。

なお、運用している通貨ペアと時間足は、ADXcross02 が USDJPY H4、yasciiMACD_3cross07 と yasciiBreakout05 は USDJPY H1 です。

運用成績として、スプレッド 5 の場合の 2014/1/1 – 2015/1/1 の一年間のバックテストの結果をお出しします。

yasciiADXcross02

ADX 指標を使って売り買いサインを出しています。

トレンド相場で力を発揮。

ドローダウンはありますが、比較的安定しています。

トレンドに乗るのが素早く、降りるのもそこそこ早いのに、長いトレンドを最初から最後までよく捕まえるな、という印象です。

なので最大勝ち額が高く、大勝ちのときは実に気持ちがいいでしょう。

  • エントリシグナル: +DI と -DI のクロス+ADX フィルタ+Damiani フィルタ
  • 決済シグナル: +DI と -DI の反転、もしくはHLBand のブレイク、もしくは固定ロスカット値を割る、もしくは暴落時

 

yasciiMACD_3cross07

MACD という指標を3つ使って売り買いのサインを出しています。現在は買い専用。

  • エントリシグナル: 短期、中期、長期の3つのMACD指標がすべて陽転+Damiani フィルタ
  • 決済シグナル: 短期、中期のMACDが反転、もしくは固定ロスカット値を下回る、もしくはHLBand のブレイク、もしくは暴落時

トレンド相場に強いですが、トレンドでない場合でのミスショットが結構あります。

Damiani フィルタが大甘なので、BBWフィルタやタイムフィルタやマルチタイムフィルタなどの導入を計画中。

このままですと、本番に使えるかやや疑問です。

yasciiBreakout05

定番のブレイクアウトシステムなので、トレンド相場でないときの突発的なブレイクアウトも拾ってくれます。

ドローダウンも一番低いですかね。

  • エントリシグナル: HLBand のブレイク+value range フィルタ
  • 決済シグナル: HLBand のブレイク、もしくは固定ロスカット値を割る、もしくは暴落時

関連記事

FX デモ口座運用実績(2014/12/16~2015/1/15)

###

FX デモ口座運用実績(2014/12/16~2015/1/15)

Windows VPS サーバー上での FX デモ口座(FXCM)の運用が1ヶ月になったので、実績をまとめてみました。

(2014/12/16~2015/1/15)

日付、時刻、売買の種類、ロット、通貨ペア、約定価格、日付、時刻、決済価格、損益 の順番です。

最後の損益の金額は円です。

2014-12-16	02:00:01	buy	0.1	usdchf	0.96558	2014-12-16	10:32:12	0.96251	-3726
2014-12-16	05:26:11	buy	1	eurusd	1.2453	2014-12-16	07:06:58	1.24542	1409
2014-12-16	07:40:32	sell	1	usdjpy	117.31	2014-12-16	10:29:11	117	31000
2014-12-16	12:27:59	sell	1	gbpusd	1.5692	2014-12-16	13:42:52	1.57421	-58164
2014-12-16	14:45:00	sell	1	gbpusd	1.57407	2014-12-17	04:38:39	1.57336	8279
2014-12-29	18:10:00	buy	1	usdjpy	120.634	2014-12-30	07:40:04	120.429	-20500
2014-12-30	07:40:04	sell	1	usdjpy	120.429	2014-12-31	04:24:42	119.326	110300
2014-12-30	11:47:37	sell	1	usdjpy	119.535	2014-12-30	21:00:00	119.532	300
2015-01-02	05:44:58	buy	1	usdjpy	120.362	2015-01-02	17:00:00	120.626	26400
2015-01-02	23:00:00	buy	1	usdjpy	120.477	2015-01-05	05:39:40	120.478	100
2015-01-05	19:50:00	sell	1	usdjpy	119.588	2015-01-05	20:33:19	119.789	-20100
2015-01-05	21:10:00	sell	1	usdjpy	119.579	2015-01-06	01:00:07	119.327	25200
2015-01-06	02:45:00	sell	1	usdjpy	119.351	2015-01-06	02:53:11	119.351	0
2015-01-06	04:25:00	sell	1	usdjpy	119.296	2015-01-06	07:32:18	119.127	16900
2015-01-06	10:45:00	sell	1	usdjpy	118.937	2015-01-06	12:37:31	118.899	3800
2015-01-07	00:00:04	sell	0.3	eurusd	1.18861	2015-01-07	13:34:48	1.18291	20373
2015-01-07	06:10:00	buy	1	usdjpy	119.064	2015-01-07	07:42:32	118.914	-15000
2015-01-07	08:30:01	buy	1	usdjpy	119.024	2015-01-07	11:19:45	118.877	-14700
2015-01-07	13:34:48	sell	0.3	eurusd	1.18287	2015-01-08	12:04:31	1.17717	20481
2015-01-07	17:00:00	buy	1.1	usdjpy	119.517	2015-01-07	21:50:49	118.857	-72600
2015-01-08	03:32:28	buy	1.1	usdjpy	119.547	2015-01-08	05:29:29	119.735	20680
2015-01-08	08:57:41	buy	1.1	usdjpy	119.858	2015-01-08	09:31:20	119.914	6160
2015-01-08	09:29:54	buy	1.1	usdjpy	119.937	2015-01-08	14:00:00	119.812	-13750
2015-01-08	12:04:32	sell	0.3	eurusd	1.17716	2015-01-09	15:25:42	1.18222	-18080
2015-01-09	03:00:00	buy	1.1	usdjpy	119.82	2015-01-09	03:12:49	119.598	-24420
2015-01-09	17:00:00	sell	0.3	eurusd	1.17836	2015-01-12	16:34:52	1.18131	-10510
2015-01-12	08:00:02	buy	1	audusd	0.82527	2015-01-14	08:00:00	0.8093	-187028
2015-01-12	14:27:49	sell	1	eurusd	1.17938	2015-01-12	20:00:00	1.18258	-36142
2015-01-13	10:00:00	buy	0.3	eurusd	1.18505	2015-01-15	11:33:47	1.16898	-56541
2015-01-13	11:45:43	sell	1	eurusd	1.17979	2015-01-14	00:07:03	1.17736	28644
2015-01-13	16:00:00	sell	1	eurusd	1.177	2015-01-16	05:01:00	1.16319	160298
2015-01-13	16:00:00	buy	1	usdchf	1.02035	2015-01-15	07:48:38	1.02047	1385
2015-01-13	20:30:00	sell	1	usdjpy	117.819	2015-01-14	20:00:00	117.04	77900
2015-01-14	13:03:07	sell	1	eurusd	1.17545	2015-01-14	15:30:04	1.17903	-41751
2015-01-15	20:35:14	buy	1.1	usdchf	0.8808	2015-01-16	05:07:06	0.86037	-303152
2015-01-15	02:30:00	buy	1	usdjpy	117.545	2015-01-15	11:30:00	117.537	-800
2015-01-15	03:03:36	buy	1.1	audusd	0.82088	2015-01-16	05:06:43	0.82425	43067
2015-01-15	04:00:02	sell	1	eurusd	1.17745	2015-01-16	01:00:00	1.16289	169206
2015-01-15	08:00:05	buy	1.1	gbpusd	1.52297	2015-01-15	20:00:00	1.5153	-98468
2015-01-15	12:00:01	sell	0.3	eurusd	1.17164	2015-01-15	16:15:42	1.16594	20033
2015-01-15	13:30:00	sell	1	usdjpy	116.459	2015-01-16	06:34:58	116.414	4500


損益は通算して、マイナス 198117円
となりました。

本日のドルフランの暴落の -303152円がなければプラス 105035円だったのに・・・シクシク。

2015-01-12 の -187028円の負けは買ったとたんに相場が反転しました。これに対する対策(急落対策ではない)はすでに昨日織り込んであります。

*

稼働しているプログラムは自作が3種類、他作が2種類(kolachi, Nikkori)です。

自作の分は毎週順調に進化していますので、勝率とプロフィットファクターは初期のものよりパワーアップしています。

他作の Nikkori はドローダウンを減らすいいアイディアを考えたので、似たようなシステムを自作することを考えています。

2月からリアル口座に入金して小額から運用していこうかと思っています。

###

FX 大ダメージ 暴落対策用コードの導入

 

自動売買のデモ口座が今朝とんでもないことに。

昨日は調子よく、30万円プラス近くまで行ったのですが、今朝プラスマイナスゼロくらいに戻っていたのです。

利益確定をもう少し改善しなくてはと思ってよく見ると、ドルフランの暴落によるものと判明(上のグラフ)。

スイス中銀がスイスフラン相場について1ユーロ=1.20フランの上限を撤廃したとのニュースのためでしょう。

この上限はFXサーファーにはなじみのものですが、ついにスイスの為替介入がなくなる日が来たのですね。

ドルフランの暴落と書きましたが、ドルは無実で、スイスフラン単独の高騰ですね。

しかし、数時間で 15%も高騰したとは・・・ケタ違いです。

*

しかし、デモ口座でよかった。

あわててプログラムに暴落対策を加えました。

ちゃんと動くかはチェックしていません。バックテストではちょっと効果があるようなんですが。

もう一度暴落が起きないかな。

プログラムソース

//
// yasciiMACD_3cross07.mq4
//                Trailing stop
//

//マジックナンバーの定義
#define MAGIC  42553        

//パラメーターの設定//
extern double Lots = 1.0;     //取引ロット数
extern int Slip = 10;         //許容スリッページ数
extern string Comments =  ""; //コメント

extern int Fast_EMA_Period1 = 6;
extern int Slow_EMA_Period1 = 19;
extern int Signal_Period1 = 6;
extern int Fast_EMA_Period2 = 12;
extern int Slow_EMA_Period2 = 26;
extern int Signal_Period2 = 9;
extern int Fast_EMA_Period3 = 18 ; // 19;
extern int Slow_EMA_Period3 = 33 ; // 39;
extern int Signal_Period3 = 11; // 9;

extern int ADXcrossesPeriod = 14;
extern int Fast_period = 18 ;
extern double margin = 0.0 ;

extern double ILC = 730.0 ; 

//---- input parameters
extern int       Viscosity=13;
extern int       Sedimentation=50;
extern double    Threshold_level=1.3;
extern bool      lag_supressor=true;

//変数の設定//
int Ticket_L = 0; //買い注文の結果をキャッチする変数
int Ticket_S = 0; //売り注文の結果をキャッチする変数
int Exit_L = 0;   //買いポジションの決済注文の結果をキャッチする変数
int Exit_S = 0;   //売りポジションの決済注文の結果をキャッチする変数
int OS1 ;
int OS2 ;

double   MACD_MAIN1_1 ;
double   MACD_SIGN1_1 ;
double   MACD_Value1_1 ;

double   MACD_MAIN1_2 ;
double   MACD_SIGN1_2 ;
double   MACD_Value1_2 ;

double   MACD_MAIN1_3 ;
double   MACD_SIGN1_3 ;
double   MACD_Value1_3 ;

double   OOPL;
double   OOPS;
double   LwT = 0.0;
double   HgT = 10000.0 ;

//damiani_filter用
double    lag_s_K=0.5;
double   s0 = 0; 
double   s1= 0;
double   s2 = 0;
double   s3 = 0;
double   vol=0;
double t=Threshold_level;

int damiani_f()
{

      double sa=iATR(NULL,0,Viscosity,1);
      double ia = iATR(NULL,0,Sedimentation,1) ;
      if(lag_supressor){
         if (ia == 0) vol = 1.0 ;
         else vol= sa/ia + lag_s_K*(s1-s3);   
      }else{
         if (ia == 0) vol = 1.0 ;
         else vol= sa/ia;   
      }

      double anti_thres=iStdDev(NULL,0,Viscosity,0,MODE_LWMA,PRICE_TYPICAL,1);

      double isd = iStdDev(NULL,0,Sedimentation,0,MODE_LWMA,PRICE_TYPICAL,1) ;
      if (isd == 0) anti_thres = 1.0 ;
      else anti_thres = anti_thres/isd ;

      t=t-anti_thres;

      s3 = s2; s2 = s1; s1= s0; 
      s0 = vol;

      if (vol>t){
      	return(1);
      }else{
      	return(0);
      }

}

int start()
  {

// 暴落対策始まり

   double FastHH1 = Close[iHighest(NULL, 0, MODE_CLOSE, Fast_period, 1)];
   double FastLL1 = Close[iLowest(NULL, 0, MODE_CLOSE, Fast_period, 1)];

   OS1 = OrderSelect(Ticket_L, SELECT_BY_TICKET);  

   //買いポジションのエグジット
   if( Bid < FastLL1-margin 
       && ( Ticket_L != 0 && Ticket_L != -1 ))
    {     
      Exit_L = OrderClose(Ticket_L,Lots,Bid,Slip,Red);
      if( Exit_L ==1 ) {Ticket_L = 0;}
    }    

   OS2 = OrderSelect(Ticket_S, SELECT_BY_TICKET); 

   //売りポジションのエグジット
   if( Ask> FastHH1+margin
       && ( Ticket_S != 0 && Ticket_S != -1 ))
    {     
      Exit_S = OrderClose(Ticket_S,Lots,Ask,Slip,Blue);
      if( Exit_S ==1 ) {Ticket_S = 0;} 
    }   

// 暴落対策終わり

   if (Volume[0]>1 || IsTradeAllowed() == false) return(0) ;

   MACD_MAIN1_1 = iMACD(NULL, 0, Fast_EMA_Period1 , Slow_EMA_Period1, Signal_Period1, PRICE_CLOSE, MODE_MAIN, 1 );
   MACD_SIGN1_1 = iMACD(NULL, 0, Fast_EMA_Period1 , Slow_EMA_Period1, Signal_Period1, PRICE_CLOSE, MODE_SIGNAL, 1 );
   MACD_Value1_1 = MACD_MAIN1_1 - MACD_SIGN1_1 ;

   MACD_MAIN1_2 = iMACD(NULL, 0, Fast_EMA_Period2 , Slow_EMA_Period2, Signal_Period2, PRICE_CLOSE, MODE_MAIN, 1 );
   MACD_SIGN1_2 = iMACD(NULL, 0, Fast_EMA_Period2 , Slow_EMA_Period2, Signal_Period2, PRICE_CLOSE, MODE_SIGNAL, 1 );
   MACD_Value1_2 = MACD_MAIN1_2 - MACD_SIGN1_2 ;

   MACD_MAIN1_3 = iMACD(NULL, 0, Fast_EMA_Period3 , Slow_EMA_Period3, Signal_Period3, PRICE_CLOSE, MODE_MAIN, 1 );
   MACD_SIGN1_3 = iMACD(NULL, 0, Fast_EMA_Period3 , Slow_EMA_Period3, Signal_Period3, PRICE_CLOSE, MODE_SIGNAL, 1 );
   MACD_Value1_3 = MACD_MAIN1_3 - MACD_SIGN1_3 ;

   double FastHH2 = Close[iHighest(NULL, 0, MODE_CLOSE, Fast_period, 2)];
   double FastLL2 = Close[iLowest(NULL, 0, MODE_CLOSE, Fast_period, 2)];

   OS1 = OrderSelect(Ticket_L, SELECT_BY_TICKET);  
   OOPL = OrderOpenPrice();   

   //買いポジションのエグジット
   if(    ((MACD_Value1_1 <0 && MACD_Value1_2 <0) || OOPL - ILC*Point >= Close[1]  || (Close[2] >= FastLL2-margin && Close[1] < FastLL2-margin ))
       && ( Ticket_L != 0 && Ticket_L != -1 ))
    {     
      Exit_L = OrderClose(Ticket_L,Lots,Bid,Slip,Red);
      if( Exit_L ==1 ) {Ticket_L = 0;}
    }    

   OS2 = OrderSelect(Ticket_S, SELECT_BY_TICKET); 
   OOPS = OrderOpenPrice();

   //売りポジションのエグジット
   if(    ((MACD_Value1_1 >0 && MACD_Value1_2 >0) || OOPS + ILC*Point <= Close[1]  || (Close[2] <= FastHH2+margin && Close[1] > FastHH2+margin ))
       && ( Ticket_S != 0 && Ticket_S != -1 ))
    {     
      Exit_S = OrderClose(Ticket_S,Lots,Ask,Slip,Blue);
      if( Exit_S ==1 ) {Ticket_S = 0;} 
    }   

   //買いエントリー
   if(    MACD_Value1_1 >0 && MACD_Value1_2 >0 && MACD_Value1_3 >0  && MACD_MAIN1_3 >0 && damiani_f() ==1
       && ( Ticket_L == 0 || Ticket_L == -1 ) 
       && ( Ticket_S == 0 || Ticket_S == -1 ))
    {  
      Ticket_L = OrderSend(Symbol(),OP_BUY,Lots,Ask,Slip,0,0,Comments,MAGIC,0,Yellow);
    }

   //売りエントリー
   if(    MACD_Value1_1 <0 && MACD_Value1_2 <0 && MACD_Value1_3 <0 && MACD_MAIN1_3 <0 && damiani_f() ==1
       && ( Ticket_S == 0 || Ticket_S == -1 )
       && ( Ticket_L == 0 || Ticket_L == -1 ))
    {   
      Ticket_S = OrderSend(Symbol(),OP_SELL,Lots,Bid,Slip,0,0,Comments,MAGIC,0,Red);     
    } 

   return(0);
  }

関連記事

スイスフラン暴騰騒動

スイスフラン暴騰騒動(2)

###

ADXcrosses を EA に

前々回の記事「未来を予測する(?)便利なインジケータ AdamPriceReflection」の最後にちょこっと紹介したインディケーターの ADXcrosses をもとに自動売買ソフトを作りました。

ADXDMI という指標を使い、+DI  と -DI の 2本のクロスで売り買いをするという、どんな教科書に載っているくらいのごく初歩的なロジックです。

ドテンになりますし、都合の悪いときにも売買してしまうので、Damiani フィルタ(効きが悪い!)と ADX フィルター(簡易版)をかませています。

USDJPY(ドル円) 4時間足の結果がいいです。

プロフィットファクター 1.41、勝率 36.49%。

取引回数が多いので、22ヶ月で資金は 4.29 倍になっています。

最大ドローダウンが破滅的に大きいですけど・・・

資産曲線を見ると、トレンド以外は全くだめで資金を浪費していますから、 トレンド以外には起動しないようにもっと強めのフィルタをかけるように改良していくつもりです。

プログラムソース

//
// yasciiADXcross01a.mq4
//                with Damiani
//

//マジックナンバーの定義
#define MAGIC  42511

//パラメーターの設定//
extern double Lots = 1.0;     //取引ロット数
extern int Slip = 10;         //許容スリッページ数
extern string Comments =  ""; //コメント

extern int ADXcrossesPeriod = 14;

extern double ILC = 730.0 ; 
// extern double TP = 110.0 ; 

//---- input parameters
extern int       Viscosity=13;
extern int       Sedimentation=50;
extern double    Threshold_level=1.3;
extern bool      lag_supressor=true;

//変数の設定//
int Ticket_L = 0; //買い注文の結果をキャッチする変数
int Ticket_S = 0; //売り注文の結果をキャッチする変数
int Exit_L = 0;   //買いポジションの決済注文の結果をキャッチする変数
int Exit_S = 0;   //売りポジションの決済注文の結果をキャッチする変数
int OS1 ;
int OS2 ;

double   OOPL;
double   OOPS;
double   LwT = 0.0;
double   HgT = 10000.0 ;

//damiani_filter用
double    lag_s_K=0.5;
double   s0 = 0; 
double   s1= 0;
double   s2 = 0;
double   s3 = 0;
double   vol=0;
double t=Threshold_level;

int damiani_f()
{

      double sa=iATR(NULL,0,Viscosity,1);
      double ia = iATR(NULL,0,Sedimentation,1) ;
      if(lag_supressor){
         if (ia == 0) vol = 1.0 ;
         else vol= sa/ia + lag_s_K*(s1-s3);   
      }else{
         if (ia == 0) vol = 1.0 ;
         else vol= sa/ia;   
      }

      double anti_thres=iStdDev(NULL,0,Viscosity,0,MODE_LWMA,PRICE_TYPICAL,1);

      double isd = iStdDev(NULL,0,Sedimentation,0,MODE_LWMA,PRICE_TYPICAL,1) ;
      if (isd == 0) anti_thres = 1.0 ;
      else anti_thres = anti_thres/isd ;

      t=t-anti_thres;

      s3 = s2; s2 = s1; s1= s0; 
      s0 = vol;

      if (vol>t){
      	return(1);
      }else{
      	return(0);
      }

}

int start()
  {

   if (Volume[0]>1 || IsTradeAllowed() == false) return(0) ;

     double plusdi2 = iADX(NULL, 0, ADXcrossesPeriod, PRICE_CLOSE, MODE_PLUSDI, 2);
     double plusdi1 = iADX(NULL, 0, ADXcrossesPeriod, PRICE_CLOSE, MODE_PLUSDI, 1);
     double minusdi2 = iADX(NULL, 0, ADXcrossesPeriod, PRICE_CLOSE, MODE_MINUSDI, 2);
     double minusdi1 = iADX(NULL, 0, ADXcrossesPeriod, PRICE_CLOSE, MODE_MINUSDI, 1);  

     double maindi1 = iADX(NULL, 0, ADXcrossesPeriod, PRICE_CLOSE, MODE_MAIN, 1); 

   OS1 = OrderSelect(Ticket_L, SELECT_BY_TICKET);  
   OOPL = OrderOpenPrice();   

   //買いポジションのエグジット
   if(    ((plusdi1 < minusdi1 && plusdi2 > minusdi2 ) || ( OOPL - ILC*Point >= Close[1] ) ) //|| ( OOPL+TP*Point <= Close[1] ))
       && ( Ticket_L != 0 && Ticket_L != -1 ))
    {     
      Exit_L = OrderClose(Ticket_L,Lots,Bid,Slip,Yellow);
      if( Exit_L ==1 ) {Ticket_L = 0;}
    }    

   OS2 = OrderSelect(Ticket_S, SELECT_BY_TICKET); 
   OOPS = OrderOpenPrice();

   //売りポジションのエグジット
   if(    ((plusdi1 > minusdi1 && plusdi2 < minusdi2 ) ||( OOPS + ILC*Point <= Close[1] ) ) //|| ( OrderOpenPrice()-TP*Point >= Close[1] ))
       && ( Ticket_S != 0 && Ticket_S != -1 ))
    {     
      Exit_S = OrderClose(Ticket_S,Lots,Ask,Slip,Red);
      if( Exit_S ==1 ) {Ticket_S = 0;} 
    }   

   //買いエントリー
   if(    (plusdi1 > minusdi1 && plusdi2 < minusdi2 ) && maindi1 > 18.0 && maindi1 < 50.0 && damiani_f() ==1  // && maindi1 > mainsig
       && ( Ticket_L == 0 || Ticket_L == -1 ) 
       && ( Ticket_S == 0 || Ticket_S == -1 ))
    {  
      Ticket_L = OrderSend(Symbol(),OP_BUY,Lots,Ask,Slip,0,0,Comments,MAGIC,0,Yellow);
    }

   //売りエントリー
   if(    (plusdi1 < minusdi1 && plusdi2 > minusdi2 ) && maindi1 > 18.0 && maindi1 < 50.0 && damiani_f() ==1  // && maindi1 > mainsig
       && ( Ticket_S == 0 || Ticket_S == -1 )
       && ( Ticket_L == 0 || Ticket_L == -1 ))
    {   
      Ticket_S = OrderSend(Symbol(),OP_SELL,Lots,Bid,Slip,0,0,Comments,MAGIC,0,Red);     
    } 

   return(0);
  }

外国為替トレード 勝利の方程式 (投資を極める! 本当は教えたくないプロのノウハウ) / 今井雅人

外国為替トレード 勝利の方程式 (投資を極める! 本当は教えたくないプロのノウハウ) 外国為替トレード 勝利の方程式 (投資を極める! 本当は教えたくないプロのノウハウ)

今井雅人

日本実業出版社 2005-08-01

売り上げランキング :

Amazonで詳しく見る

by G-Tools

★★★☆☆

今井さんのFX本ですが、これもメンタルなどのお話が主で、戦術は書いてありません。

初心者向けなのかと思ったら、職業トレーダー向けに書いてあるんだそうな。

その割りにはさほど意外な話や高尚な話はありません。

うーん、勝利の方程式はどこにあるのでしょう。

関連記事

【かんたん図解】しっかり儲けるFX入門 / 今井 雅人 酒匂 隆雄

###

未来を予測する(?)便利なインジケータ AdamPriceReflection

ドル円15分足

 

AdamPriceReflection という変わった名称のインジケータ(MetaTrader4用)がありまして、上の桃色↓で示した黄色いラインを表示してくれます。

アダムセオリーに基づいて未来を予測するそうです。

作者のサイト(無料ダウンロード)> http://d.hatena.ne.jp/fai_fx/20100819/1282170104

もちろん 100%当たるわけではありません。

当たるなら誰でも数日で億万長者になってしまいますね。

*

私も試しにデモ口座で売買してみました。

今回は OANDA のデモ口座を初めて使います。ここのサーバーの時間も Alpari のサーバーと同じく 日本より 7時間遅れています。

  • 2015.01.14 10:11:16 sell 1.00 usdjpy 116.963  ⇒  2015.01.14 10:19:14 116.749 +21400

なんと 8分弱で 21400円ゲット(デモ口座なのでバーチャルです)。

ただ、チャートの時間足を変えると、曲線の形状はめまぐるしく変化し、いったいどれが正しいのかよくわかりません。^^

おかしいなと思ってプログラムソースを見ると、おそらくジョークのようです。^^

上のチャートのように、Schaff Trend Cycle、VQ、ADX、平均足、ボリンジャーの足並みを見て判断するのがいいと思います。

*

メインウィンドウは平均足が使われており、白(上昇)と赤(下降)で表示され、赤の次は赤が、白の次は白が続きやすくなっています。

赤が2-3個続いたら売り、白が2-3個続いたら買いで入り、色が変わったら手仕舞いする(線の長さが短ければ様子見でもいい)のが基本。

メインウィンドウの赤矢印と青矢印は ADXcrosses で出しています。これもなかなかイケルやつです。

###

FXで稼ぐ人はなぜ「1勝9敗」でも勝つのか? 利回り100%の外貨投資戦略 / 松田 哲

FXで稼ぐ人はなぜ「1勝9敗」でも勝つのか?  利回り100%の外貨投資戦略 FXで稼ぐ人はなぜ「1勝9敗」でも勝つのか? 利回り100%の外貨投資戦略

松田 哲

技術評論社 2007-02-22

売り上げランキング : 293460

Amazonで詳しく見る

by G-Tools

★★★☆☆

投資戦略と書いてあるとおり、戦術的なことは書いてありません。

上の写真とは違うのですが、私の買った本には、「村上龍氏絶讚!!」とオビに書いてあったので、シロウト向けの観念本かなと思って読み始めましたら、その通りでした。

メンタルについての話がほとんどです。

ちょっと役に立ったのは、一年のスケジュール。

欧米の職業的トレーダーはうまくいった人は 12月は完全に休みを取るらしいです。うまくいっていない人があがいて12月にがんばるために荒れる、と。金曜日の深夜の相場みたいに。

1月はリハビリ、手探りの月らしく方向は定まりません。

実際の今月の相場も上に下にどちらに行くかさっぱり読めません。デモ口座で動かしている EA もさっぱり波に乗れません。月曜日午前中の相場みたいです。

ということで、FX は 火曜日~金曜日日中、2月~11月に取引するのがいいということですね。

関連記事

###

FXブレイクアウトシステムのテスト(3)

ブレイクアウトシステムの改良です。

改良点は 21期間の値幅に制限を設けて、あまり値動きの激しいときにはエントリしないようにしました。

ドル円 1時間足で、前回と同じく 2013年3月15日からの結果。

総損益が 18693(2.87倍) と上昇。勝率はほぼ不変ながらプロフィットファクターの向上が効いているようです。

一番大きいのはドローダウンの大幅減少ですね。

右上がりのいい曲線になってきました。

改善前の資産曲線

 

 改善後の資産曲線

関連記事

###

FXブレイクアウトシステムのテスト(2)

昨日のブレイクアウトシステムの検証の続きです。

USDCHF(ドルフラン)日足の成績がいいようです。

Slow_period 36、Fast_period 24 に最適化しています。

2010/6/7(この日付はたまたま日付を指定しないとデフォルトでこうなってしまった) から本日までの結果です。

 

プロフィットファクター 1.55 はともかく、勝率44%はブレイクアウトシステムとしては立派と言えるでしょう。

資産曲線は後半のドローダウンがありますが、かなりチャーミングです。

売買回数は少ないですが、5年で 5.48倍ですからなかなか有望と思います。

続いて EURUSD(ユーロドル)4時間足です。Slow_period 25、Fast_period 45 に最適化しています。

売買回数が多く、最初のドローダウンがイタイですが、5年で 5.89倍ですから有望と思います。

続いて GBRUSD(ポンドドル)4時間足です。Slow_period 19、Fast_period 44 に最適化しています。

関連記事

FXブレイクアウトシステムのテスト

###

FXブレイクアウトシステムのテスト

ブレイクアウトシステムは今まで食わず嫌いでしたが、試作してみました。

ルールはシンプル。

  • 直近39期間の最高値を終値が上回る(ブレイクアウト)と買い。
  • 直近39期間の最低値を終値が下回る(ブレイクアウト)と売り。
  • 買いの決済は、直近19期間の最低値を終値が下回るとき。
  • 売りの決済は、直近19期間の最高値を終値が上回るとき。

プログラムソースは後述。

*

検証期間は 2013/3/15 から先週まで。

下は USDJPY 1時間足の結果です。Fast_period = 15 ; Slow_period = 30 に最適化しています。

 

プロフィットファクターは 1.30 ですが、勝率 38.5%とがブレイクアウトシステムにしては高いのは円安相場が長く続いた影響でしょうか。

ちょっと改良の余地がありそうです。

プログラムソース

//
// yasciiBreakout01.mq4
//
//

//マジックナンバーの定義
#define MAGIC  42871        

//パラメーターの設定//
extern double Lots = 1.0;     //取引ロット数
extern int Slip = 10;         //許容スリッページ数
extern string Comments =  ""; //コメント

extern int Fast_period = 18 ;
extern int Slow_period = 39 ;

//変数の設定//
int Ticket_L = 0; //買い注文の結果をキャッチする変数
int Ticket_S = 0; //売り注文の結果をキャッチする変数
int Exit_L = 0;   //買いポジションの決済注文の結果をキャッチする変数
int Exit_S = 0;   //売りポジションの決済注文の結果をキャッチする変数
int OS1 ;
int OS2 ;

double   OOPL;
double   OOPS;

int start()
  {

   if (Volume[0]>1 || IsTradeAllowed() == false) return(0) ;

   double FastHH2 = Close[iHighest(NULL, 0, MODE_CLOSE, Fast_period, 2)];
   double FastLL2 = Close[iLowest(NULL, 0, MODE_CLOSE, Fast_period, 2)];
   double SlowHH2 = Close[iHighest(NULL, 0, MODE_CLOSE, Slow_period, 2)];
   double SlowLL2 = Close[iLowest(NULL, 0, MODE_CLOSE, Slow_period, 2)];

   OS1 = OrderSelect(Ticket_L, SELECT_BY_TICKET);  
   OOPL = OrderOpenPrice();   

   //買いポジションのエグジット
   if(  (Close[2] >=FastLL2 && Close[1] < FastLL2) // || ( OOPL - ILC*Point >= Close[1] ))  //|| ( OOPL+TP*Point <= Close[1] ))
       && ( Ticket_L != 0 && Ticket_L != -1 ))
    {     
      Exit_L = OrderClose(Ticket_L,Lots,Bid,Slip,Red);
      if( Exit_L ==1 ) {Ticket_L = 0;}
    }    

   OS2 = OrderSelect(Ticket_S, SELECT_BY_TICKET); 
   OOPS = OrderOpenPrice();

   //売りポジションのエグジット
   if(    (Close[2] <=FastHH2 && Close[1] > FastHH2) // ||( OOPS + ILC*Point <= Close[1] ))  //|| ( OrderOpenPrice()-TP*Point >= Close[1] ))
       && ( Ticket_S != 0 && Ticket_S != -1 ))
    {     
      Exit_S = OrderClose(Ticket_S,Lots,Ask,Slip,Blue);
      if( Exit_S ==1 ) {Ticket_S = 0;} 
    }   

   //買いエントリー
   if(    Close[2] <= SlowHH2 && Close[1] > SlowHH2
       && ( Ticket_L == 0 || Ticket_L == -1 ) 
       && ( Ticket_S == 0 || Ticket_S == -1 ))
    {  
      Ticket_L = OrderSend(Symbol(),OP_BUY,Lots,Ask,Slip,0,0,Comments,MAGIC,0,Yellow);
    }

   //売りエントリー
   if(    Close[2] >= SlowLL2 && Close[1] < SlowLL2
       && ( Ticket_S == 0 || Ticket_S == -1 )
       && ( Ticket_L == 0 || Ticket_L == -1 ))
    {   
      Ticket_S = OrderSend(Symbol(),OP_SELL,Lots,Bid,Slip,0,0,Comments,MAGIC,0,Red);     
    } 

   return(0);
  }

関連記事

FXブレイクアウトシステムのテスト(2)

###

RVI のクロスを使った逆張り系FX自動売買システム

RVI( relative vigor index )という指標は素直でわかりやすいなぁと前から思っていましたが、シグナルラインも標準で備えているのでプログラム化するのも非常に簡単。

RVI はオシレーター系ですので逆張りに向いています。レンジ相場に強く、トレンド相場には全く向いておりません。

ということで作ってみました(ソースは後述)。

*

RVI とシグナル線のゴールデンクロスとデッドクロスでエントリします。

検証すると EURUSD 4時間足 との相性がいいです。

結果を見ると無駄打ちも結構あるので、とことん逆張りさせようと思い、移動平均線(4EMA)の上にあるときのみ売り、下にあるときは買いのみというフィルタをかけました。

2010/1/18 から先週までの 5年間のデータを使った結果はこちら。

 

資産曲線は後半の伸び悩みがもったいない。

レンジ相場はやはり強いですね。

まだまだ改良の余地がありそうです。トレンドが発生すると自動的にエントリをやめるとか・・・

EURUSD は 2014年の 5月からは一貫して下降トレンドでした。

2014年5月から先週まで、動作を「売り」に制限したら下のような感じになります。

未来がわかればいいのになあ。

プログラムソース

//
// yasciiRVIcross01.mq4
// 
//

//マジックナンバーの定義
#define MAGIC  42853        

//パラメーターの設定//
extern double Lots = 1.0;     //取引ロット数
extern int Slip = 10;         //許容スリッページ数
extern string Comments =  ""; //コメント

extern int RVI_period = 10 ;
extern int EMA_period = 4 ;

extern double ILC = 80 ; 
extern double TP = 110 ;

//変数の設定//
int Ticket_L = 0; //買い注文の結果をキャッチする変数
int Ticket_S = 0; //売り注文の結果をキャッチする変数
int Exit_L = 0;   //買いポジションの決済注文の結果をキャッチする変数
int Exit_S = 0;   //売りポジションの決済注文の結果をキャッチする変数
int OS1 ;
int OS2 ;

double   OOPL;
double   OOPS;

int start()
  {

   if (Volume[0]>1 || IsTradeAllowed() == false) return(0) ;

   double RVI_MAIN1 = iRVI(NULL, 0, RVI_period, MODE_MAIN, 1);
   double RVI_SIG1 = iRVI(NULL, 0, RVI_period, MODE_SIGNAL, 1);
   double RVI_MAIN2 = iRVI(NULL, 0, RVI_period, MODE_MAIN, 2);
   double RVI_SIG2 = iRVI(NULL, 0, RVI_period, MODE_SIGNAL, 2);

   double Ema21 = iMA(NULL, 0, EMA_period , 0, MODE_EMA ,PRICE_CLOSE, 1) ;

   OS1 = OrderSelect(Ticket_L, SELECT_BY_TICKET);  
   OOPL = OrderOpenPrice();   

   //買いポジションのエグジット
   if(    ((RVI_MAIN1 < RVI_SIG1 && RVI_MAIN2 > RVI_SIG2) || ( OOPL - ILC*Point >= Close[1] ) ) // || ( OOPL+TP*Point <= Close[1] ))
       && ( Ticket_L != 0 && Ticket_L != -1 ))
    {     
      Exit_L = OrderClose(Ticket_L,Lots,Bid,Slip,Red);
      if( Exit_L ==1 ) {Ticket_L = 0;}
    }    

   OS2 = OrderSelect(Ticket_S, SELECT_BY_TICKET); 
   OOPS = OrderOpenPrice();

   //売りポジションのエグジット
   if(    ((RVI_MAIN1 > RVI_SIG1 && RVI_MAIN2 < RVI_SIG2)||( OOPS + ILC*Point <= Close[1] ) ) // || ( OrderOpenPrice()-TP*Point >= Close[1] ))
       && ( Ticket_S != 0 && Ticket_S != -1 ))
    {     
      Exit_S = OrderClose(Ticket_S,Lots,Ask,Slip,Blue);
      if( Exit_S ==1 ) {Ticket_S = 0;} 
    }   

   //買いエントリー
   if(    RVI_MAIN1 > RVI_SIG1 && RVI_MAIN2 < RVI_SIG2 && Ema21 > Close[1]
       && ( Ticket_L == 0 || Ticket_L == -1 ) 
       && ( Ticket_S == 0 || Ticket_S == -1 ))
    {  
      Ticket_L = OrderSend(Symbol(),OP_BUY,Lots,Ask,Slip,0,0,Comments,MAGIC,0,Yellow);
    }

   //売りエントリー
   if(    RVI_MAIN1 < RVI_SIG1 && RVI_MAIN2 > RVI_SIG2 && Ema21 < Close[1]
       && ( Ticket_S == 0 || Ticket_S == -1 )
       && ( Ticket_L == 0 || Ticket_L == -1 ))
    {   
      Ticket_S = OrderSend(Symbol(),OP_SELL,Lots,Bid,Slip,0,0,Comments,MAGIC,0,Red);     
    } 

   return(0);
  }

###

MTF-CCI インディケーター( yMTF_Forex_freedom_Bar )を使った FX手法

上の AUDJPY 15分足のチャートのサブウィンドウに表示しているのはマルチタイムフレーム対応の CCI のインディケータです。

yMTF_Forex_freedom_Bar という名前で、無料でダウンロードできます。

ここでも以前、「MTF Forex Freedom Bar の威力 」で紹介しました。

*

任意の 4つ(上では 15分、30分、1時間、4時間にしています)のタイムフレームの CCI の値を正なら白箱、負なら赤箱で示します。

白が上下に4つ並ぶとどの時間軸でも上昇トレンド、赤なら下降トレンドということになります。

白が4つで買い、赤なら売り、そして決済は一番上もしくは上の二つが反転したときというのが典型的な売買法になります。

*

で、プログラム化して検証してみましたが、どうもうまくいきません。資産は減るばかり。

そこで移動平均線(21EMA)より終値が上になるときだけ買い(売りの場合は下)という条件を付け加えました。やや改善しますが、ほとんどの通貨で資産曲線は下降。

21EMA の代わりに動きの遅い 62EMA を使用してもだめ。

4つの時間足の組み合わせをいろいろ変えましたが、どうもうまくいかないようです。

印象としてはエントリはまずまずよいのですが、決済がだいぶ遅れるのが原因のように思えます。

決済はほかの敏感なインディケータ(Schaff Trend Cycle など)で行うといいかもしれません。

プログラムソース

//
// yasciiCCI_MTF1501.mq4
// 
//

//マジックナンバーの定義
#define MAGIC  42722        

//パラメーターの設定//
extern double Lots = 1.0;     //取引ロット数
extern int Slip = 10;         //許容スリッページ数
extern string Comments =  ""; //コメント

extern int CCI_Period = 14;

extern double LC = 80 ; 
//extern double TP = 110 ;

//変数の設定//
int Ticket_L = 0; //買い注文の結果をキャッチする変数
int Ticket_S = 0; //売り注文の結果をキャッチする変数
int Exit_L = 0;   //買いポジションの決済注文の結果をキャッチする変数
int Exit_S = 0;   //売りポジションの決済注文の結果をキャッチする変数

double   CCI_Value1 ;
double   CCI_Value2 ;
double   CCI_Value3 ;
double   CCI_Value4 ;
double   Ema21 ;

int OS ;

int start()
  {

   if (Volume[0]>1 || IsTradeAllowed() == false) return(0) ;

   CCI_Value1 = iCCI(NULL, 15, CCI_Period , PRICE_CLOSE, 1 );
   CCI_Value2 = iCCI(NULL, 30, CCI_Period , PRICE_CLOSE, 1 );
   CCI_Value3 = iCCI(NULL, 60, CCI_Period , PRICE_CLOSE, 1 );
   CCI_Value4 = iCCI(NULL, 1440, CCI_Period , PRICE_CLOSE, 1 );

   Ema21 = iMA(NULL, 30, 21 , 0, MODE_EMA ,PRICE_CLOSE, 1) ;

   OS = OrderSelect(Ticket_L, SELECT_BY_TICKET);  

   //買いポジションのエグジット
   if(    (CCI_Value1 <0  || Ema21 > Close[1] ||  OrderOpenPrice()-LC*Point >= Close[1] ) // || ( OrderOpenPrice()+TP*Point <= Close[1] ))
       && ( Ticket_L != 0 && Ticket_L != -1 ))
    {     
      Exit_L = OrderClose(Ticket_L,Lots,Bid,Slip,Red);
      if( Exit_L ==1 ) {Ticket_L = 0;}
    }    

   OS = OrderSelect(Ticket_S, SELECT_BY_TICKET); 

// Comment(Point);

   //売りポジションのエグジット
   if(    (CCI_Value1 >0  || Ema21 < Close[1] || OrderOpenPrice()+ LC*Point <= Close[1] ) // || ( OrderOpenPrice()-TP*Point >= Close[1] ))
       && ( Ticket_S != 0 && Ticket_S != -1 ))
    {     
      Exit_S = OrderClose(Ticket_S,Lots,Ask,Slip,Blue);
      if( Exit_S ==1 ) {Ticket_S = 0;} 
    }   

   //買いエントリー
   if(    CCI_Value1 >0 && CCI_Value2 >0 && CCI_Value3 >0 && CCI_Value4 >0 && Ema21 < Close[1]
       && ( Ticket_L == 0 || Ticket_L == -1 ) 
       && ( Ticket_S == 0 || Ticket_S == -1 ))
    {  
      Ticket_L = OrderSend(Symbol(),OP_BUY,Lots,Ask,Slip,0,0,Comments,MAGIC,0,Red);
    }

   //売りエントリー
   if(     CCI_Value1 <0 && CCI_Value2 <0 && CCI_Value3 <0 && CCI_Value4 <0 && Ema21 > Close[1]
       && ( Ticket_S == 0 || Ticket_S == -1 )
       && ( Ticket_L == 0 || Ticket_L == -1 ))
    {   
      Ticket_S = OrderSend(Symbol(),OP_SELL,Lots,Bid,Slip,0,0,Comments,MAGIC,0,Blue);     
    } 

   return(0);
  }

関連記事

MTF Forex Freedom Bar の威力

###

MACDのマルチタイムフレームシステム(FX自動売買プログラム)

ある本に載っていたある人の売買法をプログラムにして自動売買してみました。

長期の時間足と日足を見て、上昇トレンドの際には MACD とシグナル線とのゴールデンクロスを買いサインにするというものです(売りサインはこの真逆)。

手仕舞いは MACDとシグナル線が反転したときというもの。

長期の時間足と日足における上昇トレンドの判定にも MACD が使えますから、MACD をトリプルフレームで使えばいいとひらめきました。

ということで、MACDシステムのマルチタイムフレーム化を試してみたことになります。

3つの時間足の異なる MACD のパラメーターは汎用性のあるもので統一しました(ここを変えた方がいいのかもしれません)。

で、プログラム(後述)ができあがり、いろんな通貨の 5分足、15分足、30分足、1時間足で試しましたが、どれもかんばしくありません。

移動平均線のクロスという基本ロジックの限界でしょう。

同じロジックの「シングルタイムフレームでパラメーターを変えた3種類のMACDで構成した」マックトリプルバーガーシステムにも勝てていません。

マックトリプルバーガーシステムもオーバーフィッティングであることは変わりないので、根本的に異なるシステムを解発する法がいいでしょう。

現在、「未来予測システム」と「簡略化MarketForceシステム」と「フィボナッチピボットシステム」を研究中です。

プログラムソース

//
// yasciiMACD_MTF15_1.mq4
//

//マジックナンバーの定義
#define MAGIC  42571        

//パラメーターの設定//
extern double Lots = 1.0;     //取引ロット数
extern int Slip = 10;         //許容スリッページ数(pips)
extern string Comments =  ""; //コメント

extern int Fast_EMA_Period = 12;
extern int Slow_EMA_Period = 26;
extern int Signal_Period = 9;
extern double ILC = 80 ;
// extern double TP = 110 ; 

//変数の設定//
int Ticket_L = 0; //買い注文の結果をキャッチする変数
int Ticket_S = 0; //売り注文の結果をキャッチする変数
int Exit_L = 0;   //買いポジションの決済注文の結果をキャッチする変数
int Exit_S = 0;   //売りポジションの決済注文の結果をキャッチする変数
int OS1 ;
int OS2 ;

double   MACD_MAIN1_1 ;
double   MACD_SIGN1_1 ;
double   MACD_Value1_1 ;

double   MACD_MAIN1_2 ;
double   MACD_SIGN1_2 ;
double   MACD_Value1_2 ;

double   MACD_MAIN1_3 ;
double   MACD_SIGN1_3 ;
double   MACD_Value1_3 ;

double   OOPL;
double   OOPS;

int start()
  {

   if (Volume[0]>1 || IsTradeAllowed() == false) return(0) ;

   MACD_MAIN1_1 = iMACD(NULL, 0, Fast_EMA_Period , Slow_EMA_Period, Signal_Period, PRICE_CLOSE, MODE_MAIN, 1 );
   MACD_SIGN1_1 = iMACD(NULL, 0, Fast_EMA_Period , Slow_EMA_Period, Signal_Period, PRICE_CLOSE, MODE_SIGNAL, 1 );
   MACD_Value1_1 = MACD_MAIN1_1 - MACD_SIGN1_1 ;

   MACD_MAIN1_2 = iMACD(NULL, 240, Fast_EMA_Period , Slow_EMA_Period, Signal_Period, PRICE_CLOSE, MODE_MAIN, 1 );
   MACD_SIGN1_2 = iMACD(NULL, 240, Fast_EMA_Period , Slow_EMA_Period, Signal_Period, PRICE_CLOSE, MODE_SIGNAL, 1 );
   MACD_Value1_2 = MACD_MAIN1_2 - MACD_SIGN1_2 ;

   MACD_MAIN1_3 = iMACD(NULL, 1440, Fast_EMA_Period , Slow_EMA_Period, Signal_Period, PRICE_CLOSE, MODE_MAIN, 1 );
   MACD_SIGN1_3 = iMACD(NULL, 1440, Fast_EMA_Period , Slow_EMA_Period, Signal_Period, PRICE_CLOSE, MODE_SIGNAL, 1 );
   MACD_Value1_3 = MACD_MAIN1_3 - MACD_SIGN1_3 ;

   OS1 = OrderSelect(Ticket_L, SELECT_BY_TICKET);  
   OOPL = OrderOpenPrice();   

   //買いポジションのエグジット
   if(   ( MACD_Value1_1 <0 ||  OOPL - ILC*Point >= Close[1] ) // || ( OOPL+TP*Point <= Close[1] ))
       && ( Ticket_L != 0 && Ticket_L != -1 ))
    {     
      Exit_L = OrderClose(Ticket_L,Lots,Bid,Slip,Red);
      if( Exit_L ==1 ) {Ticket_L = 0;}
    }    

   OS2 = OrderSelect(Ticket_S, SELECT_BY_TICKET); 
   OOPS = OrderOpenPrice();

   //売りポジションのエグジット
   if(    (MACD_Value1_1 >0  || OOPS + ILC*Point <= Close[1]  ) //|| ( OrderOpenPrice()-TP*Point >= Close[1] ))
       && ( Ticket_S != 0 && Ticket_S != -1 ))
    {     
      Exit_S = OrderClose(Ticket_S,Lots,Ask,Slip,Blue);
      if( Exit_S ==1 ) {Ticket_S = 0;} 
    }   

   //買いエントリー
   if(    MACD_Value1_1 >0 && MACD_MAIN1_2 >0 && MACD_MAIN1_3 >0
       && ( Ticket_L == 0 || Ticket_L == -1 ) 
       && ( Ticket_S == 0 || Ticket_S == -1 ))
    {  
      Ticket_L = OrderSend(Symbol(),OP_BUY,Lots,Ask,Slip,0,0,Comments,MAGIC,0,Yellow);
    }

   //売りエントリー
   if(    MACD_Value1_1 <0 && MACD_MAIN1_2 <0 && MACD_MAIN1_3 <0 
       && ( Ticket_S == 0 || Ticket_S == -1 )
       && ( Ticket_L == 0 || Ticket_L == -1 ))
    {   
      Ticket_S = OrderSend(Symbol(),OP_SELL,Lots,Bid,Slip,0,0,Comments,MAGIC,0,Red);     
    } 

   return(0);
  }

###

一番売れてる投資の雑誌ザイが作った「FX」入門 / ザイFX!編集部 羊飼い

一番売れてる投資の雑誌ザイが作った「FX」入門 一番売れてる投資の雑誌ザイが作った「FX」入門

ザイFX!編集部 羊飼い

ダイヤモンド社 2009-03-27

売り上げランキング : 4655

Amazonで詳しく見る

by G-Tools

★★★☆☆(わかりやすいが今ひとつ)

初心者用のFX解説本。

有名ブロガー羊飼いさんが担当しています。この人のブログは非常に役に立ちます。

全くの初心者にはちょっと難しいかも。

最後の方に個人投資家たちの方法を紹介していますが、どれも参考にならない(失礼!)。

ということで、FX 手法は載っていないのでほかの本で研究してください。

###

株って儲かりますか?

この前知人と話していて、投資の話になりました。

その人が株でだいぶ損をしていると言うので、

他人の思惑を想像したり 噂を聞いたりして とかという理由で株を買ったらダメでしょ。

会ったこともない海千山千のゼニゲバ親父の思惑なんてわかりませんよ。

いっしょに住んでいるカミサンの思惑すらわかりっこないのに。

と言ったら、すごく納得されました。

###

FXトレード 2014/1/7

FXトレードの記録です。

ようやく OANDA にリアル口座を開きました。早ければ来週あたりに実稼働です。

で、昨日の成績は(まだデモ口座です)以下のようになりました。

時間はサーバーの時間で日本時間より 7時間遅れています。

幸いなことに全勝。

マックトリプルバーガー(自動売買プログラム)

  1. 2015.01.07 03:12:51 buy 1.00 usdjpy 118.855 ⇒ 2015.01.07 03:22:07 118.909 5400

10分も仕事せずに 5400円で終了。

もっと仕事しろよ。

実際はバージョンアップ(Damiani フィルタの組み込み)のために止めていた時間が長かったのですが。

にっこり(自動売買プログラム)

  1. 2015.01.07 01:08:29 sell 0.30 eurusd 1.18781 ⇒ 2015.01.07 02:18:34 1.18746 1248
  2. 2015.01.07 02:18:35    sell 0.30 eurusd 1.18738 ⇒ 2015.01.07 16:07:44 1.18168 20427
  3. 2015.01.07 17:00:01 sell 0.30 eurusd 1.18189 ⇒ 2015.01.08 14:18:09 1.17619 20496

昨日買った本についていた EA です。
計3回発動し、42171円のゲット。
10万通貨でなく、3万通貨なのは負けた時の金額が超でかいので。

裁量つまり手動(えつこチャート)

  1. 2015.01.06 15:30:00 sell 1.00 usdjpy 119.056 ⇒ 2015.01.06 16:44:14 118.915 14100
  2. 2015.01.06 16:45:00 sell 1.00 usdjpy 118.898 ⇒ 2015.01.06 17:03:15 118.731 16700

裁量はしないはずなのですが、ちょっとヒマだったものでつい。^^

15分足なのでちょっと忙しかったですが、1回目を利益確定したらすぐ2回目のベルが鳴りました。ちょっとびっくりしました。

「まだ降りたらアカン」と言われたような感じです。

###

 

ドクター田平の「最強」外貨投資―5年後に資産家になる / 田平 雅哉

ドクター田平の「最強」外貨投資―5年後に資産家になる ドクター田平の「最強」外貨投資―5年後に資産家になる

田平 雅哉

主婦と生活社 2006-10

売り上げランキング : 140859

Amazonで詳しく見る

by G-Tools

★★★☆☆(最強ではなく普通)

これもブックオフで見つけた田平先生の FX 本。

似たような本をいくつも書いておられますね。

初心者向けの解説本ですが、「ユーロは12月に高く、1月に安くなる」と書いてあり、確かに現在も昨年の 12/16 をピークにずっと下げていますね。

EURUSD 1時間足

あと、初心者用にしては珍しく手法の説明があります(そっけないですが)。

この方法は他の本にも載っていましたが、MACD(パラメーターは標準的) とストキャスティクス(パラメーターは驚異の 42日間:閾値は85%と15%)とを使ったものです。

42日間のストキャスなんて世界最長記録ではないでしょうか。普通は 5日間ですもんね。

でも42日間にすると結構レートと似てくるので、わかりやすかったりします。

↑ 上からレート、5日間のストキャス、42日間のストキャスです。

関連記事

###

ほったらかしでも月100万円儲かるFX自動売買 / 榊原卓丸

ほったらかしでも月100万円儲かるFX自動売買 ほったらかしでも月100万円儲かるFX自動売買

榊原卓丸

かんき出版 2010-05-07

売り上げランキング : 458303

Amazonで詳しく見る

by G-Tools

★★★★★(わかりやすく、オマケつき)

いつもどうでもいい本を紹介しているので今日はいい本を。

昨日本屋で見つけました。

FX の自動売買についての教科書です。

初心者でも非常にわかりやすく、しかも3本の EA(自動売買ソフト)がついてきます。

誰でもこの本を買えば無料で(デモ口座で)この3本の EA を体験できてしまいます。

にっこりシステムという EA

ちなみに、この3本、私が少しだけバックテストしたところ、その1本(にっこりシステム)は今の相場でもちゃんと働きそうです。

さっそく、昨晩からデモ口座で起動しています。

この EA はトレンド相場で働くブレイクアウトシステムです。推奨は EURUSD 1時間足。

ブレイクアウトなので勝率は低いのが普通ですが、なんと 90%以上。

秘密は損切りの額が利益確定の額の6倍にしてあるから。

負けたときはイタイのですが、よく勝つのでトータルでは儲かるというわけです。

下は 2014/3/10 から今日までの約 10ヶ月のバックテストの結果です。

資産曲線

39戦35勝(最後の1敗はテスト終了のため強制打ち切りになったので、本当なら勝ちに転じていた可能性もあります)。

売りなら25戦全勝。すごいですね。負けの金額もすごいですが。

さて、昨晩起動したところですが、現在の結果は1回めが起動してすでに終了しています。いま2回目が起動中。

1回目の結果は 2015.01.07 00:00:04 sell 0.30 eurusd 1.18861 ⇒ 015.01.07 13:34:48 1.18291  (+20373円)

コワイので 30000通貨単位と、いつもの 3割の投資金額で稼働していますが、うれしい 2万円超え。

いつもの 1.0ロットなら 67000円くらいですね。1400円の本代が早速挽回できます。

2回目はまだ 2000円弱みたいですけど。

リアル口座で使えるといいですね。

最初の負けが早くにくるとくじけそうになるでしょうから、もう少し検討してみます。

###

Damiani フィルタ(関数版:MetaTrader4用)のソース

公開されているインディケーター Damiani_volatmeter のソースより抜き出して、私が関数版に書き直したものがこちらです。

ご自分の EA にお使いください。

戻り値はトレンド相場のとき1、レンジ相場のとき0です。

//+------------------------------------------------------------------+
//            Damiani volatmeter 関数版 終値を使用
//
// 戻り値はトレンド相場のとき1、レンジ相場のとき0
//+------------------------------------------------------------------+

//---- input parameters
extern int       Viscosity=13;
extern int       Sedimentation=50;
extern double    Threshold_level=1.3;
extern bool      lag_supressor=true;

double   lag_s_K=0.5;
double   s0 = 0; 
double   s1= 0;
double   s2 = 0;
double   s3 = 0;
double   vol=0;
double t=Threshold_level;

int damiani_f()
{

      double sa=iATR(NULL,0,Viscosity,1) ;
      double ia = iATR(NULL,0,Sedimentation,1) ;
      if(lag_supressor){
         if (ia == 0) vol = 1.0 ;
         else vol= sa/ia + lag_s_K*(s1-s3) ;   
      }else{
         if (ia == 0) vol = 1.0 ;
         else vol= sa/ia ;   
      }

      double anti_thres=iStdDev(NULL,0,Viscosity,0,MODE_LWMA,PRICE_TYPICAL,1) ;

      double isd = iStdDev(NULL,0,Sedimentation,0,MODE_LWMA,PRICE_TYPICAL,1) ;
      if (isd == 0) anti_thres = 1.0 ;
      else anti_thres = anti_thres/isd ;

      t=t-anti_thres;

      s3 = s2; s2 = s1; s1= s0; 
      s0 = vol;

      if (vol>t){
      	return(1);
      }else{
      	return(0);
      }

}

###

マックトリプルバーガーシステムの改良 / Damiani フィルタ使用

マックトリプルバーガーシステムの改良をしてみました。

改良点: Damiani フィルタを用いて「Do not trade」の時期はエントリを回避する

結果は取引数が直近の 22ヶ月間で 14回減少と、あまり効果はないようですが、プロフィットファクターは 1.70 とやや改善。

勝率は 1%弱ダウン。

収益も 若干ですが、改善しています。

年率は 79%。

オリジナル(yasciiMaCD_3cross4.ex4)買いのみ

改良型(yasciiMaCD_3cross5.ex4)買いのみ

改良型(yasciiMaCD_3cross5.ex4)買い+売り

売りも行うようにしてもプロフィットファクターは低下し、勝率も低下。収益はわずかに改善するものの誤差の範囲かもしれません。

取引数は倍近くに増えますが、手数料(スプレッド含む)を考えると疑問。

これからの相場がダウントレンドが多いと有効でしょうけど。

あ、まだ売りの場合の最適化はできていませんけどね。

売り(円高用)のほうが急激な下落に対応しないといけないケースが多いので、パラメーターを変えるか、別のロジックを使った EA を採用するほうがよいと思います。

改良型(yasciiMaCD_3cross5.ex4)買いのみの収益グラフ

改良型(yasciiMaCD_3cross5.ex4)買い+売りの収益グラフ

見た目も上のグラフの方がなめらかで気分がいいですね。

関連記事

###