#property strict
// Следующая задача.
// Нужно написать советник, торгующий по сигналам двух стандартных технических индикаторов Moving Average.
// Один индикатор с более быстрым периодом усреднения чем второй.
// Ордер Бай открывается, когда быстрая MA пересекает медленную снизу вверх.
// Ордер Селл открывается, когда быстрая MA пересекает медленную сверху вниз.
// Открытие осуществлять по закрытию сигнальной свечи, то есть – свеча на которой было пересечение вверх/вниз должна быть закрыта, а вход на новой свече.
// Советник должен работать по инструменту своего графика, и открывать только один ордер.
// Закрытие происходит по стоп уровням СтопЛосс и ТейкПрофит.
// Переменные MagicNumber, СтопЛосс и ТейкПрофит вывести во входные параметры советника.
// Постарайтесь при реализации не использовать лишних операций (действий).
//+------------------------------------------------------------------+
input int FastMA = 164; // FastMAPeriod
input ENUM_MA_METHOD FastMAMethod = MODE_EMA; // FastMAMethod
input ENUM_APPLIED_PRICE FastMAPrice = PRICE_CLOSE; // FastMAPrice
input int FastMAShift = 0; // FastMAShift
input int SlowMA = 384; // SlowMAPeriod
input ENUM_MA_METHOD SlowMAMethod = MODE_EMA; // SlowMAMethod
input ENUM_APPLIED_PRICE SlowMAPrice = PRICE_CLOSE; // SlowMAPrice
input int SlowMAShift = 0; // SlowMAShift
input double Lots = 0.1; // Lots:
input double TakeProfit = 300; // Take Profit:
input double StopLoss = 100; // Stop Loss:
input int Magic = 12345; // Magic Number:
input int Slippage = 3; // Slippage:
//+------------------------------------------------------------------+
int slipp, ticket;
double point;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
//----Определение пяти значного брокера
point = _Point;
if(_Digits == 3 || _Digits == 5)
{
point = 10.0 * Point;
slipp = Slippage * 10;
}
//---
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
int OrdersSum=0;
int i=0;
double MA1_0,MA2_0,MA1_1,MA2_1;
int total;
bool resalt;
MA1_0 = iMA ( NULL, 0, FastMA, FastMAShift, FastMAMethod,FastMAPrice, 0 ); // Получаем значение FastMA
MA1_1 = iMA ( NULL, 0, FastMA, FastMAShift, FastMAMethod,FastMAPrice, 1 ); // Получаем значение FastMA
MA2_0 = iMA ( NULL, 0, SlowMA, SlowMAShift, SlowMAMethod,SlowMAPrice, 0 ); // Получаем значение SlowMA
MA2_1 = iMA ( NULL, 0, SlowMA, SlowMAShift, SlowMAMethod,SlowMAPrice, 1 ); // Получаем значение SlowMA
total=OrdersTotal();
//---- buy
if (total<1)
{
if(MA1_1<MA2_1 && MA1_0>MA2_0)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,slipp,Ask-StopLoss*Point,Ask+TakeProfit*Point,"",Magic,0,Blue);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("Открыт ордер BUY : ",OrderOpenPrice());
}
else
{
Print("Ошибка открытия BUY ордера : ",GetLastError());
return;
}
}
//---- sell
if(MA1_1>MA2_1 && MA1_0<MA2_0)
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,slipp,Bid+StopLoss*Point,Bid-TakeProfit*Point,"",Magic,0,Red);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("Открыт ордер SELL : ",OrderOpenPrice());
}
else
{
Print("Ошибка открытия SELL ордера : ",GetLastError());
return;
}
}
}
//----
for(i = OrdersTotal()-1; i >= 0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderMagicNumber()!=Magic || OrderSymbol()!=Symbol()) continue;
//---- check order type
if(OrderType()==OP_BUY)
{
if(Bid>=(OrderOpenPrice()+TakeProfit*Point)) // проверим не пора ли закрываться по профиту
{
resalt = OrderClose(OrderTicket(),OrderLots(),Bid,slipp,Blue); // закрываем длинную позицию по профиту
break;
}
if(Bid<=(OrderOpenPrice()-StopLoss*Point)) // проверим не пора ли закрываться по ст.лоссу
{
resalt = OrderClose(OrderTicket(),OrderLots(),Bid,slipp,Red); // закрываем длинную позицию по стопу
break;
}
}
else
{
if(Ask<=(OrderOpenPrice()-TakeProfit*Point))
{
resalt = OrderClose(OrderTicket(),OrderLots(),Ask,slipp,Red); // закрываем короткую позицию по профиту
break;
}
if(Ask>=(OrderOpenPrice()+StopLoss*Point))
{
resalt = OrderClose(OrderTicket(),OrderLots(),Ask,slipp,Red); // закрываем короткую позицию по стопу
break;
}
}
}
return;
}