ナンピンマーチン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






コメント