日本株の個別銘柄でシステムトレード検証&自動売買(ダウンロードあり)
目次/もくじ
MT4/MT5というとFXでのトレードプラットフォームの印象が強いですが、株のトレードも可能です。特にMT5では板取引に対応するバージョンアップなども行われたので、開発元のロシアではモスクワ証券取引所の銘柄をMT5でトレードしたり、システムトレードしたり、過去検証することが可能になっています。
とは言え、国内のMT4/MT5対応のFX会社ではそもそも為替以外をトレードすることすらできず、海外のMT4/MT5対応業者でも株式が取引可能な業者は限られています。
しかし、TradeStationは現状ではバグが多いし、EasyLanguageによる複雑なストラテジーを開発するには限界があるので、MT5で株のシステムトレードをしてみます。
MT4/MT5対応で株取引ができるIFCMでは、下記の東京証券取引所の銘柄があります。
シンボル |
会社名 |
スプレッド |
配当の調整 |
配当調整の入金日付 |
注文設定可能値幅 |
|
#T-6857 | Advantest Corp. | アドバンテスト株式会社 | 100 | 34 JPY | 30.03.2020 | 200 |
#T-8267 | Aeon Co. Ltd. | イオン株式会社 | 20 | 18 JPY | 27.02.2020 | 40 |
#T-2802 | Ajinomoto Co. Inc. | 株式会社アジノモト | 15 | 16 JPY | 30.03.2020 | 30 |
#T-6770 | Alps Electric Co. Ltd. | アルプス電気株式会社 | 20 | 10 JPY | 30.03.2020 | 40 |
#T-9202 | ANA HOLDINGS Inc. | 株式会社アナホールディングス | 30 | 75 JPY | 30.03.2020 | 60 |
#T-8304 | Aozora Bank, Ltd. | 株式会社オゾラ銀行 | 25 | 39 JPY | 30.03.2020 | 50 |
#T-3407 | Asahi Kasei Corp. | 旭化成株式会社 | 10 | 16 JPY | 30.03.2020 | 20 |
#T-4503 | Astellas Pharma Inc. | アステラス製薬株式会社 | 15 | 20 JPY | 30.03.2020 | 30 |
#T-5108 | Bridgestone Corp. | ブリヂストン株式会社 | 35 | 80 JPY | 27.12.2019 | 70 |
#T-7751 | Canon Inc. | キノン株式会社 | 25 | 80 JPY | 27.12.2019 | 50 |
#T-8601 | Daiwa Securities Group Inc. | 大和証券グループ株式会社 | 5 | 9.5622 JPY | 29.03.2017 | 10 |
#T-6902 | Denso Corp. | 株式会社デンソー | 40 | 70 JPY | 30.03.2020 | 80 |
#T-6702 | FUJITSU Ltd. | 富士通株式会社 | 100 | 100 JPY | 30.03.2020 | 200 |
#T-6501 | Hitachi, Ltd. | 日立製作所 | 35 | 4.781 JPY | 29.03.2016 | 70 |
#T-7267 | Honda Motor Co. Ltd. | 本田技研工業株式会社 | 25 | 28 JPY | 30.03.2020 | 50 |
#T-7013 | IHI Corp. | 株式会社イヒ | 20 | 40 JPY | 30.03.2020 | 40 |
#T-1605 | Inpex Corp. | インペックス株式会社 | 10 | 15 JPY | 27.12.2019 | 20 |
#T-7202 | Isuzu Motors Ltd. | いすゞ自動車 | 15 | 19 JPY | 30.03.2020 | 30 |
#T-8001 | ITOCHU Corp. | 伊藤忠商事株式会社 | 20 | 42.5 JPY | 30.03.2020 | 40 |
#T-6178 | Japan Post Holdings Co. Ltd. | 日本郵送ホールディングス株式会社 | 10 | 25 JPY | 30.03.2020 | 20 |
#T-5411 | JFE Holdings Inc. | JFEホールディングス株式会社 | 15 | 20 JPY | 27.09.2019 | 30 |
#T-5020 | JX Holdings, Inc. | 株式会社JXホールディングス | 5 | 11 JPY | 30.03.2020 | 10 |
#T-7012 | Kawasaki Heavy Industries, Ltd. | カワサキ重工業株式会社 | 20 | 35 JPY | 30.03.2020 | 40 |
#T-9107 | Kawasaki Kisen Kaisha, Ltd. | カワサキ・キセン株式会社 | 20 | 1.992 JPY | 29.03.2016 | 40 |
#T-9433 | KDDI Corp. | 株式会社KDDI | 25 | 60 JPY | 30.03.2020 | 50 |
#T-2503 | Kirin Holdings Co Ltd | キリンホールディングス株式会社 | 20 | 31.5 JPY | 27.12.2019 | 40 |
#T-5406 | Kobe Steel, Ltd. | 神戸製鋼株式会社 | 10 | 10 JPY | 27.03.2019 | 20 |
#T-6301 | Komatsu Ltd. | 株式会社コマツ | 20 | 55 JPY | 30.03.2020 | 40 |
#T-6326 | Kubota Corp. | 株式会社クボタ | 15 | 19 JPY | 27.12.2019 | 30 |
#T-8002 | MARUBENI | 丸 紅 | 7 | 17.5 JPY | 30.03.2020 | 14 |
#T-7261 | Mazda Motor Corp. | マツダ株式会社 | 10 | 20 JPY | 30.03.2020 | 20 |
#T-6479 | MinebeaMitsumi Inc. | ミネベアミツミ株式会社 | 20 | 14 JPY | 27.03.2019 | 40 |
#T-4188 | Mitsubishi Chemical Holdings Corp. | 三菱ケミカルホールディングス株式会社 | 7 | 20 JPY | 30.03.2020 | 14 |
#T-8058 | Mitsubishi Corp. | 三菱商事 | 25 | 68 JPY | 30.03.2020 | 50 |
#T-6503 | Mitsubishi Electric Corp. | 三菱電機株式会社 | 15 | 26 JPY | 30.03.2020 | 30 |
#T-8802 | Mitsubishi Estate Co. Ltd. | 三菱不動産株式会社 | 20 | 16 JPY | 30.03.2020 | 40 |
#T-7011 | Mitsubishi Heavy Industries, Ltd. | 三菱重工業株式会社 | 35 | 75 JPY | 30.03.2020 | 70 |
#T-5711 | Mitsubishi Materials Corp. | 三菱マテリアル株式会社 | 50 | 40 JPY | 30.03.2020 | 100 |
#T-7211 | Mitsubishi Motors Corp. | 三菱自動車株式会社 | 10 | 10 JPY | 30.03.2020 | 20 |
#T-8306 | Mitsubishi UFJ Financial Group, Inc. | 三菱UFJフィナンシャル・グループ | 5 | 12.5 JPY | 30.03.2020 | 10 |
#T-8031 | MITSUI & CO., Ltd. | 三井物産株式会社 | 15 | 40 JPY | 30.03.2020 | 30 |
#T-4183 | Mitsui Chemicals, Inc. | 三井化学株式会社 | 25 | 50 JPY | 30.03.2020 | 50 |
#T-8801 | Mitsui Fudosan Co. Ltd. | 三井不動産株式会社 | 25 | 22 JPY | 30.03.2020 | 50 |
#T-5706 | Mitsui Mining and Smelting Company, Ltd. | 三井鉱業製錬株式会社 | 25 | 70 JPY | 30.03.2020 | 50 |
#T-9104 | Mitsui O.S.K.Lines, Ltd. | 三井O.S.K.ラインズ株式会社 | 24 | 35 JPY | 30.03.2020 | 48 |
#T-8411 | Mizuho Financial Group, Inc. | みずほフィナンシャルグループ | 2 | 3.75 JPY | 30.03.2020 | 4 |
#T-6701 | NEC Corporation | 株式会社NEC | 50 | 30 JPY | 30.03.2020 | 100 |
#T-7731 | Nikon Corp. | ニコン株式会社 | 12 | 30 JPY | 30.03.2020 | 24 |
#T-5401 | NIPPON STEEL & SUMITOMO METAL CORPORATION | 日本製鉄住友金属工業株式会社 | 15 | 10 JPY | 27.09.2019 | 30 |
#T-9432 | Nippon Telegraph & Telephone Corp | 日本電信電話株式会社 | 45 | 47.5 JPY | 30.03.2020 | 90 |
#T-9101 | Nippon Yusen Kabushiki Kaisha | 日本郵船・香伏記会社 | 20 | 20 JPY | 30.03.2020 | 40 |
#T-7201 | NISSAN MOTOR CO., Ltd. | 日産自動車株式会社 | 6 | 20 JPY | 27.09.2019 | 12 |
#T-8604 | Nomura Holdings, Inc. | 野村ホールディングス株式会社 | 5 | 7.969 JPY | 29.03.2016 | 10 |
#T-6471 | NSK Ltd. | 株式会社NSK | 10 | 20 JPY | 30.03.2020 | 20 |
#T-9613 | NTT Data Corp. | NTTデータ株式会社 | 12 | 9 JPY | 30.03.2020 | 24 |
#T-9437 | NTT Docomo Inc. | 株式会社NTTドコモ | 25 | 60 JPY | 30.03.2020 | 50 |
#T-6752 | Panasonic Corp. | パナソニック株式会社 | 10 | 15 JPY | 30.03.2020 | 20 |
#T-4755 | Rakuten Inc. | 株式会社楽天 | 10 | — | 20 | |
#T-8308 | Resona Holdings, Inc. | 株式会社レソナホールディングス | 5 | 10.5 JPY | 30.03.2020 | 10 |
#T-7735 | SCREEN Holdings Co., Ltd. | 株式会社スクリーンホールディングス | 100 | 46 JPY | 30.03.2020 | 200 |
#T-6724 | Seiko Epson Corp. | セイコーエプソン株式会社 | 15 | 31 JPY | 30.03.2020 | 30 |
#T-1928 | Sekisui House Ltd | 積水ハウス株式会社 | 20 | 41 JPY | 30.01.2020 | 40 |
#T-6753 | Sharp Corporation | シャープ株式会社 | 15 | — | 30 | |
#T-8303 | Shinsei Bank, Ltd. | 新生銀行 | 15 | 7.9685 JPY | 28.03.2018 | 30 |
#T-9984 | SoftBank Corp. | ソフトバンク株式会社 | 35 | 22 JPY | 30.03.2020 | 70 |
#T-2768 | Sojitz Corp. | ソジッツ株式会社 | 10 | 8.5 JPY | 30.03.2020 | 20 |
#T-6758 | SONY Corp. | ソニー。 | 60 | 25 JPY | 30.03.2020 | 120 |
#T-7270 | Subaru Corp. | スバル株式会社 | 25 | 72 JPY | 30.03.2020 | 50 |
#T-3436 | Sumco Corp. | 株式会社サムコ | 15 | 10 JPY | 27.12.2019 | 30 |
#T-4005 | SUMITOMO CHEMICAL COMPANY, Ltd. | 住友化学株式会社 | 10 | 6 JPY | 30.03.2020 | 20 |
#T-8053 | Sumitomo Corp. | 住友商事株式会社 | 15 | 35 JPY | 30.03.2020 | 30 |
#T-5802 | Sumitomo Electric Industries Ltd. | 住友電気工業株式会社 | 15 | 24 JPY | 30.03.2020 | 30 |
#T-8309 | Sumitomo Mitsui Trust Holdings, Inc. | 三井住友トラストホールディングス株式会社 | 35 | 75 JPY | 30.03.2020 | 70 |
#T-8795 | T&D Holdings Inc. | T&Dホールディングス株式会社 | 10 | 22 JPY | 30.03.2020 | 20 |
#T-5233 | TAIHEIYO CEMENT Corp. | 太陽平代セメント株式会社 | 50 | 30 JPY | 30.03.2020 | 100 |
#T-1801 | TAISEI Corp. | 大成株式会社 | 50 | 65 JPY | 30.03.2020 | 100 |
#T-3401 | Teijin Ltd | 帝人株式会社 | 20 | 30 JPY | 30.03.2020 | 40 |
#T-8750 | The Dai-ichi Life Insurance Company, Ltd. | 第一生命保険株式会社 | 15 | 62 JPY | 30.03.2020 | 30 |
#T-9501 | Tokyo Electric Power Company, Inc. | 東京電力株式会社 | 10 | — | 20 | |
#T-9531 | Tokyo Gas Co. Ltd. | 東京ガス株式会社 | 25 | 30 JPY | 30.03.2020 | 50 |
#T-3402 | TORAY INDUSTRIES, Inc. | 株式会社トーレイインダストリーズ | 6 | 8 JPY | 30.03.2020 | 12 |
#T-6502 | TOSHIBA CORP. | 東芝。 | 50 | 10 JPY | 30.03.2020 | 100 |
#T-4042 | Tosoh Corp. | 東ソー株式会社 | 15 | 28 JPY | 30.03.2020 | 30 |
#T-7203 | TOYOTA MOTOR Corp. | トヨタ自動車株式会社 | 60 | 79.685 JPY | 29.03.2016 | 120 |
#T-4689 | Yahoo Japan Corp. | ヤフージャパン株式会社 | 10 | 8.86 JPY | 30.03.2020 | 20 |
#T-7272 | Yamaha Motor Co. Ltd. | ヤマハ発動機株式会社 | 20 | 45 JPY | 27.12.2019 | 40 |
業界を代表する銘柄が多いですが、流動性が低い新興株はそもそも板が薄くてトレードできないことがあるので仕方ありません。
営業時間内にのみ取引可能で、個別株CFDの原資産に配当が実施された場合、配当金調整額の受け取り(支払い)については配当金相当額の100%です。
株のシステムトレード検証1
上昇は緩やかで、下落は一瞬なら…
FXの場合はレンジ相場が多く、”為替そのものがある一定の値に収まるべきもの”という特徴があるので、基本は逆張り+損大利小モデルが鉄板ですが、株の場合はその知識は邪魔になります。
株の場合は”株価は上がるべきもの”という前提があるので、トレンドが発生しやすい傾向があります。そのため、先人の偉大な投資家が言うように順張り、トレンドフォローがお約束です。必然的に損小利大モデルになります。トレーリングをつけてもいいかもしれません。
ただし、オーストラリアドルや南アフリカランドのように、株価には”緩やかに上昇して、下落するときは一瞬で下落する”という特徴もあります。そのため、買い戦略と売り戦略は分けた方が合理的です。為替の場合は通貨の交換なのでチャートが上下で線対称になりやすいですが、株では上下線対称になりません。
「買いは順張りでトレーリングストップ、売りはATRで暴落時にイナゴで売り逃げ」
とりあえず、楽天(4755)でプログラミングを組みます。理由は特にありません。最初に目に入ったからです。
4755 楽天 日足チャート
まず、買いエントリーの条件である”順張り”のロジックですが、順張りのテクニカル指標の代表的なものには、
- 移動平均線によるゴールデンクロス、
- ADX、
- ボリンジャーバンドの1σ突破、
- エンベロープのバンド突破、
- 一目均衡表の雲抜け
- レジスタンスラインブレイク
などがあります。
今回は順張りのシグナルとして、サポートライン、レジスタンスラインのブレイクを使います。サポートライン、レジスタンスラインは直近の高値と直近の安値が分かれば算出することができます。
例えば、直近のロウソク足14本の高値は、
1 |
iHigh(_Symbol,0,iHighest(_Symbol,0,MODE_HIGH,14,0)) |
とすれば算出できます。(返値はdouble)
現在の株価が過去14本のロウソク足を超えた場合は、
1 |
if( iClose(_Symbol,0,0) > iHigh(_Symbol,0,iHighest(_Symbol,0,MODE_HIGH,SupportResistanceSpan,1)) ) |
とすればOKです。ただし、これだけの条件では、比較対象となる高値が凸でない可能性があります。
具体的には、株価が一時的に単調減少するようなチャートを描いた場合、14本前のロウソク足がちょうどその減少局面にあたると凸でない値を比較対象にしてしまいます。
楽天 日足チャート
上記のような株価チャートの場合、14本前のロウソク足はまったく凸ではないので、レジスタンスラインのレートにはなりえませんが、ロウソク足14本前からの最高値をブレイクとしてしまうと、この条件で買いエントリーしてしまいます。
そのため、指定したロウソク足の計算期間において、最高値のロウソク足が最も古いロウソク足である場合は除外が必要です。
コーディング
ロングエントリー条件(イメージ)
1 2 3 |
//Buy Entry Condition if( iClose(_Symbol,0,0) > iHigh(_Symbol,0,iHighest(_Symbol,0,MODE_HIGH,SupportResistanceSpan,1)) && iHighest(_Symbol,0,MODE_HIGH,SupportResistanceSpan,1) != SupportResistanceSpan ) |
ショートエントリー条件
1 |
if( iClose(_Symbol,0,0) < iClose(_Symbol,0,1) - ShortEntryGap*_Point ) |
ロングポジション トレーリング
1 2 3 4 5 6 7 8 9 10 11 12 |
if( PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY && TrailingStop ) { //トレーリングストップ if( SymbolInfoDouble(_Symbol,SYMBOL_BID) - SL_in_point_long*_Point > PositionGetDouble(POSITION_SL) ) { double NewSL,NewTP; NewSL = NormalizeDouble(SymbolInfoDouble(PositionGetString(POSITION_SYMBOL),SYMBOL_BID) - SL_in_point_long*_Point,SymbolInfoInteger(PositionGetString(POSITION_SYMBOL),SYMBOL_DIGITS)); NewTP = NormalizeDouble(SymbolInfoDouble(PositionGetString(POSITION_SYMBOL),SYMBOL_BID) + TP_in_point_long*_Point,SymbolInfoInteger(PositionGetString(POSITION_SYMBOL),SYMBOL_DIGITS)); OrderModify(PositionGetTicket(i),NewSL,NewTP); LastOrderCloseTime = TimeCurrent(); } } |
OrderModify
MQL5にはOrderModifyがないのでOrderSendでACTIONをMODIFYにするか、標準ライブラリのCTradeのPositionModifyを使う必要があります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
void OrderModify(int ModifyingTicket, double ModifyingSL, double ModifyingTP) { MqlTradeRequest CRequest; MqlTradeResult CResult; ZeroMemory(CRequest); ZeroMemory(CResult); //ネッティングタイプの場合(ポジションが合体させられる場合)------------------------------------------------------------ if( AccountInfoInteger(ACCOUNT_MARGIN_MODE) == ACCOUNT_MARGIN_MODE_RETAIL_NETTING ) { CRequest.action = TRADE_ACTION_SLTP; CRequest.position = ModifyingTicket; CRequest.symbol = PositionGetString(POSITION_SYMBOL); CRequest.sl = ModifyingSL; CRequest.tp = ModifyingTP; CRequest.type_filling = FillingMode_; R = OrderSend(CRequest,CResult); if(!R) Print("OrderClose was rejected"); } if( AccountInfoInteger(ACCOUNT_MARGIN_MODE) == ACCOUNT_MARGIN_MODE_RETAIL_HEDGING ) { m_trade.PositionModify(ModifyingTicket, ModifyingSL, ModifyingTP); } } |
EAの使い方
EAをMT5の株価チャートにセットします。
- Lot:ロット
- SupportResistanceSpan:ロングのエントリー条件であるレジスタンスラインの比較ロウソク足の本数
- ShortEntryGap: ショートエントリーの条件のナイアガラ幅. 前のロウソク足から現在価格がこの指定値以上下がった場合にショートエントリーします。(Point)
- MaxPosition_thisSymbol:その銘柄の最大同時保有ポジション数
- Sllipage_in_point:スリッページ(point)
- SL_in_point_long: ロング用のストップロス幅、損切幅(point)
- TP_in_point_long: ロング用のテイクプロフィット幅、利確幅(point)
- SL_in_point_short: ショート用のストップロス幅、損切幅(point)
- TP_in_point_short: ショート用のテイクプロフィット幅、利確幅(point)
- TrailingStop:トレーリングストップtrue=ON, false=OFF ロングでしか稼働しません。
- Magic:マジクナンバー(意味が分からなければノータッチでOK)
- FillingMode:MT5のフィリングモード
自動売買プログラムダウンロード
現在、EAを持て余したプログラマによる EA無料使い放題企画をしています。EAのパスコードは企画参加者に配布しています。
詳しくはこちら
「買いは順張りでトレーリングストップ、売りはATRで暴落時にイナゴで売り逃げ」EAのダウンロード
「買いは順張りでトレーリングストップ、売りはATRで暴落時にイナゴで売り逃げ」(ATR SLTP版)EAのダウンロード
過去データで検証
ロングとショートでトレードロジックが異なるので、最適化をロングとショート別々に行います。
銘柄は楽天で1時間足です。
ロング最適化
一見、優位性がある傾向がありそうなグラフをしていますが、緑色のところでも利益が全然でていないので、総負け状態です。
ショート最適化
周期性があるので、3Dグラフで見てみると、
微妙なグラフが現れました。
上位のトレードはどれも取引回数が少ないので、優位性があると言うにはかなり厳しい結果です。
これは、全探索でパラメータを最適化して…という以前の問題です。そもそもの仮説・仮定に誤りがあった可能性が高いです。
もちろん、1銘柄・1時間足を調べただけなので他の条件ではもしかしたら上手くいく傾向を発見することができるかもしれません。あとは読者さんにお任せします。(ブンナゲー)
そこで、「買いは順張りでトレーリングストップ、売りはATRで暴落時にイナゴで売り逃げ」という仮説は一旦ここで放置することにします。
改良点
株取引の場合マイナススワップの加算がバカにできないので、マイナススワップの影響が小さくなる戦略か、マイナススワップが発生するまでの間に決済する戦略が有効(かも)
株のシステムトレード検証2
86銘柄同時リアルタイム監視で暴騰暴落イナゴトレード
株のシステムトレードができるトレードプラットフォームにはMT5の他にTradeStationがあります。TradeStationにはスクリーニングなどの機能があり、全銘柄から条件に合う銘柄を絞り込むことが可能です。
しかし、実際にEasyLanguageで銘柄の絞り込みを行うストラテジーを組むと、いともかんたんにフリーズします。実用のレベルまで至っていません。
しかし、逆に言うとそこにチャンスがあります。つまり、多数の株式の銘柄からスクリーニングを行うシステムトレードは発展途上である可能性があります。(ただし、機関投資家レベルのトレード戦略は除く)
特に、株価が冒頭暴落した際のイナゴトレードはスピードが重要になりますが、どの銘柄が冒頭暴落しているかを判断して、その銘柄で瞬時に注文するまでには裁量トレードの場合、ラグがあります。
その遅延にターゲットを絞った検証を行ってみます。
「多数の株式銘柄を監視して、冒頭暴落があったらイナゴトレードする」
コーディング
何はともあれ呼び出しができるように東京証券取引所の銘柄のシンボルを変数に格納します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 |
static string StockName[100]; StockName[1] = "#T-6857"; // Advantest Corp. アドバンテスト株式会社 StockName[2] = "#T-8267"; // Aeon Co. Ltd. イオン株式会社 StockName[3] = "#T-2802"; // Ajinomoto Co. Inc. 株式会社アジノモト StockName[4] = "#T-6770"; // Alps Electric Co. Ltd. アルプス電気株式会社 StockName[5] = "#T-9202"; // ANA HOLDINGS Inc. 株式会社アナホールディングス StockName[6] = "#T-8304"; // Aozora Bank, Ltd. 株式会社オゾラ銀行 StockName[7] = "#T-3407"; // Asahi Kasei Corp. 旭化成株式会社 StockName[8] = "#T-4503"; // Astellas Pharma Inc. アステラス製薬株式会社 StockName[9] = "#T-5108"; // Bridgestone Corp. ブリヂストン株式会社 StockName[10] = "#T-7751"; // Canon Inc. キノン株式会社 StockName[11] = "#T-8601"; // Daiwa Securities Group Inc. 大和証券グループ株式会社 StockName[12] = "#T-6902"; // Denso Corp. 株式会社デンソー StockName[13] = "#T-6702"; // FUJITSU Ltd. 富士通株式会社 StockName[14] = "#T-6501"; // Hitachi, Ltd. 日立製作所 StockName[15] = "#T-7267"; // Honda Motor Co. Ltd. 本田技研工業株式会社 StockName[16] = "#T-7013"; // IHI Corp. 株式会社イヒ StockName[17] = "#T-1605"; // Inpex Corp. インペックス株式会社 StockName[18] = "#T-7202"; // Isuzu Motors Ltd. いすゞ自動車 StockName[19] = "#T-8001"; // ITOCHU Corp. 伊藤忠商事株式会社 StockName[20] = "#T-6178"; // Japan Post Holdings Co. Ltd. 日本郵送ホールディングス株式会社 StockName[21] = "#T-5411"; // JFE Holdings Inc. JFEホールディングス株式会社 StockName[22] = "#T-5020"; // JX Holdings, Inc. 株式会社JXホールディングス StockName[23] = "#T-7012"; // Kawasaki Heavy Industries, Ltd. カワサキ重工業株式会社 StockName[24] = "#T-9107"; // Kawasaki Kisen Kaisha, Ltd. カワサキ・キセン株式会社 StockName[25] = "#T-9433"; // KDDI Corp. 株式会社KDDI StockName[26] = "#T-2503"; // Kirin Holdings Co Ltd キリンホールディングス株式会社 StockName[27] = "#T-5406"; // Kobe Steel, Ltd. 神戸製鋼株式会社 StockName[28] = "#T-6301"; // Komatsu Ltd. 株式会社コマツ StockName[29] = "#T-6326"; // Kubota Corp. 株式会社クボタ StockName[30] = "#T-8002"; // MARUBENI 丸 紅 StockName[31] = "#T-7261"; // Mazda Motor Corp. マツダ株式会社 StockName[32] = "#T-6479"; // MinebeaMitsumi Inc. ミネベアミツミ株式会社 StockName[33] = "#T-4188"; // Mitsubishi Chemical Holdings Corp. 三菱ケミカルホールディングス株式会社 StockName[34] = "#T-8058"; // Mitsubishi Corp. 三菱商事 StockName[35] = "#T-6503"; // Mitsubishi Electric Corp. 三菱電機株式会社 StockName[36] = "#T-8802"; // Mitsubishi Estate Co. Ltd. 三菱不動産株式会社 StockName[37] = "#T-7011"; // Mitsubishi Heavy Industries, Ltd. 三菱重工業株式会社 StockName[38] = "#T-5711"; // Mitsubishi Materials Corp. 三菱マテリアル株式会社 StockName[39] = "#T-7211"; // Mitsubishi Motors Corp. 三菱自動車株式会社 StockName[40] = "#T-8306"; // Mitsubishi UFJ Financial Group, Inc. 三菱UFJフィナンシャル・グループ StockName[41] = "#T-8031"; // MITSUI & CO., Ltd. 三井物産株式会社 StockName[42] = "#T-4183"; // Mitsui Chemicals, Inc. 三井化学株式会社 StockName[43] = "#T-8801"; // Mitsui Fudosan Co. Ltd. 三井不動産株式会社 StockName[44] = "#T-5706"; // Mitsui Mining and Smelting Company, Ltd. 三井鉱業製錬株式会社 StockName[45] = "#T-9104"; // Mitsui O.S.K.Lines, Ltd. 三井O.S.K.ラインズ株式会社 StockName[46] = "#T-8411"; // Mizuho Financial Group, Inc. みずほフィナンシャルグループ StockName[47] = "#T-6701"; // NEC Corporation 株式会社NEC StockName[48] = "#T-7731"; // Nikon Corp. ニコン株式会社 StockName[49] = "#T-5401"; // NIPPON STEEL & SUMITOMO METAL CORPORATION 日本製鉄住友金属工業株式会社 StockName[50] = "#T-9432"; // Nippon Telegraph & Telephone Corp 日本電信電話株式会社 StockName[51] = "#T-9101"; // Nippon Yusen Kabushiki Kaisha 日本郵船・香伏記会社 StockName[52] = "#T-7201"; // NISSAN MOTOR CO., Ltd. 日産自動車株式会社 StockName[53] = "#T-8604"; // Nomura Holdings, Inc. 野村ホールディングス株式会社 StockName[54] = "#T-6471"; // NSK Ltd. 株式会社NSK StockName[55] = "#T-9613"; // NTT Data Corp. NTTデータ株式会社 StockName[56] = "#T-9437"; // NTT Docomo Inc. 株式会社NTTドコモ StockName[57] = "#T-6752"; // Panasonic Corp. パナソニック株式会社 StockName[58] = "#T-4755"; // Rakuten Inc. 株式会社楽天 StockName[59] = "#T-8308"; // Resona Holdings, Inc. 株式会社レソナホールディングス StockName[60] = "#T-7735"; // SCREEN Holdings Co., Ltd. 株式会社スクリーンホールディングス StockName[61] = "#T-6724"; // Seiko Epson Corp. セイコーエプソン株式会社 StockName[62] = "#T-1928"; // Sekisui House Ltd 積水ハウス株式会社 StockName[63] = "#T-6753"; // Sharp Corporation シャープ株式会社 StockName[64] = "#T-8303"; // Shinsei Bank, Ltd. 新生銀行 StockName[65] = "#T-9984"; // SoftBank Corp. ソフトバンク株式会社 StockName[66] = "#T-2768"; // Sojitz Corp. ソジッツ株式会社 StockName[67] = "#T-6758"; // SONY Corp. ソニー。 StockName[68] = "#T-7270"; // Subaru Corp. スバル株式会社 StockName[69] = "#T-3436"; // Sumco Corp. 株式会社サムコ StockName[70] = "#T-4005"; // SUMITOMO CHEMICAL COMPANY, Ltd. 住友化学株式会社 StockName[71] = "#T-8053"; // Sumitomo Corp. 住友商事株式会社 StockName[72] = "#T-5802"; // Sumitomo Electric Industries Ltd. 住友電気工業株式会社 StockName[73] = "#T-8309"; // Sumitomo Mitsui Trust Holdings, Inc. 三井住友トラストホールディングス株式会社 StockName[74] = "#T-8795"; // T&D Holdings Inc. T&Dホールディングス株式会社 StockName[75] = "#T-5233"; // TAIHEIYO CEMENT Corp. 太陽平代セメント株式会社 StockName[76] = "#T-1801"; // TAISEI Corp. 大成株式会社 StockName[77] = "#T-3401"; // Teijin Ltd 帝人株式会社 StockName[78] = "#T-8750"; // The Dai-ichi Life Insurance Company, Ltd. 第一生命保険株式会社 StockName[79] = "#T-9501"; // Tokyo Electric Power Company, Inc. 東京電力株式会社 StockName[80] = "#T-9531"; // Tokyo Gas Co. Ltd. 東京ガス株式会社 StockName[81] = "#T-3402"; // TORAY INDUSTRIES, Inc. 株式会社トーレイインダストリーズ StockName[82] = "#T-6502"; // TOSHIBA CORP. 東芝。 StockName[83] = "#T-4042"; // Tosoh Corp. 東ソー株式会社 StockName[84] = "#T-7203"; // TOYOTA MOTOR Corp. トヨタ自動車株式会社 StockName[85] = "#T-4689"; // Yahoo Japan Corp. ヤフージャパン株式会社 StockName[86] = "#T-7272"; // Yamaha Motor Co. Ltd. ヤマハ発動機株式会社 |
あとはループ文を使って全銘柄の検証をするif文を作ればOKです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
for(int i=1;i<=86;i++) { //Buy Entry Condition if( iClose(StockName[i],0,0) > iClose(StockName[i],0,1) + LongEntryGap*_Point ) { Print("Order send to broker server now-------------------------------------------"); OrderSending(StockName[i],0); Print("Order Ticket returned now"); } //Sell Entry Condition if( iClose(StockName[i],0,0) < iClose(StockName[i],0,1) - ShortEntryGap*_Point ) { Print("Order send to broker server now-------------------------------------------"); OrderSending(StockName[i],1); Print("Order Ticket returned now"); } } |
OrderSendingの関数は下記のような感じです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
void OrderSending(string TradingStock, int Direction) { MqlTradeRequest TRequest; MqlTradeResult TResult; ZeroMemory(TRequest); ZeroMemory(TResult); if( Direction == 0 ) { TRequest.type = ORDER_TYPE_BUY; TRequest.price = SymbolInfoDouble(TradingStock,SYMBOL_ASK); if( SL_in_point_long != 0 ) TRequest.sl= NormalizeDouble(SymbolInfoDouble(TradingStock,SYMBOL_BID) - SL_in_point_long*_Point,SymbolInfoInteger(TradingStock,SYMBOL_DIGITS)); if( TP_in_point_long != 0 ) TRequest.tp= NormalizeDouble(SymbolInfoDouble(TradingStock,SYMBOL_BID) + TP_in_point_long*_Point,SymbolInfoInteger(TradingStock,SYMBOL_DIGITS)); Print("sl "+TRequest.sl+" order "+TRequest.price+" tp "+TRequest.tp); } else if( Direction == 1 ) { TRequest.type = ORDER_TYPE_SELL; TRequest.price = SymbolInfoDouble(TradingStock,SYMBOL_BID); if( SL_in_point_short != 0 ) TRequest.sl = NormalizeDouble(SymbolInfoDouble(TradingStock,SYMBOL_ASK) + SL_in_point_short*_Point,SymbolInfoInteger(TradingStock,SYMBOL_DIGITS)); if( TP_in_point_short != 0 ) TRequest.tp = NormalizeDouble(SymbolInfoDouble(TradingStock,SYMBOL_ASK) - TP_in_point_short*_Point,SymbolInfoInteger(TradingStock,SYMBOL_DIGITS)); Print("sl "+TRequest.sl+" order "+TRequest.price+" tp "+TRequest.tp); } TRequest.volume = Lot; TRequest.action = TRADE_ACTION_DEAL; TRequest.symbol = TradingStock; TRequest.magic = Magic; TRequest.comment = ""; TRequest.deviation = Slippage_in_point; TRequest.type_filling = FillingMode_; R = OrderSend(TRequest,TResult); if( !R ) Print("OrderSend for Open was rejected"); //we should check the return just in case. } |
システムの使い方
日経のどれかのチャートにセットすればOKです。86銘柄チャートを開く必要はありません。気配値でこの86銘柄が表示されるようにしておいてください。(一応)
- Lot:取引ロット
- LongEntryGap: ロングエントリーをする暴騰幅(point)
- ShortEntryGap: ショートエントリーする暴落幅(point)
- MaxPosition: 最大同時保有ポジション数
- SL_in_point_long: ロング用のストップロス幅、損切幅(point)
- TP_in_point_long: ロング用のテイクプロフィット幅、利確幅(point)
- SL_in_point_short: ショート用のストップロス幅、損切幅(point)
- TP_in_point_short: ショート用のテイクプロフィット幅、利確幅(point)
- Magic:マジクナンバー(意味が分からなければノータッチでOK)
- FillingMode:MT5のフィリングモード
自動売買プログラムダウンロード
現在、EAを持て余したプログラマによる EA無料使い放題企画をしています。EAのパスコードは企画参加者に配布しています。
詳しくはこちら
【口座番号の制限なしexファイル(0.1BTC~)、ソースコードmqファイル 譲渡可(価格応相談 0.3BTC~)】
検証
MT5なら86銘柄を同時に監視しながらバックテストを稼働させることができます。(MT4では仕様上機能がありません。TradeStationは一瞬でフリーズします)
86銘柄を同時に演算するので演算量が多いです。そのため、ざっくりとした最適化を行います。
時間足は1時間足で期間は2020年2月26日~4月14日です。(合理的な理由はありません。たまたま適当にセットしました。)たったこれだけの組み合わせパターンでも膨大な時間が演算にかかっています。
MT5では世界中のMT5ユーザーのコンピュータリソースをレンタルするサービスがあるので、いよいよ出番かもしれません。
優位性は十分にあるトレード手法でも単一の銘柄では取引回数が少なすぎてまともな検証ができない、というパターンはよくあります。しかし、今回は大量の銘柄を同時に調べているので、「1銘柄ではトレードチャンスが全然ないロジックの優位性を測る」ことができます。
綺麗なグラフとは言えませんが、及第点だと思います。
ロングエントリーとショートエントリーのエントリー条件の騰落ポイントを調べてみると、ロングエントリーの方が条件が厳しいことが分かりました。直感では冒頭暴落するときは下落幅の方が大きいイメージがありますが、その逆の結果です。
これはおそらく、「暴落するときは暴落幅が大きくなる傾向があるから暴落の前兆の時点でエントリーすべきだが、暴騰するときは暴騰幅がそれほど大きくはならないから、よっぽど超暴騰したとき以外はイナゴエントリーしない方が良い」という教訓だと考えられます。
PFと取引回数とドローダウンのバランスを考慮した組み合わせでテストした場合、
このように、いかにも損小利大モデルのグラフができあがります。連敗回数が高いので心配症の人には向いてないですね。
もうちょっと取引回数が少なくても良いなら、もうちょっときれいなグラフにできます。株の場合、FXよりも取引可能な時間がそもそもかなり短いので取引回数は少なくなりがちです。
それでも1か月半~2か月で15~30回もトレードすれば上出来じゃないでしょうか。
改良点
そもそも各銘柄ごとにボラティリティが異なるので、暴騰暴落の幅を決定する指標を”point/pips単位”にするよりも”直近のロウソク足の平均(ATR)のN倍”にした方が合理的。(ただし、パラメータが増える)
EAforStocks_ScreeningStocks_and_following_ATR_SLTP.ex5
株のシステムトレード検証3
相関がある二つの銘柄間で両建て裁定取引検証
[非公開コンテンツ]
関連記事
-
トレードステーションの使い方(初心者)
トレードステーションのチャートの表示方法 TradeStation/トレードステーションは、Met
-
[EasyLanguage]ストラテジーのコードを読み解く(トレードステーション)
移動平均線のクロスのストラテジーのプログラミングを見ていきたいと思います。 思っていたより短い
-
[EasyLanguage]パーフェクトオーダーを作る(トレードステーション)
今回は久々にプログラミングを触ります。 TradeStationはデフォルトで比較的なインジケータ
-
初心者のためのEasyLanguage入門(トレードステーション)
これからトレードステーションのストラテジーを開発するためにEasyLanguageをやってみようとい
-
株の自動売買プログラムを開発する6つのやり方
FX業界ではMT4/MT5のおかげもあり、個人レベルでも自動売買やシステムトレードが盛んにおこなわれ
コメント
いつも楽しく読ませていただいております。
ブログ内に時折、「非公開コンテンツ」と書いてあるところがありますが、こちらはどのような手続きを踏めば読ませていただくことができるのでしょうか。
86イナゴEAでパラメータいじってBTしてて思いましたが、株価の数値が銘柄によって100~4000とだいぶ幅があるので、確かにpipsでエントリー/利確な限りは恣意的なフィッティングにしかならないような気がしますね。本質をつくならROCやATRが必要でしょうかね。
検証ありがとうございます。FXの場合はどの通貨ペアの値幅もpips/pointで計算すれば大きな差はありませんが、
株の場合は各銘柄ごとのボラティリティの差が大きいので、FXの考え方をそのままスライドさせただけでは安直でしたね。
ATR版も貼っておきます。