//+---------------------------------------------------------------------------+ //| ZigZagScalp | //| Copyright © 2011, Хлыстов Владимир | //|---------------------------------------------------------------------------+ #property copyright "Copyright © 2011, Vladimir Hlystov" #property link "cmillion@narod.ru" //+------------------------------------------------------------------ extern bool BUY = true; //разрешить торговать extern bool SELL = true; //разрешить торговать extern string Managing.capital = " If a lot = 0, then the lot is calculated as a percentage(LOTrisk) of available funds"; extern double LOT = 0.1; extern double LOTrisk = 5.0; //если LOT=0, то LOT=процент от депозита<if LOT = 0, LOT = percentage of the deposit> extern int takeprofit = 500; //TP extern double K_lot = 2.0; //Коэффициент увеличения лота<Zoom Ratio Lot> extern double Maxlot = 5.0; //ограничение максимального лота<limiting the maximum lot> extern int MaxRisk = 100; //закрывать ордера если лосс достиг MaxRisk процент от депозита<close the warrant if the loss has reached MaxRisk percentage of the deposit> extern double MaxLoss = 1000.0; //ограничение максимальноq просадки (в валюте депозита) extern int MaxOrders = 10; //змаксимальное кол-во ордеров одного направления //--------------------------- extern string Away.from.the = " fractal, candles or Zigzag Отступ от фрактала"; extern int Delta = 0; //отступ выставления отложенного ордера пунктов от фрактала<Indent nominations pending order items from the fractal> extern bool Trend = false; //разрешать добавлять ордера только против тренда //--------------------------- TrailingStop extern string Options.Trailing = "(0)-notTral (-1)-fractals (-2)-candl (-3)-ZigZag (>0)-PipsTral"; extern int TrailingStop = 100; //если= (-1), то трейлинг по фракталам <if = (-1), then trailing by fractals> //если= (-2), то трейлинг по свечам <if = (-2), then trailing by candlelight> //если= (-3), то трейлинг по ZigZag <if = (-3), then trailing by ZigZag> //если= (=0), то нет трейлинга <if = (=0), not trailing> //если= (>0), то трейлинг по пипсам <if = (>0), then trailing by Pips> //+-------------------------- Time работы extern string Duration.of.open.orders = " to close to the minimum profit"; extern int AllTimeStopOrders = 10; //в часах закрытие ордеров достигших общего профита и имеющих большое общее время <closure orders reaching a total profit and having a great time overall> extern string Time.Work = "RestDay - weekday (0-Sunday,1,2,3,4,5,6); TimeStart,TimeEnd - (0-24)"; 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 = 24; //+-------------------------- Zigzag extern string Options.Zigzag = " "; extern int Zigzag_Depth = 12; extern int Zigzag_Deviation = 5; extern int Zigzag_Backstep = 3; //+-------------------------- Visualization extern string Options.Visualization = " "; color WhiteColor = Silver;//цвет вывода информации <color output> extern bool DrawInfo = true; extern int Magic = 0; //------------------------------------------------------------------- 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() { int H,L, error; string name,NameLine; int SPREAD = MarketInfo(Symbol(),MODE_SPREAD); //----------------------------------------------------------------------- время торговли int TekHour = Hour(); bool Trede=false; if (TimeStart < TimeEnd && TekHour >= TimeStart && TekHour < TimeEnd ) Trede=true; if (TimeStart > TimeEnd && (TekHour >= TimeStart || TekHour < TimeEnd) ) Trede=true; if (!Trede) Comment("Торговля запрещена по времени ",TimeStart," - ",TimeEnd); if (DayOfWeek()==RestDay_I||DayOfWeek()==RestDay_II) {Trede=false;Comment("Торговля запрещена в этот день недели");} //----------------------------------------------------------------------- назначение лотов 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=1; i<500; i++) //находим ближайший верхний фрактал FrUp { FrUp = iFractals(NULL,0,MODE_UPPER,i); if (FrUp==0) continue; FrUp = NormalizeDouble(iCustom(NULL,0,"ZigZag",Zigzag_Depth,Zigzag_Deviation,Zigzag_Backstep,0,i), Digits); if (FrUp==0) continue; FrUp = FrUp+Delta*Point; break; } for (i=1; i<500; i++) //находим ближайший нижний фрактал FrDn { FrDn = iFractals(NULL,0,MODE_LOWER,i); if (FrDn==0) continue; FrDn = NormalizeDouble(iCustom(NULL,0,"ZigZag",Zigzag_Depth,Zigzag_Deviation,Zigzag_Backstep,0,i), Digits); if (FrDn==0) continue; FrDn = FrDn-Delta*Point; break; } //----------------------------------------------------------------------- проверка установленных стоп ордеров double StopOrderUp,StopOrderDn,OOP,MinBuyOrder=1000000000,MaxSellOrder,OldBuyOrder,OldSellOrder,OldBuyLot,OldSellLot; int TicketUp,TicketDn,b,s; TimeOllOpenBuy=0;TimeOllOpenSell=0; double OOL_BUYSTOP,OOL_SELSTOP; for (i=0; i<OrdersTotal(); i++) { if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true) { OOP = NormalizeDouble(OrderOpenPrice(), Digits); if (Magic==OrderMagicNumber() && OrderSymbol()==Symbol()) { if (OrderType()==OP_BUYSTOP ) {StopOrderUp = OOP; TicketUp=OrderTicket(); OOL_BUYSTOP=OrderLots();} if (OrderType()==OP_SELLSTOP) {StopOrderDn = OOP; TicketDn=OrderTicket(); OOL_SELSTOP=OrderLots();} if (OrderType()==OP_BUY ) { b++; TimeOllOpenBuy = TimeOllOpenBuy + TimeCurrent()-OrderOpenTime(); if (MinBuyOrder > OOP) MinBuyOrder = OOP; OldBuyOrder=OOP; OldBuyLot=OrderLots(); if (DrawInfo&&!IsTesting()){ NameLine="ордер Bay "+OrderTicket();ObjectDelete(NameLine);ObjectDelete(NameLine+" з"); ObjectCreate(NameLine, OBJ_TREND, 0, OrderOpenTime(),OOP ,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) { s++; TimeOllOpenSell = TimeOllOpenSell + TimeCurrent()-OrderOpenTime(); if (MaxSellOrder < OOP) MaxSellOrder = OOP; OldSellOrder=OOP; OldSellLot=OrderLots(); if (DrawInfo&&!IsTesting()){ NameLine="ордер Sell "+OrderTicket();ObjectDelete(NameLine);ObjectDelete(NameLine+" з"); ObjectCreate(NameLine, OBJ_TREND, 0, OrderOpenTime(),OOP ,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);} } } } } if (MinBuyOrder==1000000000 && MaxSellOrder==0 && (OOL_BUYSTOP!=OOL_SELSTOP && TicketUp!=0 && TicketDn!=0))//если серия закрылась { Print("Удаляем BUYSTOP ",TicketUp," SELSTOP ",TicketDn); DELETEORDERS(); } //----------------------------------------------------------------------- открытие и перемещение стоп ордеров double Max_Lot; if (Max_Lot<OldBuyLot) Max_Lot = OldBuyLot; if (Max_Lot<OldSellLot) Max_Lot = OldSellLot; if (MinBuyOrder>FrUp || Trend)//разрешать добавлять ордера только против тренда { if ((StopOrderUp > FrUp || StopOrderUp==0) && FrUp!=0) //если ордер BuyStop выше верхнего фрактала, меняем его на новый { if (MathAbs(OldBuyOrder - FrUp)/Point>SPREAD && NormalizeDouble((FrUp-Ask)/Point,0)>=STOPLEVEL) //не открывать если уже открыт по этой цене { //Comment("открытие"); if (TicketUp!=0) { OrderDelete(TicketUp, Blue);Print("удаление ",TicketUp," StopOrderUp ",StopOrderUp," FrUp ",FrUp); Sleep(500); } if (Max_Lot>0)//OldBuyOrder!=0) { Lot = NormalizeDouble(Max_Lot*K_lot,OkrLOT);//OldBuyLot if (Lot>Maxlot) Lot=Maxlot;//ограничение, задаваемое вручную } if (Lot!=0) { if (Trede&&TimeBarBuy!=Time[0] && b<MaxOrders && BUY) { if (OrderSend(Symbol(),OP_BUYSTOP,Lot,FrUp,3,0,0,NULL,Magic,0,Blue)==-1) {Print("Ошибка открытия BUYSTOP ",TxtERROR(0)," ",Symbol()," Тек.цена ",Ask," Lot ",Lot," FrUp ",FrUp);} else TimeBarBuy=Time[0]; } } else Comment(Symbol(),"BUYSTOP недостаточно средств Lot=",Lot," MAXLOT ",MAXLOT," MinLot ",MinLot); } } } if (MaxSellOrder<FrDn || Trend)//разрешать добавлять ордера только против тренда { if (StopOrderDn < FrDn) //если ордер SellStop ниже нижнего фрактала, меняем его на новый { if (MathAbs(OldSellOrder - FrDn)/Point>SPREAD && NormalizeDouble((Bid-FrDn)/Point,0)>=STOPLEVEL) //не открывать если уже открыт по этой цене { if (TicketDn!=0) { OrderDelete(TicketDn, Red);Print("удаление ",TicketDn," StopOrderDn ",StopOrderDn," FrDn ",FrDn); Sleep(500); } if (Max_Lot>0)//OldSellOrder!=0) { Lot = NormalizeDouble(Max_Lot*K_lot,OkrLOT);//OldSellLot if (Lot>Maxlot) Lot=Maxlot;//ограничение, задаваемое вручную } if (Lot!=0) { if (Trede&&TimeBarSell!=Time[0] && s<MaxOrders && SELL) { if (OrderSend(Symbol(),OP_SELLSTOP,Lot,FrDn,3,0,0,NULL,Magic,0,Red)==-1) {Print("Ошибка открытия SELLSTOP ",TxtERROR(0)," ",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*3600 && AccountProfit() > 0) CloseAllOrders(100); /*if (TimeOllOpenBuy > AllTimeStopOrders && доход_BUY > 10) CloseAllOrders(OP_BUY); if (TimeOllOpenSell > AllTimeStopOrders && доход_SELL > 10) CloseAllOrders(OP_SELL);*/ } //-------------------------------------------------------------------- void TakeProfit() { int tip,Ticket; 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)); if (!err) {Print("Error order ",Ticket," TakeProfit ",TxtERROR(0)," ",Symbol()," TP ",TPb);} } } if (tip==OP_SELL && MathAbs(OTP - TPs)/Point>STOPLEVEL) { if (TPs < Bid-STOPLEVEL*Point && (TPs < OTP || OTP == 0)) { err=OrderModify(Ticket,OrderOpenPrice(),OrderStopLoss(),TPs,0,White); Comment("TrailingStop "+Ticket," ",TimeToStr(TimeCurrent(),TIME_MINUTES)); if (!err) {Print("Error order ",Ticket," TakeProfit ",TxtERROR(0)," ",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 = SlLastBar(1,Bid-STOPLEVEL*Point,TrailingStop); //if (TPb>Ask+STOPLEVEL*Point) TP = TPb; else 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) Print("Error order ",Ticket," TrailingStop ", TxtERROR(0)," ",Symbol()," SL ",StLo," TP ",TP); } } if (tip==OP_SELL) { StLo = SlLastBar(-1,Ask+STOPLEVEL*Point,TrailingStop); if (StLo==0) continue; //if (TPs<Bid-STOPLEVEL*Point) TP = TPs; else 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) Print("Error order ",Ticket," TrailingStop ", TxtERROR(0)," ",Symbol()," SL ",StLo," TP ",TP); } } } } } } //-------------------------------------------------------------------- double SlLastBar(int tip,double price, int tipTralStop) { double fr; int j; if (tipTralStop==0) return(0); if (tipTralStop>0)//по пипсам { if (tip==1) fr = Bid - tipTralStop*Point; else fr = Ask + tipTralStop*Point; } if (tipTralStop==-1)//по фракталам { 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; } } if (tipTralStop==-2)//по свечам { if (tip== 1) for (j=1; j<100; j++) { fr = iLow(NULL,0,j); if (fr!=0) {fr =fr - Delta*Point; if (price > fr) break;} else fr=0; } if (tip==-1) for (j=1; j<100; j++) { fr = iHigh(NULL,0,j); if (fr!=0) {fr =fr + Delta*Point; if (price < fr) break;} else fr=0; } } if (tipTralStop==-3)//по зигзагу { if (tip== 1) for (j=2; j<100; j++) { fr = iCustom(NULL,0,"Zigzag",Zigzag_Depth,Zigzag_Deviation,Zigzag_Backstep,0,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 = iCustom(NULL,0,"Zigzag",Zigzag_Depth,Zigzag_Deviation,Zigzag_Backstep,0,j); if (fr!=0) {fr =fr + Delta*Point; 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)," Т ",TimeToStr(TimeOllOpenSell,TIME_MINUTES)),8,"Arial",TextColor); if (доход_BUY<0) TextColor=Red; else TextColor=Green; ObjectSetText("доходB",StringConcatenate(b," BUY ",DoubleToStr(lot_b,OkrLOT)," лот доход = ",DoubleToStr(доход_BUY ,2)," Т ",TimeToStr(TimeOllOpenBuy,TIME_MINUTES)),8,"Arial",TextColor);} if (-(доход_BUY+доход_SELL) > (Balans*MaxRisk/100)) CloseAllOrders(100); if (-(доход_BUY+доход_SELL) > MaxLoss) 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); } //+------------------------------------------------------------------+ void DELETEORDERS() { for (int i=0; i<OrdersTotal(); i++) { if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { if (OrderSymbol()==Symbol() && OrderMagicNumber() == Magic) { if (OrderType()>1) if (!OrderDelete(OrderTicket())) Print("=== Error DeleteStopOrders ",GetLastError()); } } } return; } //--------------------------------------------------------------------
Комментарии к исходному коду форекс советника ZigZagTrader v5.3.mq4
В целях безопасности и борьбы со спамом в тексте комментариев запрещено размещать html-теги и ссылки. Благодарим за понимание.