//+------------------------------------------------------------------+
//|                                                   Stochastic.mq4 |
//+------------------------------------------------------------------+


#property link "http://www.forex-instruments.info"

int start()
  {
  int  cnt,TrailingStop,per; 
  int slippage,StopLoss,TakeProfit;
  slippage = 3;
  double AlligatorHigh,AlligatorLow,Temp;
  double StoM0,StoS0,StoM1,StoS1,StoM2,StoS2,StoM3,StoS3;
  double AC3,AC2,AC1;
  double DeltaLimit;
  double DeltaOpen,DeltaOpen1,AngleOpen,DeltaClose;
  

DeltaOpen = 0.1;
DeltaOpen1 = 0.1;
AngleOpen = 2;
DeltaClose = 4;
DeltaLimit = 0;
StopLoss = 50;
TakeProfit = 100;
TrailingStop =15;


per = PERIOD_H4;
StoM1 = iStochastic(Symbol(),per,10,5,5,MODE_EMA,0,MODE_MAIN,1);
StoM2 = iStochastic(Symbol(),per,10,5,5,MODE_EMA,0,MODE_MAIN,2);
StoM3 = iStochastic(Symbol(),per,10,5,5,MODE_EMA,0,MODE_MAIN,3);
StoS1 = iStochastic(Symbol(),per,10,5,5,MODE_EMA,0,MODE_SIGNAL,1);
StoS2 = iStochastic(Symbol(),per,10,5,5,MODE_EMA,0,MODE_SIGNAL,2);
StoS3 = iStochastic(Symbol(),per,10,5,5,MODE_EMA,0,MODE_SIGNAL,3);



AC1 = iAC(Symbol(),per,1); 
AC2 = iAC(Symbol(),per,2); 
AC3 = iAC(Symbol(),per,3); 

if (OrdersTotal() <1) 
{ 
//Можно ждать сигнала на продажу 
if ((StoM2 > (StoM1 + AngleOpen)) && ((StoM1+DeltaOpen1) < StoS1) && ((StoM2-DeltaOpen) > StoS2) && ((StoM3-DeltaOpen) > StoS3) && ((AC1 < AC2)))
{ 
//Есть пересечение 
OrderSend(Symbol(),OP_SELL,MathMax(0.1,MathFloor(AccountFreeMargin()/500)/10),Ask+DeltaLimit*Point,slippage, Ask+StopLoss*Point+DeltaLimit*Point, Bid-TakeProfit*Point+DeltaLimit*Point,"Sell",0,0,Blue); 
//SetOrder(OP_SELLLIMIT,Lots,Ask+DeltaLimit*Point,Slippage, Ask+StopLoss*Point+DeltaLimit*Point, Bid-TakeProfit*Point+DeltaLimit*Point,Blue); 
Alert("Sell - ",Symbol(),"\n","Date - ",TimeToStr(CurTime()),"\n","Balance - ",AccountBalance()); 

} 

//Можно ждать сигнала на продажу 
if ((StoM2 < StoM1 - AngleOpen) && (StoM1-DeltaOpen1 > StoS1) && (StoM2+DeltaOpen < StoS2) && (StoM3+DeltaOpen < StoS3) && ((AC1 > AC2))) 
{ 
//Есть пересечение 
OrderSend(Symbol(),OP_BUY,MathMax(0.1,MathFloor(AccountFreeMargin()/500)/10),Bid-DeltaLimit*Point,slippage, Bid-StopLoss*Point-DeltaLimit*Point, Ask+TakeProfit*Point-DeltaLimit*Point,"Buy",0,0,Red); 
//SetOrder(OP_BUYLIMIT,Lots,Bid-DeltaLimit*Point,Slippage, Bid-StopLoss*Point-DeltaLimit*Point, Ask+TakeProfit*Point-DeltaLimit*Point,Red); 
Alert("Buy - ",Symbol(),"\n","Date - ",TimeToStr(CurTime()),"\n","Balance - ",AccountBalance()); 

} 
return(0);
}// конец блока покупки 

StoM0 = iStochastic(Symbol(),per,10,5,5,MODE_EMA,0,MODE_MAIN,0);
StoS1 = iStochastic(Symbol(),per,10,5,5,MODE_EMA,0,MODE_SIGNAL,0);

// перемещение отложенных позиций и стоплосов по открытым позициям 
for (cnt=1; cnt<OrdersTotal(); cnt++) // начало цикла переборки позиций из окна торговли 
{ 
 OrderSelect(cnt, SELECT_BY_POS);
if (OrderSymbol()==Symbol()) 
{ 
if (OrderType()==OP_BUY)  /* Длинная позиция */ 
{ 
if ((Bid-OrderOpenPrice())>(15*Point) && OrderStopLoss()<OrderOpenPrice()) 
{ 

OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()+5*Point,OrderTakeProfit(),Pink);
 /* дело сделали - выходим. */ 
} 
if ((Bid-OrderOpenPrice())>(TrailingStop*Point))
{ 
/* да, позиция имеет прибыль больше чем значение трейлинг стопа 
(например 30 пунктов). теперь надо проверить, можно ли 
поставить стоп лучше чем он был ранее? */ 
if (OrderStopLoss()<(Bid-TrailingStop*Point)) 
{ 
/* меняем стоплосс на уровень Bid-Trailing Stop */ 
OrderModify(OrderTicket(),OrderOpenPrice(), 
Bid-TrailingStop*Point,OrderTakeProfit(),Pink); 
} 
return(0);
//Exit; /* дело сделали - выходим. */ 

} 
if (/*(Close[1] < AlligatorHigh) or*/ (StoM1+DeltaClose < StoM2))
{ 
OrderClose(OrderTicket(),OrderLots( ) ,Bid,slippage,Green); 
//Alert("Balance - ",Balance,"\n","FreeMargin - ",FreeMargin,"\n","Margin - ",Margin,"\n","TotalProfit - ",TotalProfit); 
Alert("Balance - ",AccountBalance(),"\n","FreeMargin - ",AccountFreeMargin(),"\n","Margin - ",AccountMargin(),"\n","TotalProfit - ",AccountProfit()); 
} 
//Exit; 
return(0);
} 

if (OrderType()==OP_SELL) /*Короткая позиция */ 
{ 
if (((OrderOpenPrice() - Ask)>(15*Point)) && OrderStopLoss()>OrderOpenPrice()) 
{ 
OrderModify(OrderTicket(),OrderOpenPrice(), 
OrderOpenPrice()-5*Point,OrderTakeProfit(),Pink); 
//Exit; /* дело сделали - выходим. */ 
return(0);
} 
/* сначала проверим - есть ли профит у этой сделки больше чем 
уровень трейлинг стопа? проверяем Ask, так как позиция SELL */ 
if ((OrderOpenPrice()-Ask)>(TrailingStop*Point)) 
{ 
/* да, позиция имеет прибыль больше чем значение трейлинг стопа 
(например 30 пунктов). теперь надо проверить, можно ли 
поставить стоп лучше чем он был ранее? */ 
if (OrderStopLoss()>(Ask+TrailingStop*Point) || 
OrderStopLoss()==0 ) /* обязательное условие!!! */ 
{ 
/* меняем стоплосс на уровень Ask+Trailing Stop */ 
OrderModify(OrderTicket(),OrderOpenPrice(), 
Ask+TrailingStop*Point,OrderTakeProfit(),Pink); 
} 
return(0);
} 
if (/*(Close[1] > AlligatorLow) ||*/ (StoM1-DeltaClose > StoM2) )
{ 
OrderClose(OrderTicket(),OrderLots(),Ask,slippage,Green); 
Alert("Balance - ",AccountBalance(),"\n","FreeMargin - ",AccountFreeMargin(),"\n","Margin - ",AccountMargin(),"\n","TotalProfit - ",AccountProfit()); 
} 
return(0);
}/* концовка короткой позиции */ 
} 
} // конец цикла переборки позиций из окна торговли 
  
  
  
   return(0);
  }