//+------------------------------------------------------------------+ //| Stochastic.mq4 | //| Copyright © 2005, MetaQuotes Software Corp. | //| http://www.metaquotes.net | //+------------------------------------------------------------------+ #property copyright "Copyright © 2005, MetaQuotes Software Corp." #property link "http://www.metaquotes.net" //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ 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; // начало блока покупки //if (OrdersTotal() < 1) //{ //if ((Period() < 60) || (Minute() != 0) || (AccountFreeMargin() < 100)) // (Mod(Minute,15) > 0) then //Не торговать на маленьких периодах и в интервале //return(0); //} 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(15*Point) && OrderStopLoss()(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); } //+------------------------------------------------------------------+