Agent_Fx_v07_XZ_ss





//+------------------------------------------------------------------+
//|                                         Agent_Fx_v07_XZ_d_ss.mq4 |
//|                                                    Voloshin Yuri |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Voloshin Yuri"
#property link      "http://www.metaquotes.net"
#define Magic 3017

extern string block_01 = " îñíîâíûå ïàðàìåòðû äëÿ èíäèêàòîðîâ";

extern double lots = 0.25;                	// Âåëè÷èíà òîðãóåìîãî ëîòà
extern int SL = 200;				    	// ÑòîïËîñ äëÿ îðäåðà, åñëè SL=0 çíà÷åíèå îïðåäåëÿåòñÿ ïî ïåðâîé ñâå÷å
extern int TP = 41;					        // ÒåéêÏðîôèò äëÿ îðäåðà
extern int kCCI = 27;    				    // Êîýôôèöèåíò îñíîâíîãî èíäèêàòîðà  


extern string block_02 = " îñíîâíûå ïàðàìåòðû äëÿ áåçóáûòêà";

extern bool   AllPositions   = False; 		// Óïðàâëÿòü âñåìè ïîçèöèÿìè
extern bool   ProfitTrailing = True;  		// Òðàëèòü òîëüêî ïðîôèò
extern int    TrailingStop   = 30;    		// Ôèêñèðîâàííûé ðàçìåð òðàëà
extern int    TrailingStep   = 8;     		// Øàã òðàëà
extern bool   UseSound       = True;  		// Èñïîëüçîâàòü çâóêîâîé ñèãíàë
string NameFileSound  = "expert.wav";  		// Íàèìåíîâàíèå çâóêîâîãî ôàéëà

//	Ïîääåðæèâàåò äâà âèäà òðàëà: ïðîñòîé (ïàðàìåòð ProfitTrailing=False), ò.å. ñðàçó æå ïîñëå îòêðûòèÿ ïîçèöèè 
//	ïîäòÿãèâàåòñÿ ñòîï íà ðàçìåð òðàëà è ïðîôèò-òðýéëèíã (ïàðàìåòð ProfitTrailing=True), ïðè êîòîðîì ñòîïû 
//	äâèãàþòñÿ òîëüêî ïîñëå ïðåâûøåíèÿ ïðîôèòà ïîçû íàä ðàçìåðîì òðàëà. Âåøàòü íóæíî òîëüêî íà îäèí ëþáîé ãðàôèê, 
//	à ñòîïû áóäóò äâèãàòüñÿ ó âñåõ îòêðûòûõ ïîçèöèé (ïàðàìåòð AllPositions=True).


extern string block_03 = " íàñòðîéêà ôóíêöèè óïðàâëåíèÿ êàïèòàëîì";

extern bool uplot = true;					// âêë/âûêë èçìåíåíèå âåëè÷èíû ëîòà
extern double lotmin = 0.1;					// íà÷àëüíîå çíà÷åíèå
extern double lotmax = 0.7;					// ïîòîëîê
extern double lotstep = 0.1;				// ïðèðàùåíèå ëîòà 
extern int lastprofit = 1; 					// ïðèíèìàåò çíà÷åíèÿ -1/1. 
											// -1 - óâåëè÷åíèå ëîòà ïîñëå ìèíóñîâîé ñäåëêè äî ïåðâîé ïëþñîâîé.
											// 1 - óâåëè÷åíèå ëîòà ïîñëå ïëþñîâîé ñäåëêè äî ïåðâîé ìèíóñîâîé.

//------- Ãëîáàëüíûå ïåðåìåííûå ñîâåòíèêà -------------------------------------+
double cci[10];
int i, total;
int ticket;
int slip = 3;
double ldStop;
double ldTake;
string     SMB; 
double     PNT;
int        MinLevel;


int init() {
SMB=Symbol();                                  //Ñèìâîë âàëþòíîé ïàðû
PNT=MarketInfo(SMB,MODE_POINT);                //Ðàçìåð ïóíêòà â âàëþòå êîòèðîâêè, 
                                               //äëÿ òåêóùåãî èíñòðóìåíòà õðàíèòñÿ â ïðåäîïðåäåëåííîé ïåðåìåííîé Point
MinLevel=MarketInfo(SMB,MODE_STOPLEVEL);       //Ìèíèìàëüíî äîïóñòèìûé óðîâåíü ñòîï-ëîññà/òåéê-ïðîôèòà â ïóíêòàõ
Proverka();
   return(0);
}
int deinit() {
//----
   
//----
   return(0);
}
  
  
// ========================================================
// =================== ÍÀ×ÈÍÀÅÌ ÐÀÁÎÒÓ ====================
// ========================================================
int start() { 
RefreshRates();
    // îïðåäåëÿåì íàëè÷èå äîñòàòî÷íûõ ñðåäñòâ íà äåïîçèòå
	if(AccountFreeMargin()<(1000*lots)) 
		{
		Print("We have no money. Free Margin = ", AccountFreeMargin());
		Alert("We have no money. Free Margin = ", AccountFreeMargin());
		}

	// îïðåäåëÿåì âðåìÿ äëÿ ðàñ÷åòîâ è ðàáîòû ýêñïåðòà
	if(DayOfWeek()!=0 || DayOfWeek()!=6)       // íå ðàáîòàåò â âûõîäíûå äíè.
	{	
		double j, swo_L, swo_Y, swo_R;
		int m,s,k;
	m=Time[0]+Period()*60-CurTime();           // îïðåäåëÿåì âðåìÿ íà ñâå÷å
	j=m/60.0;
	s=m%60;
	m=(m-m%60)/60;
	if (m == 00 && s < 20) order();            // óñëîâèå äëÿ ïðèíÿòèÿ ðåøåíèÿ â êîíöå êàæäîé ñâå÷è
	}	
return(0);
}


// ========================================================
// =============== ÔÓÍÊÖÈß ÏÐÎÂÅÐÊÈ ÎÐÄÅÐÎÂ ===============
// ========================================================
void order() {
	total=OrdersTotal();                       // ôóíêöèÿ ïðîâåðÿåò íàëè÷èå îòêðûòûõ îðäåðîâ
							                   // åñëè îðäåðîâ íåò, èùåì âîçìîæíîñòü îòêðûòèÿ
	if(total<1) 
	{
	// ôîðìèðóåì ìàñèâû èíäèêàòîðîâ è îïðåäåëÿåì òðåíä
	for(i=0; i<10; i++)
        {      
		cci[i] = iCCI(NULL, 0, kCCI, PRICE_TYPICAL, i);
		}	
	raschet();  
	}	
	
	for (int i=0; i<OrdersTotal(); i++)        // åñëè îòêðûòûå îðäåðà èìåþòñÿ
	{
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) 
		{
		// âûáèðàåì ðûíî÷íûå îðäåðà è ïåðåõîäèì íà îáðàáîòêó
		if (OrderType() == OP_BUY || OrderType() == OP_SELL) BBU();
			
		}
	}
	
return;
} 


// ========================================================
// ============ ÈÙÅÌ ÂÎÇÌÎÆÍÎÑÒÜ ÎÒÊÐÛÒÜ ÎÐÄÅÐ ============
// ========================================================
void raschet() {
Comment("\n"," == ñîâåòíèê ÐÀÁÎÒÀÅÒ ==",
		"\n"," ======================",
		"\n"," ñïðåä = ", MarketInfo(Symbol(),MODE_SPREAD),
		"\n"," óðîâåíü ñòîï = ", MarketInfo(Symbol(),MODE_STOPLEVEL),
		"\n"," ======================",
		"\n"," Àíàëèçèðóþ ÈÍÄÈÊÀÒÎÐÛ ");
	
// óñëîâèå ïîêóïêè íà íèæíåé âåðøèíå
	if(cci[1]<5 && cci[2]<cci[3] && cci[1]<cci[2] && cci[0]>cci[1] && 
	Open[2]>Close[2] && Open[1]>Close[1] && Open[0]<Close[0] && Open[1]<Close[0]) pokypka();  
	  
// óñëîâèå ïðîäàæè íà âåðõíåé âåðøèíå
	if(cci[1]>-5 && cci[2]>cci[3] && cci[1]>cci[2] && cci[0]<cci[1] && 
	Open[2]<Close[2] && Open[1]<Close[1] && Open[0]>Close[0] && Open[1]>Close[0]) prodaza();  

return;
}


// ========================================================
// =================== ÎÒÊÐÛÂÀÅÌ ÎÐÄÅÐÀ ===================
// ========================================================
void pokypka() {                               // îòêðûâàåì îðäåð "ÊÓÏÈÒÜ"
	GetLots();                                 // îïðåäåëÿåì ðàçìåð ëîòà äëÿ òîðãîâëè
 	if (SL!=0) ldStop=Ask-SL*Point;
	if (SL==0) ldStop=Low[1]-7*Point;
    if (TP!=0) ldTake=Ask+TP*Point;
ticket = OrderSend(Symbol(), OP_BUY, lots, Ask, slip, ldStop, ldTake, NULL, Magic, 0, RoyalBlue);
    if (GetLastError()>0) Alert("îøèáêà ïîêóïêè = ", GetLastError());
	if (ticket>0) 
		{
Comment("\n"," == ñîâåòíèê ÐÀÁÎÒÀÅÒ ==",
		"\n"," ======================",
		"\n"," ñïðåä = ", MarketInfo(Symbol(),MODE_SPREAD),
		"\n"," óðîâåíü ñòîï = ", MarketInfo(Symbol(),MODE_STOPLEVEL),
		"\n"," ======================",
		"\n"," ÎÒÊÐÛË îðäåð <<ÊÓÏÈÒÜ>>");
		}
return;
}

void prodaza() {                               // îòêðûâàåì îðäåð "ÏÐÎÄÀÒÜ"
	GetLots();                                 // îïðåäåëÿåì ðàçìåð ëîòà äëÿ òîðãîâëè 
	if (SL!=0) ldStop=Bid+SL*Point;
	if (SL==0) ldStop=High[1]+7*Point;
    if (TP!=0) ldTake=Bid-TP*Point;
ticket = OrderSend(Symbol(), OP_SELL, lots, Bid, slip, ldStop, ldTake, NULL, Magic, 0, DeepPink);
    if (GetLastError()>0) Alert("îøèáêà ïðîäàæè = ", GetLastError()); 
	if (ticket>0)
	{
Comment("\n"," == ñîâåòíèê ÐÀÁÎÒÀÅÒ ==",
		"\n"," ======================",
		"\n"," ñïðåä = ", MarketInfo(Symbol(),MODE_SPREAD),
		"\n"," óðîâåíü ñòîï = ", MarketInfo(Symbol(),MODE_STOPLEVEL),
		"\n"," ======================",
		"\n"," ÎÒÊÐÛË îðäåð <<ÏÐÎÄÀÒÜ>>");
	}
return;
}

// ========================================================
// ============ ÐÀÁÎÒÀ Ñ ÐÛÍÎ×ÍÛÌÈ ÎÐÄÅÐÀÌÈ ===============
// ========================================================

void BBU() {
  for (int i=0; i<OrdersTotal(); i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (AllPositions || OrderSymbol()==Symbol()) {
        TrailingPositions();
      }
    }
  }
}
void TrailingPositions() {
  double pBid, pAsk, pp;

  pp = MarketInfo(OrderSymbol(), MODE_POINT);
  if (OrderType()==OP_BUY) {
    pBid = MarketInfo(OrderSymbol(), MODE_BID);
    if (!ProfitTrailing || (pBid-OrderOpenPrice())>TrailingStop*pp) {
      if (OrderStopLoss()<pBid-(TrailingStop+TrailingStep-1)*pp) {
        ModifyStopLoss(pBid-TrailingStop*pp);
        return;
      }
    }
  }
  if (OrderType()==OP_SELL) {
    pAsk = MarketInfo(OrderSymbol(), MODE_ASK);
    if (!ProfitTrailing || OrderOpenPrice()-pAsk>TrailingStop*pp) {
      if (OrderStopLoss()>pAsk+(TrailingStop+TrailingStep-1)*pp || OrderStopLoss()==0) {
        ModifyStopLoss(pAsk+TrailingStop*pp);
        return;
      }
    }
  }
}
void ModifyStopLoss(double ldStopLoss) {
  bool fm;

  fm=OrderModify(OrderTicket(),OrderOpenPrice(),ldStopLoss,OrderTakeProfit(),0,CLR_NONE);
  if (fm && UseSound) PlaySound(NameFileSound);
}
	
	
// ========================================================
// ============ ÔÓÍÊÖÈß ÓÏÐÀÂËÅÍÈß ÊÀÏÈÒÀËÎÌ ==============
// ========================================================
double GetLots() { 
  lots = lots;
  if (!uplot) return (lots);
  
  int ticket = GetLastOrderHist();
  if (ticket == -1) return (lots);
  
  if (!OrderSelect(ticket, SELECT_BY_TICKET, MODE_HISTORY)) return (lots);
  if (OrderProfit()*lastprofit < 0) return (lots);
  
  lots = MathMin(OrderLots() + lotstep, lotmax);
  
//Alert("  ÔÓÍÊÖÈß óïðàâëåíèÿ êàïèòàëîì   ");  
return (lots);
}
int GetLastOrderHist(int type = -1) {
  int ticket = -1;
  datetime dt = 0;
  int cnt = HistoryTotal();
    
  for (int i=0; i < cnt; i++) {
    if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) continue;
//Îïöèîíàëüíî
    if (OrderSymbol() != Symbol()) continue;
//Îïöèîíàëüíî
    if (OrderMagicNumber() != Magic) continue;
    if (type != -1 && OrderType() != type) continue;
    
    if (OrderCloseTime() > dt) {
      dt = OrderCloseTime();
      ticket = OrderTicket();
    }
  }
return (ticket);
}


// ======================= Ïðîâåðêà êîððåêòíîñòè ïîëüçîâàòåëüñêèõ óñòàíîâîê =============================================
void Proverka()
{
if(TrailingStop<MinLevel && TrailingStop!=0) {Comment("Îøèáêà! ÒðåéëèíãÑòîï ðûíî÷íûõ îðäåðîâ íå ìîæåò áûòü ìåíåå ",MinLevel);
                                          Print("Îøèáêà! ÒðåéëèíãÑòîï ðûíî÷íûõ îðäåðîâ íå ìîæåò áûòü ìåíåå ",MinLevel);
                                          Alert("Îøèáêà! ÒðåéëèíãÑòîï ðûíî÷íûõ îðäåðîâ íå ìîæåò áûòü ìåíåå ",MinLevel);
                                          return(0);}                                       
   if(TrailingStep>=MinLevel && TrailingStep==0) {Comment("Îøèáêà! Øàã òðåéëèíãà ðûíî÷íûõ îðäåðîâ íå ìîæåò áûòü ìåíåå 1");
                                          Print("Îøèáêà! Øàã òðåéëèíãà ðûíî÷íûõ îðäåðîâ íå ìîæåò áûòü ìåíåå 1");
                                          Alert("Îøèáêà! Øàã òðåéëèíãà ðûíî÷íûõ îðäåðîâ íå ìîæåò áûòü ìåíåå 1");
                                          return(0);}                                       
   if(TP<MinLevel && TP!=0) {Comment("Îøèáêà! TP íå ìîæåò áûòü ìåíåå ",MinLevel);
                                          Print("Îøèáêà! TP íå ìîæåò áûòü ìåíåå ",MinLevel);
                                          Alert("Îøèáêà! TP íå ìîæåò áûòü ìåíåå ",MinLevel);
                                          return(0);}
   if(SL<MinLevel && SL!=0) {Comment("Îøèáêà! SL íå ìîæåò áûòü ìåíåå ",MinLevel);
                                          Print("Îøèáêà! SL íå ìîæåò áûòü ìåíåå ",MinLevel);
                                          Alert("Îøèáêà! SL íå ìîæåò áûòü ìåíåå ",MinLevel);
                                          return(0);}
}
// ============================================================================================================================









Sample





Analysis



Market Information Used:

Series array that contains open time of each bar
Series array that contains close prices for each bar
Series array that contains open prices of each bar
Series array that contains the lowest prices of each bar
Series array that contains the highest prices of each bar


Indicator Curves created:


Indicators Used:

Commodity channel index


Custom Indicators Used:

Order Management characteristics:
Checks for the total of open orders
It automatically opens orders when conditions are reached
It can change open orders parameters, due to possible stepping strategy

Other Features:


It issuies visual alerts to the screen
It plays sound alerts

BackTest : EURUSD on H1

From 2009-11-01 to 2009-11-30 Profit Factor:0.56 Total Net Profit:-40.00

BackTest : USDJPY on H1

From 2009-11-01 to 2009-11-30 Profit Factor:0.00 Total Net Profit:11.89

BackTest : USDCHF on H1

From 2009-12-01 to 2010-01-01 Profit Factor:1.92 Total Net Profit:134.47

BackTest : USDCAD on H1

From 2009-12-01 to 2010-01-01 Profit Factor:0.65 Total Net Profit:-100.23

BackTest : EURUSD on H1

From 2009-08-01 to 2009-10-01 Profit Factor:0.50 Total Net Profit:-156.50

BackTest : GBPUSD on H1

From 2010-01-01 to 2010-02-27 Profit Factor:0.22 Total Net Profit:-370.48

BackTest : USDCAD on H1

From 2009-01-01 to 2010-01-01 Profit Factor:0.14 Total Net Profit:-6000.03

BackTest : EURUSD on H1

From 2010-03-01 to 2010-03-27 Profit Factor:0.38 Total Net Profit:-119.50

BackTest : GBPUSD on H1

From 2010-01-01 to 2010-04-16 Profit Factor:0.00 Total Net Profit:0.00

BackTest : EURUSD on H1

From 2010-04-01 to 2010-04-30 Profit Factor:0.34 Total Net Profit:-118.50

BackTest : EURUSD on H1

From 2010-05-01 to 2010-05-31 Profit Factor:0.70 Total Net Profit:-40.35

BackTest : EURUSD on H1

From 2010-06-01 to 2010-06-30 Profit Factor:0.32 Total Net Profit:-111.25

Request Backtest for Agent_Fx_v07_XZ_ss


From : (yyyy/mm/dd) To: (yyyy/mm/dd)

Pair: Period: