見出し画像

【EA】右肩上がりのグラフを作ってみよう ①ナンピン編 [※ソースコード完全公開]

割引あり

こんにちは。 どんぶら (Xアカウント:@donburakofx) です😀

今回は X でポストした通り、GOLDのナンピン(マ)の右肩上がりのバックテスト結果を作る方法を説明したいと思います。

※ (マ)とはマーチンゲール法の意味合いで付けたかったのですが、カジノなどで行う厳密な倍々(2倍、4倍、8倍…)とは違い細かい倍率で積み増していくため(マ)と表記しています。



1. はじめに


この右肩上がりのグラフを作る~はシリーズ化したいと勝手に思っています。

今回は初回且つ無料で提供しますので、主にEAを作成し始めの方や、バックテストの経験少ない方に向けに説明していこうと思います。

あくまで私のEAの作成~最適化の方法ですので、経験豊富な開発者の方などはもっと効率的な方法があるかと思いますが生暖かい目で見守って頂ければ幸いです。

また、開発者の方で、もっとこうしたら良くなる、、、その考えは誤っている、、、などの指摘がありましたら大歓迎です!!

本noteを公開することで少しでもEAを作る方の手助けになるとともに、自分としてもアウトプットすることでレベルがあがり、普段は孤独に制作を行っているので界隈の方とも仲良くなれたらなという気持ちもあります(笑)

それでは前置きが長くなりましたが、説明に移らさせて頂きます。


2.  EAを作る・利用する前に


といっても、また語り部分になってしまうのですが(;^_^A

世の中には様々なEAが存在して、販売され、利用されている方も多いかと思います。

が、多くの人が少し誤解されている点が多いと思うのでこの知識だけは皆さんに持っていただきたいということを少し書かせていただきます。

よくネットで交わされている議論で以下のようなものがあると思います。

  1. TDSのティックを使えば厳密なバックテストが行える。

  2. いくらバックテストをおこなってもリアルフォワードとは異なるのでリアルフォワードを見ないとEAの性能はあてにならない。

上記は、おっしゃる通りのこともあるかと思いますが、私の考えはあってるもあってないも半々だと思います。

なぜかと言うと、EAを売りたい・(IB縛りなどで)使わせたい魂胆なのかTDS
を利用しても厳密なバックテスト結果を公開しない開発者が多いからのような気がします。

まずバックテストの内容を正確に把握したいようでしたら下記のTNKさんの記事を読むことをお勧めします。

(悪意のあるバックテストの見分け方含めて) 、非常に良くまとまっており、かつ無料で公開されていますので、EAを利用したくバックテストがどういうものか完全に理解していない人は必ず読んでください!
最初に言いたいことが全て記載されています。


また、上記に補足する形で、自分の中で大事にしていることがあって、TDSのティックを使って公開している人は、スプレッドスリッページの設定を厳密に設定して公開してほしいです。

最近のMT4のEAのバックテストの結果でスプレッドの欄に「変動」と記載されてあるものがありますが、これが非常に厄介です。

スプレッド変動とは、TDSでは多くの場合、デューカスコピー社のヒストリカルデータを元にスプレッドを計算しています。

スプレッドを「変動」として何も説明のないデフォルトの状態ですと、ドル円(USDJPY)は平均「0.6pip」で算出されます。EAのストラテジーテスターの固定スプレッドで「6ポイント」ですね。

EAを国内の証券会社などで利用するのなら良いかとは思いますが、海外の証券会社の利用を想定する場合では、ありえない程のスプレッド差が出てきてしまいますよね(;^_^A

販売されているEAやIB縛りをされているEAで海外FXの利用を想定しているものに関しては、スプレッド「変動」の際は補正値を公表しないとまったく意味をなさないものとなります。

因みに私はXMのスタンダードなどあまりスプレッド事情が良くないものを利用するユーザーがいることも想定して、補正値を以下のように設定してバックテストを行っています。

USDJPY 変動スプレッド補正値 (XMスタンダード想定)

上記の場合、スプレッドの乗算で平均0.6pipだったスプレッドは3倍の平均1.8pipで計算されるようになります。
また、時間帯によっては平均より更に狭くなる時間帯もあるかと思いますが、「最小スプレッド:18」で設定しているため、1.8pipsより狭くなることはありません。逆にTDSのスプレッドが0.7pipに広がる時間帯は、2.1ipipで計算されます。

※ もちろん自分で利用する際は、XM極 や ThreeTrader などのスプレッドの狭いブローカー・サービスを選択しますが、バックテストはより厳しい環境でも利益を出せるように設定しています。

また、注文を行う際のスリッページも必ず設定してバックテストを行うようにし、公開しています。

このスリッページの値はどう設定しても証券会社とリアルフォワードと同じ滑りを表現することは難しいかと思いますが、なるべく不利な位置で注文を約定してしまうことを想定してバックテストをするようにしています。
(注文が滑らないブローカーなど存在しないので…というか海外証券会社は、ほぼ毎注文滑っていると思いますので(;^_^A)

スリッページ設定

ここらへんは、今回のソースコードを公開することと、厳密には関係性がないことですが、EAを利用する方々にはぜひ身に着けてほしい知識なので最初に記載させていただきました。

結論、MT4利用で 「スプレッド:変動 」のバックテストデータには気を付ける習慣を持って頂ければという願いです!

あと、以下を利用しているEAに関してもバックテストとリアルフォワードに差異が出る可能性があるので気をつけてください。

  1. 1分足を利用してバックテストを行っているEA

  2. 取引時間帯にGMTの0時台が含まれるEA

    上記さえ気を付ければ、そこまでバックテストとリアルフォワードの際は生まれにくくなりますので最低限の知識としてお持ちくださいね^^


3. 作成するバックテスト結果について


前置きが長くてすみません。やっとの本題です(笑)

今回公開するソース・パラメータで作成できるバックテスト結果は下記の3つです。

初めに言っておきますが、売買に利用するサインはMAのクロスを用いただけの単純なサインです。 (ちょっとした細工のあるMAですが)

単純なサインとナンピンを使うだけでもそこそこ形の良いグラフが作れるんだということでご覧ください。

尚、スプレッドは変動で全て以下設定でテストを実施しています。
(スリッページは先ほどと同じ設定です。)
デューカスコピーのゴールドは平均3.2pipくらいでしたので以下のようなスプレッド設定にしました。

それではバックテスト結果です。

① 2023年1月 ~ 8か月分

● 利益率300%越え(月利40%くらい?)
の良くあるナンピン(マ)のグラフですね。
一応、取引数はそれなりにありますが、如何せんバックテスト期間が短いので1年も持たずに破綻する確率が高いです。
最大DDも初期証拠金50万に対して30万以上食らってますので、うまくカーブフィッティングさせただけで、この期間にない大きな値動きが発生したら簡単に破綻します。
※ IB目当てで配布しているゴールド専用()のナンピンマEAはこれくらいのものが多く(恐らくもっと劣悪なものがほとんど)なので、このような期間・利益率のものには飛びついちゃダメですよ🙅



② 2020年1月~ 3年8か月分

● 利益率300%越え(月利10%くらい?)
あれ? 期間が長くなっているのに8か月のバックテストと利益変わらないんじゃ? と思われますが、そうです。
8か月と同じ方法でやっていくと3年持たずに必ず破綻するので取引回数減らして利益になるところ(含み損を多く発生するところ)を厳選した形になります。
直近の短い期間で利益はとれても必ず破綻するので3年、この後表示する5年ではパラメータを変えて上手く右肩上がりのグラフが作れるようにしています。
まぁ、3年程度じゃカーブフィッティングといわれればその通りですが、これでも損切かかっても1,2回程度耐えられるし上手くいけば1,2年程度は利益が出るんじゃないかなと思います。

2018年1月~ 5年8か月分

● 利益率500%くらい(月利7~8%くらい?)
本当は損切せずに完全に右肩上がりを作りたかったのですが、ナンピン(マ)で単純なロジックなので私はここら辺が限界でした(;^_^A

期間は5年くらいとバックテストでは短い部類に入る(?)かと思いますが、損切もしっかり行うしそこそこ使える内容ではないでしょうか。


4. 右肩上がりのEAの作り方 (パラメータの外だし)


さて、やっと右肩上がりのテスト結果を作るのに過程をに入っていきます。
まずは取引に関わる項目をなるべく多く外出しのパラメータに出していきます。
input ~ で定義する変数ですね。

実際に今回は以下のように、input を並べました。

/* =======================================================
// パラメータ
// ===================================================== */

enum enTime
{
    M1 = 1,
    M5 = 5,
    M15 = 15,
    M30 = 30,
    H1 = 60,
    H4 = 240,
    D1 = 1440    
};


enum enGMT
{
    GMT0 = 0, // GMT+0 (Exness)
    GMT32 = 1 // 夏:GMT+2、冬:GMT+3
};


input int MAGIC = 123456789;      //マジックナンバー
input enGMT CALC_GMT = 1;      //GMTの設定
input string COMMENT = "";      //注文時のコメント
input double LOTS = 0.01;        //ロット
input int MAX_SPREAD = 50;      //エントリー時の最大許容スプレッド(pips)
input int SLIPPAGE = 50;        //許容スリップページ(pips)
input int NUMPIN_CNT = 18;  //ナンピン本数
input int NUMPIN_WIDTH = 50;  //ナンピン幅(pips)
input double NUMPIN_RATE = 1.8;  //ナンピン倍率
input int SL = 535;      //StoppLoss (pips)
input int TP = 24;      //TakeProfit (pips)
input int AVRAGE_TP = 30;      //利確時の平均TP (pips)
input enTime MA_TIME = 5;        //MA時間足
input int ORDER_START_H_1 = 0;      //注文開始時間 1 (日本時間 0-23の中で設定)
input int ORDER_END_H_1 = 0;      //注文終了時間 1 (日本時間 0-23の中で設定)
input int ORDER_START_H_2 = 15;      //注文開始時間 2 (日本時間 0-23の中で設定)
input int ORDER_END_H_2 = 18;      //注文終了時間 2 (日本時間 0-23の中で設定)
input int ORDER_START_H_3 = 19;      //注文開始時間 3 (日本時間 0-23の中で設定)
input int ORDER_END_H_3 = 20;      //注文終了時間 3 (日本時間 0-23の中で設定)

実際にMT4で見えるパラメータは下記のようになります。

なるべく外だしした方が良い理由は、最適化をするときに変動する値が多ければ多いほど、結果の異なるテストを実施できるからです。

本当は、上記にクロスさせるMAの値をパラメータに持たせようとも思ったのですが、何となくMAの数値に意味合いがあったので外しています。
MAのパラメータを追加するのも全然ありですので、実際に最適化を行ってみたい人は試してみてください^^


5. 右肩上がりのEAの作り方 (最適化)


では、実際に最適化をかけていこうと思います。
最適化用にパラメータシートに値を設定します。

こんな感じで スタート → ステップ → ストップ に記入をしてなるべく多くのパターンが取れるように設定します。

パラメータの設定

時間を短縮させるために「遺伝子的アルゴリズム」にチェックをいれて、

テスト設定

取得したい期間でなるべく短い期間から(今回のパターンだと2023年1月~)設定して、モデルを「始値のみ」で設定して最適化をスタートします。

ストラテジーテスター:始値のみ

※「始値のみ」だとちゃんとした値が取れないのでは?と思う人が居るかと思いますが、この段階ではより多くのパターンを短時間試す目安ですので、後ほど厳密な「全ティック」を実施します。

・・・しばらく最適化を実施すると以下のような結果が出てくると思いますので、私は見やすくするために、全数をコピーしてエクセルなどのスプレッドシートに貼り付けます。

最適化結果

スプレッドシートに貼り付けた後に、成績の良さそうな結果をいくつかピックアップします。(下図の黄色いセルで表示されている行などですかね。。。とりあえず複数行ピックアップします。)

デフォルトでは記載されていませんが、添付のオレンジの列のようにリカバリーファクターを計算して目安にもしています。
数式バーにも記載していますが、損益/ドローダウン の値で算出できます。(この値が高ければ高いほど、安定感が増します。)

なお、この「始値のみ」のモデルで最適化結果で納得の期待値が取れない場合は、ロジックを直したりパラメータを修正したりを繰り返します。

期待値として重要視する値は下記の3点です。

  • 損益  ・・・ 最終的にどれくらいの利回りになるのか計算しながら期待値を設定します。

  • 取引回数  ・・・ あまりにも回数が少ないとただのカーブフィッティングになりやすいので。

  • ドローダウン ・・・損益がとれても大きなドローダウンが確認されると破綻のリスクが高いため、グラフが綺麗になりません。


上記の作業を行って良い値が出たら

  • 最適化で設定したステップ数をより縮めて、スタート→ストップの間隔も良い数値が出るものにフィットさせて縮める。 (最適化の試行回数が少なくなるように設定します。)

  • モデルを「始値のみ」→ 「コントロールポイント」 → 「全ティック」 と昇格させていき、同様に自分の中で期待値する値が出るようにする。

上記の作業を繰り返して、「全ティック」で期待する値が取れるパラメータがいくつか取れましたら、最適化のチェックを外してグラフ付の結果が取れるバックテストを実施します。

この作業で綺麗な右肩上がりのグラフが出来たら完成です!!

基本的に私はこの作業を繰り返して、バックテストを実施しています^^



■宣伝について

ここまで読んでくださってありがとうございました。

この後は、いよいよソースコードの公開となるのですが、せっかくなので私のEAの紹介もさせてください。

以下のnoteにて作成したEAを販売してます。
載っているEAだけでも自信作なのですが、今後も作成したEAは記事に追加していく予定です。 (EA追加で値段は値上げする予定ですが、一度購入しておけば追加したEAも利用できるようにしていこうと考えてます。)

また、購入後に一定期間が経過したらソースコードの配布も行います。
バックテスト・フォワードテストの結果だけでも十分かとは思いますが、ソースコードを配布することが、販売したEAの透明性を担保できる一番の方法と考え配布します。 (あくまで個人的な考えです。)


上記で販売しているEAのフォワードテスト結果は以下の通りです。


また、お気づきの点、ご意見がございましたらなんなりとお申し付けください^^

◎X(Twitter)アカウント: どんぶら (@donburakofx)
◎Eメール:donburakofx@gmail.com


■ソースコードの公開について


それでは、最後にリポストでソースコードを閲覧することができます。

注意点として、このまま利用するには注文エラー時のエラー制御が甘いです。
もちろん、このままのコードで動作はしますが、商用でないため実運用・商用に利用したい場合は注文処理の部分を見直してご利用ください。

万が一、実運用を行い注文エラーで損害が出た場合や、注文執行が正常に行われた場合でも相場の状況によっては利益だけでなく損害が出る可能性がありますので、損害に対するクレームは一切受け付けません。

あくまでバックテストを支援するサンプルのプログラムとして公開させていただきます。

ここから先は

15,301字 / 6画像 / 1ファイル

期間限定 PayPay支払いすると抽選でお得に!

この記事が参加している募集

#夏の思い出

26,408件