トラリピEAの開発と検証 ループイフダン/iサイクル[MT4/MT5]
公開日:
:
無料配布EA(MT5 用), 無料配布EA(MT4 用) MT4, MT5, 無料ea
目次/もくじ
トラリピとは
トラリピとはトラップリピートイフダンの略でグリッドトレードの一種です。一定幅毎に予約注文を出しておき、相場がウネウネしたら勝ち続けられるトレード手法です。逆に、相場が単調増加や単調減少すると負ける可能性がありますが、FXの場合はレンジ相場の比率が高いので、為替と相性の良い取引スタイルとして日本国内の各社証券会社がさまざまな名称で提供しています。
トラリピがもっとも有名な呼称だと思いますが、他にもループイフダンやiサイクルなどがあります。
サービス FX会社
トラリピ マネースクウェア・ジャパン
ループ・イフダン アイネット証券
リピートトレール注文 YJFX!
連続IFDOCO注文 ジャパンネット銀行
ループ・イフダン ひまわり証券(エコトレFX)
iサイクル注文 / サイクル注文 外為オンライン
トラッキングトレード FXトレーディングシステムズ
iサイクル注文 ライブスター証券
連続予約注文 マネーパートナーズ
トラリピEAの開発
まずはシンプルなトラリピEAを開発主体にします。大きく、買いバージョンと売りバージョンが必要です。また、トラップ幅もパラメータで可変にできる必要があります。
書き方はいろいろあると思いますが、今回は7つのオーダーを同時に送信する仕様にしました。起点となる価格TrapBasicRateを現在レートよりも情報に配置し、そこから7つのオーダーを送信します。
1 2 3 4 5 6 7 8 |
//オーダーを出すレート群を決定する TrapRate[1] = TrapBasicRate; TrapRate[2] = TrapBasicRate - 1*TrapWidth_in_point*_Point; TrapRate[3] = TrapBasicRate - 2*TrapWidth_in_point*_Point; TrapRate[4] = TrapBasicRate - 3*TrapWidth_in_point*_Point; TrapRate[5] = TrapBasicRate - 4*TrapWidth_in_point*_Point; TrapRate[6] = TrapBasicRate - 5*TrapWidth_in_point*_Point; TrapRate[7] = TrapBasicRate - 6*TrapWidth_in_point*_Point; |
最高値となる基準レートは買いバージョン、売りバージョン共通で、EAをセットしたレートにトラップ幅の半分のレートを足して、2段階分上のトラップ位置になるようにした値です。
1 2 3 4 5 |
void SetTrapBasicRate() { if( TrapMode_ == TRAP_BUY ) TrapBasicRate = SymbolInfoDouble(Symbol(),SYMBOL_ASK) + TrapWidth_in_point*_Point/2 +TrapWidth_in_point*_Point*3; else if( TrapMode_ == TRAP_SELL ) TrapBasicRate = SymbolInfoDouble(Symbol(),SYMBOL_BID) + TrapWidth_in_point*_Point/2 +TrapWidth_in_point*_Point*3; } |
言葉で説明しようとするとややこしいですが、いざ開発しようとなるとおそらく同じような発想になり、なんとなく理解できると思います。
ストップ注文が滑ることを前提とした開発
注意しなければいけない点は、リミット注文では注文価格と約定価格が一致するのに対して、ストップ注文では約定価格が必ずしも予約送信した価格と一致するわけではないということです。
ロングオーダーで、現在レートよりも上の価格帯の予約注文はすべてストップ注文になりますが、それらの注文は滑る可能性があります。そのため、if文で条件を記述する際に価格の等号を使ってしまうと簡単に不具合が発生してしまいます。
そのため、ある程度の価格の幅を持たせて条件を記述するようにしてください。
ダメな例
1 |
if( PositionGetDouble(POSITION_PRICE_OPEN) == Rate ) |
良さそうに見えてダメな例1
1 |
if( NormalizeDouble(PositionGetDouble(POSITION_PRICE_OPEN),_Digits) == NormalizeDouble(Rate,_Digits) ) |
※MQLではNormalizeDoubleが正しく丸められない仕様があります。
良さそうに見えてダメな例2
1 |
if( DoubleToString(PositionGetDouble(POSITION_PRICE_OPEN),_Digits) == DoubleToString(Rate,_Digits) ) |
※ストップ注文が滑った際に対応できなくなります。
妥協案
1 |
if( MathAbs(PositionGetDouble(POSITION_PRICE_OPEN) - Rate) < TrapWidth_in_point*_Point/2 ) |
EA再セット時の条件分布
また、バックテスト時では問題ありませんが、ライブテスト時のEAの再設定時には複数の分岐処理が必要になります。
- //すでにこのEAによる オーダーがあり、ポジションがない場合
- //オーダーがあり、ポジションもある場合
- //オーダーがなく、ポジションはある場合 (手動でEAを外し、オーダーを削除し、ポジションを残した場合)
- //このEAによるオーダーもポジションもない場合
今回は簡単のため、2番目と3番目に関しては未決オーダーを削除して再スタートする仕様にしました。
レートが大きく動いた場合の処理
レートが大きく推移した際、遠くに配置した予約注文を削除し、レートが推移した方向に新しい予約注文を出す必要があります。また、それに伴い、基準となる価格も逐次変更する必要があります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
//7つのレート以外の予約オーダーがある場合は消す int OrdersTotal_ = OrdersTotal(); for(int i=0; i<OrdersTotal_;i++) { if( OrderGetTicket(i)>0 ) { if( OrderGetInteger(ORDER_MAGIC) == Magic && OrderGetString(ORDER_SYMBOL) == Symbol() ) { if( OrderGetDouble(ORDER_PRICE_OPEN) > TrapRate[1] + TrapWidth_in_point*_Point/2 || OrderGetDouble(ORDER_PRICE_OPEN) < TrapRate[7] - TrapWidth_in_point*_Point/2 ) { m_trade.OrderDelete(OrderGetTicket(i)); } } } } |
1 2 3 4 5 6 7 8 9 10 11 12 |
//トラップ基準レートの更新が必要かどうかチェック---- //現在レートが上に移動 if( CurrentRate > TrapRate[3] ) { TrapBasicRate = TrapBasicRate + TrapWidth_in_point*_Point; } //現在レートが下に移動 if( CurrentRate < TrapRate[5] ) { TrapBasicRate = TrapBasicRate - TrapWidth_in_point*_Point; } |
通常版トラリピEAの使い方
トラリピ/ループイフダンのMT4用EAです。両建てダイプでシンプルな設計にしてあります。オーダーコメントにそのオーダーがストップオーダーなのか、リミットオーダーなのかをわかるようにしてあります。もし、約定価格が滑っていたら参考にしてください。
- Lot:ロット
- TrapWidth_in_point: トラップ幅(ポイント単位) 100=10pips
- Sllippage_in_point: スリッページ(ポイント単位)
- Magic: マジックナンバー
- OrderComment: オーダーコメント
- TrapMode: BUY=買い SELL=売り
- FillingMode: フィリングモード
基本的には、ロットとトラップ幅とトラップモードだけ気にすればOKです。
トラリピ通常版バックテスト結果
トラリピはスタートするタイミングとトラップ幅ですべてが決まるトレードロジックです。ちょっと条件が変わるだけで大きく結果に差がでます。
また、トラリピはその性質上スプレッド負けしやすいという特徴があります。本来であれば1回のトレードでいいところを何回も分けてトレードする形になるので、手数料をかなり多く払う結果になります。(それが各証券会社が推し進めたがる理由でもあります。)
そのため、トラリピで勝とうと思うならトラップ幅を大きめに設定する必要があります。間違ってもトラリピでスキャルピングをしようとは思わないください。
また、トラリピはテクニカル指標を使わないのでチャートの時間枠・時間軸は関係ありません。細かい値動きによる影響も考慮する必要がないので、テストモデルはコントロールポイントでOKです。
2019.01.01~2019.06.28 H1 USDJPY 勝率:60%
仮想通貨(CryptoGT)にも対応していますが、仮想通貨チャートでトラリピしても勝てないと思います。というのも、トラリピの本質は”一定の範囲内でウネウネする相場で利益を上げる構造”なので、ちょっとしたニュースなどでボラティリティが跳ね上がってしまう仮想通貨には悪手です。
2019/1/1~2019/12/31 H1 BTCUSD トレール幅最適化結果 CryptoGT
トラリピ・グリッドトレードの基本的性質として、レンジ相場では利益を積み重ねることができますが、トレンド相場になると損失ばかりが膨らむという特徴があります。
そのため、エントリーや決済を指定幅で行うトラリピの場合、そもそもロジックの優位性が存在しないので、長期的にはそれ単体では勝つことは困難です。
下記は、2018年一年間の期間でトラリピロジックを最適化した結果になります。
トラリピ単体で負ける理由と対策
トラリピ単体ではどのような数値最適化をしても長期的には勝てない(優位性がない)ということは、そのロジックを考えれば至極もっともです。
では、トラリピにまったく可能性がないのかというと、そういうわけでもないと思います。
エントリーした方向とは逆に単調増加、単調減少した場合
トラリピの基本的な戦略は、相場のうねりを利用したものです。そのため、相場がトラップ幅を無視するような単調増加や単調減少をした場合、大負けする可能性があります。
相場が単調増加、単調減少するパターンには、じわじわ変化するケースと突発的な暴騰暴落がありますが、後者に関しては事前に予測不可能なものである場合、急激なティックボリュームの増加などに対してフィルターを掛けることで、損失を抑えることが可能です。
また、じわじわ変化して単調に相場が推移した場合に関しては、トラップ幅を変更することで対応することができます。
週末の窓による相場の急激な変化とスプレッドフィルター
週末(土日)には為替相場は閉まりますが、月曜に窓が発生した際にトラリピの戦略では大負けする可能性があります。また、月曜日の相場が開いた後の数時間はスプレッドが数倍~数十倍になるケースがあります。(OANDAとか)
その際にも平常時ですら多く払っている取引手数料をさらに多く払うことになるので、手数料負け・スプレッド負けするリスクが増大します。
これらの現象は週末前にトラリピを終了し、月曜日の午前中もエントリーを控えるフィルターをプログラムに追加することで対策が可能です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
MqlDateTime tm; TimeCurrent(tm); //フィルター----------------------- //週末前後 if( WeekendFilter && ( (tm.day_of_week == 5 && tm.hour > 18) || (tm.day_of_week == 1 && tm.hour < 6)) ) { //予約注文をすべて消す ... //保有ポジションも決済 ... } |
1 2 3 4 5 6 |
//スプレッドが大きい時 else if( SymbolInfoInteger(Symbol(),SYMBOL_SPREAD) > MaxSpread_in_point ) { ////予約注文をすべて消す ... } |
トレンドの発生とトレンドフィルター
トラリピはレンジ相場で有効なトレード手法なので、事前にトレンドフィルターを設定することが有効です。テクニカル指標の中でトレンドの判定のみに専門特化した指標にADXがあります。ADXは古くからあるテクニカルインジケーターで、トレンド・レンジの判定をする以外には全く役に立たないと言ってもいいほど専門特化した指標です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
input int ADXperiod = 24; input int ADXthreshold = 30; double ADX[]; int ADXhandle; ADXhandle = iADX(Symbol(),Period(),ADXperiod); CopyBuffer(ADXhandle,0,0,100,ADX); ArraySetAsSeries(ADX,true); //トレンドが発生している場合 if( ADX[0] >= ADXthreshold ) { //予約注文をすべて消す } |
トラリピフィルター付き版の使い方
- Lot:ロット
- TrapWidth_in_point: トラップ幅(ポイント単位) 100=10pips
- Sllippage_in_point: スリッページ(ポイント単位)
- Magic: マジックナンバー
- OrderComment: オーダーコメント
- TrapMode: BUY=買い SELL=売り
- WeekendFilter: Trueの場合、サーバー時刻の金曜日の18時に一時終了し、月曜日の6時に再開します
- MaxSpread_in_point: スプレッドがこの値を超えた場合、トラリピを一時終了します。未満になると再開します。
- ADXperiod: ADXの期間
- ADXthreshould: ADXメインラインがトレンドかどうかを判定する閾値。これ以上の値になったらトレンドとみなし、トラリピを一時終了します。
- FillingMode: フィリングモード
トラリピEA無料ダウンロード
トラリピEAフィルター付き版のダウンロード(MT5フィルタ付版)
※(MT5トレンドフィルター、スプレッドフィルター、週末フィルター付き版)
※亜種はトラリピを発展させたグリッドトレード版です。(トラリピのような何か)
現在、EAを持て余したプログラマによる EA無料使い放題企画をしています。EAのパスコードは企画参加者に配布しています。(.ex4)
詳しくはこちら
関連記事
-
サーバータイプのMT4MT5互換コピートレードツール(EA)
この記事ではWEBサーバーを経由するMT4/MT5のコピートレードシステムの作り方について解説します
-
超高頻度トレードEA(1万回以上) [最強EA検証](MT4)
バックテスト結果 EURUSD EURUSD M5 2019/11/1~2020/4/3
-
日経アメリカ株式市場アービトラージ プログラミングで説検証
よく「日本の株式市場は前日のニューヨーク市場の後追いをする」と言われています。実際に裁量トレードする
-
FX用MT5EA[無料EA]
バックテスト結果 EURGBPの場合、1時間足で取引数631回です。平均し
-
モメンタム&スイングトレードで勝てる!?/無料EA[MT5]
モメンタムは直近のレートの差を利用した指標で、超短期スキャルピングなどで使われます。しかし、スプレッ
コメント
いつも参考にさせていただいています。今回も非常に参考になりました。
大きなドローダウン時期があるのがトラリピの特徴ではありますが、ドローダウン時期が異なる通貨ペアがわかればポートフォリオを組んでリスク分散できないでしょうか?そうすれば長期でも使えそうな気がするのですが。
初心者でも大丈夫でしょうか?
トラリピはむしろ初心者向きと言えると思います。
トラリピを初めて使いますが、使い方を教えてください。
XMのデモ口座のMT5によるバックテストですが、デモ口座は先に頂いたパスワードはPassCodeに設定しなくてもよいですか。(デモ口座は自由に使ってよいとあったので)
基本的なパラメータは
・トラップ一本当たりのロット(0.1)、Lot
・レンジ相場と見た場合の中心値段
・それぞれのトラップ間の間隔(100ポイント)trapwidth_in_point
・トラップの本数またはトラップを置く最大幅(レンジ)。これを超えるとロスカットになる。
と思いますが、指定できるのは、ロットとトラップ幅だけのように見えます。
他のパラメータがどうなるかよくわかりません。
もしかすると、
中心値段は開始時点の値段
トラップを置く最大幅は、最小ロット0.01でLot(0.1)で可能な幅。この場合の本数は片側10本で最大幅は1000ポイントとなるのでしょうか。
実際AUDJPYでxmのデモ口座でバックテストを実行しますと、取引数は0となり、何もトレードされないです。
期間は2020年から現在まで。バー数は5176です。
ちなみにデモ口座で実行(EAをチャートにドラッグ。アルゴリズム取引をオン)しても、トラップの予約ポジションは実行されないようです。
訂正です
最大幅は1000ポイントとなるのでしょうか。 → 両側で2000ポイント
予約ポジションは実行されないようです。→ 表示されない