MT4インジケータの最適化絡みの記事で、読者さんから依頼があった簡単なコードを公開しておきます。

このEAは使用している時間足が3個経過した時点で決済する仕組みになっています。

3個という部分をパラメータにすることでコード修正の影響が少なくなり、さらに最適化も可能になります。

ここから開発範囲を広げていけるか、止まってしまうのかはあなた次第です(´・ω・`)

//+------------------------------------------------------------------+
//|                                        ParameterOptimization.mq4 |
//|       Copyright (C)2015 FX取引に関するあれこれ All Rights Reserved. |
//|                                              http://www.mql4.com |
//+------------------------------------------------------------------+
#property copyright   "Copyright (C) 2015 FX取引に関するあれこれ All Rights Reserved."
#property link        "http://fxtrading.greeds.net"

/*▼EAのパラメータ▼*/
input double TP    =100;
input double SL    =100;
input double Lots  =0.1;
/*▲EAのパラメータ▲*/

/*▼インジケーターのパラメータ▼*/
extern int InpCCIPeriod=14;
extern int test_InpCCIPeriod=200;
/*▲インジケーターのパラメータ▲*/

//+------------------------------------------------------------------+
//|メイン                                                              |
//+------------------------------------------------------------------+
void OnTick(void)
{
	int cnt,total;
	if(Bars<100)
	{
		Print("bars less than 100");
		return;
	}
	
	if(TP<10)
	{
		Print("TakeProfit less than 10");
		return;
	}
	
	/*▼最適化したいインジケータからデータを取得▼*/
	double out0_0 = iCustom(NULL,0,"CCI",InpCCIPeriod,0,1);
	double out0_1 = iCustom(NULL,0,"CCI",InpCCIPeriod,0,2);
	double out1_0 = iCustom(NULL,0,"CCI",test_InpCCIPeriod,0,1);
	double out1_1 = iCustom(NULL,0,"CCI",test_InpCCIPeriod,0,2);
	/*▲最適化したいインジケータからデータを取得▲*/
	
	total=OrdersTotal();
	
	if(total<1)
	{
		if(AccountFreeMargin()<(1000*Lots))
		{
			Print("We have no money. Free Margin = ",AccountFreeMargin());
			return;
		}
		/*買いエントリー*/
		if(out0_0<out1_0 && out0_1>out1_1)
		{
		   EntryL();
		}
		
		/*売りエントリー*/
		if(out0_0>out1_0 && out0_1<out1_1)
		{
   		EntryS();
   	}
	}

	for(cnt=0;cnt<total;cnt++)
	{
		if(!OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
		continue;
		if(OrderType()<=OP_SELL &&   // check for opened position 
			OrderSymbol()==Symbol())  // check for symbol
		{
			if(OrderType()==OP_BUY)
			{
   		   /*買い決済*/
				if(TimeCurrent()-OrderOpenTime()>=(Period()*3)*60)
				{
			   	SettlementL();
				   return;
				}
			}
			else // go to short position
			{
			   /*売り決済*/
				if(TimeCurrent()-OrderOpenTime()>=(Period()*3)*60)
				{
   				SettlementS();
				   return;
				}
			}
		}
	}
}
void EntryL()
{
	int ticket = OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-TP*Point,Ask+TP*Point,"macd sample",16384,0,Green);
	if(ticket>0)
	{
		if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
		Print("BUY order opened : ",OrderOpenPrice());
	}
	else	
	{
		Print("Error opening BUY order : ",GetLastError());
	}
  	return;
}
void EntryS()
{
	int ticket = OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+TP*Point,Bid-TP*Point,"macd sample",16384,0,Red);
	if(ticket>0)
	{
		if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
		Print("SELL order opened : ",OrderOpenPrice());
	}
	else
	{
		Print("Error opening SELL order : ",GetLastError());
	}
   return;
}
void SettlementL()
{
	if(!OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet))
	{
		Print("OrderClose error ",GetLastError());
	}
	return;
}
void SettlementS()
{
	if(!OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet))
	{
	   Print("OrderClose error ",GetLastError());
	}
	return;
}