Дорогие кодеры MQL4! Помогите написать этот несчастный код.
Цель: Закрыть все ордера при достижении суммарной прибыли в пунктах и с учетом комиссии, и накопленного свопа.
Входные параметры:
-Прибыль в пунктах
-Символ
-Magic
Буду признателен за помощь.
p/s Но было бы еще круче, если код будет с тралом, хотя бы простым и параметром включить/отключить ;)
может это подойдёт - что то химичил, терминал не установлен - не могу проверить.
-------------------------------------
//+------------------------------------------------------------------+ //| TimeBalansClose.mq4 | //| Copyright 2020, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2020, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" #property strict #define Magic 842714145 #include <stdlib.mqh> //--- input string t10="----------- Time ------------------"; input datetime HoursFrom = D'1970.01.01'; // Закрыть всё input string t="------------- Balans Parameters -----"; input double TargetProfit = 999999.99; // Баланс + Прибыль(прибавить к балансу) input double TargetLoss = 0; // Баланс - Убыток(отнять от баланса) input string _Orders_="------ Parameters Order ------"; input double Lots = 0.01; // Lots input int StopLoss = 10000; // StopLoss input int TakeProfit = 10000; // TakeProfit input double TrailingStop = 300; // TrailingStop Фиксированный размер трала input double TrailingStep = 50; // TrailingStep Шаг трала //--- datetime HoursTo = D'1970.01.01'; // bool AllPositions = false; // Управлять всеми позициями bool ProfitTrailing = true; // Тралить только профит bool UseSound = true; // Использовать звуковой сигнал string NameFileSound = "expert.wav"; // Наименование звукового файла uint SLEEPTIME = 1; bool CloseOpenOrders = true; double Price[2]; string _name[]= {"BUY","SELL","BUY_Close","SELL_Close","CLOSE_ALL","Trailing"}; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- int _y=100; for(int i=0; i<ArraySize(_name); i++) { ButtonCreate(_name[i],5,_y,130,20,10); _y=_y+25; } //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- for(int i=0; i<ArraySize(_name); i++) { ObjectDelete(0,Symbol()+_name[i]); } } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- if(ProfitTarget()) { return; } ButtonOnTick(); OnTimer1(); } //+------------------------------------------------------------------+ //| Check for long position closing | //+------------------------------------------------------------------+ bool ButtonOnTick(void) { bool res=false; if(ObjectGetInteger(0,Symbol()+"SELL_Close",OBJPROP_STATE,0)==true) { int Close_tickets=0; int totals=OrdersTotal(); int s = 0; for(s = totals; s >=0; s--) { if(OrderSelect(s,SELECT_BY_POS) && OrderSymbol()==Symbol()) { if(OrderSymbol()==Symbol() && OrderType()==OP_SELL) { Close_tickets = OrderClose(OrderTicket(),OrderLots(),MarketInfo(Symbol(),MODE_ASK),5); } } } PlaySound("ok.wav"); ObjectSetInteger(0,Symbol()+"SELL_Close",OBJPROP_STATE,false); ObjectSetInteger(0,Symbol()+"SELL",OBJPROP_STATE,false); } if(ObjectGetInteger(0,Symbol()+"BUY_Close",OBJPROP_STATE,0)==true) { int Close_ticketb=0; int totalb=OrdersTotal(); int b = 0; for(b = totalb; b >=0; b--) { if(OrderSelect(b,SELECT_BY_POS) && OrderSymbol()==Symbol()) { //OrderSelect(i,SELECT_BY_POS); if(OrderSymbol()==Symbol() && OrderType()==OP_BUY) { Close_ticketb = OrderClose(OrderTicket(),OrderLots(),MarketInfo(Symbol(),MODE_BID),5); } } } PlaySound("ok.wav"); ObjectSetInteger(0,Symbol()+"BUY_Close",OBJPROP_STATE,false); ObjectSetInteger(0,Symbol()+"BUY",OBJPROP_STATE,false); } if(ObjectGetInteger(0,Symbol()+"CLOSE_ALL",OBJPROP_STATE,0)==true) { CloseAllOrders(); Sleep(SLEEPTIME*1000); CloseAllOrders(); ExpertRemove(); PlaySound("expert.wav"); ObjectSetInteger(0,Symbol()+"CLOSE_ALL",OBJPROP_STATE,false); ObjectSetInteger(0,Symbol()+"CLOSE",OBJPROP_STATE,false); } double PROFIT_BUY=0.00; double PROFIT_SELL=0.00; double PROFIT_CLOSE=0.00; double PROFIT_BUY_Lot=0.00; double PROFIT_SELL_Lot=0.00; double PROFIT_CLOSE_Lot=0.00; int _all =0; int ticket; for(int i=OrdersTotal()-1; i>=0; i--) // returns the number of open positions { if(OrderSelect(i,SELECT_BY_POS) && OrderSymbol()==Symbol()) { PROFIT_CLOSE_Lot=AccountInfoDouble(ACCOUNT_EQUITY); _all=_all+1; if(OrderSymbol()==Symbol() && OrderType()==OP_BUY) { PROFIT_BUY=PROFIT_BUY+NormalizeDouble(OrderProfit(),2); PROFIT_BUY_Lot=PROFIT_BUY_Lot+NormalizeDouble(OrderLots(),2); } if(OrderSymbol()==Symbol() && OrderType()==OP_SELL) { PROFIT_SELL=PROFIT_SELL+NormalizeDouble(OrderProfit(),2); PROFIT_SELL_Lot=PROFIT_SELL_Lot+NormalizeDouble(OrderLots(),2); } { PROFIT_CLOSE=AccountInfoDouble(ACCOUNT_PROFIT); PROFIT_CLOSE_Lot=AccountInfoDouble(ACCOUNT_PROFIT); } } } ObjectSetString(0,Symbol()+"BUY_Close",OBJPROP_TEXT,"BUY Close ("+DoubleToString(PROFIT_BUY,2)+")"); if(PROFIT_BUY>0) { ObjectSetInteger(0,Symbol()+"BUY_Close",OBJPROP_BGCOLOR,clrLimeGreen); } else if(PROFIT_BUY==0) { ObjectSetInteger(0,Symbol()+"BUY_Close",OBJPROP_BGCOLOR,clrBlack); } else { ObjectSetInteger(0,Symbol()+"BUY_Close",OBJPROP_BGCOLOR,clrCrimson); } ObjectSetString(0,Symbol()+"SELL_Close",OBJPROP_TEXT,"SELL Close ("+DoubleToString(PROFIT_SELL,2)+")"); if(PROFIT_SELL>0) { ObjectSetInteger(0,Symbol()+"SELL_Close",OBJPROP_BGCOLOR,clrLimeGreen); } else if(PROFIT_SELL==0) { ObjectSetInteger(0,Symbol()+"SELL_Close",OBJPROP_BGCOLOR,clrBlack); } else { ObjectSetInteger(0,Symbol()+"SELL_Close",OBJPROP_BGCOLOR,clrCrimson); } ObjectSetString(0,Symbol()+"CLOSE_ALL",OBJPROP_TEXT,"CLOSE ALL ("+DoubleToString(PROFIT_CLOSE,2)+")"); if(PROFIT_CLOSE>0) { ObjectSetInteger(0,Symbol()+"CLOSE_ALL",OBJPROP_BGCOLOR,clrLimeGreen); } else if(PROFIT_CLOSE==0) { ObjectSetInteger(0,Symbol()+"CLOSE_ALL",OBJPROP_BGCOLOR,clrBlack); } else { ObjectSetInteger(0,Symbol()+"CLOSE_ALL",OBJPROP_BGCOLOR,clrCrimson); } ObjectSetString(0,Symbol()+"BUY",OBJPROP_TEXT,"BUY Lot ("+DoubleToString(PROFIT_BUY_Lot,2)+")"); ObjectSetString(0,Symbol()+"SELL",OBJPROP_TEXT,"SELL Lot ("+DoubleToString(PROFIT_SELL_Lot,2)+")"); ObjectSetString(0,Symbol()+"CLOSE",OBJPROP_TEXT,"CLOSE Lot ("+DoubleToString(PROFIT_CLOSE_Lot,2)+")"); ObjectSetString(0,Symbol()+"Trailing",OBJPROP_TEXT,"Tral = "+DoubleToString(_all,0) +", all = "+DoubleToString(OrdersTotal(),0)+"."); if(ObjectGetInteger(0,Symbol()+"BUY",OBJPROP_STATE,0)==true) { ObjectSetInteger(0,Symbol()+"BUY",OBJPROP_BGCOLOR,clrDeepSkyBlue); } else { ObjectSetInteger(0,Symbol()+"BUY",OBJPROP_BGCOLOR,clrBlack); } if(ObjectGetInteger(0,Symbol()+"SELL",OBJPROP_STATE,0)==true) { ObjectSetInteger(0,Symbol()+"SELL",OBJPROP_BGCOLOR,clrRed); } else { ObjectSetInteger(0,Symbol()+"SELL",OBJPROP_BGCOLOR,clrBlack); } if(ObjectGetInteger(0,Symbol()+"CLOSE",OBJPROP_STATE,0)==true) { ObjectSetInteger(0,Symbol()+"CLOSE",OBJPROP_BGCOLOR,clrRed); } else { ObjectSetInteger(0,Symbol()+"CLOSE",OBJPROP_BGCOLOR,clrBlack); } if(ObjectGetInteger(0,Symbol()+"Trailing",OBJPROP_STATE,0)==true) { TrailStopOrders(); } if(ObjectGetInteger(0,Symbol()+"SELL",OBJPROP_STATE)!=0) { ObjectSetInteger(0,Symbol()+"SELL",OBJPROP_STATE,0); ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Ask+StopLoss*Point,Bid-TakeProfit*Point,"",Magic,0,Red); if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice()); } else Print("Error opening SELL order : ",GetLastError()); PlaySound("ok.wav"); res=true; } if(ObjectGetInteger(0,Symbol()+"BUY",OBJPROP_STATE)!=0) { ObjectSetInteger(0,Symbol()+"BUY",OBJPROP_STATE,0); ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Bid-StopLoss*Point,Ask+TakeProfit*Point,"",Magic,0,Green); if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice()); } else Print("Error opening BUY order : ",GetLastError()); PlaySound("ok.wav"); res=true; } //--- result return(res); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void ButtonCreate(string name,int Xdist, int Ydist,int Xsize,int Ysize,int FONTSIZE=12) { if(ObjectFind(0,Symbol()+name)<0) ObjectCreate(0,Symbol()+name,OBJ_BUTTON,0,100,100); ObjectSetInteger(0,Symbol()+name,OBJPROP_COLOR,clrGray); ObjectSetInteger(0,Symbol()+name,OBJPROP_BGCOLOR,clrBlack); ObjectSetInteger(0,Symbol()+name,OBJPROP_XDISTANCE,Xdist); ObjectSetInteger(0,Symbol()+name,OBJPROP_YDISTANCE,Ydist); ObjectSetInteger(0,Symbol()+name,OBJPROP_XSIZE,Xsize); ObjectSetInteger(0,Symbol()+name,OBJPROP_YSIZE,Ysize); ObjectSetString(0,Symbol()+name,OBJPROP_FONT,"Sans Serif"); ObjectSetString(0,Symbol()+name,OBJPROP_TEXT,name); ObjectSetInteger(0,Symbol()+name,OBJPROP_FONTSIZE,FONTSIZE); ObjectSetInteger(0,Symbol()+name,OBJPROP_SELECTABLE,false); } //+------------------------------------------------------------------+ //| script program start function | //+------------------------------------------------------------------+ void CloseAllOrders(void) { int iOrders=OrdersTotal()-1, i; if(CloseOpenOrders) { for(i=iOrders; i>=0; i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && (OrderType()<=OP_SELL) && GetMarketInfo() && !OrderClose(OrderTicket(),OrderLots(),Price[1-OrderType()],0)) Print(OrderError()); if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { if(OrderDelete(OrderTicket())) Print(OrderError()); } } } } //+------------------------------------------------------------------+ //| Function..: OrderError | //+------------------------------------------------------------------+ string OrderError(void) { int iError=GetLastError(); return(StringConcatenate("Order:",OrderTicket()," GetLastError()=",iError," ",ErrorDescription(iError))); } //+------------------------------------------------------------------+ //| Function..: GetMarketInfo | //+------------------------------------------------------------------+ bool GetMarketInfo(void) { RefreshRates(); Price[0]=MarketInfo(OrderSymbol(),MODE_ASK); Price[1]=MarketInfo(OrderSymbol(),MODE_BID); double dPoint=MarketInfo(OrderSymbol(),MODE_POINT); if(dPoint==0) return(false); return(Price[0]>0.0 && Price[1]>0.0); } //+------------------------------------------------------------------+ void TrailStopOrders(void) { for(int i=0; i<OrdersTotal(); i++) { if(OrderSelect(i,SELECT_BY_POS, MODE_TRADES)) { if(AllPositions || OrderSymbol()==Symbol()) { TrailingPositions(); } } } } //+------------------------------------------------------------------+ //| Сопровождение позиции простым тралом | //+------------------------------------------------------------------+ void TrailingPositions(void) { double pBid,pAsk,pp; pp=MarketInfo(OrderSymbol(),MODE_POINT); if(OrderType()==OP_BUY) { pBid=MarketInfo(OrderSymbol(),MODE_BID); if(!ProfitTrailing || (pBid-OrderOpenPrice())>TrailingStop*pp) { if(OrderStopLoss()<pBid-(TrailingStop+TrailingStep-1)*pp) { ModifyStopLoss(pBid-TrailingStop*pp); return; } } } if(OrderType()==OP_SELL) { pAsk=MarketInfo(OrderSymbol(),MODE_ASK); if(!ProfitTrailing || OrderOpenPrice()-pAsk>TrailingStop*pp) { if(OrderStopLoss()>pAsk+(TrailingStop+TrailingStep-1)*pp || OrderStopLoss()==0) { ModifyStopLoss(pAsk+TrailingStop*pp); return; } } } } //+------------------------------------------------------------------+ //| Перенос уровня StopLoss | //| Параметры: | //| ldStopLoss - уровень StopLoss | //+------------------------------------------------------------------+ void ModifyStopLoss(double ldStopLoss) { bool fm; fm=OrderModify(OrderTicket(),OrderOpenPrice(),ldStopLoss,OrderTakeProfit(),0,CLR_NONE); if(fm && UseSound) PlaySound(NameFileSound); } //+------------------------------------------------------------------+ //| Check for long position closing | //+------------------------------------------------------------------+ bool OnTimer1(void) { bool res=false; if((HoursFrom<HoursTo && TimeLocal()>=HoursFrom && TimeLocal()<HoursTo) || (HoursFrom>HoursTo && (TimeLocal()<HoursTo || TimeLocal()>=HoursFrom))) { CloseAllOrders(); Sleep(SLEEPTIME*1000); CloseAllOrders(); ExpertRemove(); PlaySound("expert.wav"); res=true; } //--- result return(res); } //+------------------------------------------------------------------+ //| Check for long position closing | //+------------------------------------------------------------------+ bool ProfitTarget(void) { bool res=false; if(AccountInfoDouble(ACCOUNT_EQUITY)<=TargetLoss || AccountInfoDouble(ACCOUNT_EQUITY)>=TargetProfit) { CloseAllOrders(); Sleep(SLEEPTIME*1000); CloseAllOrders(); ExpertRemove(); PlaySound("expert.wav"); res=true; } //--- result return(res); } //+------------------------------------------------------------------+
Дорогие кодеры MQL4! Помогите написать этот несчастный код.
Цель: Закрыть все ордера при достижении суммарной прибыли в пунктах и с учетом комиссии, и накопленного свопа.
Входные параметры:
-Прибыль в пунктах
-Символ
-Magic
Буду признателен за помощь.
p/s Но было бы еще круче, если код будет с тралом, хотя бы простым и параметром включить/отключить ;)
может это подойдёт - что то химичил, терминал не установлен - не могу проверить.
-------------------------------------
Спасибо! Интересно, поковыряюсь
Как ты собрался суммировать пункты комиссию и своп, если последние 2 не в пунктах
Никак, оговорился ))
Как ты собрался суммировать пункты комиссию и своп, если последние 2 не в пунктах
там и прибыль в пунктах тож под вопросом - нет условия, что один и тот же символ используется, нет условия, что лот фиксирован - соответственно и прибыль в пунктах не имеет смысла, максимум с оговоркой например на 1 лот - тогда задача сводится к суммированию профита и делению на MODE_TICKVALUE - что то такое - в справке нужно глянуть
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Дорогие кодеры MQL4! Помогите написать этот несчастный код.
Цель: Закрыть все ордера при достижении суммарной прибыли в пунктах и с учетом комиссии, и накопленного свопа.
Входные параметры:
-Прибыль в пунктах
-Символ
-Magic
Буду признателен за помощь.
p/s Но было бы еще круче, если код будет с тралом, хотя бы простым и параметром включить/отключить ;)