見出し画像

FX自動売買EA mt4ソースコードあり:移動平均線ゴールデンクロス時に買いエントリー

プログラムの機能概要

EAupdate-00005


MT4で稼働する「2つの移動平均線ゴールデンクロス時に買いエントリーEA(売買プログラム)」を行うEAのソースコードを販売します。
短期移動平均線が長期移動平均線を下から上にクロスした際に買い注文を行うプログラムです。(順張りです。買いのみです。)

ポジション決済は利確、損切ともにあらかじめ指定した固定Pipsに達成した場合に決済オーダーとなります。


ロジック詳細

【具体的な機能例、想定動作】
プログラムの動作
短期移動平均線が長期移動平均線の下から上へクロス→買い注文を行います。
ほか、固定pipsでの利確・損切(ポジション解消・決済処理)のオーダーを行います。


★以下の設定値はわかりやすくパラメータ化★
・短期移動平均線
→移動平均線期間を設定(1~199)※長期移動平均線より小さい数値であること

・長期移動平均線
→移動平均線期間を設定(2~200)※短期移動平均線より大きい数値であること

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

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

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

【ご購入前に確認いただきたい事】
・商品の性質上、ご購入後のご返品・ご返金は対応致しかねます。

・正しくEAが動作するかの視点での問い合わせに対する確認、対応のみを行います
 恐れ入りますが、機能追加や、設定値の有効性や指定通貨、MT4、取引所、PC環境に対する問い合わせなど、本ソース範囲以外の一切の対応は致しかねます。

ソースコード

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

//+---------------------------------------------------------------------+
//
//	 KOUSHIROU 
//	 「2つの移動平均線ゴールデンクロス時に買いEA(売買プログラム)」
//	 For MQL4
//
//+---------------------------------------------------------------------+

//+---------------------------------------------------------------------+
//				パラメーター設定★の箇所を変更してみましょう(★がないところは基本的に変更しないことを推奨)
//+---------------------------------------------------------------------+

input string C0="---- Base Setting ----";
input int MAGIC = 20120414;
input int Slippage=3;


//取引ロット関連
input int MaxPosition=1;
input double BaseLots=1.00;//★トレードロット数
input int takeprofit=62;//★利確pips 1H
input int stoploss=29;//★損切pips 1H

//その他項目 
double Lots;

input string C1="移動平均線ゴールデンクロス(順張り)買いのみ";
int TimeScale1 = 0;
int Entry1 = 1;//1_直近確定の足、2_二本前、3_三本前  
input int MaType1 = 0; //平均線種類
input int MA1_1 = 47; //★短期移動平均線期間
input int MA1_2 = 54; //★長期移動平均線期間
input int PriceType1 = 0; //価格タイプ

//インジケーター矢印の幅
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);
				 }
			 }
		 }
	 }
}

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

//1-1 シグナル|シグナル|移動平均線クロス(順張り)
int Indicator1_1(int i,int TimeScale,int LineType,int MaPer1,int MaPer2, int PType)
{
	 double Ma1=iMA(NULL,TimeScale,MaPer1,0,LineType,PType,i);
	 double Ma2=iMA(NULL,TimeScale,MaPer2,0,LineType,PType,i);
	 double Ma1_1=iMA(NULL,TimeScale,MaPer1,0,LineType,PType,i+1);
	 double Ma2_1=iMA(NULL,TimeScale,MaPer2,0,LineType,PType,i+1);
	 
	 int ret=0;
	 if (Ma1>Ma2 && Ma1_1<Ma2_1)
	 {
		 ret=1;
	 }
	 else if(Ma1<Ma2 && Ma1_1>Ma2_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();
	 
	 //クローズ判定
	 //買いのクローズロジックは選択されていません
	 //売りのクローズロジックは選択されていません

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

	 //オープン処理
	 if(EntryBuy!=0)
	 {
		 OpenOrder(1);
	 }
	 if(EntrySell!=0) 
	 {
		 OpenOrder(-1);
	 }
}

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