//+------------------------------------------------------------------+ //| Ultimate.mq4 | //| Copyright 2020, | //| http://www.forexsystems.biz | //+------------------------------------------------------------------+ #property copyright "Copyright 2020, " #property link "http://www.forexsystems.biz" #property version "1.00" #property strict //--- Inputs extern double Risk = 1.0; // Риск ММ (%) [ при фикс. = 0.0 ] extern double Lots = 0.01; // торговый объем ордера (фикс.) extern double MaxLot = 50; // максимальный торговый объем extern double KLot = 1.2; // увеличение лота extern int MaxSpread = 35; // максимальный спред extern int StopLoss = 5000; // лось extern int TakeProfit = 500; // язь extern double Profit = 2; // профит extern int StartHour = 0; // час начала торговли extern int StartMin = 0; // минута начала торговли extern int EndHour = 24; // час окончания торговли extern int EndMin = 0; // минута окончания торговли extern bool CloseTime = false; // закрыть все по времени окончания торговли extern int Step = 50; // шаг extern int Count = 25; // число поз extern int Shift = 1; // на каком баре сигнал extern int Slip = 30; // реквот extern int Magic = 123; // магик extern string s = " ------------- Настройки ------------- "; extern string IndName = "Ind-GG01"; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { Comment(""); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int CountTrades() { int count=0; for(int i=OrdersTotal()-1; i>=0; i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) { if(OrderType()<2) count++; } } } return(count); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void PutOrder(int type,double price) { int r=0; color clr=Green; double sl=0,tp=0; if(type==1 || type==3 || type==5) { clr=Red; if(StopLoss>0) sl=NormalizeDouble(price+StopLoss*_Point,_Digits); if(TakeProfit>0) tp=NormalizeDouble(price-TakeProfit*_Point,_Digits); } if(type==0 || type==2 || type==4) { clr=Blue; if(StopLoss>0) sl=NormalizeDouble(price-StopLoss*_Point,_Digits); if(TakeProfit>0) tp=NormalizeDouble(price+TakeProfit*_Point,_Digits); } r=OrderSend(NULL,type,Lot(),NormalizeDouble(price,_Digits),Slip,sl,tp,"",Magic,0,clr); return; } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ bool TimeSession(int aStartHour,int aStartMinute,int aStopHour,int aStopMinute,datetime aTimeCur) { //--- время начала сессии int StartTime=3600*aStartHour+60*aStartMinute; //--- время окончания сессии int StopTime=3600*aStopHour+60*aStopMinute; //--- текущее время в секундах от начала дня aTimeCur=aTimeCur%86400; if(StopTime=StartTime || aTimeCur=StartTime && aTimeCur=0; i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) { oticket=OrderTicket(); if(oticket>ticketNumber) { ticketNumber=oticket; type=OrderType(); } } } } return(type); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ double FindLastBuyPrice() { int oticket,ticketNumber=0; double oprice=0; for(int i=OrdersTotal()-1; i>=0; i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { if(OrderSymbol()==Symbol() && OrderType()==OP_BUY && OrderMagicNumber()==Magic) { oticket=OrderTicket(); if(oticket>ticketNumber) { ticketNumber=oticket; oprice=OrderOpenPrice(); } } } } return(oprice); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ double FindLastSellPrice() { int oticket,ticketNumber=0; double oprice=0; for(int i=OrdersTotal()-1; i>=0; i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { if(OrderSymbol()==Symbol() && OrderType()==OP_SELL && OrderMagicNumber()==Magic) { oticket=OrderTicket(); if(oticket>ticketNumber) { ticketNumber=oticket; oprice=OrderOpenPrice(); } } } } return(oprice); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ bool CloseAll(int ot=-1) { int err=0; for(int i=OrdersTotal()-1; i>=0; i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) { if(OrderType()==0 && (ot==0 || ot==-1)) { RefreshRates(); if(!OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,_Digits),Slip,White)) err++; } if(OrderType()==1 && (ot==1 || ot==-1)) { RefreshRates(); if(!OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,_Digits),Slip,White)) err++; } } } } if(err>0) return(false); return(true); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void ModifyOrders() { double all=0,count=0,sl=0,tp=0; for(int i=OrdersTotal()-1; i>=0; i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) { if(OrderType()==OP_BUY || OrderType()==OP_SELL) { all+=OrderOpenPrice()*OrderLots(); count+=OrderLots(); } } } } all=NormalizeDouble(all/count,Digits); for(int i=OrdersTotal()-1; i>=0; i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { if(OrderSymbol()==Symbol()) { if(OrderType()==OP_BUY) { tp=NormalizeDouble(all+TakeProfit*Point,Digits); sl=NormalizeDouble(all-StopLoss*Point,Digits); if(OrderTakeProfit()!=tp || OrderStopLoss()!=sl) bool mod=OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,0,Yellow); } else if(OrderType()==OP_SELL) { tp=NormalizeDouble(all-TakeProfit*Point,Digits); sl=NormalizeDouble(all+StopLoss*Point,Digits); if(OrderTakeProfit()!=tp || OrderStopLoss()!=sl) bool mod=OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,0,Yellow); } } } } } //+------------------------------------------------------------------+ //| Профит всех ордеров по типу ордера | //+------------------------------------------------------------------+ double AllProfit() { double pr=0; for(int i=OrdersTotal()-1; i>=0; i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) { if(OrderType()==0) { pr+=OrderProfit()+OrderCommission()+OrderSwap(); } if(OrderType()==1) { pr+=OrderProfit()+OrderCommission()+OrderSwap(); } } } } return(pr); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ double Lot() { double lot=Lots; if(lot==0) lot = AccountBalance()*Risk/100/MarketInfo(Symbol(),MODE_MARGINREQUIRED); if(CountTrades()>0) lot=NormalizeDouble(lot*MathPow(KLot,CountTrades()),2); if(lot>MaxLot) { lot=Lots; if(lot==0) lot = AccountBalance()*Risk/100/MarketInfo(Symbol(),MODE_MARGINREQUIRED); } return(lot); } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { if(AllProfit()>Profit && Profit>0) CloseAll(); if(!TimeSession(StartHour,StartMin,EndHour,EndMin,TimeCurrent())) { if(CountTrades()==0) return; if(CloseTime) if(!CloseAll()) return; } double up=iCustom(NULL,0,IndName,1,Shift); double dn=iCustom(NULL,0,IndName,0,Shift); if(CountTrades()<1 && MaxSpread>MarketInfo(Symbol(),MODE_SPREAD)) { if(up!=EMPTY_VALUE) PutOrder(0,Ask); if(dn!=EMPTY_VALUE) PutOrder(1,Bid); } if(CountTrades()=Step) { PutOrder(0,Ask); ModifyOrders(); } if(FindOrderType()==1 && (Bid-FindLastSellPrice())/Point>=Step) { PutOrder(1,Bid); ModifyOrders(); } } Comment("\n Profit: ",AllProfit(), "\n Trades: ",CountTrades()); } //+------------------------------------------------------------------+