完全自動売買

MQLピンポイントアドバイスサービス


2015年8月 MQLピンポイントアドバイスサービスはじめました!

MQLピンポイントアドバイス

自作EAで、「機能を追加したけど、うまく作動しない」とか
「一部にバグがあり、自力では修正困難な場合」など、
ピンポイントで問題解決したい方、ご相談ください!

1件につき、3000円~。
先着順で承ります。

秘密厳守で行ないます!
まずは、ご連絡ください!

ご相談、お問い合わせは
→Dr.EA お問い合わせフォームへ

完全自動売買への道のり

タグ

2007年10月18日|コメント (0)

カテゴリー:完全自動売買

EA作成代行


2008年9月 EA作成代行はじめました!

Dr.EA作成代行

「EAを作ったケド、うまく作動しない」とか、
「持っているEAに新しい機能をつけたい」など、
部分的な修正や追加などをしたい方、
ご相談ください!

「新しくEAやインディケータを作って欲しい」という方も、
ご連絡お待ちしております^0^

お見積もりは無料です。
先着順で承ります。

著作権・MQ4ファイル希望の方は、別途追加料金が必要となります。
(後からの申し込みもできます。)

作成したものによる損失等、一切の責任を負うことはできませんので
ご了承ください。

秘密厳守で行ないます!
まずは、ご連絡ください!

ご相談、お問い合わせは
→Dr.EA システム作成のお見積もりへ

おまけツール

ProfitCounterとClockの表示画像

画像のチャートの上下にあるのは、
残高が変化した時に一緒によろこんでくれたりする ProfitCounter と、
サーバー時間との差を補正してくれる Clock というインディケータです。

ProfitCounter_v2.zip

Clock.zip

デイトレなどのお供にどうぞ!
(ProfitCounterはバックテストのVisual modeではつかえません^^;)

完全自動売買への道のり

タグ

2007年10月17日|コメント (12)

カテゴリー:完全自動売買

ダウンロードしたものを使う


ネットで検索していると、いろんなインディケータ(テクニカル指標)やEA(Expert Advisor、売買ルール)がダウンロードできたりします。

今回は、

  1. ダウンロードしたものを保存する
  2. ダウンロードしたものを使う

について、書いていきたいと思います。

1.ダウンロードしたものを保存する

ダウンロードするときには、どこにダウンロードするか選択しなければなりません。

まずは、MetaTrader4のフォルダがどこにあるのかを知りましょう。

MT4を普通にダウンロードした場合は、
マイコンピュータ→ローカルディスク(C:)→Program Files
の中に、MT4のフォルダがあると思います。

MT4のフォルダを開くと、またいろんなフォルダがあります。

その中で、experts フォルダを見つけてください。

EA(売買ルール)をダウンロードするときは、
このexperts フォルダの中に保存しましょう!

では、さっそく下記のzipファイルをダウンロードして解凍してみてください。

その中にあるmq4ファイルをexperts フォルダの中に保存します。

Template.zip

出来ましたか?

ここでもう一つ、インディケータをダウンロードする場合は、
experts フォルダの中の indicators フォルダの中に保存する
ということを覚えておきましょう!

2.ダウンロードしたものを使う

EAやインディケータには、2つのファイルが存在します。

一つは、先ほどダウンロードしたもののような mq4 ファイル
もう一つは、 ex4 ファイルです。

mq4 ファイルは人間が読むファイル。
ex4 ファイルはMetaTrader4が読むファイル。

といった感じです。

なので、先ほどダウンロードした mq4 ファイルのままだと
MT4には分かってもらえません。

そこで、Meta Editor の登場です。

Meta Editor のコンパイルは mq4 ファイルを
ex4 ファイルに翻訳するといった機能なのです。

早速、Meta Editor で先ほどダウンロードした Template.mq4 をコンパイルしてみましょう。

コンパイルできたらexpertsフォルダを確認してください。
Template.ex4 ファイルが作られたと思います。

これで、MT4で使える状態になりました。

今回ダウンロードしたTemplate.mq4はプログラム練習のためのEAなので
実際の取引には使わないようにしましょうね。

では、今回はこのへんで。

完全自動売買への道のり

タグ

2007年10月16日|コメント (11)

カテゴリー:完全自動売買

システムの質を高める2


今回は、

  1. 売り取引もする
  2. 売買条件にフィルタを付け加える
  3. 最適化をする

ということをやっていきましょう。

1.売り取引もする方法

これは、買い取引の条件文を書いたときと、同じようにすればいいです。

書く場所は、ポジション無しの条件文の{}内の、買いの条件文の{}の次あたりに書きましょうか。

      if(nowbar != Bars && Close[1] < ma)
      {                          
         //売りポジションを取る。
         OrderSend(Symbol(), OP_SELL, lots, Bid, 3, Bid+(StopLoss*Point),
                             Bid-(TakeProfit*Point), "Sell", 10, 0, Red);
         nowbar = Bars;
      }

とすればよいです。

注意点は、価格は Ask ではなくて Bid になるということ。
損切り値、利食い値の +- が反対になることです。
あとは、コメントや色も変えてあげましょうか。

更に、決済のときのポジションの振り分けも必要ですね。

   // ポジション有りの場合
   else 
   {
      //ポジションのデータを取得。
      OrderSelect(CurrentPosition, SELECT_BY_POS);
      //もしポジションが買いポジションだったら
      if(OrderType() == OP_BUY)
      {
	      //もし1本前の終値が移動平均より下ならば
	      if(Close[1] < ma)
	      {
	         //買いポジション決済
	         OrderClose(OrderTicket(), OrderLots(), Bid, 3, Red);
	      }
      }
      //もしポジションが売りポジションだったら
      if(OrderType() == OP_SELL)
      {
	      //もし1本前の終値が移動平均より上ならば
	      if(Close[1] > ma)
	      {
	         //売りポジション決済
	         OrderClose(OrderTicket(), OrderLots(), Ask, 3, Blue);
	      }
      }      
   }

このように、選択されたポジションが売りか買いかを調べるときは、
OrderType()
を使います。

これで、上のように条件をつけて、振り分けて、そのうえで決済条件を書きましょう。

売りポジションの決済の場合の価格は、Ask になるので気をつけましょう。

2.売買条件にフィルタを付け加える

このままでは、移動平均より上ならばホイホイと買い、下ならばホイホイト売り。
これでは、勝率も上がりませんし、利益も出しづらいと思います。

なので、一般的には条件を絞ってあげて、勝てるときに取引をするといった売買戦略をつくります。

今回は、フィルタとしてオシレータ系のストキャスティクスを使いましょうか。

まずは、ストキャスの値を代入しておく変数の宣言です。
変数名は、sto にしておきましょうか。

   double ma, sto;

このように、既存の ma の後ろにカンマと sto を割り込ませましょう。
これで、ma と sto は小数ですよといった意味になります。

つぎに、ストキャスの値を計算します。
といっても、便利な関数があるので、簡単です。

   //ストキャスティクス
   sto = iStochastic(NULL, 0, 5, 3, 3, MODE_SMA, 0, MODE_MAIN, 0);

これを、移動平均の計算式の下あたりに入力します。

iStochastic(・・・) はストキャスの関数です。

()内の意味は、

(通貨ペア,時間足,%K期間,%D期間,スロー期間,移動平均の種類,使う価格,ラインの選択,時期)

といった感じです。

これを使って売買の条件を絞りたいのですが、ここはひとつ、条件の値をパラメータにしましょうか。

ストキャスの許容度として StoLevel という変数を作りましょう。

まずは、変数の宣言ですが、パラメータ用の変数のところに

extern int StoLevel = 20;

を付け加えましょう。

そして、ポジション無しの場合の買いの条件を

      //買いの条件
      if(nowbar != Bars && Close[1] > ma && sto < StoLevel)

といった感じに付け加えましょう。

売りの時も同様に

      //売りの条件
      if(nowbar != Bars && Close[1] < ma && sto > 100 - StoLevel)

という具合です。

ここで、売りのときは、sto の値は 100 に近いほうがよいので
sto > 100-StoLevel としておきましょう。

これでフィルタは装着完了です。コンパイルしましょう。

次の「最適化をする」の前にもう一度仕上がりのコードをコピペしておきますね。

//+------------------------------------------------------------------+
//|                                                      HeikinSample.mq4 |
//|                                                                            keiji |
//|                                 http://www.dr-ea.com/meta-blog/ |
//+------------------------------------------------------------------+
#property copyright "keiji"
#property link      "http://www.dr-ea.com/meta-blog/"

//パラメータ用の変数
extern int     StopLoss    = 40;
extern int     TakeProfit  = 20;
extern double  lots        = 0.1;
extern int     MaPeriod    = 12;
extern int     StoLevel    = 20;

//記憶用の変数
int nowbar;

//+------------------------------------------------------------------+
//| expert start function                                                    |
//+------------------------------------------------------------------+
int start()
{
//----
   //変数の宣言
   double ma, sto;
   int cnt, CurrentPosition = -1 ;
   
   //移動平均値の算出  
   ma = iMA(NULL, 0, maPeriod, 0, MODE_SMA, PRICE_CLOSE, 1);
   //ストキャスティクス
   sto = iStochastic(NULL, 0, 5, 3, 3, MODE_SMA, 0, MODE_MAIN, 0);
   
   //オーダー
   for(cnt = 0; cnt < OrdersTotal(); cnt++)
   {
      OrderSelect(cnt, SELECT_BY_POS);
      if(OrderMagicNumber() == 10) CurrentPosition = cnt;
   }

   //ポジション無しの場合
   if(CurrentPosition == -1)
   {
      //買いの条件
      if(nowbar != Bars && Close[1] > ma && sto < StoLevel)
      {                          
         //買いポジションを取る。
         OrderSend(Symbol(), OP_BUY, lots, Ask, 3, Ask-(StopLoss*Point),
                            Ask+(TakeProfit*Point), "Buy", 10, 0, Blue);
         nowbar = Bars;
      }
      //売りの条件
      if(nowbar != Bars && Close[1] < ma && sto > 100-StoLevel)
      {                          
         //売りポジションを取る。
         OrderSend(Symbol(), OP_SELL, lots, Bid, 3, Bid+(StopLoss*Point),
                             Bid-(TakeProfit*Point), "Sell", 10, 0, Red);
         nowbar = Bars;
      }      
   } 
   // ポジション有りの場合
   else 
   {
      //ポジションのデータを取得。
      OrderSelect(CurrentPosition, SELECT_BY_POS);
      
      //もしポジションが買いポジションだったら
      if(OrderType() == OP_BUY)
      {
         //もし1本前の終値が移動平均より下ならば
         if(Close[1] < ma)
         {
            //買いポジション決済
            OrderClose(OrderTicket(), OrderLots(), Bid, 3, Red);
         }
      }
      //もしポジションが売りポジションだったら
      if(OrderType() == OP_SELL)
      {
         //もし1本前の終値が移動平均より上ならば
         if(Close[1] > ma)
         {
            //売りポジション決済
            OrderClose(OrderTicket(), OrderLots(), Ask, 3, Blue);
         }
      }
   }
//----
   return(0);
}
//+------------------------------------------------------------------+

こんな感じですね^^

3.最適化をする

さあ、いよいよ最適化です。

最適化とは、特定の通貨ペアの特定の時間足で、
このシステムのパラメータを変化させて利益を出しやすくする作業です。

やり方は、バックテストの作業と似ています。

MT4 を開き、テスターを開きます。

Expert Advisor: にHeikinSample を選びます。

その他、それぞれをセッティングします。(バックテストのときと同じ要領)

右上の Expert properties ボタンを押してパラメーターの入力タブを押します。

最適化したいパラメータのチェックボックスにチェックをいれます。

スタート、ステップ、ストップの欄にそれぞれ、スタートからストップまでステップの幅で調べたい数値を入力します。

例えば、損切り・利食い幅は広めに取って、lots は 1 にしておいて、
MaPeriod と StoLevel にチェックを入れて、
MaPeriod は 6 から 3 つとびの 21 まで、
StoLevel は 10 から 5 つとびの 30 まで。
といった感じです。

OK ボタンを押して、ウィンドウを閉じ、Optimization にチェックをいれてスタートボタンで開始します。

終了したら、Optimization Results で並べ替えをしたりして見ていきましょう。
特に、取引回数、プロフィットファクター、ドローダウンをみてよさそうなもののパラメーターの入力の欄をみてみましょう。

それを参考に更に、練り込んでやってみましょう。
時間が許すなら、Every ticks の方でやってみましょう。

このように、パラメータを過去のデータにあわせていく作業が最適化です。

ここで気をつけてほしいのは、全ての通貨ペアに通用するパラメータを探すのはやめましょう。
なぜなら、1pipsの価値も違うしそれぞれ動き方に性格のようなものがありますので、システムとの相性も当然出てくるからです。

今回、作ってきたシステムは、単純ですがよい結果がでるかもですよ。
相性のよい通貨ペア、時間足が見つかったら、デモ取引で試してみましょう。

今回はこのへんで。

完全自動売買への道のり

タグ

2007年10月15日|コメント (17)

カテゴリー:完全自動売買

システムの質を高める


 前回までに作ったシステムに手を加えて、実際の取引の時に使いやすいものにしていきましょう。

  1. パラメータを作る
  2. 売買制限を設ける
  3. 他の取引(手動での取引や他のシステムでの取引)の邪魔をしないようにする

の順にやってみます。

1.パラメータを作る方法

パラメータとは、外部から設定できる値のことで、これを設けることでシステムに融通性が出てきます。

今回は、

  • 損切り幅
  • 利食い幅
  • ロット数
  • 移動平均の計算期間

を、設定可能にしていきましょうか。

書く場所は、#property ・・・ の下あたりに書きましょう。

書き方は、

extern int     StopLoss    = 40;
extern int     TakeProfit  = 20;
extern double  lots        = 0.1;
extern int     MaPeriod    = 12;

という感じです。

変数の宣言の前に extern を付け加えるだけです。
宣言の後に = ** と付け加えると、最初は**を入れておいてくださいといった意味になります。

さて、この変数たちをシステム内に忍ばせるわけですが、
まずはOrderSend の()内の損切り値に入れたいと思います。

その前に、パラメータで扱う変数は、『損切り幅』ですから、これを『損切り値』に変えてあげなければなりません。

Ask - (StopLoss * Point)

と書けば損切り値に変わります。
Point とは、このチャートの1ピプスの桁のことで、例えば、USDJPYの通貨ペアだったら、0.01になります。
(小数点以下3桁まで表示されている場合は、0.001になります)

これは、
買値 - ( 損切り幅 * ピプスの桁 )

といった感じです。

利食い値も同様に

Ask + (TakeProfit * Point)

となります。

ロット数はlotsのままで大丈夫そうですね。

これを、OrderSend の()内にそれぞれ入れてあげましょう。

   OrderSend(Symbol(), OP_BUY, lots, Ask, 3, Ask-(StopLoss*Point),
                      Ask+(TakeProfit*Point), "Buy", 10, 0, Blue);

といった具合です。

同じように移動平均の関数 iMA の()内にも MaPeriod を入れてあげましょうか。

   ma = iMA(NULL, 0, MaPeriod, 0, MODE_SMA, PRICE_CLOSE, 1);

というように、10のかわりに MaPeriod を入れましょう。

さて、これでパラメータを設定できる環境になりました。

コンパイルして、一度、MT4で作動させてみましょう。
やり方は、使い方を覚えるの記事の中で紹介しましたね。

最初にプロパティウィンドウが開きました。
その中のパラメータータブをクリックすると、設定した4つのパラメータが並んでいます。
Value の欄の数字をダブルクリックするとパラメータを入力し直すことができます。

これで、システムの幅が広がったわけです。

2.売買制限を設ける方法

今回は、一つのバーの中では1回しか注文を出さないという制限を付け加えましょう。

ここで、バーとは、ロウソク足の一本一本のことです。
そして、Bars という変数は、現在あるバーの数です。

このバーの数が変化していないうちは、まだ新たにバーが現れていないということがわかります。

この条件を付け加えると、注文したバーの中で、損切りや利食いが発生したとき、次のバーが現れるまで注文をしないといった意味になります。

まずは、バーの数を記憶させる変数を nowbar としておきましょうか。

これを、パラメータを設置した下あたりに宣言します。

int nowbar;

としましょう。
これを、int start() の{}内に書いてしまうと start() の動作が終わるたびにリセットされてしまうので、記憶しておいてもらえません。
気をつけましょう。

この変数 nowbar に、取引したときのバーの数を記憶させましょう。

やり方は、OrderSend 文の下の段に

      nowbar = Bars;

と、書きます。
nowbar に現在のバーの数を代入するといった意味です。

次に、nowbar と Bars が違うときだけ取引するという条件を加えましょう。

やり方は、OrderSend 文の上のif文の()内を

   nowbar != Bars && Close[1] > ma

とするのです。

これは、
nowbar が Bars と同じでない時、かつ、1本前の終値が ma より大きい時、
という意味です。

!= はノットイコール(~ではない)の意味です。

これで一つのバーの中では、1回しか注文を出さないようになりました。

3.他の取引の邪魔をしないようにする

他の邪魔をしないようにするには、このシステム特有の暗号を作ってあげましょう。

これは、OrderSend のマジックナンバーを使います。

まずは、ポジション無しの場合に使った

   if(OrdersTotal() < 1)

の代わりに

OrdersTotal()のなかで、マジックナンバーが 10 のものがあればそのインデックスを、変数 CurrentPosition に代入する

というプログラムを書き、代入されなかった場合は、ポジション無しとみなす、といった文にしていきましょう。

ここでは、新たに cnt と CurrentPosition という変数をつくりますので、int start() の{}内の ma を宣言した下あたりに

   int cnt, CurrentPosition = -1;

と変数の宣言をしてあげましょう。

ここで、CurrentPosition = -1 としたのは、
ポジションのインデックスが 0 から始まるので、変数をそのまま宣言したときのデフォルトの 0 とカブらないようにするためです。

そして、オーダーの条件文の前に

   for(cnt = 0; cnt < OrdersTotal(); cnt++)
   {
      OrderSelect(cnt, SELECT_BY_POS);
      if(OrderMagicNumber() == 10) CurrentPosition = cnt;
   }

という文を書いてあげます。

ここで、
for(*1; *2; *3){***}
は、繰り返すときに使う構文で

*1から開始して***する。*2のうちは*3を行い、***する。また、*2のうちは*3を行い、***する。また、・・・。

という感じに繰り返していきます。

また、cnt++ とは、cnt=cnt+1 という意味で、cnt に 1 をたして、cnt に代入するといった意味です。

全体では、

cnt が 0 のとき、
0 よりポジションの合計が多いなら続けてください。
持っているポジションのうちインデックス 0 のものを選択してください。
もし、そのマジックナンバーが 10 であるならば、CurrentPosition に 0 を代入してください。
cnt に 1 を足してください。
cnt が 1 のとき、・・・

と続きます。
もし、ポジションの合計が 0 より多くない(0の)とき、{}内の処理はされないので、CurrentPosition には、何も代入されることが無く、デフォルトの -1 になるということになります。

ですので、
if(OrdersTotal() < 1) の代わりに

   if(CurrentPosition == -1)

と書いてあげましょう。
if(CurrentPosition < 0) としてもいいですね。

さらに、ポジション有りの場合のOrderSelect のインデックスの部分には、
0 の代わりに
CurrentPosition
と入力しましょう。

これで、このシステム特有のマジックナンバー 10 だけを選んで取引できるようになりました。
コンパイルを忘れずにしましょう。

int init() や int deinit() は今のところ使わないので消しても大丈夫です。

コード全体をコピペしてみます。

//+------------------------------------------------------------------+
//|                                                 HeikinSample.mq4 |
//|                                                            keiji |
//|                                  http://www.dr-ea.com/meta-blog/ |
//+------------------------------------------------------------------+
#property copyright "keiji"
#property link      "http://www.dr-ea.com/meta-blog/"

//パラメータ用の変数
extern int     StopLoss    = 40;
extern int     TakeProfit  = 20;
extern double  lots        = 0.1;
extern int     MaPeriod    = 12;

//記憶用の変数
int nowbar;

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
{
//----
   //変数の宣言
   double ma;
   int cnt, CurrentPosition = -1 ;
   
   //移動平均値の算出  
   ma = iMA(NULL, 0, MaPeriod, 0, MODE_SMA, PRICE_CLOSE, 1);
   
   //オーダー
   for(cnt = 0; cnt < OrdersTotal(); cnt++)
   {
      OrderSelect(cnt, SELECT_BY_POS);
      if(OrderMagicNumber() == 10) CurrentPosition = cnt;
   }

   // ポジション無しの場合
   if(CurrentPosition == -1)
   {
      //もし1本前の終値が移動平均より上ならば
      if(nowbar != Bars && Close[1] > ma)
      {                          
         //ポジションを取る。
         OrderSend(Symbol(), OP_BUY, lots, Ask, 3, Ask-(StopLoss*Point), 
                                                      Ask+(TakeProfit*Point), "Buy", 10, 0, Blue);
         nowbar = Bars;
      }
   } 
   // ポジション有りの場合
   else 
   {
      //ポジションのデータを取得。
      OrderSelect(CurrentPosition, SELECT_BY_POS);
      //もし1本前の終値が移動平均より下ならば
      if(Close[1] < ma)
      {
         //ポジション決済
         OrderClose(OrderTicket(), OrderLots(), Bid, 3, Green);
      }
   }
//----
   return(0);
}
//+------------------------------------------------------------------+

こんな感じになりましたか?
今回はこのへんで。

完全自動売買への道のり

タグ

2007年10月14日|コメント (10)

カテゴリー:完全自動売買

売買システムを作る2


 さて、いよいよ注文の命令文です。

今回は、
ポジションを持ってなくて、1本前の終値が移動平均より上ならば買いポジションを持つ。
ポジションをもっていて、1本前の終値が移動平均より下ならば決済する。

という戦術で、命令文を書いていきましょう。

   // ポジション無しの場合
   if(OrdersTotal() < 1)
   {
      //もし1本前の終値が移動平均より上ならば
      if(Close[1] > ma )
      {                          
         //買いポジションを取る。
         OrderSend(Symbol(), OP_BUY, 0.1, Ask, 3, 0, 0, "Buy", 10, 0, Blue);
      }
   }

上から順に見ていきましょう。
//の行はコメントメモでしたね。後から見てわかりやすいように書いたりします。

ここで
if(・・・){***}という形を覚えましょう。
これは、
もし・・・ならば***しなさいという条件文です。
{ } が改行されているのは見やすくするためです。
} の後には ; はつけないようにしてください。

if(OrdersTotal() < 1)
{
}

は、もしポジションや注文中のものが 1 未満(一つも無い)ならば
{ } の中を実行するという意味です。

{ } の中にまた条件文の if文がでてきました。条件を通過した中で更に条件を付け加えています。

if(Close[1] > ma)

は、もし1本前の終値が ma (←1本前の移動平均値が代入されている)よりも大きいならば
{ } の中を実行するという意味です。

ここで、
Close[**] は、
このチャートの**本前の終値という便利な言葉です。
他にも、
Open[] High[] Low[] も同様に使えます。

さあ、ついにきました。注文の命令文です。

OrderSend(Symbol(), OP_BUY, 0.1, Ask, 3, 0, 0, "Buy", 10, 0, Blue);

OrderSend(・・・) は()の内容を送信するといった感じです。1行で書いてもよいし、カンマの前後の隙間で改行してもよいです。最後に ; を忘れないようにしましょう。

OrderSend(・・・)
のカッコの中の決まりごとを見ていきましょう。

(通貨ペア,注文方法,量,値段,スリッページ,損切り値,利食い値,コメント,マジックナンバー,有効期限,色)
といった感じです。

通貨ペアには、
"USDJPY" や "EURUSD" などを入力します。Symbol() と入力するとこのチャートの通貨ペアという意味になります。

注文方法には、
OP_BUY 成り行き買い、
OP_SELL 成り行き売り、
などを入力します。指値、逆指値注文の設定することができます。
買いオペ、売りオペといった感じですが、コンピュータは 0 や 1 というように整数で認識しているということも覚えておいてあげましょう。

量には、
ロットという単位で入力します。1ロットが10万通貨で通常0.1ロット(1万通貨)単位で入力します。

値段には、
買値、売値を入力します。このチャートの買値は Ask 、売値は Bid と入力すればコンピュータが調べてくれます。

スリッページには、
注文時の価格と約定時の価格の差の許容範囲をピプス(pips)という単位で入力します。ピプスとは、表示価格の下一桁のことで、スリップページは3程度が無難かと思います。

損切り値には、
損切りするときの価格を入力します。逆指値決済ですね。0 と入力すると指定無しということになります。

利食い値には、
利食いするときの価格を入力します。指値決済です。0 と入力すると指定無しとなります。

コメントには、
約定したときに操作履歴に残しておきたい言葉を入力します。複数の売買システムを使用している場合、後から見てわかるようにしたりします。

マジックナンバーには、
注文に番号を貼ってあげて、注文を識別するための数字を入力します。複数の売買システムを使用している場合、コンピュータにマジックナンバーで識別させたりします。

有効期限には、
注文の有効期限を入力します。指値注文や逆指値注文などのときに使いますが、特に必要ないときは 0 としておきましょう。

色には、
注文約定時、チャートにつけられる矢印の色を設定します。
色の種類は、Tools → Options → Colors のところで見ることができます。
個人的には、買いは Blue 売りは Red にしています。

さあ、これでポジションを持っていないときの注文は完了です。
続いては、ポジションを持っているときの注文です。

   // ポジション有りの場合
   else 
   {
      //ポジションのデータを取得
      OrderSelect(0, SELECT_BY_POS);
      //もし1本前の終値が移動平均より下ならば
      if(Close[1] < ma)
      {
         //ポジション決済
         OrderClose(OrderTicket(), OrderLots(), Bid, 3, Green);
      }
   }

いきなり else と書いてあります。なんだかポジション無しの場合よりも言葉数が少ない感じですが^^;
これは、その他の場合といった感じの意味です。else のすぐ上には、ポジション無しの場合のif文の終わりの } があります。なので、この場合は、ポジション無し以外の場合といった意味になります。
この場合も、その条件で{}内を実行します。

OrderSelect(0, SELECT_BY_POS); で、
持っているポジションを選択しています。

じつは、()の中には、もう一つ3つ目に項目があるのですが今回は省略します。(省略した場合デフォルトの現在のものといった感じになります。)
()の中の意味は持っているポジションの中で、インデックス 0 のものといった感じです。手動で約定させるときにも約定させたい取引を選択するんですが、その作業と同じですね。

if(Close[1] < ma){・・・} は、ポジション無しの時の条件の大小が逆になったパターンですね。
もし1本前の終値が ma よりも小さいならば { } の中を実行するという意味です。

そして、最後。
OrderClose(OrderTicket(), OrderLots(), Bid, 3, Green);
OrderClose(・・・) は選択されたポジションを()内の内容で決済注文をするといった意味です。

()内の内容は、
(注文番号,量,価格,スリップページ,色)
という感じ。

注文番号とは、
注文ごとにつけられるそれぞれの番号のことです。
OrderTicket() と書くことで選択されたポジションのチケットナンバーを意味します。

量には、
決済する、ロット数を入力します。
OrderLots() と書くことで選択されたポジションのロット数を意味します。

価格は、決済する価格です。
今回は、買いポジションを売り払うので、Bid というこのチャートの現在の売値という意味の言葉を入力しておきましょう。

スリップページと色は、OrderSend の時と同じですね。

これで、全てが書き終わりました^_^;

今まで、書いてきたのはソースコードといういわゆる人間語みたいなものです。今度は、これをコンピュータが理解して実行できるようにコンピュータ語に変換してあげましょう。

やり方は、
Compile ボタンを押す
です。

Meta Editor のツールバーに、用紙にチェックマーク Compile と書いてあるボタンです。

Toolbox 内の2,3段目位に太い文字で
0 error(s), 0 warning(s)
と、表示されれば大成功ですv(^0^)

何かエラーが表示された場合は、
{} の数、 () の数、 ; のつけ忘れが無いか、大文字小文字は合っているか、変数の宣言はできているか、などを確認してみましょう。

もう一度、全部書きますね。

   double ma ;
   
   ma = iMA(NULL, 0, 10, 0, MODE_SMA, PRICE_CLOSE, 1);
   
   // ポジション無し
   if(OrdersTotal() < 1)
   {
      //もし1本前の終値が移動平均より上ならば
      if(Close[1] > ma )
      {                          
         //ポジションを取る。
         OrderSend(Symbol(), OP_BUY, 0.1, Ask, 3, 0, 0, "Buy", 10, 0, Blue);
      }
   } 
   // ポジション有り
   else 
   {
      //ポジションのデータを取得。
      OrderSelect(0, SELECT_BY_POS);
      //もし1本前の終値が移動平均より下ならば
      if(Close[1] < ma)
      {
         //ポジション決済
         OrderClose(OrderTicket(), OrderLots(), Bid, 3, Green);
      }
   }

これを、int start() の
//----

//----
の間に書けばオッケーです。

今回は、できるだけシンプルにすることを心がけて作ったつもりです。なので、複数のポジションを持ったり、複数のシステムを起動させたりする場合は、もう少し複雑なプログラムになります。
それは、またの機会にしておきましょうか^^;

今回は、このへんで。

完全自動売買への道のり

タグ

2007年10月12日|コメント (11)

カテゴリー:完全自動売買

売買システムを作る


 さあ、いよいよシステム作りです!

今回は、基本練習のため移動平均線で作ってみましょう。

システムトレードで有名な石井正敏氏によれば、結局のところ移動平均線が一番使えるとのことです。

作り方は、

  1. MetaTrader4のMeta Editor ボタンをクリック(→Meta Editor が起動する)
  2. Meta EditorのNew ボタンをクリック
  3. Expert Advisor にチェック →次へボタン
  4. Name: に名前を入れる →完了ボタン
  5. EAのプログラムを書く →Compile ボタン

これで完了です。

1のMeta Editor ボタンはMT4画面のツールバーの中の黄色い四角にビックリマークのボタンです。

2のNew ボタンはMeta Editor画面のツールバーの中の一番左、用紙に緑のプラスマークのボタンです。

3は簡単。

4の名前は、HeikinSample とでもしておきましょうか。

5これが一苦労ですね・・・。コツコツとやってきましょう。
画面には、あらかじめテンプレートが書かれたプログラムがあらわれました。骨組みですね。

EAのプログラムを書く

上から順番に見ていきましょう。

左に // がある行はコメントメモの役割を果たします。これはプログラムを見やすくするためです。
コンピュータはその行の // から右は無視しますので、何を書いてもかまいません。日本語を書きたいときは、Tools→Options→fontで設定することができます。

#property~

は特に気にしなくてもよいです。

int init()
  {
//----
   
//----
   return(0);
  }

これは、プログラムを作動させたときの最初一回だけ読み取られます。初期設定などに使われますが、今のところ特に使わなくても大丈夫です。

つぎの

int deinit()
  {
//----
   
//----
   return(0);
  }

は、終了時に読み取られるプログラムです。これも、特に気にしなくてもよいです。

int start()
  {
//----
   
//----
   return(0);
  }

は、そのチャートに動きがあったときに、読み取られるプログラムです。値動きするたびに毎回です。ここにプログラムを書きましょう。

//----
   
//----

の間にプログラムを書けば、よいわけです。

 まずは、変数の宣言をしなければなりません。
数学の方程式に出てくる x や y といった感じです。 x や y ではわかりにくいので文字をつなげてわかりやすくしましょう。
 たとえば、seisuu という変数を使おうとします。日本人なら、これはたぶん整数がはいるんだろうなぁと思ったりしますが、コンピュータは理解できないので、seisuu には整数が入りますよって教えてあげましょう。

int seisuu;

といった感じです。

型 変数名;

で宣言します。 int は整数の型という意味。最後の ; は文の終わりを意味します。忘れずにつけましょう。

他にも、

  • double は小数
  • bool は true か false のどちらかがはいる2択のようなもの
  • string は文字列

などがあります。

今回は ma という小数が入る変数を作ります。

   //変数の宣言
   double ma;

これで変数の宣言はオッケーです。

次に移動平均の値の計算です。
これは、あらかじめ用意されている iMA という構文をつかって先ほど作った変数 ma に代入するという文を書きます。

   ma = iMA(NULL, 0, 10, 0, MODE_SMA, PRICE_CLOSE, 1);

ma に 移動平均値を 代入

という意味です。

ma は先ほど作った変数

= は代入するという記号
(数学でつかうイコールは == というように書きます)

iMA(・・・) はカッコ内の条件で移動平均値を算出する便利な言葉(関数)

便利な関数は他にもいろいろあって、iMA を選択してキーボードのF1ボタンを押すと Toolbox の表示がかわり、左の方にいろんな便利な関数がならんでいます。それぞれ、カッコ内の書き方が違うのでそのつど調べるようにしましょう。

カッコ内の(NULL,0,10,0,MODE_SMA,PRICE_CLOSE,1) は、
順番に

(通貨ペア,時間足,計算期間,ずらし幅,平均値の種類,用いる価格,時期)

といった感じです。

通貨ペアには、 "USDJPY" とか "EURGBP" などが入ります。現在のチャートの通貨ペアを計算するには、NULL と入力します。

時間足には、

  • 5分足なら PERIOD_M5
  • 1時間足なら PERIOD_H1
  • 日足なら PERIOD_D1

という具合に入力します。
現在のチャートの時間足を計算するには、0 と入力します。

計算期間には、何本前までの値を計算するのかを入れます。
例えば、日足で 10 なら10日間の移動平均値といった感じです。

ずらし幅は、移動平均線をチャート上に表示させる時のための機能なので、今回は 0 とします。

平均値の種類には、平均値の算出方法を入力します。

  • 単純移動平均なら MODE_SMA
  • 指数平滑移動平均なら MODE_EMA
  • 修正移動平均なら MODE_SMMA
  • 加重移動平均なら MODE_LWMA

という具合です。

用いる価格には、4本値や高値安値の平均値などのうちどれを使うかです。

  • 終値なら PRICE_CLOSE
  • 始値なら PRICE_OPEN
  • 高値なら PRICE_HIGH
  • 安値なら PRICE_LOW
  • 高安平均なら PRICE_MEDIAN

などがあります。

時期には、何本前の移動平均値かを入れます。
現在の移動平均値は 0 と入力します。

なので

   ma = iMA(NULL, 0, 10, 0, MODE_SMA, PRICE_CLOSE, 1);

は、

ma に このチャートの通貨ペアと時間足をずらさずに単純平均で終値を用いて1本前の値を 代入する

という意味になります。
そして、最後の ; でこの行を終わりにします。

これで、ma にはコンピュータで計算された数値が小数で入っていることになります。

少し長くなってしまったので今回は、このへんで。
次回は、いよいよ注文の命令文を書きます。ではでは。

完全自動売買への道のり

タグ

2007年10月12日|コメント (15)

カテゴリー:完全自動売買

過去の成績を調べる


過去のデータを使って、売買システムの過去における成績を調べることをバックテストといいます。

さて、実際にMoving Average をバックテストしてみましょう。

バックテストするには、
Strategy tester ボタンでテスターのウィンドウを表示させます。

セッティングタブで
Expert Advisor: にMoving Average を選ぶ。
通貨ペア: に調べたい通貨ペアを選ぶ。
モデル: にはとりあえずControl pointsにしときましょうか。

ここで、
Open prices onlyは始値だけで調べる。
Control pointsは大まかに調べる。
Every tickはできるだけ詳しく調べる。
といった感じです。

しかし、気をつけなければならないのが
Control pointsではかなり優秀な成績(一年で資産が1000倍になってしまうなど)でも
Every tickでは全然ダメってことが、よくあります。
(特に逆張りでスキャルピングのような薄利を重ねる売買システムで)
これは、途中のデータが飛ばされているため有利な位置で売買されることになるからです。
時間に余裕があるときは、Every tickで詳しく調べるようにしましょう。

さて、つぎに
日付と時間を使用:にチェックをいれ、
開始と終了の年月日を入力。
チェックなしの場合は、データ全ての期間で調べます。

Visual mode:にチェックをいれると、値動きと売買の様子をチャートでみることができます。

期間:には、Dailyを選んでおきましょうか。
ここで、
M1は1分足
M5は5分足
・・・
H1は1時間足
・・・
Dailyは日足
です。

一般的な売買システムでは5分足より30分足、30分足より1時間足、1時間足より日足の方が
効果を発揮しやすい傾向があるかと思います。
が、一般的な手法で利益を期待するのはやめましょう。(^_^;

Optimization はパラメーターの最適化の時にチェックをいれます。
今回は、チェックをはずした状態にします。

そして、スタートボタンを押します。

スタートボタンがストップボタンに変わり、下のメーターが右へ満タンになり、ストップボタンがスタートボタンに戻ったら計算完了です。

下のタブで、
結果は、売買記録。
指定した時期からではなく最近の記録しかない場合は、チャートを一番左まで表示させてから再チャレンジしてください。(なんだかそれで解決しました^^;)
チャートを左の方へ表示させるときはAuto Scroll ボタンをオフの状態じゃないとまた一番右に戻ってしまうので気をつけてください。

Graphのタブは、資産の増減をグラフ化したもの。

レポートは成績表です。

ここで、合格基準を設けましょう!

グラフはきれいな右肩上がりなら合格!

レポート内で
Profit factor 2.0以上
Maximal drawdown
Relative drawdown
10%以内
Profit trades(% of total) 80%以上

なら合格です。
Total trades は最低でも100以上は欲しいです。

でも、自分の許せる範囲で合格基準を甘くしてもよいと思います。
なぜなら、システムの特長によっては勝率50%でも、最大ドローダウン20%でも、利益を出しているシステムもあるからです。
しかし、

Moving Average はどうでしょう?
私のデータでは、通貨ペア・期間の組み合わせによってはかろうじて利益が出るものもあります。しかし、合格点からは、程遠いです・・・。

Moving Average でそのままの、自動売買はやめにしましょう。

チャートを右クリック → Expert Advisors → 削除

では、どうしたらよいのでしょう。

答えは簡単。作ればいいのです。
しかし、
私は最初、自身がなかったです。

  1. 本当に自動売買で利益がでるのか?
  2. 自分には売買システムのプログラムが書けるのか?

1.に関しては、実際にヘッジファンドなどはコンピュータが莫大な利益を出しているので間違いない。
2.に関しては、宝探しの第一歩。何が何でも覚えるしかない!と。

やる気さえあれば、一ヶ月位である程度できてしまうのです。
後は、宝探しのようにいろいろと探っていくわけですが、
いよいよ次回は、売買システムを作ってみましょうか(^-^)

完全自動売買への道のり

タグ

2007年10月10日|コメント (8)

カテゴリー:完全自動売買

使い方を覚える


Meta Trader 4 で完全自動売買するためには、

  1. チャートを表示させる
  2. 売買システムを作動させる

です。

1.チャートを表示させる

これは簡単で、一番上のメニューバーの
ファイル → 新規チャート → お好みの通貨^^;
または、New Chart ボタン
です。

なんだか見慣れないものが出てきたと思いますが見慣れているローソク足に変えてみましょう!

メニューバーの
チャート → ズームイン
もういっちょチャート → ズームイン
チャート → ロウソク足
または、Zoom In ボタン → Candlesticks ボタン

です。
ツールバーのボタンに慣れると作業が楽なので私はいつもボタンでやってます!

2.売買システムを作動させる

少し手間がかかるのでここでは移動平均線での売買システム作動を例にあげ、やってみましょう。

まずは、画面上にナビゲーターが無い場合は
Navigator ボタンで表示させます。

その中に、Expert Advisors というフォルダがあり、
それをダブルクリックまたは左の+ボタンをクリックする。

その中に、Moving Average(これが移動平均線による売買システム)があり、
これをチャートまでドラッグ&ドロップする。

すると、プロパティウィンドウが表示されます。
全般タブのAllow live tradingにチェックをいれてOKボタンです。

チャートの右上にMoving Average(ニッコリマーク)となれば成功です。

マークが不機嫌マークの場合は、
チャートを右クリック → Expert Advisors → Properties
全般タブのAllow live tradingにチェックをいれてください。

マークが×印の場合は、
ツールバーのExpert Advisors ボタンを押してみましょう。

これで、Expert Advisors の Moving Average が売買判断をして、注文を出してくれるのです。
(パソコンの電源はONのまま、MT4も閉じないでください。MT4の最小化はOKです。)

...
でも、本当にMoving Averageに任せちゃって大丈夫でしょうか?とても心配です。
次回は、Moving Averageの過去の成績を調べて見ましょう。

完全自動売買への道のり

タグ

2007年10月10日|コメント (5)

カテゴリー:完全自動売買

環境を整える


まずはじめに必要なものは、

  1. パソコン
  2. インターネット(常時接続)
  3. やる気

です。^^;

ここに訪問されてるということは、上の3つはすでにクリアされてるかと思います。
まだの方は、お急ぎください。

さて次は、取引に必要な道具(ソフト)です。
これは、非常に優れたソフトが無料で手に入れることができます。

その名も
MetaTrader 4です。

詳しい機能は追々説明したいと思います。

→Meta Trader 4 ダウンロードページへ

ページの一番下の 
Download MetaTrader 4 Terminal という文字をクリックしてダウンロードしてください。

その後、インストールして必要事項を書き込めば、デモ取引開始ができます。
(実際の取引は業者との手続きが必要です。)

私は今のところ、実際の取引用、デモ用、デモ兼検証用、他社検証用の3種6つのMeta Trader 4をインストールしてあります。

完全自動売買への道のり

タグ

2007年10月 9日|コメント (14)

カテゴリー:完全自動売買