MQL4. Помогите написать код для определения суммарной прибыли

 

Дорогие кодеры MQL4! Помогите написать этот несчастный код.

Цель: Закрыть все ордера при достижении суммарной прибыли в пунктах и с учетом комиссии, и накопленного свопа.

Входные параметры:

-Прибыль в пунктах

-Символ

-Magic  

Буду признателен за помощь.


p/s Но было бы еще круче, если код будет с тралом, хотя бы простым и параметром включить/отключить  ;) 

 
spetrosyan1979:

Дорогие кодеры 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);
  }
//+------------------------------------------------------------------+


 

 
spetrosyan1979:

Дорогие кодеры MQL4! Помогите написать этот несчастный код.

Цель: Закрыть все ордера при достижении суммарной прибыли в пунктах и с учетом комиссии, и накопленного свопа.

Входные параметры:

-Прибыль в пунктах

-Символ

-Magic  

Буду признателен за помощь.


p/s Но было бы еще круче, если код будет с тралом, хотя бы простым и параметром включить/отключить  ;) 

Как ты собрался суммировать пункты комиссию и своп, если последние 2 не в пунктах
 
SanAlex:

может это подойдёт - что то химичил, терминал не установлен - не могу проверить.

-------------------------------------


 

Спасибо! Интересно, поковыряюсь 

 
Aleksei Beliakov:
Как ты собрался суммировать пункты комиссию и своп, если последние 2 не в пунктах

Никак, оговорился ))  

 
Aleksei Beliakov:
Как ты собрался суммировать пункты комиссию и своп, если последние 2 не в пунктах

там и прибыль в пунктах тож под вопросом - нет условия, что один и тот же символ используется, нет условия, что лот фиксирован - соответственно и прибыль в пунктах не имеет смысла, максимум с оговоркой например на 1 лот - тогда задача сводится к суммированию профита и делению на  MODE_TICKVALUE - что то такое - в справке нужно глянуть