//+---------------------------------------------------------------------------+ //| FractalScalp v7 | //| Copyright © 2010, Хлыстов Владимир | //|v0 Ставки при пробитии фракталов | //| перенос SL по уровню портфельного безубытка | //| перенос TP на уровень портфельного профита | //|v3 Удаление ордеров при большой просадке | //|v4 коэффициент мартингейла | //|v5 закрытие ордеров достигших общего профита и имеющих большое общее время | //|v7 фильтр времени работы советника <filter operating time advisor> | //|v7.2 ограничитель количества сделок в одном направлении | //|v7.3 добавлены 2 переменные: CloseProfit и OrdersCloseProfit | //| если общее кол-во ордеров больше OrdersCloseProfit, то все они | //| закрываются при достижении общего профита CloseProfit | //|v7.4 добавлен stoploss | //|---------------------------------------------------------------------------+ #property copyright "Copyright © 2010, Vladimir Hlystov" #property link "cmillion@narod.ru" //+------------------------------------------------------------------ extern double LOT = 0.01; //может быть любой, но если = 0 то лот рассчитывается автоматически по LOTrisk extern int LOTrisk = 5; //если LOT=0, то LOT=процент от депозита<if LOT = 0, LOT = percentage of the deposit> extern int Delta = 0; //отступ выставления отложенного ордера пунктов от фрактала<Indent nominations pending order items from the fractal> extern int stoploss = 0; //если=0, то SL отключен extern int takeprofit = 20 ; //TP extern double K_lot = 2.0; //Коэффициент увеличения лота<Zoom Ratio Lot> extern double Maxlot = 3.0; //ограничение максимального лота<limiting the maximum lot> extern int MaxRisk = 10; //закрывать ордера если лосс достиг MaxRisk процент от депозита<close the warrant if the loss has reached MaxRisk percentage of the deposit> //------------------------------------------------------------------- TrailingStop extern int TrailingStop = 0; //close the warrant if the loss has reached MaxRisk percentage of the deposit<close the warrant if the loss has reached MaxRisk percentage of the deposit> extern int Fr.or.Candl = 1; //если= 0, то трейлинг по фракталам <if = 0, then trailing by fractals> //если= 1, то трейлинг по свечам <if = 1, then trailing by candlelight> color WhiteColor = Silver;//цвет вывода информации <color output> extern int Magic = 0; extern bool DrawInfo = true; extern int AllTimeStopOrders = 50000;//закрытие ордеров достигших общего профита и имеющих большое общее время <closure orders reaching a total profit and having a great time overall> extern int RestDay_I = 0 , //weekday (0-Sunday,1,2,3,4,5,6) RestDay_II = 0 , //weekday (0-Sunday,1,2,3,4,5,6) TimeStart = 0 , TimeEnd = 20; extern int MaxOrders = 15; //ограничитель количества сделок в одном направлении extern double CloseProfit = 10.0; //если общее кол-во ордеров больше OrdersCloseProfit, то все они extern int OrdersCloseProfit = 10; //закрываются при достижении общего профита CloseProfit extern int MAperiod = 25; extern int MAmethod = 0; //SMA 0 Простое скользящее среднее, EMA 1 Экспоненциальное скользящее среднее, SMMA 2 Сглаженное скользящее среднее, LWMA 3 Линейно-взвешенное скользящее среднее //------------------------------------------------------------------- double MAXLOT,MinLot,TPb,TPs,SLb,SLs; int OkrLOT; double STOPLEVEL,lot_s,lot_b; double доход_SELL,доход_BUY; int TimeOllOpenBuy,TimeOllOpenSell,TimeBarSell,TimeBarBuy; //------------------------------------------------------------------- int init() { MinLot = MarketInfo(Symbol(),MODE_MINLOT); MAXLOT = MarketInfo(Symbol(),MODE_MAXLOT); if (Maxlot>MAXLOT) Maxlot = MAXLOT; if (MinLot==0.01) OkrLOT = 2; if (MinLot >0.01) OkrLOT = 1; if (MinLot >0.1 ) OkrLOT = 0; if (DrawInfo){ ObjectCreate("БАЛАНС", OBJ_LABEL, 0, 0, 0); ObjectSet("БАЛАНС", OBJPROP_CORNER, 1); ObjectSet("БАЛАНС", OBJPROP_XDISTANCE, 10 ); ObjectSet("БАЛАНС", OBJPROP_YDISTANCE, 25); ObjectCreate("доход", OBJ_LABEL, 0, 0, 0); ObjectSet("доход", OBJPROP_CORNER, 1); ObjectSet("доход", OBJPROP_XDISTANCE, 10 ); ObjectSet("доход", OBJPROP_YDISTANCE, 55); ObjectCreate("доходS", OBJ_LABEL, 0, 0, 0); ObjectSet("доходS", OBJPROP_CORNER, 1); ObjectSet("доходS", OBJPROP_XDISTANCE, 10 ); ObjectSet("доходS", OBJPROP_YDISTANCE, 35); ObjectCreate("доходB", OBJ_LABEL, 0, 0, 0); ObjectSet("доходB", OBJPROP_CORNER, 1); ObjectSet("доходB", OBJPROP_XDISTANCE, 10 ); ObjectSet("доходB", OBJPROP_YDISTANCE, 45); } return(0); } //------------------------------------------------------------------- int deinit() { return(0); } //------------------------------------------------------------------- int start() { double _ma=NormalizeDouble(iMA(NULL,0,MAperiod,0,MAmethod,PRICE_CLOSE,0), Digits); int H,L, error; string name,NameLine; int SPREAD = MarketInfo(Symbol(),MODE_SPREAD); //----------------------------------------------------------------------- время торговли int TekHour = Hour(); bool Trede; if ( TekHour >= TimeStart && TekHour < TimeEnd ) Trede=true; else {Trede=false;Comment("Торговля запрещена по времени","\nModify © 2011, Michelangelo®","\nwww.fxgeneral.com");} if (DayOfWeek()==RestDay_I||DayOfWeek()==RestDay_II) {Trede=false;Comment("Торговля запрещена в этот день недели","\nModify © 2011, Michelangelo®","\nwww.fxgeneral.com");} //----------------------------------------------------------------------- назначение лотов double Lot; MAXLOT = NormalizeDouble(AccountFreeMargin()/MarketInfo(Symbol(),MODE_MARGINREQUIRED)-MinLot,OkrLOT); if (MAXLOT<0) MAXLOT=0; if (MAXLOT>MarketInfo(Symbol(),MODE_MAXLOT)) MAXLOT=MarketInfo(Symbol(),MODE_MAXLOT); if (LOT!=0) { if (LOT>MAXLOT) { if (LOT<MinLot) Lot = 0; else Lot = MinLot; } else Lot = LOT; } else { Lot = NormalizeDouble(MAXLOT*LOTrisk/100,OkrLOT); } if (Lot<MinLot) Lot = MinLot; if (MAXLOT<MinLot) Lot = 0; //Comment("MAXLOT ",MAXLOT," MinLot ",MinLot," Lot ",Lot); //----------------------------------------------------------------------- STOPLEVEL=MarketInfo(Symbol(),MODE_STOPLEVEL); if (takeprofit<STOPLEVEL && takeprofit!= 0) takeprofit=STOPLEVEL; if (DrawInfo){ ObjectDelete("STOPLEVEL_Up"); ObjectCreate("STOPLEVEL_Up",OBJ_ARROW,0,Time[0],Ask+STOPLEVEL*Point,0,0,0,0); ObjectSet ("STOPLEVEL_Up",OBJPROP_ARROWCODE,4); ObjectSet ("STOPLEVEL_Up",OBJPROP_COLOR, Aqua); ObjectDelete("STOPLEVEL_Dn"); ObjectCreate("STOPLEVEL_Dn",OBJ_ARROW,0,Time[0],Bid-STOPLEVEL*Point,0,0,0,0); ObjectSet ("STOPLEVEL_Dn",OBJPROP_ARROWCODE,4); ObjectSet ("STOPLEVEL_Dn",OBJPROP_COLOR, DeepPink);} //----------------------------------------------------------------------- находим ближайший фракталы Fr double FrUp,FrDn; for (int i=3; i<300; i++) //находим ближайший верхний фрактал FrUp { FrUp = NormalizeDouble(iFractals(NULL,0,MODE_UPPER,i), Digits); if (FrUp!=0) {FrUp = FrUp+Delta*Point; if (Ask+STOPLEVEL*Point < FrUp) break;} FrUp=0; } for (i=3; i<300; i++) //находим ближайший нижний фрактал FrDn { FrDn = NormalizeDouble(iFractals(NULL,0,MODE_LOWER,i), Digits); if (FrDn!=0) {FrDn = FrDn-Delta*Point; if (Bid-STOPLEVEL*Point > FrDn) break;} FrDn=0; } //----------------------------------------------------------------------- проверка установленных стоп ордеров double StopOrderUp,StopOrderDn,price,MinBuyOrder=1000000000,MaxSellOrder,OldBuyOrder,OldSellOrder,OldBuyLot,OldSellLot; int TicketUp,TicketDn; TimeOllOpenBuy=0;TimeOllOpenSell=0; for (i=0; i<OrdersTotal(); i++) { if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true) { price = OrderOpenPrice(); if (Magic==OrderMagicNumber() && OrderSymbol()==Symbol()) { if (OrderType()==OP_BUYSTOP ) {StopOrderUp = price; TicketUp=OrderTicket();} if (OrderType()==OP_SELLSTOP) {StopOrderDn = price; TicketDn=OrderTicket();} if (OrderType()==OP_BUY ) { TimeOllOpenBuy = TimeOllOpenBuy + TimeCurrent()-OrderOpenTime(); if (MinBuyOrder > price) MinBuyOrder = price; OldBuyOrder=price; OldBuyLot=OrderLots(); if (DrawInfo&&!IsTesting()){ NameLine="ордер Bay "+OrderTicket();ObjectDelete(NameLine);ObjectDelete(NameLine+" з"); ObjectCreate(NameLine, OBJ_TREND, 0, OrderOpenTime(),price ,Time[0],Bid); ObjectSet(NameLine, OBJPROP_COLOR,LightSkyBlue); ObjectCreate(NameLine+" з",OBJ_ARROW,0,Time[0],Bid,0,0,0,0); ObjectSet(NameLine, OBJPROP_STYLE, STYLE_DOT);// Стиль ObjectSet(NameLine, OBJPROP_RAY, false); // Луч ObjectSet(NameLine+" з",OBJPROP_ARROWCODE,3);ObjectSet(NameLine+" з",OBJPROP_COLOR,WhiteColor);} } if (OrderType()==OP_SELL) { TimeOllOpenSell = TimeOllOpenSell + TimeCurrent()-OrderOpenTime(); if (MaxSellOrder < price) MaxSellOrder = price; OldSellOrder=price; OldSellLot=OrderLots(); if (DrawInfo&&!IsTesting()){ NameLine="ордер Sell "+OrderTicket();ObjectDelete(NameLine);ObjectDelete(NameLine+" з"); ObjectCreate(NameLine, OBJ_TREND, 0, OrderOpenTime(),price ,Time[0],Ask); ObjectSet(NameLine, OBJPROP_COLOR,Pink); ObjectCreate(NameLine+" з",OBJ_ARROW,0,Time[0],Ask,0,0,0,0); ObjectSet(NameLine, OBJPROP_STYLE, STYLE_DOT);// Стиль ObjectSet(NameLine, OBJPROP_RAY, false); // Луч ObjectSet(NameLine+" з",OBJPROP_ARROWCODE,3);ObjectSet(NameLine+" з",OBJPROP_COLOR,WhiteColor);} } } } } //----------------------------------------------------------------------- открытие и перемещение стоп ордеров double SL; //if (MinBuyOrder>FrUp)//разрешать добавлять ордера только против тренды if ((StopOrderUp - Point > FrUp || StopOrderUp==0) && FrUp!=0) //если ордер BuyStop выше верхнего фрактала, меняем его на новый { if (MathAbs(OldBuyOrder - FrUp)/Point>=SPREAD) //не открывать если уже открыт по этой цене { //Comment("открытие"); if (TicketUp!=0) { OrderDelete(TicketUp, Blue);Print("удаление ",TicketUp," StopOrderUp ",StopOrderUp," FrUp ",FrUp); Sleep(500); } if (OldBuyOrder!=0) { Lot = NormalizeDouble(OldBuyLot*K_lot,OkrLOT); if (Lot>Maxlot) Lot=Maxlot;//ограничение, задаваемое вручную } if (ORDERS( 1)<MaxOrders && Close[0]>_ma) { if (Lot!=0) { if (Trede&&TimeBarBuy!=Time[0]) { if (stoploss!=0) SL = NormalizeDouble(FrUp - stoploss* Point,Digits); else SL = 0; if (OrderSend(Symbol(),OP_BUYSTOP,Lot,NormalizeDouble(FrUp, Digits),3,SL,0,NULL,Magic,0,Blue)==-1) {error=GetLastError(); if (error!=146) Alert("Ошибка открытия BUYSTOP ",TxtERROR(error)," ",Symbol()," Тек.цена ",Ask," Lot ",Lot," FrUp ",FrUp);} else TimeBarBuy=Time[0]; } } else Comment(Symbol(),"BUYSTOP недостаточно средств Lot=",Lot," MAXLOT ",MAXLOT," MinLot ",MinLot); } } } //if (MaxSellOrder<FrDn)//разрешать добавлять ордера только против тренда if (StopOrderDn + Point< FrDn) //если ордер SellStop ниже нижнего фрактала, меняем его на новый { if (MathAbs(OldSellOrder - FrDn)/Point>=SPREAD) //не открывать если уже открыт по этой цене { if (TicketDn!=0) { OrderDelete(TicketDn, Red);Print("удаление ",TicketDn," StopOrderDn ",StopOrderDn," FrDn ",FrDn); Sleep(500); } if (OldSellOrder!=0) { Lot = NormalizeDouble(OldSellLot*K_lot,OkrLOT); if (Lot>Maxlot) Lot=Maxlot;//ограничение, задаваемое вручную } if (ORDERS(-1)<MaxOrders && Close[0]<_ma) { if (Lot!=0) { if (Trede&&TimeBarSell!=Time[0]) { if (stoploss!=0) SL = NormalizeDouble(FrDn + stoploss* Point,Digits); else SL = 0; if (OrderSend(Symbol(),OP_SELLSTOP,Lot,NormalizeDouble(FrDn, Digits),3,SL,0,NULL,Magic,0,Red)==-1) {error=GetLastError(); if (error!=146) Alert("Ошибка открытия SELLSTOP ",TxtERROR(error)," ",Symbol()," Тек.цена ",Bid," Lot ",Lot," FrDn ",FrDn);} else TimeBarSell=Time[0]; } } else Comment(Symbol()," SELLSTOP недостаточно средств Lot=",Lot," MAXLOT ",MAXLOT," MinLot ",MinLot); } } } //----------------------------------------------------------------------- TrailingStop(); TProfit(); // вычисление общего (портфельного) TP if (takeprofit!=0) TakeProfit(); //перенос профитов //-------------------------------------------------------- закрытие ордеров достигших общего профита и имеющих большое общее время //Comment("TimeOllOpenBuy ",TimeOllOpenBuy," TimeOllOpenSell ",TimeOllOpenSell); if (TimeOllOpenBuy+TimeOllOpenSell > AllTimeStopOrders && доход_SELL+доход_BUY > 0) CloseAllOrders(100); if (ORDERS(0) > OrdersCloseProfit && доход_SELL+доход_BUY>= CloseProfit) CloseAllOrders(100); } //-------------------------------------------------------------------- void TakeProfit() { int tip,Ticket,error; bool err; double OTP; for (int i=0; i<OrdersTotal(); i++) { if (OrderSelect(i, SELECT_BY_POS)==true) { tip = OrderType(); if (tip<2 && OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) { OTP = OrderTakeProfit(); Ticket = OrderTicket(); if (tip==OP_BUY && MathAbs(OTP - TPb)/Point>STOPLEVEL) { if (TPb > Ask+STOPLEVEL*Point && TPb > OTP) { err=OrderModify(Ticket,OrderOpenPrice(),OrderStopLoss(),TPb,0,White); Comment("TrailingStop ",Ticket," ",TimeToStr(TimeCurrent(),TIME_MINUTES)); Sleep(500); if (!err) {error=GetLastError();if (error!=146) Alert("Error order ",Ticket," TakeProfit ",TxtERROR(error)," ",Symbol()," TP ",TPb);} } } if (tip==OP_SELL && MathAbs(OTP - TPs)/Point>STOPLEVEL) { if (TPs < Bid-STOPLEVEL*Point && (TPs < OTP || OTP == 0)) { error=OrderModify(Ticket,OrderOpenPrice(),OrderStopLoss(),TPs,0,White); Comment("TrailingStop "+Ticket," ",TimeToStr(TimeCurrent(),TIME_MINUTES)); Sleep(500); if (!error) {error=GetLastError();if (error!=146) Alert("Error order ",Ticket," TakeProfit ",TxtERROR(error)," ",Symbol()," TP ",TPs);} } } } } } } //-------------------------------------------------------------------- void TrailingStop() { int tip,Ticket; bool error; double StLo,OSL,OOP,TP; for (int i=0; i<OrdersTotal(); i++) { if (OrderSelect(i, SELECT_BY_POS)==true) { tip = OrderType(); if (tip<2 && OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) { OSL = OrderStopLoss(); OOP = OrderOpenPrice(); Ticket = OrderTicket(); if (tip==OP_BUY) { StLo = NormalizeDouble(SlLastBar(1,Bid-STOPLEVEL*Point,Fr.or.Candl,TrailingStop),Digits); TP = OrderTakeProfit(); if (StLo > SLb && StLo<Bid-STOPLEVEL*Point) if (StLo > OSL && SLb!=0) { error=OrderModify(Ticket,OOP,NormalizeDouble(StLo,Digits),TP,0,White); Comment("TrailingStop ",Ticket," ",TimeToStr(TimeCurrent(),TIME_MINUTES)); Sleep(500); if (!error) Alert("Error order ",Ticket," TrailingStop ", TxtERROR(0)," ",Symbol()," SL ",StLo," TP ",TP); } } if (tip==OP_SELL) { StLo = NormalizeDouble(SlLastBar(-1,Ask+STOPLEVEL*Point,Fr.or.Candl,TrailingStop),Digits); if (StLo==0) continue; TP = OrderTakeProfit(); if (StLo < SLs && StLo>Ask+STOPLEVEL*Point) if (StLo < OSL || OSL==0) { error=OrderModify(Ticket,OOP,NormalizeDouble(StLo,Digits),TP,0,White); Comment("TrailingStop "+Ticket," ",TimeToStr(TimeCurrent(),TIME_MINUTES)); Sleep(500); if (!error) Alert("Error order ",Ticket," TrailingStop ", TxtERROR(0)," ",Symbol()," SL ",StLo," TP ",TP); } } } } } } //-------------------------------------------------------------------- double SlLastBar(int tip,double price, int tipFr, int tral) { double fr; int j; if (tral!=0) { if (tip==1) fr = Bid - tral*Point; else fr = Ask + tral*Point; } else { if (tipFr==0) { if (tip== 1) for (j=2; j<100; j++) { fr = iFractals(NULL,0,MODE_LOWER,j); if (fr!=0) {fr =fr - Delta*Point; if (price > fr) break;} else fr=0; } if (tip==-1) for (j=2; j<100; j++) { fr = iFractals(NULL,0,MODE_UPPER,j); if (fr!=0) {fr =fr + Delta*Point; if (price < fr) break;} else fr=0; } } else { if (tip== 1) for (j=1; j<100; j++) { fr = iLow(NULL,0,j); if (fr!=0) if (price > fr) break; else fr=0; } if (tip==-1) for (j=1; j<100; j++) { fr = iHigh(NULL,0,j); if (price < fr) break; else fr=0; } } } return(fr); } //-------------------------------------------------------------------- вычисление общего (портфельного) TP void TProfit() { if (takeprofit==0) return(0); int b,s; double price,price_b,price_s,lot,LOTmax; lot_s=0;lot_b=0;SLb=0;SLs=0;доход_SELL=0;доход_BUY=0; for (int i=0; i<OrdersTotal(); i++) { if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true) { if (Magic==OrderMagicNumber() && OrderSymbol()==Symbol()) { price = OrderOpenPrice(); lot = OrderLots(); if (OrderType()==OP_BUY ) {price_b = price_b+price*lot; b++; lot_b=lot_b+lot; доход_BUY = доход_BUY +OrderProfit();}//Bay if (OrderType()==OP_SELL) {price_s = price_s+price*lot; s++; lot_s=lot_s+lot; доход_SELL = доход_SELL +OrderProfit();}//Sell } } } //-------------------------------------- if (b==0) TPb=NormalizeDouble((Ask + takeprofit*Point),Digits); else TPb=NormalizeDouble((price_b/lot_b + takeprofit*Point),Digits); if (s==0) TPs=NormalizeDouble((Bid - takeprofit*Point),Digits); else TPs=NormalizeDouble((price_s/lot_s - takeprofit*Point),Digits); if (TPb<Ask+STOPLEVEL*Point) TPb=Ask+STOPLEVEL*Point; if (TPs>Bid-STOPLEVEL*Point) TPs=Bid-STOPLEVEL*Point; //-------------------------------------- if (DrawInfo){ObjectDelete("SLb");ObjectDelete("SLb_");} if (b!=0) { SLb = price_b/lot_b; if (DrawInfo){ ObjectCreate("SLb",OBJ_ARROW,0,Time[0],TPb,0,0,0,0); ObjectSet ("SLb",OBJPROP_ARROWCODE,6); ObjectSet ("SLb",OBJPROP_COLOR, Blue); ObjectCreate("SLb_",OBJ_ARROW,0,Time[0],SLb,0,0,0,0); ObjectSet ("SLb_",OBJPROP_ARROWCODE,6); ObjectSet ("SLb_",OBJPROP_COLOR, Navy);} } if (DrawInfo){ObjectDelete("SLs");ObjectDelete("SLs_");} if (s!=0) { SLs = price_s/lot_s; if (DrawInfo){ ObjectCreate("SLs",OBJ_ARROW,0,Time[0],TPs,0,0,0,0); ObjectSet ("SLs",OBJPROP_ARROWCODE,6); ObjectSet ("SLs",OBJPROP_COLOR, Red); ObjectCreate("SLs_",OBJ_ARROW,0,Time[0],SLs,0,0,0,0); ObjectSet ("SLs_",OBJPROP_ARROWCODE,6); ObjectSet ("SLs_",OBJPROP_COLOR, Maroon);} } //-------------- баланс double Balans = AccountBalance(); if (DrawInfo) {double доход=доход_BUY+доход_SELL; color TextColor=Green; ObjectSetText("БАЛАНС"," БАЛАНС = "+DoubleToStr(Balans,2)+" |своб "+DoubleToStr(AccountFreeMargin(),2)+" | "+DoubleToStr(MAXLOT,2)+" | "+WindowFirstVisibleBar(),8,"Arial",WhiteColor); if (доход<0) TextColor=Red; ObjectSetText("доход",StringConcatenate("Общий доход = ",DoubleToStr(доход,2)),8,"Arial",TextColor); if (доход_SELL<0) TextColor=Red; else TextColor=Green; ObjectSetText("доходS",StringConcatenate(s," SELL ",DoubleToStr(lot_s,OkrLOT)," лот доход = ",DoubleToStr(доход_SELL,2)," Т ",TimeOllOpenSell),8,"Arial",TextColor); if (доход_BUY<0) TextColor=Red; else TextColor=Green; ObjectSetText("доходB",StringConcatenate(b," BUY ",DoubleToStr(lot_b,OkrLOT)," лот доход = ",DoubleToStr(доход_BUY ,2)," Т ",TimeOllOpenBuy),8,"Arial",TextColor);} if (-(доход_BUY+доход_SELL) > (Balans*MaxRisk/100)) CloseAllOrders(100); /* if (-доход_BUY > (Balans*MaxRisk/100)) CloseAllOrders(OP_BUY); if (-доход_SELL > (Balans*MaxRisk/100)) CloseAllOrders(OP_SELL);*/ } //-------------------------------------------------------------------- string TxtERROR(int e) { if (e==0) e = GetLastError(); switch ( e ) { case 0: return; case 1: return; case 2: return("Общая ошибка "); case 3: return("неправильные параметры "); case 6: return("Нет связи с торговым сервером "); case 130: return("Неправильные стопы "); case 131: return("Неправильный объем "); case 133: return("Торговля запрещена "); case 134: return("Недостаточно денег "); case 136: return("Нет цен "); case 146: return("Подсистема торговли занята "); case 129: return("Неправильная цена "); case 131: return("Неправильный объем "); case 4051:return("Недопустимое значение параметра функции "); case 4059:return("Функция не разрешена в тестовом режиме"); case 4063:return("Ожидается параметр типа integer "); case 4105:return("Ни один ордер не выбран "); case 4107:return("Неправильный параметр цены для торговой функции "); case 4108:return("Неверный номер тикета "); case 4109:return("Торговля не разрешена. Необходимо включить опцию `Разрешить советнику торговать` в свойствах эксперта."); case 4200:return("Объект уже существует "); default: return(StringConcatenate("Error ",e," ")); } } //------------------------------------------------------------------------------------------------------------ int CloseAllOrders(int tip) { bool error=true; int Ошибка,nn; while(true) { string txt; for (int j = 0; j < OrdersTotal(); j++) { if (OrderSelect(j, SELECT_BY_POS)) { if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic) { if ((tip==OP_BUY || tip==100) && OrderType()==OP_BUY) { error=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),3,Red); if (error) txt=StringConcatenate(txt,"Закрыт ордер N ",OrderTicket()," прибыль ",OrderProfit(), " ",TimeToStr(TimeCurrent(),TIME_MINUTES),"\n"); } if ((tip==OP_SELL || tip==100) && OrderType()==OP_SELL) { error=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),3,Red); if (error) txt=StringConcatenate(txt,"Закрыт ордер N ",OrderTicket()," прибыль ",OrderProfit(), " ",TimeToStr(TimeCurrent(),TIME_MINUTES),"\n"); } if (!error) { j--; Ошибка = GetLastError(); if (Ошибка<2) continue; if (Ошибка==129) //Неправильная цена { Sleep(5000); RefreshRates(); continue; } if (Ошибка==146) //Подсистема торговли занята { if (!IsTesting()) if (IsTradeContextBusy()) Sleep(2000); continue; } txt=StringConcatenate("Ошибка закрытия ордера N ",OrderTicket()," ",TxtERROR(Ошибка)," ",TimeToStr(TimeCurrent(),TIME_MINUTES),"\n"); } } } } Comment(txt); int n=0; txt=""; for (j = 0; j < OrdersTotal(); j++) { if (OrderSelect(j, SELECT_BY_POS)) { if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == tip || tip==100)) {txt=StringConcatenate(txt,OrderTicket(),"\n"); n++;} } } if (n==0) break; else {Sleep(2000);Comment("Не все ордера удалены, осталось еще ",n,"\n",txt);} nn++; if (nn>100) {Comment("не могу закрыть ордер");break;} } return(0); } //+------------------------------------------------------------------+ int ORDERS(int tip) { int N_Sell,N_Buy; for (int i=0; i<OrdersTotal(); i++) { if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true) { if (OrderSymbol()==Symbol() && (OrderMagicNumber() == Magic || Magic == 0)) { if (OrderType()==OP_BUY ) N_Buy++; if (OrderType()==OP_SELL) N_Sell++; } } } if (tip== 0) return(N_Buy+N_Sell); if (tip== 1) return(N_Buy); if (tip==-1) return(N_Sell); } //--------------------------------------------------------------------
Комментарии к исходному коду форекс советника FractalScalp v7.5.1.mq4
В целях безопасности и борьбы со спамом в тексте комментариев запрещено размещать html-теги и ссылки. Благодарим за понимание.