バックテストできます!MetaTrader4(以下、MT4)がバージョンアップして、ついにバックテストが使えるようになりました!(ネット旅人さん、情報提供ありがとうございます)ダウンロード先http://www.metatrader4.com/MT4の旧バージョンをお使いの方は、自動アップデート機能では、最新版にならない場合があるので、サイトから直接最新版をダウンロードして下さい。上書きインストールでOKです。MT4のバックテスト機能は、SBFXよりもかなり性能が良くなっているようなので、これからはMT4をメインにシステムを作るようにします。解説についても順次書き換えていきますので、よろしくお願いします。はじめましたフォーラムサイトをオープンしました!自動売買システムに関する情報交換や、プログラミングの依頼など、いろいろ使っていただけると嬉しいです。trading」にチェックを入れて、OK。AdvisorをONにして、ニッコリマークが表示されれば運用開始です。あとはそのまま放っておくだけで、シグナル発生時に自動的にオーダーを実行してくれます。FXCM/RefcoFX/...から、画面下のタブ、PositionsやAccountを見てください。今回作成したMAPreGCDCの売買ルールでは、バックテストで見たように、成果を得るまで、かなりの期間が必要だと思われます。実際に自動売買システムを運用をする場合には、もっと効率良く、安定した成果を得られるルールを見つけ出さなければいけません。満足のいくものを作り上げるのは大変ですが、うまくいけば、寝ていても儲かる夢のようなシステムになる可能性もあります。紹介されているもの用いても良いでしょう。プログラミングが苦手な方は、プログラミング依頼用の掲示板を作成しますので、そちらで依頼してみて下さい。このサンプルではFXCMの口座で売買するためにHyperOrderとBlackJumboDogを利用しましたが、HyperOrderが対応していない他のいろいろなブローカー(外為どっとコム等)でも自動化することができます。(SBFXのエキスパートプログラムはそのままで、HOとBJDを変更するだけですので簡単です。)その方法については随時紹介していきますので、ご希望のブローカーがあればどんどんリクエストして下さい。仕上げ[プログラム最終版]最後に、シグナル発生時にSBFXがオーダーを(メールに見せかけて)書き出すよう、コードに追加します。end*この最終バージョンでバックテストを行う場合は、必ずHyperOrderを停止しておいて下さい。テストによって出力された過去のオーダーが大量に実行されてしまいます。テスト終了後には忘れず、アカウント名(.csv)ファイルを削除して下さい。メールオーダー用のユーザーファンクションを呼び出します参考:UserFunction()さらに一つ、mailorderというユーザーファンクションを追加します。*ユーザーファンクションは、Expertプログラム中から呼び出すことのできる外部ファイルです。繰り返し行なう処理や、他のExpertプログラムでも使用したいものをユーザーファンクションにしておくと、あとから修正や拡張したい時に便利です。今回は、BJDのメール保存フォルダにオーダーを書き出す処理をユーザーファンクションにしました。これは他のExpertプログラムからも呼び出して使うことができます。Function」を選びます。Nameをmailorderと入力して、OK。新規ウィンドウが表示されます。以下のコードを記入して、*3のfilenameとpassの部分を書き換えます。filenemaはBJDで設定したメールのアカウント名(.csv付き)passはHOで設定した、オーダー用のパスワードです。return(True);//*7あとは、Verifyボタンで保存、コンパイルして出来上がりです。inputsでファンクションの引数を宣言。宣言した順に、UserFunction()からの引数が渡される。lotmultipleはロット数の単位を調整するための変数。一万通貨はSBFX上では0.1なのに対し、FXCMでは10なので、100倍する。アカウント名,オーダー用パスワード。SwitchでSymbolごとに処理を振り分ける。SBFXではEURUSDのような記述であるのに対し、HOではEUR/USDのように間に「/」が必要。ここから、ファイルの読み書き。FileOpen()でcsvファイルを開く。";"は列の区切り文字。今回は「列」を使用しないので関係ない。FileWrite()で一行ずつ書き込み、FileClose()でファイルを閉じる。ファイルの最後に読み書きポイントを移動。他の通貨との同時運用の場合を考慮して、オーダーを上書きではなく追記するため。設定の確認[設定の確認]設定が終わったところで、メールによるオーダーがきちんと通るか確認してみましょう。以下の文をBJDのアカウント名(メールのアカウント名)をつけてSBFXのExpertsフォルダに保存して下さい。FXCM/RefcoFX....を開き、画面下のタブPositionsに、EURUSD買いポジションが表示されているはずです。*ポジションが表示されない場合はOrdersタブを開き、オーダーが認識されているか、認識されていればその右端にあるInformationの欄でエラーメッセージを確認してください。Journalを見てください。メールが認識されていればここに何らかのメッセージが出ているはずです。一つ、ポジションを閉じるメールも試してみましょう。以下の文を同じようにBJDのアカウント名をつけてSBFXのExpertsフォルダに保存して下さい。2005$HOCOMMAND$,orderpass,CP,EUR/USD,Forex,Cash,,,,EUR,,,,これで、ポジションが閉じられるはずです。メール-オーダーの設定[BlackJumboDogの設定]以上を踏まえたうえで、BJDの設定をしましょう。メールサーバ設定ダイアログを開きます。「メールサーバを使用する」にチェックをいれます。FILES\STRATEGYBUILDERFX\EXPERTS\)を指定します。次に、利用者タブを開いて、アカウントを追加します。このときアカウント名には必ず「.csv」を付けてください。このようにアカウント名に.csvをつけておくことで、メール保存先となるファイルが見かけ上、.csvファイルになりますので、SBFXから読み書きすることができるようになります。あとは「OK」を押して、メールサーバ設定ダイアログを閉じて下さい。以上でBlackJumboDogの設定は終わりです。[HyperOrderの登録]次はHyperOrderです。HOをはじめて起動する時は、ユーザー登録が必要です。入力は全てアルファベットです。ここで入力したメールアドレス宛てに認証コードが送られますので、正確に記入してください。registration」を選択して次へ進み、しばらく待つと、認証コードがメールで届きます。メールにある認証コードを入力欄にコピペして認証完了です。[HyperOrderの設定]HOが起動すると広告が表示されますが、それは消さずに、タスクトレイにあるアイコンをダブルクリックして、ウインドウを開きます。FXCMと連携するための設定を行います。>BrokerFeedsにあるFXCM/Refco....を右クリック、Propertiesを選択します。FXCMデモ口座のIDとパスワードを入力します。今度はActivateをクリック。待つと、FXCMとの接続が完了し、Connected欄にチェックが入ります。次はオーダーメールを受け取る設定をします。Dispatcherを開きます。「Inbox」にチェックを入れて、各項目を入力します。than=0(ここで指定した分数より古いメールは無視。contain:オーダーメール用のパスワードを設定します。オーダーメールにはここで決めたパスワードを記入するようにしてください。password=(確認のためもう一度)OKで閉じれば設定完了です。トラックバックFileClose(csvファイルを閉じる)FileOpenで呼び出していたファイルを閉じる。閉じる対象のファイルハンドル。トラックバックFileWrite(csvファイルに書き込む)FileOpenで呼び出したファイルに、値を書き込む。FileOpen後、そのままFileWriteした場合は最初の行から上書きされるでの、ファイルの末尾から追記したい場合は、FileSeekで書き込み地点を末尾に移動しておく。書き込み対象のファイルハンドル。「,」に続けて複数指定すると、FileOpenで指定した区切り文字で区切って、一行に書き込む。トラックバックFileOpen(csvファイルを開く)Expertsフォルダ内にあるCSVファイルを呼び出し、ファイルハンドルを返す。拡張子が.csvとなっているファイル以外は呼び出せない。ファイルハンドルは、現在呼び出し中のファイルを特定するためのIDのようなもの。読み込みや書き出しなどはこのファイルハンドルで対象ファイルを指定して行なう。FileOpenで呼び出し、処理した後は必ずFileCloseで閉じなければならない。expertsフォルダ内の.csvファイルに限る。トラックバックUserFunction(ユーザー定義のファンクション)外部ファンクションを呼び出す。外部ファンクションは、多言語の関数のようなもので、別途ユーザーが作成できる。入力値(引数)を得て、処理の結果、出力値(返り値)を返す。呼び出し側で返り値を受け取る記述をしていないと警告が出る。ファンクションファイルは、Expertフォルダのfunctionsフォルダ内に保存しておく。書式:UserFunction(ファンクション名[,引数1][,引数2][,...])ファンクション名=外部ファンクションのファイル名。引数=ファンクションの入力値。必要なければ省略できる。数値のみで文字列は不可。引数は「,」に続けて複数指定可能。i(0),j(0);//inputs:で宣言した順に引数が割り当てられる。//この例では、iにinput1(=2)、jにinput2(=4)の値が入る。トラックバック2005年07月07日HyperOrderのデモ警告について旧バージョンのHyperOrderを使っていると、画像のようなデモ警告が表示され、製品版の購入を促すメッセージがでることがあります。開発元のサイトではフリーソフトとしてありましたし、フォーラムでもそのように書かれていますので、このデモ警告は旧バージョンの名残(?)かバグだと思って良さそうです。この警告が出てしまった場合は、一度HyperOrderをアンインストールしてから、最新バージョンをインストールし直すと、使えるようになります。最新バージョンはこちらのフォーラムにあります。オーダーの仕組み【自動売買の設定をする】できあがったプログラムを使って、FXCMの口座で自動売買をするように設定しましょう。FXCMで自動売買を行う流れは、シグナル発生時にSBFXからHyperOrder(HO)にオーダーメールを送り、それによってHOがオーダーを実行するというものです。メールの送受信部分をもう少し詳しく言うと、SBFXから送られたメールをメールサーバーが受信して保管、HOがメールサーバーに問い合わせて、届いていたメールを引き出すとなります。ところが、SBFXにはメールを送信する機能はありません。したら良いのでしょうか?[BlackJumboDogの利用]そこで、BlackJumboDog(以下、BJD)の登場です。BJDのメールサーバーの仕組みを、利用させてもらうことにします。BJDでは、管理するアドレス宛てに届いたメールを、受信用のフォルダに保存します。その時メールは、あて先のアカウントごとに分けられ、アカウント名の付いたテキストファイル(拡張子なし)として保存されます。メールが届いた場合は、そのファイルに追記していきますので、アカウントごとに一つずつファイルがあり、そのファイルの中にメールがまとめて保存される形になります。アカウント名kawaroboなら、保存フォルダ内の「kawarobo」というファイル(拡張子無し)にkawarobo宛てのメールがまとめて記録されます。SBFXはメールの送信はできませんが、ファイルを読み書きすることができます。このファイル読み書き機能を使って、BJDの保存フォルダ内のアカウント名ファイル(先ほどの例で言えば「karawobo」ファイル)に直接書き込めば、あたかもメールを送ったかのように見せかけることができます。これで、HOがBJDに問い合わせると、BJDは、SBFXによって書き込まれたファイルをメールとして、HOに渡してくれます。ここで注意があります。SBFXが扱えるのは.csvの拡張子がついたCSVファイル限定です。ファイルの場所はSBFXインストールフォルダ内のExpertフォルダに限られているのです。トラックバック2005年07月06日HyperOrderの入手先変更これまでのメインページだったwww.hypertrader.itが見れなくなってしまいましたので、HyperOrderは直接、フォーラムからダウンロードするようになります。一時的なダウンだったようです。詳しい入手方法はこちらです。変更結果[変更版の結果]それでは、テストをしてみましょう。結果は+80,318$!かなりいい数字が出てきました。最大ドローダウンが40.6%もあり、実用化するにはかなり気合が要りそうです。つづけて、テスター画面のSettingsからTypeを1に変えて、Type1のテストをします。結果、+95,519$、さらにいい値が出ました!最大ドローダウン26%と、Type0よりはかなりマシになりました。(それでもまだ少し気合の入った数字ですが。)Type1はルール上、ポジションが閉じられやすくなっているので、ストップロスにもう少し余裕を持たせてもよさそうです。StopLossを150と200でそれぞれテストしてみました。最大ドローダウン24.2%どちらもトレード数は700~800程度、ロットは1に固定なので、トレード1回あたりの平均値は+150$ぐらいになります。テストに使用したヒストリカルデータは1978年5月から2005年6月まで27年分。それで7~800回のトレードということは、月に2,3回の割合でシグナルが発生するという、かなり悠長なシステムということになります。トレイリングストップを付けたり、パラメーターをいじったり、まだまだ手の加えようはあると思いますが、そろそろ次の手順に移りたいので、Type1のストップ150を採用することにします。次からはいよいよHyperOrderとBlackJumboDogを使ってFXCMのデモ口座での自動売買をセットすることにしましょう。(ここまでのチャートを見ていた中で、おかしな位置に矢印が出ていることがあり、調べたところ、実はMAPreGCDCのコードのミスがあったことに気が付きました。MaLongCurrentとしてしまいました。これでは終値が短期線を越え、さらに長期線も越えてしまった状態も含んでしまいます。MaLongCurrentとしなくてはいけないところです。ところが、ここを訂正すると成績がかえって悪くなってしまいました。そこで、あえて間違えたままこの部分を残すことにしました。怪我の功名というのでしょうか。ルールの見直し[修正の結果]修正したところで再度バックテストをしてみます。chartにチェックを入れます。結果、矢印の重なりはなくなりました。言え-15,190$と相変わらずマイナスのままですので、これでは使えません。他の通貨で様子を見てみましょう。ドル円の日足チャートを開き、MAPreGCDCを適用してテストします。chartにチェック。結果、-31,920$とますます悪い結果に。パラメーターをいろいろいじってみてもよさそうですが、ここではもう一度チャートの様子を見ることにします。[チャートに移動平均を表示]チャートには売買ポイントを示す矢印が出ていますが、これだけではいまいち分かりません。MAPreGCDCのルールは、移動平均の長期線と短期線の間に入った時にポジションを取り、GC,DCで閉じるというものでした。チャート上にも見やすいように移動平均線を表示します。NavigatorウインドウのIndicatorsからMovingAverageをチャートにドラッグ。Shift=0で赤色の長期線(21日)を表示、同じようにして今度はPeriod=5、色を白に変えて短期線(5日)を書き出します。[ルールの見直し]これで見やすくなりましたが、かなり「だまし」にやられているようです。それ以上に、せっかくいいタイミングで入っているときでも、ストップが狭すぎて、損をしているようです。これまではGC、DCで閉じるようにしていましたが、チャートでみると、もう少し粘った方が利益を伸ばせるようにも見えます。ここをどうにかできないでしょうか。トレーディングシステム入門という本を見たところ、ディレクショナルスロープ法というやり方が載っていました。ディレクショナルスロープ法とは、短期と長期、2本の移動平均線を使って、クロスではなく、その傾きをもとにシグナルを出す方法で、2本の移動平均両方が上昇(下降)すれば買い(売り)、短期線の向きが反転したところでポジションを閉じるというものでした。この方法の一部を拝借することにしましょう。GCやDCで閉じる代わりに、短期線が反転したところで閉じることにします。コードは以下のようにしました。end新たにTypeという定数を用意しました。Typeが0のときは、ポジションを閉じる時の条件が「短期線が長期線を越えてから、短期線の向きが反転した時点」となります。Typeを0以外にすると単に「短期線の向きが反転した時点」となって、長期線を越える前でも即、ポジションを閉じてしまうようになります。ポジションを閉じる条件とは独立して、ストップロスが設定してありますので、一定額の損失が出たところで強制的に損切りされます。ストップロスの初期値は少し余裕をもたせて100pipsにしてあります。バックテスト「Verify」ボタンを押すと、保存&エラーチェック&コンパイルがされて準備が整います。(ファイル名はMAPreGCDCにしました)「MetaTrader」ボタンでSBFXに戻ります。【バックテストをする】とりあえずプログラミングができたので、テストをしてみます。NavigatorウィンドウのExpertAdvisorsから先ほど作成したMAPreGCDCをEURUSDの1時間足チャートにドラッグ。TesterタブからStartボタンでバックテストを開始します。結果は、開始直後から-92%と惨敗です。時間足で試したのがだめなのでしょうか?日足に変えてやってみましょう。テスト画面を閉じて、チャート画面に戻り、「D1」ボタンで日足チャートに変えます。結果はやはり-90%と無惨な結果になりました。[チャートで確認する]シグナルがどのような状態で出ているのか、チャート上で確認してみましょう。chart」にチェックを入れて、シグナルの状況がチャート上に表示されるようにします。先ほどは資金不足で途中で止まってしまいましたので、資金は10倍の100,000ドルにし、手数料やスプレッドは両方0にして純粋な売買結果を見ることにします。point(slow)」として、スタート。結果が出たらOKでチャートに戻ります。ここでおかしな状態が目に付きました。一本のBarに矢印が大量に重なっています。これは、ストップロスでポジションが消えたところで、すぐ新たなポジションを取り、またストップに引っかかるということをBar1本の中で何回も繰り返してしまうためのようです。point(slow)」でテストをする際、日足のデータを基にランダムで作成した仮想のデータを使用しているというのも影響しているようです。始値と終値は順番がはっきりしていますが、高値と安値はどちらが先に来るか元の4本値からだけではわかりませんし、高値と安値を何往復もしたのか、安値から高値に一方的に上がっただけなのかもわかりません。これでは結果の信頼性がありませんので、Bar1本の中で何度もポジションをとらないようにコードを改良します。[コードの修正]MetaEditorに戻って、MAPreGCDCのコードを以下のように書き換えます。end14、16、51、58行目が変更部分。openbarという変数を作り、ポジションを持った時のBarを記録。そのBar内ではそれ以降の処理をスキップします。「bars」はその時の合計Bar数を得るものです。只今、実験的にトップページのデザインを変えてみています。他のページは全然変わっていませんが。