見出し画像

FX自動売買EA mt4ソースコードあり:MACDとのシグナル線クロスで順張り買いエントリー


プログラムの機能概要

EAupdate-00007
MACDとシグナル線(MACDの指数平滑移動平均線)のゴールデンクロス時に買い注文を行うプログラムです。(順張りです。)
ほか、指定のpips値での損切、利確を行います。

ロジック詳細

MACDは「MACD=短期EMA-長期EMA」で計算されます。
このMACDとシグナル線(MACDの指数平滑移動平均線)がクロスした場合に買いオーダー(順張り)を行います。


ほか、固定pipsでの利確・損切(ポジション解消・決済処理)のオーダーを行います。

★以下の設定は簡単に変更できるようパラメータ化してあります★

・短期EMA 指数平滑移動平均線(1~100)
・長期EMA 指数平滑移動平均線(1~100)
・シグナル線(MACDのEMA)(1~100)
短期、長期、シグナル線はいずれも違う期間指定が必要です。(同じ値NG)

・利益注文時のpips(1~100)最小単位は1です。(少数点以下の設定不可)
・損切注文時のpips(1~100)最小単位は1です。(少数点以下の設定不可)

・ロット数:0.01~1.00の間で指定ください。0.01刻みです(小数点以下2桁まで指定)。
・許容スリッページ:3~10pipsの間で指定下さい。1刻みです。(整数で指定)

【ロジックご参考】
・対象通貨ペア、時間足はEAが設定されたチャートに依存します。(
・価格は終値で判定します
・決められた条件に達した際に1度だけ注文を出します。
・最大ポジション数は「1」固定です。
・「プログラム動作」に記載以外の動作は含まれておりません。証拠金・取引可能時間の確認やスプレッドの考慮、注文取消し、不成立時再注文、他は行っておりません。


【ご注意いただきたい事】
・作成したEAについて利益を保証するものではありません。

・FXの主要通貨ペアを想定しています。それ以外のCFDや先物、指数やコモディティの稼働は考慮しておりません。

ソースコード

mt4向けmqlでの作成ソースコードです。

//+---------------------------------------------------------------------+
//
//MACDとのシグナル線クロスで順張り買いエントリー
//
//  code by KOUSHIROU
//  https://note.com/mt4_coder                 
//+------------------------------------------------------------------+
//+---------------------------------------------------------------------+
//	パラメーター設定  ★の部分は自由にパラメータ変更可能です。
//+---------------------------------------------------------------------+

input int MAGIC = 20120414;
input int Slippage=3;//★許容スリッページ
input int MaxSpread=10;//★スプレッド最大値(スプレッドが開きすぎるときはオーダーしない)


//取引ロット関連
input int MaxPosition=1;
input double BaseLots=0.01;//★ロット数
input int takeprofit=100;//★利確pips
input int stoploss=100;//★損切pips

//その他項目 
double Lots;

input string C1="MACDクロス";
int TimeScale1 = 0;
int Entry1 = 1;//1_直近確定の足、2_二本前、3_三本前  
input int MACD1_fast = 2; //★短期EMA 指数平滑移動平均線
input int MACD1_slow = 3; //★長期EMA 指数平滑移動平均線
input int MACD1_sig = 1; //★シグナル

//インジケーター矢印の幅
input int AllowNarrow=10; 

//+---------------------------------------------------------------------+
//	一般関数
//+---------------------------------------------------------------------+

double AdjustPoint(string Currency)//ポイント調整
{
	 int Symbol_Digits=(int)MarketInfo(Currency,MODE_DIGITS);
	 double Calculated_Point=0;
	 if (Symbol_Digits==2 || Symbol_Digits==3)
	 {
		 Calculated_Point=0.01;
	 }
	 else if (Symbol_Digits==4 || Symbol_Digits==5)
	 {
		 Calculated_Point=0.0001;
	 }
	 else if (Symbol_Digits==1)
	 {
		 Calculated_Point=0.1;
	 }
	 else if (Symbol_Digits==0)
	 {
		 Calculated_Point=1;
	 }
	 return(Calculated_Point);
}

int AdjustSlippage(string Currency,int Slippage_pips )//スリッページ調整
{
	 int Calculated_Slippage=0;
	 int Symbol_Digits=(int)MarketInfo(Currency,MODE_DIGITS);
	 if (Symbol_Digits==2 || Symbol_Digits==3)
	 {
		 Calculated_Slippage=Slippage_pips;
	 }
	 else if (Symbol_Digits==4 || Symbol_Digits==5)
	 {
		 Calculated_Slippage=Slippage_pips*10;
	 }
	 return(Calculated_Slippage); 
}

int LongPosition()//ロングポジション数を取得
{
	 int buys=0;
	 for(int i=0;i<OrdersTotal();i++)
	 {
		 if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true && OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC)
		 {
			 if(OrderType()==OP_BUY)  buys++;
		 }
	 }
	 return(buys);
}

int ShortPosition()//ショートポジション数を取得
{
	 int sells=0;
	 for(int i=0;i<OrdersTotal();i++)
	 {
		 if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true && OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC)
		 {
			 if(OrderType()==OP_SELL) sells++;
		 }
	 }
	 return(sells);
}

//+---------------------------------------------------------------------+
//	エントリ関連関数
//+---------------------------------------------------------------------+

//ポジションエントリ関数
void OpenOrder(int EntryPosition)
{
	 int res;
	 bool Modified;
	 double SL;
	 double TP;
	 int SLP=AdjustSlippage(Symbol(),Slippage );
	 
	 //ロットサイズ調整
	 Lots=BaseLots;//固定ロット
	 
	 if( EntryPosition == 1 ) //買いの場合のエントリ条件
	 {
		 res=OrderSend(Symbol(),OP_BUY,Lots ,Ask,SLP,0,0,"EAupdate",MAGIC,0,Red);
		 if (OrderSelect(res,SELECT_BY_TICKET)==true)
		 {
			 if (stoploss!=0) SL=OrderOpenPrice()-stoploss*AdjustPoint(Symbol());
			 if (takeprofit!=0) TP=OrderOpenPrice()+takeprofit*AdjustPoint(Symbol());
		 }
		 if(SL!=0 || TP!=0) Modified=OrderModify(OrderTicket(),OrderOpenPrice(),SL,TP,0,Red);
	 }
	 else if(EntryPosition == -1 ) //---- 売りエントリ
	 {
		 res=OrderSend(Symbol(),OP_SELL,Lots,Bid,SLP,0,0,"EAupdate",MAGIC,0,White);
		 if(OrderSelect(res,SELECT_BY_TICKET)==true)
		 {
			 if(stoploss!=0) SL=OrderOpenPrice()+stoploss*AdjustPoint(Symbol());
			 if(takeprofit!=0) TP=OrderOpenPrice()-takeprofit*AdjustPoint(Symbol());
		 }
		 if(SL!=0 || TP!=0) Modified=OrderModify(OrderTicket(),OrderOpenPrice(),SL,TP,0,White);
	 }
	 return;
}

//+---------------------------------------------------------------------+
//	エグジット関連関数
//+---------------------------------------------------------------------+

//ポジションクローズ関数
void CloseOrder(int ClosePosition)
{
	 for(int i=OrdersTotal()-1;i>=0;i--)
	 {
		 int res;
		 if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
		 {
			 if(OrderMagicNumber()==MAGIC && OrderSymbol()==Symbol())
			 {
				 if(OrderType()==OP_SELL && (ClosePosition==-1 || ClosePosition==0 )) //売りポジションのクローズ
				 {
					 res=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),10,Silver);
				 }
				 else if(OrderType()==OP_BUY && (ClosePosition==1 || ClosePosition==0 ) ) //買いポジションのクローズ
				 {
					 res=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),10,Silver);
				 }
			 }
		 }
	 }
}

//+---------------------------------------------------------------------+
//	インジケーター
//+---------------------------------------------------------------------+

//2-1 シグナル|MACDとSignal線のクロス(順張り)
int Indicator2_1(int i,int TimeScale,int MACDfast,int MACDslow,int MACDsig)
{
	 double Main=iMACD(NULL,TimeScale,MACDfast,MACDslow,MACDsig,0,0,i);
	 double Sig= iMACD(NULL,TimeScale,MACDfast,MACDslow,MACDsig,0,1,i);
	 double Main_1=iMACD(NULL,TimeScale,MACDfast,MACDslow,MACDsig,0,0,i+1);
	 double Sig_1= iMACD(NULL,TimeScale,MACDfast,MACDslow,MACDsig,0,1,i+1);

	 int ret=0;
	 if (Main>Sig && Main_1<Sig_1)
	 {
		 ret=1;
	 }
	 else if(Main<Sig && Main_1>Sig_1)
	 {
		 ret=-1;
	 }
	 return(ret);
}

//+---------------------------------------------------------------------+
//			ティック毎の処理
//+---------------------------------------------------------------------+
void start()
{

	 
	 // ニューバーの発生直後以外は取引しない
	 static datetime bartime=Time[0]; 
	 if (Time[0]==bartime) return; 
	 bartime=Time[0]; 

	 //各種パラメーター取得
	 int EntryBuy=0;
	 int EntrySell=0;
	 int ExitBuy=0;
	 int ExitSell=0;
	 
	 int LongNum=LongPosition();
	 int ShortNum=ShortPosition();
	 
	 //クローズ判定
	 //買いのクローズロジックなし、固定PIPSのみ
	 //売りのクローズロジックなし、固定PIPSのみ

	 //エントリ基準取得
	 int Strtagy1=Indicator2_1(Entry1,TimeScale1,MACD1_fast,MACD1_slow,MACD1_sig);
	 int TotalNum=ShortNum+LongNum;
	 
	 //エントリ判定
	 if((TotalNum<MaxPosition ) && (Strtagy1==1 ))
	 {
		 EntryBuy=1;
	 }
	 //売りエントリのロジックは選択されていません

	 //オープン処理
	 if( ((Ask-Bid)/AdjustPoint(Symbol())) < MaxSpread )
	 {
		 if(EntryBuy!=0)
		 {
			 OpenOrder(1);
		 }
		 if(EntrySell!=0) 
		 {
			 OpenOrder(-1);
		 }
	 }
}

以上、どうぞよろしくお願いいたします。

この記事が気に入ったらサポートをしてみませんか?