本記事ではポジションの分割エントリー(ナンピン)のソースコードをご紹介。
マーチンゲール法の実装方法も合わせて解説します。
その他の開発用ソースコードは以下でまとめています。
-
EA開発で使える拡張ソースコードまとめ【MT4でFX自動売買】
続きを見る
Q.自動売買でナンピンをするには?
できれば後のポジションほどロット数が大きくなるようにしたいです。
恐らくポジション情報の取得が必要だと思いますがどうでしょうか。
・ナンピンとは?
保有ポジションに対し相場が逆行した際に買い増しで平均単価を下げる手法です。
例えば108円でドル円の買いポジを取った後、107円まで逆行したとします。
同じ数のポジションを新たにとれば平均は107.5円です。
ナンピン買いは有効な手法ですが、一方で損失を広げる諸刃の剣です。
初心者の退場理由の多くがナンピンによる「コツコツドカン」です。
A.ロジックを複数に分けて考える
ですが、希望のロジックを実現するには少々工夫が必要になります。
具体的には以下のように機能を分割して考える必要があります。
・保有ポジション価格を取得し現在値と比較するロジックを作成
・保有ポジション数をカウントしロット数に反映するロジックを作成
・上記を組み合わせてナンピン買いロジックを作成
・保有ポジション情報の取得
ポジション情報の取得は下記のOrderSelect関数を使います。
他のロジックを作る際にもよく使うので覚えておきましょう。
OrderSelect(①,②,③);
①インデックス番号を指定。先に取ったポジションから1,2,3と増えていきます。
②タイプを指定。①でチケット番号をしたい場合はここで指定。
③取得したい情報を指定。今回はポジション価格、売買方向を取得。
・ナンピン買いロジックを公開
OrderSelectで取得した情報を元に売買判断をします。
下記を参考にご自身のコードに組み込んでみてください。
✔ 保有ポジションから価格を取得し現在値と比較するロジック
ソースコードの該当部分を以下に差し替えてください。
マーカの部分が主な変更点です。
command //------------------------------------------------------------------------------------ // 3. position : ポジション管理 //------------------------------------------------------------------------------------ void position(){ //ポジション数取得 int res; int tpoji = 0; int pojilim = 4; int torder = OrdersTotal(); //ポジション数カウント for(int i = torder-1; i >= 0; i--){ res = OrderSelect(i, SELECT_BY_POS, MODE_TRADES); if(OrderSymbol()==rcur&&((OrderType()==0&&result==1)||(OrderType()==1&&result==-1))) tpoji += 1; } //ポジション構築 if(tpoji<pojilim&&result!=0&&goflg) ordersend(); } //------------------------------------------------------------------------------------ // 4. ordersend : ポジション構築 //------------------------------------------------------------------------------------ void ordersend(){ int res = 0; double BID = MarketInfo(rcur,MODE_BID); double ASK = MarketInfo(rcur,MODE_ASK); double PIP = MarketInfo(rcur,MODE_SPREAD); double lots = 10; double HI = 0; double LOW = 0; bool noflg = true; //選択通貨ポジション数取得 int torder = OrdersTotal(); for(int i = torder-1; i >= 0; i--){ res = OrderSelect(i, SELECT_BY_POS, MODE_TRADES); if(OrderSymbol()==rcur&&((OrderType()==0&&result==1)||(OrderType()==1&&result==-1))) if(OrderType()==1&&result==-1){ if(OrderOpenPrice()>=HI||HI==0) HI=OrderOpenPrice(); } if(OrderType()==0&&result==1){ if(OrderOpenPrice()<=LOW||LOW==0) LOW=OrderOpenPrice(); } } if(result==-1&&HI!=0){ if(HI+0.05>=ASK) noflg = false; } if(result==1&&LOW!=0){ if(LOW-0.05<=BID) noflg = false; } //売り指示 if(result==-1&&PIP<=100&&noflg){ res = OrderSend(rcur,OP_SELL,0.01*lots,BID,100,ASK+0.2,ASK-0.4,"Short",MAGICMA,0,clrRed); Sleep(3000); } //買い指示 else if(result==1&&PIP<=100&&noflg){ res = OrderSend(rcur,OP_BUY,0.01*lots,ASK,100,BID-0.2,BID+0.4,"Long",MAGICMA,0,clrRed); Sleep(3000); } }
保有ポジションのエントリー価格を取得して現在値と比較します。
サンプルコードは 5pips 逆行するごとに売買命令をするよう設定しています。
今回はポジションを4つに分けて取るようにしています。
✔ ポジション数をカウントしロット数に反映するロジック
こちらで公開しているコードの該当部分を以下に差し替えてください。
マーカの部分が主な変更点です。
command //------------------------------------------------------------------------------------ // 3. position : ポジション管理 //------------------------------------------------------------------------------------ void position(){ //ポジション数取得 int res; int tpoji = 0; int pojilim = 4; int torder = OrdersTotal(); //ポジション数カウント for(int i = torder-1; i >= 0; i--){ res = OrderSelect(i, SELECT_BY_POS, MODE_TRADES); if(OrderSymbol()==rcur&&((OrderType()==0&&result==1)||(OrderType()==1&&result==-1))) tpoji += 1; } //ポジション構築 if(tpoji<pojilim&&result!=0&&goflg) ordersend(); } //------------------------------------------------------------------------------------ // 4. ordersend : ポジション構築 //------------------------------------------------------------------------------------ void ordersend(){ int res = 0; double BID = MarketInfo(rcur,MODE_BID); double ASK = MarketInfo(rcur,MODE_ASK); double PIP = MarketInfo(rcur,MODE_SPREAD); double lots; int tpoji = 0; int torder = OrdersTotal(); for(int i = torder-1; i == 0; i--){ if(OrderSymbol()==rcur&&((OrderType()==0&&result==1)||(OrderType()==1&&result==-1))) tpoji += 1; } lots = MathFloor(5*(1+tpoji)); //売り指示 if(result==-1&&PIP<=100){ res = OrderSend(rcur,OP_SELL,0.01*lots,BID,100,ASK+0.2,ASK-0.4,"Short",MAGICMA,0,clrRed); Sleep(3000); } //買い指示 else if(result==1&&PIP<=100){ res = OrderSend(rcur,OP_BUY,0.01*lots,ASK,100,BID-0.2,BID+0.4,"Long",MAGICMA,0,clrRed); Sleep(3000); } }
保有ポジションが1つ増えるごとにロット数を 2倍、3倍と増やしていきます。
✔ 上記の組み合わせで実現できるロジック
具体的には以下のようなロジックを作ることが可能です。
・打診買いの際にはロット数を低めにしておく
・まずはポジションを大きくとって、あとで平均単価を合わせる
実際に実装した画面が以下になります。
1ペア目から5pips刻みで、ポジションが増えています。
売買のタイミングやスプレッドで多少ずれますが、許容範囲かと思います。
個人的におすすめしませんが…
EA開発に役立つサービス
下記参考情報です。
筆者が過去に使ったことがあるものを紹介しています。
・自動売買に適した証券会社
MT4自体は同じですが取引時の約定率やスプレッドに差があります。
軽視されがちですがEAの成績に直結する部分です。
適当に選ぶと後で口座開設をやり直す必要が出てきます。
自動売買と相性の良い証券会社
迷うなら筆者がメインで使っているFXTFがおすすめ。
その他の証券会社については以下で特徴をまとめています。
-
MT4でFX自動売買できる国内証券会社おすすめ。EA開発者が徹底比較
続きを見る
・自動売買と相性の良いVPS
実際に自動売買する際はMT4を24時間起動する必要があります。
月2000円ほどで使えるVPS(仮想PCサービス)がおすすめ。
筆者は『お名前.com』を2年以上継続利用しています。
以下の記事で主要なVPS業者を比較しています。
-
【MT4/MT5】FX自動売買用VPSの比較!EA開発者がおすすめを紹介
続きを見る
・その他おすすめサービス
EA開発を進める上でおすすめの書籍やサービスを紹介します。
価格帯別に紹介しているので、お財布と相談で。
✔ FXメタトレーダー入門【2千円】
EA開発者を目指すなら以下のシリーズは押さえておきたいです。
筆者は書籍版を持っていますが、半額の電子版がおすすめ。
✔ EAつくーる【月3千円】
プログラミング初心者におすすめしたいのがEAつくーるです。
これを使えばノーコード(プログラミング無し)でEA開発が可能。
お試しなら1ヶ月版(2980円)で十分です。
やる気があれば初めから1年版(29800円)がおすすめ。
これがあれば学習期間含め100時間くらい短縮できます。
以下の記事で詳しく説明しています。
-
【MT4/MT5】EAつくーるとは?プログラミング無しでオリジナルEA開発
続きを見る
✔ EA開発セミナー【4万円】
講師の支援を受けながらEA開発を学ぶプログラミングセミナーです。
3講座ありますが、個人的には実践講座or裏講座がおすすめ。
まとめ
複雑なロジックはいくつかの機能に分けて考えましょう。
実現したいロジックがあった場合、まずは必要な機能を書き出します。
コピペでEAを作る場合もソースコードを探すのが容易になります。
また、それをサブ関数化することで後の開発に使いまわすことが可能です。
その他のロジックについて知りたい方は以下の記事を参照下さい。
-
EA開発で使える拡張ソースコードまとめ【MT4でFX自動売買】
続きを見る
以上、参考になれば幸いです。