くるくるワイドという手法の一部機能をEA化したものがついに誕生したようです。
機能としては簡易的なくるくるワイドとなっているようです。完全にくるくるワイドを再現しているわけではなようですが、すべて自動的にポジションを持ってくれるので、本家のくるくるワイドの考え方が難しくて理解できない方や、裁量トレードの部分がめんどくさい方にはオススメです。
そのEAがkmTraderLite_AUDJPY という名前のEAです。
バックテスト
バックテストはくるくるワイドっぽく途中で大きな含み損を抱え、仕切り直しや出口と思われる資産曲線を描いていることがわかります。

内容
機能の一部にくるくるワイド、グリッドトレードなどの考え方を使っているようなので想定内のレンジで注文をひたすら繰り返していくタイプのEAのようです。
ほとんど損切をしないEAなのでロスカットされない限りは勝ち続けることができます。逆に言うと損切しないので含み損を抱え続けることになり、口座の出金もしづらくなります。長期的に含み損に耐えながら運用していく長期投資スタイルのEAのようです。
くるくるワイドしたいけどできなかった人、めんどくさがってた人は今回紹介した自動で簡易的に運用できるkmTraderLite_AUDJPYを検討してみてはいかがでしょうか。
今回紹介したEAはこちら↓
kmTraderLite_AUDJPY
くるくるワイドEAが自作できないか考える
今回紹介したEAを動かすのもいいのですが、くるくるワイドを行うにあたり、基本的なことは機械的にトレードが行えるであろうということと、ポジションを持ったりするのが手間なのでEA化してしまおうと考えました。
主な機能としては
- 本体ポジションを建てる
- トラップを貼る
- トラップトレードの利益で攻撃的複利、現実的複利、非現実的複利を建てる
- ヘッジトレードする
- ヘッジトレードの利益で固定ポジションを建てる
- 下落時に本体の出口とトラップの幅を修正する
下記に本体ロングで行うくるくるワイドのソースを記載します。
外部パラメータ
以下の外部パラメータを用意する必要があります。
extern bool HONTAI_UMU = true; //本体を建てるかどうか、パラメータ修正時はfalseにすること extern double HONTAILOTS = 0.1; //本体ロングロット数 extern double HONTAI_TP = 122; //本体TP extern bool SAIKIDOU = false; //再起動時true extern int MAGIC_TRAP = 222; //トラップマジックナンバー extern int MAGIC_HONTAI = 333; //本体マジックナンバー extern int MAGIC_HEDGE = 444; //ヘッジマジックナンバー extern int MAGIC_COMP = 555; //複利マジックナンバー extern int MAGIC_FIX = 666; //固定マジックナンバー extern double COMP1FUND = 0; //攻撃的複利資金 extern double COMP1RATE = 110; //攻撃的複利レート extern double COMP2FUND = 0; //現実的複利資金 extern double COMP2RATE = 120; //現実的複利複利レート extern double COMP3FUND = 0; //非現実的複利資金 extern double COMP3RATE = 130; //非現実的複利レート extern double FIXFUND = 0; //固定ポジション資金 extern bool HEDGEALLOWFLG = true; //ヘッジトレード許可フラグ extern bool HEDGEBOOST = false; //ヘッジブーストフラグ(ヘッジ資金があれば即ヘッジポジションを持つ)
本体ポジションを建てる
init()関数内に本体を建てるコードを記述しています。本体の注文価格はEAを稼働した瞬間の現在の価格にしています。本体は外部変数によって建てるか建てないかを判定しています。EA再起動時は外部変数によって本体を建てないようにすることが必要になります。
int init(){ if(HONTAI_UMU){ // 本体を建てるかどうか HONTAI_RATE = Bid; int ticket = OrderSend(Symbol(),OP_BUY,HONTAILOTS,HONTAI_RATE,SLIPPAGE,0,HONTAI_TP,"本体",MAGIC_HONTAI,0,Blue); } }
トラップを貼る
トラップを貼る部分のコードは魚屋さんのブログにあるとおりのコードを使用することにします。
トラップトレードの利益で攻撃的複利、現実的複利、非現実的複利を建てる
複利の目安よりレートが10pips上にあるときに複利資金から建てられる複利枚数を計算し、複利を建てます。
//攻撃的複利 //複利目安よりも10pipレートが上の場合かつ複利資金がある場合 if(Ask > COMP1RATE + 0.1 && COMP1FUND > 0 && COMPALLOWFLG){ // 複利ロットを求める double Comp1Lots = NormalizeDouble((COMP1FUND / (Ask - COMP1RATE)) / 100000,SisyaGonyuuTani); // 複利ロットが1000枚以上の場合 if(Comp1Lots >= lowestLots){ // トラップ下限よりレートが下の場合 if(Ask < URITOP){ int ticket = OrderSend(Symbol(),OP_BUY,Comp1Lots,Ask,SLIPPAGE,COMP1RATE,URITOP,"複利1",MAGIC_COMP,0,Blue); COMP1FUND -= Comp1Lots * (Ask - COMP1RATE) * 100000; } } } // 現実的複利 // 複利目安よりも10pipレートが下の場合かつ複利資金がある場合 if(Bid < COMP2RATE - 0.1 && COMP2FUND > 0){ // 複利ロットを求める double Comp2Lots = NormalizeDouble((COMP2FUND / (COMP2RATE - Bid)) / 100000,SisyaGonyuuTani); // 複利ロットが1000枚以上の場合 if(Comp2Lots >= lowestLots){ // トラップ下限よりレートが上の場合 if(Bid > KAIBOTTOM){ int ticket = OrderSend(Symbol(),OP_SELL,Comp2Lots,Bid,SLIPPAGE,COMP2RATE,KAIBOTTOM,"複利2",MAGIC_COMP,0,Blue); COMP2FUND -= Comp2Lots * (Ask - COMP2RATE) * 100000; } } } // 非現実的複利 // 複利目安よりも10pipレートが下の場合かつ複利資金がある場合 if(Bid < COMP3RATE - 0.1 && COMP3FUND > 0){ // 複利ロットを求める double Comp3Lots = NormalizeDouble((COMP3FUND / (COMP3RATE - Bid)) / 100000,2); // 複利ロットが1000枚以上の場合 if(Comp3Lots >= lowestLots){ // トラップ下限よりレートが上の場合 if(Bid < KAIBOTTOM){ int ticket = OrderSend(Symbol(),OP_SELL,Comp3Lots,Bid,SLIPPAGE,COMP3RATE,KAIBOTTOM,"複利3",MAGIC_COMP,0,Blue); COMP3FUND -= Comp3Lots * (Ask - COMP3RATE) * 100000; } } }
ヘッジトレードする
ヘッジポジションを持っていない時に、ヘッジトレードできるポジションを計算し、ヘッジポジションを建てます。
ヘッジポジションを建てる条件は適当にボリバンアップバンドの1σに達したらとしています。
//ヘッジポジションをもっているかチェック for(int i = 0; i < OrdersTotal(); i++){ if(OrderSelect(i, SELECT_BY_POS) == true){ if(OrderMagicNumber() == MAGIC_HONTAI){ HEDGEFLG = false; for(int j = 0; j < OrdersTotal(); j++){ if(OrderSelect(j, SELECT_BY_POS) == true){ if(OrderMagicNumber() == MAGIC_HEDGE){ HEDGEFLG = true; break; } } } if(HEDGEFLG){ break; } } } } //ヘッジポジションを立てていない場合 double Boli2Up1 = iBands(NULL,0,21,2,0,PRICE_CLOSE,MODE_UPPER,1); if(!HEDGEFLG){ //(出口時の本体益-出口時のトラップ損)÷(出口のレート-現レート) if(URITOP - 0.1 > Bid){ hedgeposition = NormalizeDouble(((URITOP * HONTAILOTS - HONTAI_RATE * HONTAILOTS) - (URITOP * HONTAILOTS - HONTAI_RATE * HONTAILOTS)/2)/(URITOP - Ask),2); //ヘッジポジションが持てる場合 if(hedgeposition > lowestLots){ if(HEDGEBOOST){ HEDGETP = Bid - 0.1; HEDGEFLG = true; int ticket = OrderSend(Symbol(),OP_SELL,hedgeposition,Bid,SLIPPAGE,URITOP,HEDGETP,"ヘッジ",MAGIC_HEDGE,0,Green); } else{ if((High[1] >= Boli2Up1)){ HEDGETP = Bid - 0.1; HEDGEFLG = true; int ticket = OrderSend(Symbol(),OP_SELL,hedgeposition,Bid,SLIPPAGE,URITOP,HEDGETP,"ヘッジ",MAGIC_HEDGE,0,Green); } } } } }
ヘッジトレードの利益で固定ポジションを建てる
固定ポジションが本体枚数以下ならヘッジトレードで得た利益をもとに固定ポジションを建てます。
//固定ポジション数を調べる FIXPOSITION = 0; for(int i = 0; i < OrdersTotal(); i++){ //インデックスを使用して注文を選択する if(OrderSelect(i, SELECT_BY_POS) == true){ if(OrderMagicNumber() == MAGIC_HONTAI){ for(int j = 0; j < OrdersTotal(); j++){ if(OrderSelect(j, SELECT_BY_POS) == true){ if(OrderMagicNumber() == MAGIC_FIX){ FIXPOSITION += OrderLots(); } } } } } } //固定ポジションを建てる if(FIXPOSITION/100000 <= HONTAILOTS && FIXFUND > 0 && HONTAI_RATE + (HONTAI_TP - HONTAI_RATE)/2 - 0.1 > Bid && KOTEIALLOWFLG){ double FixLots = NormalizeDouble((FIXFUND / (HONTAI_RATE + (HONTAI_TP - HONTAI_RATE)/2 - Bid)) / 100000,SisyaGonyuuTani); if(FixLots >= lowestLots){ int ticket = OrderSend(Symbol(),OP_SELL,FixLots,Ask,SLIPPAGE,HONTAI_RATE + (HONTAI_TP - HONTAI_RATE)/2,0,"固定ポジション",MAGIC_FIX,0,Yellow); FIXFUND -= FixLots * (HONTAI_RATE + (HONTAI_TP - HONTAI_RATE)/2 - Bid) * 100000; } }
結論
実際にEAを稼働させてみた結果、おかしな動作をしたりまだまだ未完成な部分がありました。また小回りが利かないので、本気でやるなら結局手動が一番であるということに気づきました。
もしEAを稼働させたいならば kmTraderLite_AUDJPY をオススメします。