//+------------------------------------------------------------------+
//|                                         AlexmanConcursExpert.mq4 |
//|                      Copyright © 2006, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#define copyright "Copyright © 2006, AlexMan Studio"
#define link "mailto:alexgomel@tut.by"

#import  "AlexConcursLibrary.ex4"
//Некоторые функции для работы эксперта  
 // double StopValue(int i);
  bool IsByeTrade(int i);
  bool IsSellTrade(int i);
  bool IsStopByeTrade(int i);
  bool IsStopSellTrade(int i);
  double EmaStop(int PeriodEMA, int i);  
#import



//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   GlobalVariableSet( "AlexmanConcursExpert", 0); 
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }

extern int  _MagicNumber = 1440;    // Уникальный магический номер ордера
extern int PeriodEMA  = 15;         // Период ЕМА для расчета стоп-лоса
extern int Zazor = 7;               // буфферный запас на стоп-лосс
 

// Так как по условиям конкурса включаемые файлы не разрешены, используемый файл
// OneOrderControl.mq4 вставлен в тело эксперта непосредственно.
// Спасибо за систему управления ордерами Андрею Хатимлянскому!

//+------------------------------------------------------------------+
//|                                              OneOrderControl.mq4 |
//|                                      Copyright © 2006, komposter |
//|                                      mailto:komposterius@mail.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, komposter"
#property link      "mailto:komposterius@mail.ru"

int _Ticket = 0, _Type = 0; double _Lots = 0.0, _OpenPrice = 0.0, _StopLoss = 0.0;
double _TakeProfit = 0.0; datetime _OpenTime = -1; double _Profit = 0.0, _Swap = 0.0;
double _Commission = 0.0; string _Comment = ""; datetime _Expiration = -1;

void OneOrderInit( int magic )
{
	int _GetLastError, _OrdersTotal = OrdersTotal();

	_Ticket = 0; _Type = 0; _Lots = 0.0; _OpenPrice = 0.0; _StopLoss = 0.0;
	_TakeProfit = 0.0; _OpenTime = -1; _Profit = 0.0; _Swap = 0.0;
	_Commission = 0.0; _Comment = ""; _Expiration = -1;

	for ( int z = _OrdersTotal - 1; z >= 0; z -- )
	{
		if ( !OrderSelect( z, SELECT_BY_POS ) )
		{
			_GetLastError = GetLastError();
			Print( "OrderSelect( ", z, ", SELECT_BY_POS ) - Error #", _GetLastError );
			continue;
		}
		if ( OrderMagicNumber() == magic && OrderSymbol() == Symbol() )
		{
			_Ticket		= OrderTicket();
			_Type			= OrderType();
			_Lots			= NormalizeDouble( OrderLots(), 1 );
			_OpenPrice	= NormalizeDouble( OrderOpenPrice(), Digits );
			_StopLoss	= NormalizeDouble( OrderStopLoss(), Digits );
			_TakeProfit	= NormalizeDouble( OrderTakeProfit(), Digits );
			_OpenTime	= OrderOpenTime();
			_Profit		= NormalizeDouble( OrderProfit(), 2 );
			_Swap			= NormalizeDouble( OrderSwap(), 2 );
			_Commission	= NormalizeDouble( OrderCommission(), 2 );
			_Comment		= OrderComment();
			_Expiration	= OrderExpiration();
			return(0);
		}
	}
}


int Shift=1;
 
int start()
{
 //   if (CurTime() < D'2006.07.01 00:00') return(0);
    
    int _GetLastError = 0;
    double spraid = Ask-Bid;
    double EmaStopValue = EmaStop(PeriodEMA,Shift); // вынес в переменную для разгрузки проца
 
    
    //---- Запоминаем параметры открытой позиции (если она есть)
    OneOrderInit( _MagicNumber );
  
    //---- А теперь смотрим, есть ли открытая позиция:
    if ( _Ticket > 0 )
    {
        //---- если открыта БАЙ-позиция,
        if ( _Type == OP_BUY )
        {
            //---- если ee закрывать,
            if ( IsStopByeTrade(Shift) )
            {
                //---- закрываем позицию
                if ( !OrderClose( _Ticket, _Lots, Bid, 5, Green ) )
                {
                    _GetLastError = GetLastError();
                    Print( "Ошибка OrderClose № ", _GetLastError );
                    return(-1);
                }
            }
            //---- если сигнал не изменился, выходим - пока рано открывать новую позицию
            else 
            {   // кстати, может пора двигать стоп-лосс?
              if ((_StopLoss==0 || _StopLoss < (EmaStopValue-(Zazor+5)*Point )) && (EmaStopValue-Zazor*Point ) < Bid)
              {
                if (!OrderModify(_Ticket,_OpenPrice,EmaStopValue-Zazor*Point,_TakeProfit,0,Blue))
                  {
                    _GetLastError = GetLastError();
                    Print( "Ошибка -0- OrderModify № ", _GetLastError );
                    return(-1);
                  }
                  GlobalVariableSet( "AlexmanConcursExpert", 1);
              }      

              if ((_StopLoss==0 || _StopLoss < _OpenPrice) && _Profit>500 )
              {
                if (!OrderModify(_Ticket,_OpenPrice,_OpenPrice,_TakeProfit,0,Blue))
                  {
                    _GetLastError = GetLastError();
                    Print( "Ошибка OrderModify № ", _GetLastError );
                    return(-1);
                  }
                  GlobalVariableSet( "AlexmanConcursExpert", 1);
              }      


              return(0);
            }
         }    
        //---- если открыта СЕЛЛ-позиция,
        if ( _Type == OP_SELL )
        {
            //---- если ее закрывать,
            if ( IsStopSellTrade(Shift) )
            {
                //---- закрываем позицию
                if ( !OrderClose( _Ticket, _Lots, Ask, 5, Red ) )
                {
                    _GetLastError = GetLastError();
                    Print( "Ошибка OrderClose № ", _GetLastError );
                    return(-1);
                }
            }
            //---- если сигнал не изменился, выходим - пока рано открывать новую позицию
            else
            {   // кстати, может пора двигать стоп-лосс?
              if ((_StopLoss==0 || _StopLoss > (EmaStopValue+spraid+(Zazor+5)*Point )) && (EmaStopValue+Zazor*Point ) > Bid)
              {
                if (!OrderModify(_Ticket,_OpenPrice,EmaStopValue+spraid+Zazor*Point,_TakeProfit,0,Blue))
                  {
                    _GetLastError = GetLastError();
                    Print( "Ошибка -1- OrderModify № ", _GetLastError );
                    return(-1);
                  }
                  GlobalVariableSet( "AlexmanConcursExpert", 1);
              }      

              if ((_StopLoss==0 || _StopLoss > _OpenPrice) && _Profit>500 )
              {
                if (!OrderModify(_Ticket,_OpenPrice,_OpenPrice,_TakeProfit,0,Blue))
                  {
                    _GetLastError = GetLastError();
                    Print( "Ошибка OrderModify № ", _GetLastError );
                    return(-1);
                  }
                  GlobalVariableSet( "AlexmanConcursExpert", 1);
              }      


              return(0);
            }
            
        }
    }
    //---- если нет позиции, открытой экспертом ( _Ticket == 0 )
    
   
        //- торгуем только если кончился старый сигнал   
      if ((IsByeTrade(Shift+5) && IsStopByeTrade(Shift)) || (IsSellTrade(Shift+5) && IsStopSellTrade(Shift)) )  
                 GlobalVariableSet( "AlexmanConcursExpert", 0);
   
    
    
    //-- Отдыхаем, если в этот час сработал стоплосс
    
    if(GlobalVariableGet("AlexmanConcursExpert") ==1) return(0);
    
    
    //---- Неплохо бы открыть позицию, например купить
    if ( IsByeTrade(Shift) && EmaStopValue<=Low[Shift] && EmaStopValue < Bid)
    {
        //---- открываем БАЙ позицию
        if ( OrderSend( Symbol(), OP_BUY, 1.0, Ask, 5, 0.0, 0.0, "by AlexmanConcursExpert.mq4", 
              _MagicNumber, 0, Green ) < 0 )
        {
            _GetLastError = GetLastError();
            Print( "Ошибка OrderSend № ", _GetLastError );
            return(-1);
        }
        return(0);
    }
    //---- Или может продать?,
    if ( IsSellTrade(Shift)  && EmaStopValue>=High[Shift] && EmaStopValue> Ask)
    {
        //---- открываем СЕЛЛ позицию
        if ( OrderSend( Symbol(), OP_SELL, 1.0, Bid, 5, 0.0, 0.0, "by AlexmanConcursExpert.mq4", 
              _MagicNumber, 0, Red ) < 0 )
        {
            _GetLastError = GetLastError();
            Print( "Ошибка OrderSend № ", _GetLastError );
            return(-1);
        }
        return(0);
    }

    return(0);
}