【FX完全自動売買シリーズ】MT4 EA無料ダウンロード&ロジック完全公開 ユーロドル15分足 141401_EURUSD_M15_cUP_B



EA無料ダウンロード

永遠に放置できるわけではありません

裁量トレードほどには儲かりませんが、使い方によっては完全放置で利益が出ます

ですが、定期的なメンテナンス(パラメータ調整)はどうしても必要です。

「完全放置じゃないじゃん(゚Д゚)!」と言うツッコミありがとうございます。

【期間限定で完全放置】と言うことで勘弁してください。


投資は自己責任で

ご利用前に必ずご自身でデバッグ&バックテストしてください

公開しておいてなんですが、ロジックを参考にする程度に留めておくと幸せになれます。
免責や著作権について 免責:著作権は放棄していませんので商用利用不可。改造しての販売・再配布も不可。個人口座でのみ利用可。

また、ご利用されたことによるいかなる事態・結果についても責任は負いかねます。全て自己責任でお願いします。
ご注意:EAや自動売買に過度な期待をされている方、FXの世界に聖杯があると信じている方はこちらの記事も併せてご覧ください。

FXで完全機械化は可能か?

結論から言うと可能です。そんなことは20世紀からやっていることで、いまさら議論することでもないのですが・・・



期間限定のキャンペーンもやってます



コピペしてお持ち帰りください

※スパゲティなのは仕様です。ローカルにコピペでもしてご覧ください。


#define EA_MAGIC_NO		141401
#define D_NONE	0
#define D_BUY	1
#define D_SELL	2
#define D_OFF	0
#define D_ON	1
#define D_SUCCESS 	1
#define D_COUNTING	2
#define D_FAILURE	3
#define D_C_DOWN	1
#define D_C_UP		2
#define D_A_UP		3
#define D_A_DOWN	4
/*****************************************
 * グロバル変数
 *****************************************/
//extern int	EA_temp = 1;
int	EA_OpenRangeHour = 10;
int	EA_range_period=1;
int	EA_entry_end = 16;//終了間近
int	EA_close_hour = 3;
double	EA_aValue=0.09;
double	EA_cValue=0.26;
double EA_stop_rate = 4.05;
int	EA_start_trail = 25;
int	EA_stop_min = 30;//万が一のときのためのもの
int	EA_stop_max = 140;//万が一のときのためのもの
int	EA_posi_size = 0;
int	EA_add_cnt = 12;
int EA_shadow_value = -23;
int	EA_vola_cnt = 25;
double	EA_trail_rate = 0.49;

double aValue=0.0;
double cValue=0.0;
bool OpenRangeInit=D_OFF;

double aUp=0;
double aDown=0;
double cUp=0;
double cDown=0;
double openRangeHigh;
double openRangeLow;

int aUpBefore=D_NONE;
int aDownBefore=D_NONE;
int cUpBefore=D_NONE;
int cDownBefore=D_NONE; 

int aUpBars=0;
int aDownBars=0;
int cUpBars=0;
int cDownBars=0;

bool aUpUse=D_OFF;
bool aDownUse=D_OFF;
bool cUpUse=D_OFF;
bool cDownUse=D_OFF; 
bool aUpFailUse=D_OFF;
bool aDownFailUse=D_OFF; 
double g_stop_loss=0;
int	slippage=3;

int g_TDM=0;
double	EA_Lots = 1;
double	G_Point=0;

int init()
{
	if(Point==0.00001) G_Point=10*Point;
	else
	if(Point==0.0001)  G_Point=1*Point;

	slippage=slippage*G_Point;
	return 0;
}
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void CheckForOpen()
{
	int		lots=0;
	int		ticket=0;
	double	High_pre_1=0,Low_pre_1=0,High_pre_2=0,Low_pre_2=0,open_pre_1=0,close_pre_1=0,close_pre_2=0;
	double	openRangeVal=0;

	if((Ask-Bid)>7*G_Point) return;

	/************************
	 * 注文状況の確認
	 ************************/
	open_pre_1 = iOpen(NULL,PERIOD_D1,1);
	close_pre_1 = iClose(NULL,PERIOD_D1,1);
	High_pre_1 = iHigh(NULL,PERIOD_D1,1);
	Low_pre_1 = iLow(NULL,PERIOD_D1,1);
	close_pre_2 = iClose(NULL,PERIOD_D1,2);
	High_pre_2 = iHigh(NULL,PERIOD_D1,2);
	Low_pre_2 = iLow(NULL,PERIOD_D1,2);

	if((close_pre_1-open_pre_1)>EA_shadow_value*Bid*G_Point)
	{
		displayAlert();

		openRangeVal=(cUp-cDown);
		/****************
 		* エントリー
 		****************/
		//Cアップ
		if(cUpUse==D_OFF && cUpBefore==D_SUCCESS)
		{
			g_stop_loss=cUp-openRangeVal*EA_stop_rate;
			if((Ask-g_stop_loss)>EA_stop_max*Bid*G_Point)
			{
				g_stop_loss=Ask-EA_stop_max*Bid*G_Point;
			}
			else
			if((Ask-g_stop_loss)<EA_stop_min*Bid*G_Point)
			{
				g_stop_loss=Ask-EA_stop_min*Bid*G_Point;
			}

			lots=1+(EA_posi_size*G_Point)/(Bid-g_stop_loss);

			ticket=OrderSend(
				Symbol(),OP_BUY,
				EA_Lots*lots,
				Ask,slippage,0,0,"141401",EA_MAGIC_NO,0,Blue);

			if(ticket<0)
			{
				g_stop_loss=0;
				Print("OrderSendError ",GetLastError());
			}
			//オーダーに成功
			else
			{
				cUpUse=D_ON;
			}
		}
	}
}

void CheckForClose()
{
	int		ii=0,jj=0;				//カウンタ
	int		total=0;			//オーダートータル
	int		order_flag=D_NONE;
	int		bar_count=0;
	double	volatility=0;
	double	stop_loss_new=0;

	total=OrdersTotal();
	if(total<=0) return;

	for(ii=(total-1);ii>=0;ii--)	//注文がある
	{
		order_flag=D_NONE;

		if(OrderSelect(ii,SELECT_BY_POS,MODE_TRADES)!=TRUE)
		{
			Print("OrderSelect ERROR",GetLastError( ));
			return;
		}

		if(OrderSymbol()!=Symbol()) continue;
		if(OrderMagicNumber()!=EA_MAGIC_NO) continue;

		bar_count=iBarShift(NULL,0,OrderOpenTime(),false);

		//stopが設定されていなければ設定する
		if(OrderStopLoss()==0 && g_stop_loss!=0)
		{
			if(OrderModify(OrderTicket(),OrderOpenPrice(),g_stop_loss,0,0,White)!=TRUE)
			{
				Print("OrderModify ERROR ",GetLastError( ));
			}
		}

		if(!(bar_count>1)) continue;

		if(order_flag==D_NONE)
		{
			volatility=High[iHighest(NULL,0,MODE_HIGH,EA_vola_cnt,1)]-Low[iLowest(NULL,0,MODE_LOW,EA_vola_cnt,1)];
			stop_loss_new=Bid-volatility*EA_trail_rate;

			if(Bid-(OrderOpenPrice())>EA_start_trail*Bid*G_Point)
			{
				if(OrderStopLoss()<stop_loss_new && (Bid-stop_loss_new)>10*G_Point)
				{
					if(OrderModify(OrderTicket(),OrderOpenPrice(),stop_loss_new,0,0,White)!=TRUE)
					{
						Print("OrderModify ERROR ",GetLastError( ));
					}
				}
			}
		}

		if(order_flag==D_NONE && OrderProfit()>0)
		{
			if(Hour()==EA_close_hour)
			{
				order_flag=D_BUY;
			}
		}

		if(order_flag==D_BUY)
		{
			if(OrderClose(OrderTicket(),OrderLots(),Bid,10,Blue)!=TRUE)
			{
				Print("OrderClose ERROR",GetLastError( ));
			}
		}
	}
}

void displayAlert()
{
	double highest_val=0;
	double lowest_val=0;
	//本日、C点ピボットを付けた
	if(cDownBefore==D_SUCCESS || cUpBefore==D_SUCCESS)	return(D_NONE);

	/******************************************************
	 * A,Cピボット確認処理
	 ******************************************************/
	//本日、A点ピボットを付けた
	if (aUpBefore==D_SUCCESS || aDownBefore==D_SUCCESS)
	{
		if (aUpBefore==D_SUCCESS && cDown!=0 && Bid<cDown) cDownBefore=D_COUNTING;
		else
		if (aDownBefore==D_SUCCESS && cUp!=0 && Bid>cUp) cUpBefore=D_COUNTING;
	}
	else
	//Aアップを超えた
	if (aUp!=0 && Bid>aUp)
	{
		//Aアップ滞在カウント開始
		if(aDownBefore==D_COUNTING) aDownBefore=D_FAILURE;
		aUpBefore=D_COUNTING;
	}
	else
	if (aDown!=0 && Bid<aDown)
	{
		if(aUpBefore==D_COUNTING) aUpBefore=D_FAILURE;
		aDownBefore=D_COUNTING;
	}

	/******************************************************
	 * カウント処理
	 ******************************************************/
	//Aアップ確定待ち
	if(aUpBefore==D_COUNTING)
	{
		//Aアップに失敗
		if(Bid<aUp) aUpBefore=D_FAILURE;
		else
		{
			aUpBefore=D_SUCCESS;
			aUpBars=Bars;
		}
	}

	if(aDownBefore==D_COUNTING)
	{
		//Aアップに失敗
		if(Bid>aDown) aDownBefore=D_FAILURE;
		else
		{
			aDownBefore=D_SUCCESS;
			aDownBars=Bars;
		}
	}

	if(cUpBefore==D_COUNTING)
	{
		//Cアップに失敗
		if(Bid<cUp) cUpBefore=D_FAILURE;
		else
		{
			cUpBefore=D_SUCCESS;
			cUpBars=Bars;
		}
	}

	if(cDownBefore==D_COUNTING)
	{
		//Cアップに失敗
		if(Bid>cDown) cDownBefore=D_FAILURE;
		else
		{
			cDownBefore=D_SUCCESS;
			cDownBars=Bars;
		}
	}
}

int start()
{
	double	openRangeVal=0;
	int		bar_count=0,OpenRangeEndMinute=0,plus_hour=0;
	int		total=0,ii=0;
	bool	posi_flag=D_OFF,entry_flag=D_OFF;

	if(Bars<100) return;

	total=OrdersTotal();
	for(ii=(total-1);ii>=0;ii--)	//注文がある
	{
		if(OrderSelect(ii,SELECT_BY_POS,MODE_TRADES)!=TRUE)
		{
			Print("OrderSelect ERROR A",GetLastError( ));
			return 0;
		}
		if(OrderSymbol()!=Symbol()) continue;
		if(OrderMagicNumber()!=EA_MAGIC_NO) continue;

		posi_flag=D_ON;
		bar_count=iBarShift(NULL,0,OrderOpenTime(),false);
		if(bar_count<EA_add_cnt) entry_flag=D_ON;
	}

	OpenRangeEndMinute=(EA_range_period+1)*15;
	plus_hour=OpenRangeEndMinute/60;
	OpenRangeEndMinute=OpenRangeEndMinute-plus_hour*60;

	//オープンレンジ算出時刻にピボットの計算も同時に行っておく
	if(Hour()==(EA_OpenRangeHour+plus_hour) && Minute()==OpenRangeEndMinute && OpenRangeInit==D_OFF)
	{
		openRangeHigh = High[iHighest(NULL,0,MODE_HIGH,EA_range_period+1,1)];
		openRangeLow = Low[iLowest(NULL,0,MODE_LOW,EA_range_period+1,1)];
		openRangeVal=(openRangeHigh-openRangeLow);

		aValue=openRangeVal*EA_aValue;
		cValue=openRangeVal*EA_cValue;

		aUp = openRangeHigh + aValue;
		cUp = openRangeHigh + cValue;
		aDown = openRangeLow - aValue;
		cDown = openRangeLow - cValue; 

		aUpBefore=D_NONE;
		aDownBefore=D_NONE;
		cUpBefore=D_NONE;
		cDownBefore=D_NONE; 
		aUpUse=D_OFF;
		aDownUse=D_OFF;
		cUpUse=D_OFF;
		cDownUse=D_OFF; 
		aUpFailUse=D_OFF;
		aDownFailUse=D_OFF; 
		OpenRangeInit=D_ON;

		for(ii=0;ii<=Day();ii++)
		{
			//iTimeはbarの開始時刻を返すので、先月のbarになった時点でループから抜ける
			if(TimeMonth(iTime(NULL,PERIOD_D1,ii))==Month())
			{
			}
			else
			{
				break;
			}
		}
		g_TDM = ii;
	}
	else
	if(!(Hour()==EA_OpenRangeHour && Minute()<=OpenRangeEndMinute))
	{
		//注文が無い時だけエントリー処理
		if(entry_flag==D_OFF)
		{
			if(Hour()<=EA_entry_end)
			{
				if(DayOfWeek()==3 || DayOfWeek()==4 || DayOfWeek()==5)
				{
					if(g_TDM != 2 && g_TDM != 18 && g_TDM != 11 && g_TDM != 10 && g_TDM != 6 && g_TDM != 8 && g_TDM != 22 && g_TDM != 20 && g_TDM != 3)
					{
						if(Month() != 11)
							CheckForOpen();
					}
				}
				OpenRangeInit=D_OFF;
			}
		}
	}

	if(posi_flag==D_ON)
	{
		CheckForClose();
	}
	return 0;
}
//+------------------------------------------------------------------+