//+------------------------------------------------------------------+ //| grid_6_symbols.mq4 | //| Copyright © 2015, Vladimir Hlystov | //| cmillion@narod.ru | //+------------------------------------------------------------------+ #property copyright "Copyright © 2015, Vladimir Hlystov" #property link "cmillion@narod.ru" #property strict #property description "Советник выставляет сети из стоп ордеров по указанным парам" #property description "Как только суммарный профит по всем позициям превысит указанный уровень," #property description "советник закрывает все и по новой переоткрывает сети" //--- extern string Symbol1 = "EURUSD"; extern string Symbol2 = "GBPUSD"; extern string Symbol3 = "EURJPY"; extern string Symbol4 = ""; extern string Symbol5 = ""; extern string Symbol6 = ""; //--- extern int sleep = 300; // Задержка после закрытия в секундах extern int Step = 100; // Шаг между ордерами //--- При достижении прибыли NoLoss + MinProfitNL (измеряется в пунктах) стоп-лосс переносим на цену открытия ордера плюс минус MinProfitNL extern int NoLoss=150; // Безубыток (расстояние от СЛ до цены) extern int MinProfitNL=20; // Минимальная прибыль безубытка //--- extern int Orders=3; // Кол-во отложенных extern double Lot = 0.01; extern double Profit = 0.5; extern int Magic = 123; //------------------------------- string val,symbol[6]; int n=0,digits[6]; double point[6]; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int OnInit() { val=" "+AccountCurrency(); n=0; if(MarketInfo(Symbol1,MODE_TRADEALLOWED)==1&&Symbol1 != "") {symbol[n] = Symbol1; point[n] = MarketInfo(symbol[n],MODE_POINT); digits[n] = (int)MarketInfo(symbol[n],MODE_DIGITS); n++;} if(MarketInfo(Symbol2,MODE_TRADEALLOWED)==1&&Symbol2 != "") {symbol[n] = Symbol2; point[n] = MarketInfo(symbol[n],MODE_POINT); digits[n] = (int)MarketInfo(symbol[n],MODE_DIGITS); n++;} if(MarketInfo(Symbol3,MODE_TRADEALLOWED)==1&&Symbol3 != "") {symbol[n] = Symbol3; point[n] = MarketInfo(symbol[n],MODE_POINT); digits[n] = (int)MarketInfo(symbol[n],MODE_DIGITS); n++;} if(MarketInfo(Symbol4,MODE_TRADEALLOWED)==1&&Symbol4 != "") {symbol[n] = Symbol4; point[n] = MarketInfo(symbol[n],MODE_POINT); digits[n] = (int)MarketInfo(symbol[n],MODE_DIGITS); n++;} if(MarketInfo(Symbol5,MODE_TRADEALLOWED)==1&&Symbol5 != "") {symbol[n] = Symbol5; point[n] = MarketInfo(symbol[n],MODE_POINT); digits[n] = (int)MarketInfo(symbol[n],MODE_DIGITS); n++;} if(MarketInfo(Symbol6,MODE_TRADEALLOWED)==1&&Symbol6 != "") {symbol[n] = Symbol6; point[n] = MarketInfo(symbol[n],MODE_POINT); digits[n] = (int)MarketInfo(symbol[n],MODE_DIGITS); n++;} //--- if(n==0 && IsTesting()) {symbol[0]=Symbol(); point[n]=MarketInfo(symbol[n],MODE_POINT); digits[n]=(int)MarketInfo(symbol[n],MODE_DIGITS);n=1;} // тестер //--- Comment("Торговля по ",n," сим"); return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ int S(string sym) { for(int i=0; i<6; i++) if(symbol[i] == sym) return(i); return(-1); } //+------------------------------------------------------------------+ void OnDeinit(const int reason) { if(!IsTesting()) ObjectsDeleteAll(); Comment(""); } //+------------------------------------------------------------------+ void OnTick() { if(n==0 || n>6) {Comment("Торги по выбранным парам запрещены"); return;} int OT,i,j,orders=0; double OSL,OOP,profit=0; double ProfitS[6]; ArrayInitialize(ProfitS,0); double MaxPrice[6],MinPrice[6]; ArrayInitialize(MaxPrice,0); ArrayInitialize(MinPrice,0); int bs[6],ss[6]; ArrayInitialize(bs,0); ArrayInitialize(ss,0); for(i=0; i=NormalizeDouble(OOP+(MinProfitNL+NoLoss)*point[j],digits[j]) && OSLOOP || MinPrice[j]==0) MinPrice[j]=OOP; if(MarketInfo(symbol[j],MODE_ASK)<=NormalizeDouble(OOP -(MinProfitNL+NoLoss)*point[j],digits[j]) &&(OSL==0|| OSL>NormalizeDouble(OOP-MinProfitNL*point[j],digits[j]))) { if(!OrderModify(OrderTicket(),OOP,NormalizeDouble(OOP-MinProfitNL*point[j],digits[j]),OrderTakeProfit(),0,White)) Print(symbol[j]," NoLoss Error ",GetLastError()," order ",OrderTicket()," SL ",DoubleToStr(OOP+MinProfitNL*point[j],digits[j])); } } if(OT==OP_BUYSTOP) { if(MaxPrice[j]OOP || MinPrice[j]==0) MinPrice[j]=OOP; ss[j]++; } } } } } if(sleep>0 && orders==0) { for(i=OrdersHistoryTotal()-1; i>=0; i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) { if(OrderMagicNumber()==Magic) { if(S(OrderSymbol())!=-1) if(TimeCurrent()-OrderCloseTime()NormalizeDouble(MarketInfo(symbol[i],MODE_BID)-MarketInfo(symbol[i],MODE_STOPLEVEL)*point[i],digits[i])) price=NormalizeDouble(MarketInfo(symbol[i],MODE_BID)-MarketInfo(symbol[i],MODE_STOPLEVEL)*point[i],digits[i]); if(OrderSend(symbol[i],OP_SELLSTOP,Lot,price,30,0,0,"GRID ",Magic,0,CLR_NONE)==-1) Comment("OrderSend ",symbol[i]," Error ",GetLastError()); } RefreshRates(); } //--- if(profit>Profit) DeleteAllOrders(); //--- DrawLABEL("Balance",StringConcatenate("Balance ",DoubleToStr(AccountBalance(),2),val),5,35,Lime); DrawLABEL("Equity",StringConcatenate("Equity ",DoubleToStr(AccountEquity(),2),val),5,55,Lime); DrawLABEL("FreeMargin",StringConcatenate("FreeMargin ",DoubleToStr(AccountFreeMargin(),2),val),5,75,Lime); for(i=0; i=0; i--) { if(OrderSelect(i,SELECT_BY_POS)) { if(OrderMagicNumber()==Magic) { j=S(OrderSymbol()); if(j!=-1) { int OT=OrderType(); int Ticket=OrderTicket(); if(OT==OP_BUY) { error=OrderClose(Ticket,OrderLots(),NormalizeDouble(MarketInfo(symbol[j],MODE_BID),digits[j]),50,clrNONE); } if(OT==OP_SELL) { error=OrderClose(Ticket,OrderLots(),NormalizeDouble(MarketInfo(symbol[j],MODE_ASK),digits[j]),50,clrNONE); } if(OT>1) if(!OrderDelete(Ticket)) Comment("Ордер ",Ticket," ошибка удаления ",GetLastError()); //--- if(!error) { int err=GetLastError(); if(err<2) continue; if(err==129) { Comment("Неправильная цена ",TimeToStr(TimeCurrent(),TIME_SECONDS)); Sleep(500); RefreshRates(); continue; } if(err==146) { j++; if(IsTradeContextBusy()) Sleep(500); RefreshRates(); continue; } } } } } } int k=0; for(j= 0; j10) break; Sleep(500); RefreshRates(); } } //-------------------------------