//+------------------------------------------------------------------+ // советник Close_All_Profit_Loss_Equity | //+------------------------------------------------------------------+ #property copyright "Copyright © Sergey Gulyaev. Maykop." #property show_inputs #define FIRST_NAME "Close_All_if_Profit_or_Loss" // имя анализатора #define VER "GS_2010_12_28" #define AUTOR " © valenok2003@mail.ru" #define ADVERT "Конструктор BlueDream на FXGeneral.com" #define URL "http://fxgeneral.com/" string Name_Obj_Advert = "Advert"; extern bool Only_Alert = false; extern string rem_1 = "-при достижении прибыли-"; extern string rem_2 = "-или убытка по эквити-"; extern double Max_Equity = 0; extern double Min_Equity = 0; extern string rem_3 = "-изменять динамически-"; extern bool DYNAMIC = true; extern string rem_4 = "-допустимые значения (0,1,2,3)-"; extern int Pozition = 2; extern int Size = 9; extern bool Advert_ON = true; double Start_Equity, Equity, Cur_Equity, Dist_Max_Equity, Dist_Min_Equity; string Name_Sound_Open = "expert.wav"; string Name_Sound_Close = "ok.wav"; string Name_Sound_Modify = "tick.wav"; string Name_Sound_Profit = "payment.wav"; string Name_Sound_Loss = "ERROR.WAV"; bool TRADE_ON = true; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- Start_Equity = AccountEquity(); if(DYNAMIC) { Dist_Min_Equity = Start_Equity - Min_Equity; } //---- реклама создаём объект ---------------------------------------- if(Advert_ON) { ObjectCreate (Name_Obj_Advert, OBJ_LABEL, 0, 0, 0); ObjectSet (Name_Obj_Advert, OBJPROP_CORNER, 2); ObjectSet (Name_Obj_Advert, OBJPROP_XDISTANCE, 5); ObjectSet (Name_Obj_Advert, OBJPROP_YDISTANCE, 5); ObjectSetText(Name_Obj_Advert, ADVERT, 10, "Arial", LimeGreen); } if(Max_Equity == 0 && Min_Equity == 0) { ObjectCreate("Start_Equity", OBJ_LABEL, 0, 0, 0); ObjectSetText("Start_Equity", "Необходимо задать хотя бы одно предельное зачение эквити.", Size, "Arial", Yellow); ObjectSet("Start_Equity", OBJPROP_CORNER, Pozition); ObjectSet("Start_Equity", OBJPROP_XDISTANCE, 5); ObjectSet("Start_Equity", OBJPROP_YDISTANCE, 25); } //-------------------------------------------------------------------- //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- ObjectDelete("Max_Equity"); ObjectDelete("Start_Equity"); ObjectDelete("Min_Equity"); ObjectDelete("Cur_Equity"); ObjectDelete("Close_Max"); ObjectDelete("Close_Min"); ObjectDelete("Only_Alert"); ObjectDelete("Set_Profit"); ObjectDelete("Set_Loss"); ObjectDelete(Name_Obj_Advert); //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { if(!TRADE_ON) return(0); if(Max_Equity < 0 || Min_Equity < 0) { Alert("Close_All_if_Profit_or_Loss: отрицательные значения не допустимы!"); return(0); } //-------------------------------------------------------------------- Cur_Equity = AccountEquity(); //- вычисление уровней ----------------------------------------------- string Txt_Max_Equity, Txt_Min_Equity, Txt_Set_Profit, Txt_Set_Loss; if(Max_Equity == 0) Txt_Max_Equity = "Max_Equity = NONE"; else { Txt_Max_Equity = "Max_Equity = " + DoubleToStr(Max_Equity,2); double Max_Equity_Percent_Start = (Max_Equity - Start_Equity)/(Start_Equity/100); double Max_Equity_Percent_Cur = (Max_Equity - Cur_Equity)/(Cur_Equity/100); Txt_Set_Profit = "TP=" + DoubleToStr(Max_Equity_Percent_Start,1) + "% от Start_Equity, TP=" + DoubleToStr(Max_Equity_Percent_Cur,1) + "% от Cur_Equity"; } if(Min_Equity == 0) Txt_Min_Equity = "Min_Equity = NONE"; else { if(DYNAMIC) { if(Cur_Equity - Min_Equity > Dist_Min_Equity) Min_Equity = Cur_Equity - Dist_Min_Equity; Txt_Min_Equity = "Min_Equity DYNAMIC = " + DoubleToStr(Min_Equity,2); } string Txt_Profit = "SL"; color Color_Txt_Set_Loss = Red; if(Min_Equity > Start_Equity) { Txt_Profit = "Безубыток SL"; Color_Txt_Set_Loss = LimeGreen; } double Min_Equity_Percent_Start = (Start_Equity - Min_Equity)/(Start_Equity/100); double Min_Equity_Percent_Cur = (Cur_Equity - Min_Equity)/(Cur_Equity/100); Txt_Set_Loss = Txt_Profit + "=" + DoubleToStr(Min_Equity_Percent_Start,1) + "% от Start_Equity, SL=" + DoubleToStr(Min_Equity_Percent_Cur,1) + "% от Cur_Equity"; } //-------------------------------------------------------------------- //---- выводим инфо -------------------------------------------------- if(Max_Equity != 0 || Min_Equity != 0) { ObjectDelete("Close_Max"); ObjectDelete("Close_Min"); if(Only_Alert) { ObjectCreate("Only_Alert", OBJ_LABEL, 0, 0, 0); ObjectSetText("Only_Alert", "Только оповещение!", Size, "Arial", Red); ObjectSet("Only_Alert", OBJPROP_CORNER, Pozition); ObjectSet("Only_Alert", OBJPROP_XDISTANCE, 5); ObjectSet("Only_Alert", OBJPROP_YDISTANCE, Size*15); } ObjectCreate("Start_Equity", OBJ_LABEL, 0, 0, 0); ObjectSetText("Start_Equity", "Start_Equity = " + DoubleToStr(Start_Equity,2), Size, "Arial", Yellow); ObjectSet("Start_Equity", OBJPROP_CORNER, Pozition); ObjectSet("Start_Equity", OBJPROP_XDISTANCE, 5); ObjectSet("Start_Equity", OBJPROP_YDISTANCE, Size*13); ObjectCreate("Cur_Equity", OBJ_LABEL, 0, 0, 0); ObjectSetText("Cur_Equity", "Cur_Equity = " + DoubleToStr(Cur_Equity,2), Size, "Arial", LimeGreen); ObjectSet("Cur_Equity", OBJPROP_CORNER, Pozition); ObjectSet("Cur_Equity", OBJPROP_XDISTANCE, 5); ObjectSet("Cur_Equity", OBJPROP_YDISTANCE, Size*11); ObjectCreate("Max_Equity", OBJ_LABEL, 0, 0, 0); ObjectSetText("Max_Equity", Txt_Max_Equity, Size, "Arial", DodgerBlue); ObjectSet("Max_Equity", OBJPROP_CORNER, Pozition); ObjectSet("Max_Equity", OBJPROP_XDISTANCE, 5); ObjectSet("Max_Equity", OBJPROP_YDISTANCE, Size*9); ObjectCreate("Set_Profit", OBJ_LABEL, 0, 0, 0); ObjectSetText("Set_Profit", Txt_Set_Profit, Size, "Arial", DodgerBlue); ObjectSet("Set_Profit", OBJPROP_CORNER, Pozition); ObjectSet("Set_Profit", OBJPROP_XDISTANCE, 5); ObjectSet("Set_Profit", OBJPROP_YDISTANCE, Size*7); ObjectCreate("Min_Equity", OBJ_LABEL, 0, 0, 0); ObjectSetText("Min_Equity", Txt_Min_Equity, Size, "Arial", Red); ObjectSet("Min_Equity", OBJPROP_CORNER, Pozition); ObjectSet("Min_Equity", OBJPROP_XDISTANCE, 5); ObjectSet("Min_Equity", OBJPROP_YDISTANCE, Size*5); ObjectCreate("Set_Loss", OBJ_LABEL, 0, 0, 0); ObjectSetText("Set_Loss", Txt_Set_Loss, Size, "Arial", Color_Txt_Set_Loss); ObjectSet("Set_Loss", OBJPROP_CORNER, Pozition); ObjectSet("Set_Loss", OBJPROP_XDISTANCE, 5); ObjectSet("Set_Loss", OBJPROP_YDISTANCE, Size*3); } //----- отрабатываем ------------------------------------------------- if(Cur_Equity < Min_Equity && Min_Equity != 0) { if(Only_Alert) { Alert("Значение эквити ниже установленного минимума!"); } else { Close_All(); if(OrdersTotal() == 0) { ObjectDelete("Max_Equity"); ObjectDelete("Start_Equity"); ObjectDelete("Min_Equity"); ObjectDelete("Cur_Equity"); ObjectCreate("Close_Min", OBJ_LABEL, 0, 0, 0); ObjectSetText("Close_Min", "Закрыто с убытком, при эквити = " + DoubleToStr(Min_Equity,2), 14, "Arial", Red); ObjectSet("Close_Min", OBJPROP_CORNER, Pozition); ObjectSet("Close_Min", OBJPROP_XDISTANCE, 5); ObjectSet("Close_Min", OBJPROP_YDISTANCE, 85); PlaySound("ERROR.WAV"); Start_Equity = AccountEquity(); Max_Equity = 0; Min_Equity = 0; } } } //---- if(Cur_Equity > Max_Equity && Max_Equity != 0) { if(Only_Alert) { Alert("Значение эквити выше установленного максимума!"); } else { Close_All(); if(OrdersTotal() == 0) { ObjectDelete("Max_Equity"); ObjectDelete("Start_Equity"); ObjectDelete("Min_Equity"); ObjectDelete("Cur_Equity"); ObjectCreate("Close_Max", OBJ_LABEL, 0, 0, 0); ObjectSetText("Close_Max", "Закрыто с прибылью, при эквити = " + DoubleToStr(Max_Equity,2), 14, "Arial", Blue); ObjectSet("Close_Max", OBJPROP_CORNER, Pozition); ObjectSet("Close_Max", OBJPROP_XDISTANCE, 5); ObjectSet("Close_Max", OBJPROP_YDISTANCE, 85); PlaySound("payment.wav"); Start_Equity = AccountEquity(); Max_Equity = 0; Min_Equity = 0; } } } //---- return(0); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| Close_All.mq4 | //+------------------------------------------------------------------+ #property copyright "expforex" #property link "http://expforex.at.ua" #include double Price[2]; int giSlippage; int Close_All() { int iOrders=OrdersTotal()-1, i; //---- for(i=iOrders; i>=0; i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && (OrderType()<=OP_SELL) && GetMarketInfo() && !OrderClose(OrderTicket(),OrderLots(),Price[1-OrderType()],giSlippage)) { Print(OrderError()); } } //---- //проверка - все ли рыночные ордера закрыты, если да - запрещаем дальнейшую торговлю iOrders=OrdersTotal()-1; TRADE_ON = false; for(i=iOrders; i>=0; i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && (OrderType()<=OP_SELL)) TRADE_ON = true; } //---- return(0); } //+------------------------------------------------------------------+ //| Function..: GetMarketInfo | //+------------------------------------------------------------------+ bool GetMarketInfo() { RefreshRates(); Price[0]=MarketInfo(OrderSymbol(),MODE_ASK); Price[1]=MarketInfo(OrderSymbol(),MODE_BID); double dPoint=MarketInfo(OrderSymbol(),MODE_POINT); if(dPoint==0) return(false); giSlippage=(Price[0]-Price[1])/dPoint; return(Price[0]>0.0 && Price[1]>0.0); } //+------------------------------------------------------------------+ //| Function..: OrderError | //+------------------------------------------------------------------+ string OrderError() { int iError=GetLastError(); return(StringConcatenate("Order:",OrderTicket()," GetLastError()=",iError," ",ErrorDescription(iError))); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+