ナンピンマーチンEA
ナンピンマーチンEAというのは、ナンピンとはポジションを増やしていく方法です。
漢字で書くと「難平」です。これは、難を平らにならすという意味で、転じて愚か者との意味合いもあります。
マーチンゲールというのはカジノでよく使われる手法で、負けたら倍々に掛け金を増やしていく手法です。
ナンピンとマーチンゲールを組み合わせたナンピンマーチンというEAの種類があります。
今回はEAを作成したいと思います。
- 移動平均線のゴールデンクロスとデッドクロス
- ナンピンマーチンでポジションを取る
メタエディタ(MetaEditor)を立ち上げる
メタエディタ(MetaEditor)を立ち上げましょう。今回は名前を「Nampin-Martingale-EA」で作成します。
パラメーターを記述する
パラメーターを記述しましょう。
OnTick()関数を記述する
allCloseの記述
コンパイル
ソースコード全体
Nampin-Martingale-EAのソースコード全体は以下に記載しています。
//+------------------------------------------------------------------+ //| Nampin-Martingale-EA.mq4 | //| Copyright 2020, FX-EA System Project Creator | //| https://creator.fx-ea-system-project.com/ | //+------------------------------------------------------------------+ #property copyright "Copyright 2020, FX-EA System Project Creator" #property link "https://creator.fx-ea-system-project.com/" #property version "1.00" #property strict input double lots = 0.01;//ロット input double slippage = 3;//スリッページ input int Fast_MA = 5;//短期移動平均線 input int Slow_MA = 15;//長期移動平均線 input double nampin = 5;//ナンピン幅 input int maxnampin = 5;//最大ナンピン数 input int MagicNumber = 12345; //マジックナンバー static int TicketNumber;//チケットナンバー //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- int cnt; int CurrentPosition;//ポジション数 double profit;//損益 CurrentPosition=-1;//ポジション数ゼロ for(cnt=0;cnt<OrdersTotal();cnt++) { if(OrderSelect(cnt,SELECT_BY_POS)==false)continue; if(OrderMagicNumber()!=MagicNumber)continue; profit=profit+OrderProfit();//損益 if(OrderMagicNumber()==MagicNumber)CurrentPosition=cnt; } if(CurrentPosition==-1)//ポジションを持っていない場合 { double kako_Fast,kako_Slow;//過去のMA double gen_Fast,gen_Slow;//現在のMA kako_Fast=iMA(NULL,0,Fast_MA,0,MODE_SMA,PRICE_CLOSE,1);//過去の短期MA kako_Slow=iMA(NULL,0,Slow_MA,0,MODE_SMA,PRICE_CLOSE,1);//過去の長期MA gen_Fast=iMA(NULL,0,Fast_MA,0,MODE_SMA,PRICE_CLOSE,0);//現在の短期MA gen_Slow=iMA(NULL,0,Slow_MA,0,MODE_SMA,PRICE_CLOSE,0);//現在の長期MA //ゴールデンクロス時 if(kako_Fast < kako_Slow && gen_Fast >= gen_Slow) { TicketNumber=OrderSend(Symbol(),OP_BUY,lots,Ask,slippage,0,0,"buy",MagicNumber,0,Red); } //デッドクロス時 if(kako_Fast > kako_Slow && gen_Fast <= gen_Slow) { TicketNumber=OrderSend(Symbol(),OP_SELL,lots,Bid,slippage,0,0,"sell",MagicNumber,0,Blue); } } else//複数ポジションを持っている場合 { OrderSelect(CurrentPosition,SELECT_BY_POS); if(OrderSymbol()==Symbol()) { if(OrderType()==OP_BUY) { if(OrdersTotal()<(maxnampin+1)&&Close[0]<(OrderOpenPrice()-nampin*Point)) { TicketNumber=OrderSend(Symbol(),OP_BUY,OrderLots()*2,Ask,slippage,0,0,"buy2",MagicNumber,0,Blue); } if(profit>10) { allClose(Green);//すべてロングポジションを決済 } } if(OrderType()==OP_SELL) { if(OrdersTotal()<(maxnampin+1)&&Close[0]>(OrderOpenPrice()+nampin*Point)) { TicketNumber=OrderSend(Symbol(),OP_SELL,OrderLots()*2,Bid,slippage,0,0,"sell2",MagicNumber,0,Red); } if(profit>10) { allClose(Yellow);//すべてショートポジションを決済 } } } } } //+------------------------------------------------------------------+ //すべて決済する関数 void allClose(color clr) { int i; for(i=OrdersTotal()-1;i>=0;i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) continue; if(OrderSymbol()!=Symbol()||OrderMagicNumber()!=MagicNumber) continue; if(OrderType()==OP_BUY) OrderClose(OrderTicket(),OrderLots(),Bid,NormalizeDouble(slippage,0),clr); if(OrderType()==OP_SELL) OrderClose(OrderTicket(),OrderLots(),Ask,NormalizeDouble(slippage,0),clr); } }
Copy
コメント