Navigation:Home > Content >

Ilan_Anyan.mq4

Time: 2010-12-15 | Download file:Ilan_Anyan.mq4

//+------------------------------------------------------------------+
//|                                                    
//+------------------------------------------------------------------+
#property copyright "Copyright © 2010, anyan"
#property link      "mailto:aaa"

//---- Внешние переменные (доступные в окне свойств эксперта) - можно установить значения по умолчанию
extern string 		Expert_Properties 			= "-------Expert-Properties-------";
extern int 			Expert_Id 						= 2292;	// Уникальный идентификатор эксперта. Если на 2-х графиках с одинаковым Символом И ТаймФреймом должно работать 2 эксперта, надо установить им разные Expert_Id
extern int			TradeDirection					= 0;		// Разрешенное направление торговли: 0 - Buy & Sell, 1 - Buy Only, -1 - Sell Only
extern int			PipStep							= 30;		// Шаг доливки
//extern int			TakeProfitALL						= 10;		// Необходимая для закрытия позиций прибыль
extern int			TakeProfit_1					= 10;		// Необходимая для закрытия позиций прибыль
extern double		StartLot							= 0.1;	// Стартовый лот
extern double		LotExponent						= 1.27;	// Коэффициент прибывки лота
extern int			MaxTrades						= 10;		// Максимальное кол-во доливок
extern int			LastStopLoss					= 30;		// При убытке последней доливки размером LastStopLoss пунктов вся серия закрывается
extern int        ma                         = 100;    // Период скользящей средней для определения направления открытия сделки
extern int        shift                      = 0;     // сдвиг машки
extern int        TF                         = 60;    // таймфрейм машки
extern int       TFPulseSlope=5; // Если 0 - ТФ на котором стоит, иначе 5 - М5, 1440 - Д1  240 - Н4 и т.д.
extern int       period=50; 
extern int       method=3;                         // MODE_SMA 
extern int       price=0;                          // PRICE_CLOSE


extern bool       poMA                       =true;   // Использовать ли фильтры для открытия позиций

#include 

int init()
{
	TradeInfoLib_Initialization ( Expert_Id, "Ilan1.4_k" );
	return(0);
}

int deinit()
{
	TradeInfoLib_Deinitialization();
	return(0);
}

int start()
{
	if ( !IsOK() ) { return(0); }

	int _GetLastError, _OrdersTotal = OrdersTotal();

	double l, op;
	double max_lot_b = 0.0, level_b = 0.0, summ_lot_b = 0.0, ave_price_b = 0.0; int count_b = 0; static int last_b = 0;
	double max_lot_s = 0.0, level_s = 0.0, summ_lot_s = 0.0, ave_price_s = 0.0; int count_s = 0; static int last_s = 0;

	for ( int z = _OrdersTotal - 1; z >= 0; z -- )
	{
		if ( !OrderSelect( z, SELECT_BY_POS, MODE_TRADES ) )
		{
			_GetLastError = GetLastError();
			Print( "OrderSelect( ", z, ", SELECT_BY_POS, MODE_TRADES ) - Error #", _GetLastError );
			continue;
		}
		if ( OrderMagicNumber() != _MagicNumber || OrderSymbol() != _Symbol ) continue;

		l = OrderLots();
		op = OrderOpenPrice();

		if ( OrderType() == OP_BUY )
		{
			count_b ++;
			summ_lot_b += l;
			ave_price_b += op*l;
			if ( l > max_lot_b )
			{
				max_lot_b = l;
				level_b = op;
			}
		}

		if ( OrderType() == OP_SELL )
		{
			count_s ++;
			summ_lot_s += l;
			ave_price_s += op*l;
			if ( l > max_lot_s )
			{
				max_lot_s = l;
				level_s = op;
			}
		}
	}

	// check fo close
	if ( max_lot_b > 0.0 )
	{
		ave_price_b = NormalizeDouble( ave_price_b/summ_lot_b, _Digits );
		if ( NormalizeDouble( Bid - ave_price_b - TakeProfit_1*_Point, _Digits ) >= 0.0 )
		{
			if ( !CloseAll( OP_BUY ) ) return(-1);
			max_lot_b = 0.0;
		}
		if ( LastStopLoss > 0 && count_b >= MaxTrades )
		{
			if ( NormalizeDouble( level_b - Bid - LastStopLoss*_Point, _Digits ) >= 0.0 )
			{
				Print( "LastStopLoss for BUY!" );
				if ( !CloseAll( OP_BUY ) ) return(-1);
				max_lot_b = 0.0;
			}
		}
	}
	if ( max_lot_s > 0.0 )
	{
		ave_price_s = NormalizeDouble( ave_price_s/summ_lot_s, _Digits );
		if ( NormalizeDouble( ave_price_s - Ask - TakeProfit_1*_Point, _Digits ) >= 0.0 )
		{
			if ( !CloseAll( OP_SELL ) ) return(-1);
			max_lot_s = 0.0;
		}
		if ( LastStopLoss > 0 && count_s >= MaxTrades )
		{
			if ( NormalizeDouble( Ask - level_s - LastStopLoss*_Point, _Digits ) >= 0.0 )
			{
				Print( "LastStopLoss for SELL!" );
				if ( !CloseAll( OP_SELL ) ) return(-1);
				max_lot_s = 0.0;
			}
		}
	}

	// check fo open
	double ma_res_now, ma_res_prev,inna_res_now,inna_res_prev;
	
   inna_res_now=iCustom(Symbol(),TFPulseSlope,"HMA",period,method,price,0,0);
   inna_res_prev=iCustom(Symbol(),TFPulseSlope,"HMA",period,method,price,1,1);    
    
	ma_res_now=iMA(Symbol(),TF,ma,shift,MODE_EMA,PRICE_CLOSE,0); //Получение значение скользящей средней (текущее)
   ma_res_prev=iMA(Symbol(),TF,ma,shift,MODE_EMA,PRICE_CLOSE,1); //Получение значение скользящей средней (предыдущего периода)	
	
	if ( ((poMA==false && TradeDirection >= 0) || (poMA==true && ma_res_now>ma_res_prev && inna_res_now= Close[2] && Time[0] > last_b )
			{
				OpenBuy( StartLot );
				last_b = Time[0];
			}
		}
		else
		{
			if ( level_b - PipStep*Point >= Ask ) OpenBuy( LotExponent*max_lot_b );
			//if ( level_b - PipStep*Point <= Ask ) OpenBuy( LotExponent*max_lot_b );
		}
	}
	if ( ((poMA==false && TradeDirection <= 0) || (poMA==true && ma_res_nowinna_res_prev) ) && count_s < MaxTrades )
	{
		if ( count_s == 0 )
		{
			if ( Close[1] <= Close[2] && Time[0] > last_s )
			{
				OpenSell( StartLot );
				last_s = Time[0];
			}
		}
		else
		{
			if ( level_s + PipStep*Point <= Bid ) OpenSell( LotExponent*max_lot_s );
			//if ( level_s + PipStep*Point >= Bid ) OpenSell( LotExponent*max_lot_s );
		}
	}
	
	//StartLot=NormalizeDouble(AccountFreeMargin()*StartLot/100/1000,2);

	return(0);
}

void OpenBuy( double Lot )
{
	double _OpenPriceLevel, _StopLossLevel = 0.0, _TakeProfitLevel = 0.0;
	_OpenPriceLevel = NormalizeDouble( Ask, _Digits );
	_TakeProfitLevel = 0.0; //NormalizeDouble( Ask + (TakeProfitALL + 25)*_Point, _Digits );

	double 	lot_min		= MarketInfo( _Symbol, MODE_MINLOT  );
	double 	lot_max		= MarketInfo( _Symbol, MODE_MAXLOT  );
	double 	lot_step		= MarketInfo( _Symbol, MODE_LOTSTEP );

	Lot = NormalizeDouble( Lot / lot_step, 0 ) * lot_step;
	if ( Lot < lot_min ) Lot = lot_min;
	if ( Lot > lot_max ) Lot = lot_max;

	double needmargin = AccountFreeMarginCheck( Symbol(), OP_BUY, Lot );

	if ( needmargin < 5 || GetLastError() == 134 )
	{
		Print( "We have no money!!!" );
		return(-1);
	}

	if ( _OrderSend ( _Symbol, OP_BUY, Lot, _OpenPriceLevel, Slippage, _StopLossLevel, _TakeProfitLevel, "", _MagicNumber ) < 0 )
		Alert( strComment, ": ошибка при открытии BUY-позиции!!!" );
}

void OpenSell( double Lot )
{
	double _OpenPriceLevel, _StopLossLevel = 0.0, _TakeProfitLevel = 0.0;
	_OpenPriceLevel = NormalizeDouble( Bid, _Digits );
	_TakeProfitLevel = 0.0; //NormalizeDouble( Bid - (TakeProfit + 25)*_Point, _Digits );

	double 	lot_min		= MarketInfo( _Symbol, MODE_MINLOT  );
	double 	lot_max		= MarketInfo( _Symbol, MODE_MAXLOT  );
	double 	lot_step		= MarketInfo( _Symbol, MODE_LOTSTEP );

	Lot = NormalizeDouble( Lot / lot_step, 0 ) * lot_step;  
	
	if ( Lot < lot_min ) Lot = lot_min;
	if ( Lot > lot_max ) Lot = lot_max;

	double needmargin = AccountFreeMarginCheck( Symbol(), OP_SELL, Lot );

	if ( needmargin < 5 || GetLastError() == 134 )
	{
		Print( "We have no money!!!" );
		return(-1);
	}

	if ( _OrderSend ( _Symbol, OP_SELL, Lot, _OpenPriceLevel, Slippage, _StopLossLevel, _TakeProfitLevel, "", _MagicNumber ) < 0 )
		Alert( strComment, ": ошибка при открытии SELL-позиции!!!" );
}

bool CloseAll( int type = -1 )
{
	bool result = true;
	int _GetLastError, _OrdersTotal = OrdersTotal();
	for ( int z = _OrdersTotal - 1; z >= 0; z -- )
	{
		if ( !OrderSelect( z, SELECT_BY_POS, MODE_TRADES ) )
		{
			_GetLastError = GetLastError();
			Print( "OrderSelect( ", z, ", SELECT_BY_POS, MODE_TRADES ) - Error #", _GetLastError );
			result = false;
			continue;
		}
		if ( OrderMagicNumber() != _MagicNumber || OrderSymbol() != _Symbol ) continue;
		if ( OrderType() > 1 ) continue;
		if ( type >= 0 && OrderType() != type ) continue;

		if ( _OrderClose( OrderTicket() ) < 0 ) result = false;
	}
	return(result);
}

Recommend