#property copyright "Copyright © 2011 zvp.1976@gmail.com" #property link "zvp.1976@gmail.com" #include // ========================================================================================================================================================================================================== extern string Indicator_=" Настройки индикатора"; extern int MA_PER = 350; extern int BOL_PER = 20; extern double BOL_DEV = 2; extern int MAX_HOUR_WAIT = 4; extern bool EquityStop=False; extern double EquityProcentClose=1.5; extern string trade_="Настройки торговли"; extern int Magic=777; // Магический номер extern int Slippage=20; // Проскальзывание extern int StopOrderDelta=25; // Дистанция для отложенных ордеров extern double Lots=0.05; // Фиксирвоанный лот extern double LossProcent=0; // Закрыть самую убыточную если процент убытков по всем позициям больше указанного extern bool allowtest=true; datetime PrevTime,DeltaTime; int timeCheckSignal=0; // Время открытия позиции double sl,tp,TakeProfit,StopLoss; double UpLine[]; double DownLine[]; double AverLine[],psar[]; double MA[],MA_2[]; double ktp,ksl; double minsl,minstep,sprd,minlot,maxlot; // ========================================================================================================================================================================================================== int start() { string s0; double MN_CL_DIF,ktp1,ktp2,ksl1,ksl2; double curprof, minprof,sprd,psar1,pricein,pricein1; int Signal,answ; int curtime; Sleep(2000); Signal=0; curprof =CalculateProfit(); if (curprof<0&&LossProcent>0) if (MathAbs(curprof)>=(LossProcent*AccountBalance()/100)) { answ = CloseMaxLoss(); } if (EquityStop) if (curprof>=(EquityProcentClose*AccountBalance()/100)) { CloseThisSymbolAll(); } for (int i=0;i<=2;i++) { UpLine[i]=iBands(Symbol(),0,BOL_PER,BOL_DEV,0,0,MODE_UPPER,i); DownLine[i]=iBands(Symbol(),0,BOL_PER,BOL_DEV,0,0,MODE_LOWER,i); AverLine[i]=iBands(Symbol(),0,BOL_PER,BOL_DEV,0,0,0,i); MA[i]=iMA(Symbol(),0,MA_PER,0,0,0,i); MA_2[i]=iMA(Symbol(),0,MA_PER/2,0,0,0,i); psar[i]=iSAR(Symbol(),0,0.02,0.2,1); } ktp1=MathMax(DownLine[2],DownLine[1])/MathMin(DownLine[2],DownLine[1]); ktp2=MathMax(UpLine[2],UpLine[1])/MathMin(UpLine[2],UpLine[1]); ktp=MathMax(ktp1,ktp2); ksl1=1/ktp1; ksl2=1/ktp2; ksl=MathMin(ksl1,ksl2); MN_CL_DIF=MathMin(UpLine[1],UpLine[2])-MathMax(AverLine[1],AverLine[2]); TakeProfit =(MathMax(UpLine[1],UpLine[2])-MathMin(DownLine[2],DownLine[1]))*ktp/Point; StopLoss = MathAbs(MN_CL_DIF*ksl/Point); /* Здесь указываем условие для индикатора, при котором мы будем продавать*/ if (UpLine[2]>=MA[2]&&UpLine[1]<=MA[1]&&(AverLine[2]-AverLine[1]>sprd)) if (UpLine[2]-MA[2]+MA[1]-UpLine[1]>=sprd&&(MA[2]-MA[1]>=sprd/2||MA_2[1]AverLine[1]) pricein =(Low[1]+Low[2])/2-2*sprd; else pricein =psar1; Signal=2; } /* Здесь указываем условие для индикатора, при котором мы будем покупать*/ if (DownLine[1]>=MA[1]&&DownLine[2]<=MA[2]&&(AverLine[1]-AverLine[2]>sprd)) if (DownLine[1]-MA[1]+MA[2]-DownLine[2]>=sprd&&(MA[1]-MA[2]>=sprd/2||MA_2[2]0) { //+------------------------------------------------------------------+ // Если сигнал на бай: //+------------------------------------------------------------------+ if(Signal==1)// buy { //Вычисляем цену входа pricein1 = Ask+StopOrderDelta*Point; //Вычисляем стоплосс if(StopLoss!=0)sl=Bid+StopOrderDelta*Point-StopLoss*Point; else sl=0; // ВЫчисляем тейкпрофит if(TakeProfit!=0)tp=pricein1+TakeProfit*Point; else tp=0; //Открываем Ордер i=SetOrder(Symbol(),OP_BUYSTOP,GetSizeLot(),pricein,sl,tp,Magic,Time[0]+MAX_HOUR_WAIT*60*60,"buy"); if (i>0)PrevTime=iTime(Symbol(),1,0); } //+------------------------------------------------------------------+ // Если сигнал на селл: //+------------------------------------------------------------------+ if(Signal==2)// селл { //Вычисляем цену входа pricein1 = Bid-StopOrderDelta*Point; //Вычисляем стоплосс if(StopLoss!=0)sl=Ask-StopOrderDelta*Point+StopLoss*Point; else sl=0; // ВЫчисляем тейкпрофит if(TakeProfit!=0)tp=pricein1-TakeProfit*Point; else tp=0; //Открываем Ордер i= SetOrder(Symbol(),OP_SELLSTOP,GetSizeLot(),pricein,sl,tp,Magic,Time[0]+MAX_HOUR_WAIT*60*60,"sell"); if (i>0)PrevTime=iTime(Symbol(),1,0); } } return(0); } // ========================================================================================================================================================================================================== //+------------------------------------------------------------------+ //| Установка отложенного ордера | //+------------------------------------------------------------------+ //+----------------------------------------------------------------------------+ //| Параметры: | //| sy - наименование инструмента (NULL или "" - текущий символ) | //| op - операция | //| ll - лот | //| pp - цена | //| sl - уровень стоп | //| tp - уровень тейк | //| mn - Magic Number | //| ex - Срок истечения | //+----------------------------------------------------------------------------+ int SetOrder(string sy,int op,double ll,double pp, double sl=0,double tp=0,int mn=0,datetime ex=0,string lsComm="") { color clOpen; datetime ot; double pa,pb,mp; int err,it,ticket,msl; if(sy=="" || sy=="0") sy=Symbol(); msl=MarketInfo(sy,MODE_STOPLEVEL); if(ex>0 && ex0) { return(ticket); break; } else { err=GetLastError(); if(err==128 || err==142 || err==143) { Sleep(1000*66); continue; } mp=MarketInfo(sy, MODE_POINT); pa=MarketInfo(sy, MODE_ASK); pb=MarketInfo(sy, MODE_BID); if(pa==0 && pb==0) Comment("SetOrder(): Проверьте в обзоре рынка наличие символа "+sy); // Неправильные стопы if(err==130) { switch(op) { case OP_BUYLIMIT: if(pp>pa-msl*mp) pp=pa-msl*mp; if(sl>pp-(msl+1)*mp) sl=pp-(msl+1)*mp; if(tp>0 && tppp-(msl+1)*mp) sl=pp-(msl+1)*mp; if(tp>0 && tp0 && slpp-(msl+1)*mp) tp=pp-(msl+1)*mp; break; case OP_SELLSTOP: if(pp>pb-msl*mp) pp=pb-msl*mp; if(sl>0 && slpp-(msl+1)*mp) tp=pp-(msl+1)*mp; break; } Print("SetOrder(): Скорректированы ценовые уровни"+sy+"--op-"+op+"--ll-"+ll+"--pp-"+pp+"---"+Slippage+"--sl-"+sl+"--tp-"+tp+"---"+lsComm+"---"+mn+"---"+ex+"---"+clOpen); } // Блокировка работы советника if(err==2 || err==64 || err==65 || err==133) { break; } // Длительная пауза if(err==4 || err==131 || err==132) { Sleep(1000*300); break; } // Слишком частые запросы (8) или слишком много запросов (141) if(err==8 || err==141) Sleep(1000*100); if(err==139 || err==140 || err==148) break; // Ожидание освобождения подсистемы торговли if(err==146) while(IsTradeContextBusy()) Sleep(1000*11); // Обнуление даты истечения if(err==147) { ex=0; continue; } if(err!=135 && err!=138) Sleep(1000*7.7); } } } //+------------------------------------------------------------------+ //| Автолот | //+------------------------------------------------------------------+ double GetSizeLot(double ll=1) //Функция возвращает значение лотов, { double MinLots=MarketInfo(Symbol(),MODE_MINLOT); double MaxLots=MarketInfo(Symbol(),MODE_MAXLOT); double Lot2=Lots; if(Lot2 < MinLots) Lot2 = MinLots; if(Lot2 > MaxLots) Lot2 = MaxLots; return(NormalizeDouble(Lot2,2)); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- sprd=NormalizeDouble(MarketInfo(Symbol(),MODE_SPREAD)*Point,Digits); minsl= MarketInfo(Symbol(),MODE_STOPLEVEL); minstep=MarketInfo(Symbol(),MODE_LOTSTEP); minlot= MarketInfo(Symbol(),MODE_MINLOT); maxlot=MarketInfo(Symbol(),MODE_MAXLOT); Stamp(); //---- return(0); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void Stamp() { ArrayResize(UpLine,3); ArrayResize(DownLine,3); ArrayResize(AverLine,3); ArrayResize(MA,3); ArrayResize(MA_2,3); ArrayResize(psar,3); Magic=Magic*Period(); } //+------------------------------------------------------------------+ double CalculateProfit() { double Profit = 0; for (int cnt = OrdersTotal() - 1; cnt >= 0; cnt--) { if (OrderSelect(cnt, SELECT_BY_POS)==true) { if (OrderSymbol() != Symbol() || OrderMagicNumber() != Magic) continue; if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic) if (OrderType() == OP_BUY || OrderType() == OP_SELL) Profit += OrderProfit(); } } return (Profit); } void CloseThisSymbolAll() { for (int trade = OrdersTotal() - 1; trade >= 0; trade--) { OrderSelect(trade, SELECT_BY_POS, MODE_TRADES); if (OrderSymbol() == Symbol()) { if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic) { if (OrderType() == OP_BUY) OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, Blue); if (OrderType() == OP_SELL) OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, Red); } Sleep(1000); } } } int CloseMaxLoss() { double Profit_1 = 0; int answ, ticket; for (int cnt = OrdersTotal() - 1; cnt >= 0; cnt--) { if (OrderSelect(cnt, SELECT_BY_POS)== True) { if (OrderSymbol() != Symbol() || OrderMagicNumber() != Magic) continue; if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic) if (OrderType() == OP_BUY || OrderType() == OP_SELL) if (OrderProfit()<0&&Profit_1>OrderProfit()) { Profit_1 = OrderProfit(); ticket = OrderTicket(); } } } if (ticket>0) { Print("TICK = ", ticket, " : PROF = ",Profit_1); if (OrderSelect(ticket, SELECT_BY_TICKET)== True) { if (OrderType() == OP_BUY) answ = OrderClose(ticket, Lots, Bid, Slippage, Blue); if (OrderType() == OP_SELL) answ =OrderClose(ticket, Lots, Ask, Slippage, Red); } } Sleep(2000); return (answ); }