2007年10月の記事一覧

20/200 expert v3



自動売買チャンピオンシップ2007で第5位に入賞し
3ヶ月弱で$10000を約3.7倍にしたzyx40さんが元にしたEAです。

Zyx40.zip

関連するブログ記事を下記のタグをクリックして頂く事でまとめてご覧頂けます。

タグ

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

カテゴリー:MetaTrader EA

MaDo


特定のパターンを狙い撃ちするシステムです。
取引頻度は少ないですが効率よく稼いでくれます。


→バックテスト結果

取引結果
期間トレード回数勝率(%)利益率(%)
2007.101100+0.45
2007.11250.00-19.82
2007.125100+11.09

2008年からMaDoV2(改良版)とVolAveを1つにまとめ、
VAWMというEAしました。

結果は右サイドに表示するようにしました。

タグ

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

カテゴリー:MetaTrader EA

VolAve


Volume と Average の融合システムです。
やはり出来高は値と密接な関係があるようです。

→バックテスト結果

取引結果
期間トレード回数勝率(%)利益率(%)
2007.102669.23+1.46
2007.112075.00+2.58
2007.121872.22+3.05

2008年より、MaDoV2(MaDoの改良版)とひとつにまとめ、
VAWMというEAにしました。

結果は右サイドに表示するようにしました。

タグ

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

カテゴリー:MetaTrader EA

Docro


移動平均線を Do cross したら、取引するということで『Docro』と命名。^^;
18移動平均線を使ったシステムで売買条件を少し付け加えたものです。

USDJPY1時間足使用

→バックテスト結果


取引結果
期間トレード回数勝率(%)利益率(%)
2007.101266.67+0.39
2007.111361.54-1.57
2007.121070.00+0.59

2007年は8月につまづいた感じになり5%ほどの利益しか出ませんでした。しばらく、デモの方で様子を見ようかと思います。

タグ

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

カテゴリー:MetaTrader EA

日本語対応業者の紹介


デモ取引で慣れてきたら、いよいよ本番です。

再編集 2011年11月

現在注目中のブローカー
Forex.com Japan

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

カテゴリー:FXブローカー

HeikinSample


完全自動売買への道のりで作ってきたシステムを最適化して出した成績はこちら。

バックテスト結果

まずまず安定したシステムになりました。

しかし、こちらを見てください。

2007年上半期のバックテスト結果

前の4年間のデータと比べると、かなりパフォーマンスが落ちています。
これは、この4年間にぴったり合うようにパラメータを変えたために起こるものです。(カーブフィッティングという)

実際のパフォーマンスは2007年以降のバックテストとデモ取引の成績で良し悪しを判断しましょう。

このようにできたシステムを数ヶ月デモ取引をしましょう。
成績優秀ならば使えるシステムの一つとして考えてもよいのではないかと思います。

デモ取引している間に、さらに良いシステムを作るようにしましょう。

タグ

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

カテゴリー:MetaTrader EA

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.ダウンロードしたファイルの保存先を知る

ダウンロードしたEAを使用するには、決まった場所に保存する必要があります。

EAファイルの保存先を開くには、まず、MetaTrader4画面のメニューの「ファイル」→「データフォルダを開く」でデータフォルダを開きます。
開いたフォルダ内の「MQL4」フォルダ→「Experts」フォルダ内がEAファイルの保存先です。
ちなみに、インジケーターファイルの保存先は、「MQL4」フォルダ→「Indicators」フォルダ内です。

ダウンロードしたファイルがzipファイルなどの圧縮ファイルの場合は解凍してから、mq4ファイルまたはex4ファイルを指定のフォルダ内に保存するようにしましょう。

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

EAファイルやインジケーターファイルを指定のフォルダ内に保存しても、すぐにはMT4に反映されません。
MT4を再起動させると、使用可能になります。

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

完全自動売買への道のり

タグ

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

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

システムの質を高める2


今回は、

  1. コンパイル時の警告が出ないようにする
  2. 売り取引もする
  3. 売買条件にフィルタを付け加える
  4. 最適化をする

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

1.コンパイル時の警告が出ないようにする

メタエディタのバージョンによって警告の種類などが異なりますが、MetaEditor Ver5.00 build 1526現在では、
return value of 'OrderSend' should be checked
というような警告が出ます。
これは、「OrderSend()関数が返す値をチェックすべき」という警告です。

この警告がでないようにするには、変数の宣言で「int ticket;」として、OrderSend()関数を使用しているところを次のように変更します。

         ticket = OrderSend(Symbol(), ・・・(中略)・・・, clrBlue);

OrderClose()関数はbool型の値を返すので、変数の宣言で「bool close_result;」として、同じように変更します。

         close_result = OrderClose(OrderTicket(), ・・・(中略)・・・, clrGreen);

再度コンパイルして確認してみましょう。

2.売り取引もする方法

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

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

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

とすればよいです。

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

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

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

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

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

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

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

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

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

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

まずは、ストキャスの値を代入しておく変数の宣言です。
変数名は、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/"
#property version   "1.00"
#property strict

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

// 記憶用の変数
int nowbar;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   // 変数の宣言
   double ma, sto;
   int cnt, CurrentPosition = -1;
   int ticket;
   bool close_result;
   
   // 移動平均値の算出  
   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++)
   {
      if(OrderSelect(cnt, SELECT_BY_POS) == false) return;
      if(OrderMagicNumber() == 10) CurrentPosition = cnt;
   }

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

こんな感じですね^^

4.最適化をする

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

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

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

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

エキスパートアドバイザでHeikinSample を選びます。

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

右上の エキスパート設定 ボタンを押してパラメーターの入力タブを押します。

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

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

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

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

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

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

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

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

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

今回はこのへんで。

完全自動売買への道のり

タグ

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

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

システムの質を高める


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

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

の順にやってみます。

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

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

今回は、

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

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

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

書き方は、

extern int     StopLoss    = 400;
extern int     TakeProfit  = 200;
extern double  lots        = 0.1;
extern int     MaPeriod    = 12;

という感じです。

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

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

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

Ask - (StopLoss * Point)

と書けば損切り値に変わります。
Point とは、実行チャートの1ポイントの桁のことで、例えば、USDJPYの通貨ペアで123.456のように小数点以下3桁まで表示されている場合は、1ポイントが0.001になります。

これは、
買値 - ( 損切り幅 * 1ポイントの値)

といった感じです。

利食い値も同様に

Ask + (TakeProfit * Point)

となります。

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

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

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

といった具合です。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

int nowbar;

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

この変数 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 という変数をつくりますので、OnTIck() の{}内の ma を宣言した下あたりに

   int cnt, CurrentPosition = -1;

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

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

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

   for(cnt = 0; cnt < OrdersTotal(); cnt++)
   {
      if(OrderSelect(cnt, SELECT_BY_POS) == false) return;
      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 だけを選んで取引できるようになりました。
コンパイルを忘れずにしましょう。

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

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

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

//記憶用の変数
int nowbar;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   //変数の宣言
   double ma;
   int cnt, CurrentPosition = -1 ;
   
   //移動平均値の算出  
   ma = iMA(NULL, 0, MaPeriod, 0, MODE_SMA, PRICE_CLOSE, 1);
   
   //オーダー
   for(cnt = 0; cnt < OrdersTotal(); cnt++)
   {
      if(OrderSelect(cnt, SELECT_BY_POS) == false) return;
      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, clrBlue);
         nowbar = Bars;
      }
   } 
   // ポジション有りの場合
   else 
   {
      //ポジションのデータを取得。
      if(OrderSelect(CurrentPosition, SELECT_BY_POS) == false) return;
      //もし1本前の終値が移動平均より下ならば
      if(Close[1] < ma)
      {
         //ポジション決済
         OrderClose(OrderTicket(), OrderLots(), Bid, 3, clrGreen);
      }
   }
//----
  }
//+------------------------------------------------------------------+

こんな感じになりましたか?
このままコンパイルしますと警告が2つ出ますが、出さないようにするのはまた次回にします^^;
今回はこのへんで。

完全自動売買への道のり

タグ

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

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

売買システムを作る2


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

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

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

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

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

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

if(OrdersTotal() < 1)
{
}

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

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

if(Close[1] > ma)

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

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

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

OrderSend(Symbol(), OP_BUY, 0.10, Ask, 3, 0, 0, "Buy", 10, 0, clrBlue);

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

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

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

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

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

量には、
ロットという単位で入力します。多くのブローカー(証券会社)では、1ロットが10万通貨で通常0.01ロット(1千通貨)単位で入力します。

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

スリッページには、
注文時の価格と約定時の価格の差の許容範囲をポイント(Point)という単位で入力します。ポイントは値動きの最小値のことです。例えば、レート表示が小数点以下3桁までの場合は、1ポイント=0.001ということになります。

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

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

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

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

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

色には、
注文約定時、チャートにつけられる矢印の色を設定します。
色の種類は、ヘルプの「MQL4 Reference / Standard Constants, Enumerations and Structures / Objects Constants / Web Colors」で見ることができます。
個人的には、買いは clrBlue 売りは clrRed にしています。

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

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

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

OrderSelect(0, SELECT_BY_POS); で、
持っているポジションを選択しています。
OrderSelect()関数がfalseを返した場合、ポジションの選択に失敗したときなので、returnを実行してOnTick()関数の実行を終了させています。(次の値動きでまたOnTick()関数が実行される)

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

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

そして、最後。
OrderClose(OrderTicket(), OrderLots(), Bid, 3, clrGreen);
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.10, Ask, 3, 0, 0, "Buy", 10, 0, clrBlue);
      }
   } 
   // ポジション有り
   else 
   {
      //ポジションのデータを取得。
      if(OrderSelect(0, SELECT_BY_POS) == false) retun;
      //もし1本前の終値が移動平均より下ならば
      if(Close[1] < ma)
      {
         //ポジション決済
         OrderClose(OrderTicket(), OrderLots(), Bid, 3, clrGreen);
      }
   }

これを、OnTick()関数の
{

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

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

今回は、このへんで。

完全自動売買への道のり

タグ

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

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

売買システムを作る


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

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

作り方は、

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

これで完了です。

1のメタエディタ ボタンはMT4画面のツールバーの中の黄色い本のマークのボタンです。

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

3は簡単。

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

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

EAのプログラムを書く

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

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

#property~

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

int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }

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

つぎの

void OnDeinit(const int reason)
  {
//---
   
  }

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

void OnTick()
  {
//---
   
  }

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

  {
//---
   
  }

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

 まずは、変数の宣言をしてみます。
数学の方程式に出てくる 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ボタンを押すと iMA()関数のヘルプが見れます。説明ページの上の段をみると、「MQL4 Reference / Technical Indicators / iMA 」とあります。ヘルプの目次タブからも辿って説明ページをみることができます。便利な関数は他にもいろいろあって、関数によってそれぞれカッコ内の書き方が違うのでそのつど調べるようにしましょう。

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

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

といった感じです。

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

時間足には、

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

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

計算期間には、何本前までの値を計算するのかを入れます。
例えば、日足で 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 をバックテストしてみましょう。

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

セッティングタブで
エキスパートアドバイザ でMoving Average を選ぶ。
通貨ペア: に調べたい通貨ペアを選ぶ。
モデル: にはとりあえずコントロールポイントにしときましょうか。

ここで、
始値のみは始値だけで調べる。
コントロールポイントは大まかに調べる。
全ティックはできるだけ詳しく調べる。
といった感じです。

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

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

ビジュアルモードにチェックをいれると、値動きと売買の様子をチャートでみることができます。

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

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

スプレッド はポイント入力で買値と売値のスプレッドを指定します。
現在値とするとテスト開始時の実際のスプレッドが適応されます。
※スプレッド拡大時にテストする場合は現在値にしないほうが無難です。

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

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

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

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

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

レポートは成績表です。

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

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

レポート内で
プロフィットファクター 2.0以上
ドローダウン 10%以内

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

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

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

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

チャートを右クリック → エキスパートアドバイザ→ 削除

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

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

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

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

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

完全自動売買への道のり

タグ

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

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

使い方を覚える


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

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

です。

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

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

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

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

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

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

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

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

その中に、エキスパートアドバイザ というフォルダがあり、
それをダブルクリックまたは左の+ボタンをクリックする。

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

すると、プロパティウィンドウが表示されます。
全般タブの自動売買を許可するにチェックをいれてOKボタンです。

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

マークが不機嫌マークの場合は、
チャートを右クリック → エキスパートアドバイザ → 設定
全般タブの自動売買を許可するのチェックを確認してください。
さらに、ツールバーの自動売買 ボタンが赤い停止マークになっている場合は自動売買ボタン押して緑色の再生マークにしましょう。

これで、エキスパートアドバイザー(EA) の Moving Average が売買判断をして、注文を出してくれるのです。
(パソコンの電源はONのまま、MT4も閉じないでください。MT4の最小化はOKです。)

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

完全自動売買への道のり

タグ

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

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

環境を整える


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

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

です。^^;

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

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

その名も
MetaTrader 4です。

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

Meta Trader 4 を入手するには、MT4を取り扱っている証券会社でデモ口座を申請してダウンロードするのが一番早くて簡単です。

国内では、楽天MT4、Forex.com、アヴァトレード・ジャパン、外為ファイネスト、FXTFなどがあります。

【PR】
FOREX.com 口座開設

完全自動売買への道のり

タグ

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

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