//+------------------------------------------------------------------+ // советник Close_All_Profit_Loss | //+------------------------------------------------------------------+ #property copyright "Copyright © Sergey Gulyaev. Maykop." #property show_inputs string Name_Indicator = "Close_All_if_Profit_or_Loss", Ver = "GS_2010_07_29", Autor = " ©valenok2003@mail.ru"; extern string rem_0 = "-при достижении прибыли-"; extern string rem_1 = "-или убытка (в процентах)-"; extern double _Max_Equity = 0; double Max_Equity = 0; extern double _Min_Equity = 0; double Min_Equity = 0; extern string rem_2 = "-позиция для вывода инфо (0,1,2,3)-"; extern int Pozition = 3; extern int Size = 12; double Start_Equity, Equity, Cur_Equity; bool FLAG_ON = true; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- Start_Equity = AccountEquity(); //---- 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"); //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { if(_Max_Equity < 0 || _Min_Equity < 0 || _Max_Equity >100 || _Min_Equity > 100) { Alert("Close_All_if_Profit_or_Loss: отрицательные значения и значения больше 100% не допустимы!"); return(0); } //- вычисление уровней ----------------------------------------------- Max_Equity = (Start_Equity*_Max_Equity)/100; Max_Equity = Start_Equity + Max_Equity; Min_Equity = (Start_Equity*_Min_Equity)/100; Min_Equity = Start_Equity - Min_Equity; string Txt_Max_Equity, Txt_Min_Equity; if(_Max_Equity == 0) Txt_Max_Equity = "NONE"; else Txt_Max_Equity = DoubleToStr(Max_Equity,2); if(_Min_Equity == 0) Txt_Min_Equity = "NONE"; else Txt_Min_Equity = DoubleToStr(Min_Equity,2); //-------------------------------------------------------------------- Cur_Equity = AccountEquity(); //---- выводим инфо -------------------------------------------------- if(_Max_Equity != 0 || _Min_Equity != 0) FLAG_ON = true; if(FLAG_ON) { ObjectDelete("Close_Max"); ObjectDelete("Close_Min"); ObjectCreate("Start_Equity", OBJ_LABEL, 0, 0, 0); ObjectSetText("Start_Equity", "Start_Equity = " + DoubleToStr(Start_Equity,2), Size-3, "Arial", Yellow); ObjectSet("Start_Equity", OBJPROP_CORNER, Pozition); ObjectSet("Start_Equity", OBJPROP_XDISTANCE, 5); ObjectSet("Start_Equity", OBJPROP_YDISTANCE, Size*8); ObjectCreate("Cur_Equity", OBJ_LABEL, 0, 0, 0); ObjectSetText("Cur_Equity", "Cur_Equity = " + DoubleToStr(Cur_Equity,2), Size-3, "Arial", DodgerBlue); ObjectSet("Cur_Equity", OBJPROP_CORNER, Pozition); ObjectSet("Cur_Equity", OBJPROP_XDISTANCE, 5); ObjectSet("Cur_Equity", OBJPROP_YDISTANCE, Size*6); ObjectCreate("Max_Equity", OBJ_LABEL, 0, 0, 0); ObjectSetText("Max_Equity", "Max_Equity = " + Txt_Max_Equity, Size, "Arial", Blue); ObjectSet("Max_Equity", OBJPROP_CORNER, Pozition); ObjectSet("Max_Equity", OBJPROP_XDISTANCE, 5); ObjectSet("Max_Equity", OBJPROP_YDISTANCE, Size*4); ObjectCreate("Min_Equity", OBJ_LABEL, 0, 0, 0); ObjectSetText("Min_Equity", "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*2); } //----- отрабатываем ------------------------------------------------- if(Cur_Equity < Min_Equity && _Min_Equity != 0) { 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); Start_Equity = AccountEquity(); _Max_Equity = 0; _Min_Equity = 0; FLAG_ON = false; } } //---- if(Cur_Equity > Max_Equity && _Max_Equity != 0) { 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); Start_Equity = AccountEquity(); _Max_Equity = 0; _Min_Equity = 0; FLAG_ON = false; } } //---- 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()); } } //---- 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))); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+