//+------------------------------------------------------------------+ //| Scalp-M15.mq4 | //| Modified by Jazz. | //| http://www.metaquotes.net/ | //| версия 2.4 | //| - Добавлен контроль лота на допустимый размер | //| (чтоб no money не получить ) | //| версия 2.3 | //| - изменен ММ: теперь размер лота изменяется по след. алгоритму:| //| начинается торговля с лотом = mlot, после каждой успешной | //| сделки лот уменьшается вдвое до минимального = 0.1, | //| если встретилась проигравшая сделка лот ставится по | //| мартингейлу для того, что бы следующая восполнила убыток | //| (при успехе разумеется :)) или = mlot, если по МГ получилось | //| меньше чем mlot | //| - Добавлена задержка = !!!3 дня!!! после неуспешной сделки, это| //| зачастую позволяет избежать получения второго лося подряд | //| - Исправлен код, отвечающий за удаление несработавших ордеров | //| (теперь работает :)) | //| - Добавлен параметр UseMG включающий использование ММ | //| - Теперь экперт подчищает чарт за собой | //+------------------------------------------------------------------+ #include #property show_inputs #property copyright "Jazz, Tartan" extern double TakeProfit = 15; extern double StopLoss = 100; extern double Lots = 1.0; extern double TrailingStop = 10; extern int per=14; extern int mgod=2005; extern int ttime=60; extern int m1=0; extern int zap=15; extern int msec=45; extern int Pause=450; extern double mlot=1.0; extern bool UseMG=true; // использовать тактику мартингейла для компенсации лосей double canal,ob,os,dl,dh,lb,b,s,oppr,porog,hod,MidLine,MaxH,MinL,MaxPr,ls; double lbsig,ssig,bsig,lssig,pb=200,ps, ord_lot; datetime ctm1; string MaxHi="lime"; string MinLow="ww",MidLin="ee"; int korl,korh,blok,i,reg=1,j,MinPr,blokd,Prec=4,k,cmd,cmd1,h; bool isHedj=false; //+------------------------------------------------------------------+ int deinit(){ ObjectsDeleteAll(WindowOnDropped()); return(0); } //+------------------------------------------------------------------+ int init(){ return(0); } //+------------------------------------------------------------------+ int start() { double price,stl; int cnt,i,ticket; string arrup,arrdown; datetime ctm; if(mgod!=Year()) return(0); if(m1==Minute() && msec<=Seconds() && j==0) j=j+1; //---------------------------------------Подсчет открытых позиций---------------- b=0;s=0;ob=0;os=0;ls=0;lb=0; for (cnt=0;cnt0) {blok=1;blokd=1;} if ((s+b+os+ob+ls+lb)==0) {//Print((s+b+os+ob+ls+lb),"+",h); h=0; for (cnt=0;cnt=0;i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Error in history!"); break; } if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL || OrderMagicNumber() > 2) continue; // это отложеный ордер //---- if(OrderProfit()>0) { ord_lot = NormalizeDouble(OrderLots()/2,1); if (ord_lot<0.1) ord_lot=0.1; break; } if(OrderProfit()<0 && OrderClosePrice() == OrderStopLoss()) { ord_lot = OrderLots()*MathRound(StopLoss/TakeProfit); if (ord_lot < mlot) ord_lot=mlot; if (ord_lot > NormalizeDouble(AccountFreeMargin()/1000.0,1)) ord_lot = NormalizeDouble(AccountFreeMargin()/1000.0,1); break; } } } if (StringSubstr(Symbol(),3,3) == "USD"){ //Print("USD не основная валюта! Проверим лот."); if (ord_lot > NormalizeDouble(AccountFreeMargin()/1000.0/Bid,1)) ord_lot = NormalizeDouble(AccountFreeMargin()/1000.0/Bid,1); //Print("Лот=",ord_lot); } //-----------------------------------------------MiniMax Setting------------------------------------------------ MaxH=High[per];MinL=Low[per]; for (cnt=0;cntLow[cnt]) MinL=Low[cnt]; } MidLine=NormalizeDouble((MaxH+MinL)/2,Prec); ObjectMove("MaxHi",OBJ_HLINE,CurTime(),MaxH); ObjectMove("MinLow",OBJ_HLINE,CurTime(),MinL); ObjectMove("MidLine",OBJ_HLINE,CurTime(),MidLine); canal=MathRound((MaxH-MinL)/Point); ObjectCreate(MaxHi, OBJ_HLINE, 0, Time[0], MaxH); ObjectsRedraw(); ObjectCreate(MinLow, OBJ_HLINE, 0, Time[0], MinL); ObjectsRedraw(); ObjectCreate(MidLin, OBJ_HLINE, 0, Time[0],MidLine); ObjectsRedraw(); ObjectSet(MaxHi, OBJPROP_PRICE1,MaxH); ObjectsRedraw(); ObjectSet(MinLow, OBJPROP_PRICE1,MinL); ObjectsRedraw(); ObjectSet(MidLin, OBJPROP_PRICE1,MidLine); ObjectsRedraw(); //Comment("ps - ",ps," pb - ",pb,"\nos - ",os," ob - ",ob); if(os==1 && ((oppr-MidLine)/Point)>=5) reg=0; if(ob==1 && ((oppr-MidLine)/Point)<=-5) reg=0; if((os+ob)==0 && (s+b)==0 && canal<30) return(0); if(MidLineoppr && ssig==1) reg=1; if(MidLine>oppr && bsig==1) reg=0; if(mlot==0.1) { if(reg==0) porog=canal/10; else porog=5; if(canal<50) porog=canal/10; porog=MathRound(porog); } if (mlot==1.0) { if (reg==0) porog=canal; else porog=50; if (canal<50) porog=canal; } //------------------------------------Определение ходовых параметров пары--------------------------------- hod=(Open[3]-Close[3]+Open[2]-Close[2]+Open[1]-Close[1]+Open[0]-Close[0])/Point; if ((MidLine-Close[0])/Point<-5) korh=1; else korh=0; if ((MidLine-Close[0])/Point>5) korl=1;else korl=0; //---------------------------------------------Снятие сливок---------------------------------------------- //if((CurTime()-OrderCloseTime())<15) return(0); if ((s+b+os+ob+ls+lb)>0) {MaxPr=0; MinPr=0;} if(( b+s)>0 && TrailingStop==0 && h==0) { for (cnt=0;cntMaxPr) MaxPr=OrderProfit(); //if (OrderProfit()porog||stl>=50*Point) { OrderClose(OrderTicket(),OrderLots(),price,5,Violet); // close position return(0); } } } } if ((ob+os)==0 && (b+s)==0 && (ls+lb)==0 && Hour()!=0){blok=0; oppr=0; blokd=0;} if ((os+ob)>0) {blok=1;blokd=1;} if (((MathAbs(oppr-Close[0]))/Point)>=15) blokd=0; if (j>0) { blokd=0;j=0;} else blokd=1; if (blokd==0) { for (cnt=OrdersTotal()-1;cnt>=0;cnt--) { if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES)==false) { Print("Error in OrderSelect!"); break; } if (OrderType()==OP_BUYSTOP && OrderSymbol()==Symbol()) OrderDelete(OrderTicket()); if (OrderType()==OP_SELLSTOP && OrderSymbol()==Symbol()) OrderDelete(OrderTicket()); } } //-----------------------------------------------Indicators Setting-------------------------------------------- ssig=0;bsig=0; if ((s+b+os+ob+ls+lb)>0){korh=0;korl=0;} if (korh==1 && hod>0) {ssig=1;SetIndexArrow(0,242);} if ((MaxH-Close[0])>10*Point) { if (korh==1 && hod<=-5) {bsig=1;SetIndexArrow(0,241);} } else { if (korh==1 && hod<=-5) {ssig=1;SetIndexArrow(0,242);} } if (korl==1 && hod<0) {bsig=1;SetIndexArrow(0,241);} if ((Close[0]-MinL)>10*Point) { if (korl==1 && hod>=5){ssig=1;SetIndexArrow(0,242);} } else { if (korh==1 && hod>=5) {bsig=1;SetIndexArrow(0,241);} } Comment("Data: ",Year(),".",Month(),".",Day()," Time ",Hour(),":",Minute()," MidLine=",(MaxH+MinL)/2," MaxPr: ",MaxPr, " MinPr=",MinPr," Blok=",blok," TInd=",j," Reg=",reg,"\n","StoProfit=",porog," Canal=",canal, " Profit=",MathRound(OrderProfit())," Hod=",hod," KorL=",korl," KorH=",korh," DBlok=",blokd," OrdPrice=",oppr); //-------------------------------------------------Open Positions--------------------------------------------- if ((ob+os+lb+ls)==0) blok=0; if (blok==0) { int t = ttime; for(i=HistoryTotal()-1;i>=0;i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Error in history!"); break; } if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL || OrderMagicNumber() > 2) continue; // это отложеный ордер //---- if(OrderProfit()>0) break; if(OrderProfit()<0 && OrderClosePrice() == OrderStopLoss()) { t = 3600*72; // после лося выдержим паузу что бы не нарваться на еще одного break; } } if ((CurTime()-OrderCloseTime())Ask) { arrup=CharToStr(Time[0]); ObjectCreate(arrup, OBJ_ARROW, 0,Time[0],Low[0]-10*Point); ObjectSet(arrup,OBJPROP_ARROWCODE,241); ObjectSet(arrup,OBJPROP_COLOR,Blue); ticket=OrderSend(Symbol(),OP_BUYSTOP,ord_lot,Ask+zap*Point,5,Ask-StopLoss*Point+zap*Point,Ask+TakeProfit*Point+zap*Point,"Sculp_Buy",2,CurTime()+3600*6,Violet); pb=Ask; return(0); } } //----------------------------TrailingStop-------------------------- if ((b+s)>0 && TrailingStop>0) { for (cnt=0;cntTrailingStop*Point) { if(OrderStopLoss()Point*TrailingStop) { if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0)) { OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red); return(0); } } } } } //-------------------------Подтянем отложенные ордера-------------------- /*if((ob+os)>0) { for (cnt=0;cntAsk) { arrup=CharToStr(Time[0]); ObjectCreate(arrup, OBJ_ARROW, 0,Time[0],Low[0]-10*Point); ObjectSet(arrup,OBJPROP_ARROWCODE,241); ObjectSet(arrup,OBJPROP_COLOR,Blue); pb=Ask; OrderModify(OrderTicket(),Ask+zap*Point,0,0,0,Violet); OrderModify(OrderTicket(),Ask+zap*Point,Ask+zap*Point-StopLoss*Point,Ask+zap*Point+TakeProfit*Point,0,Violet); return(0); } } } }*/ return(0); }//---------End------------