Группа "Стол заказов MQL"

Рейтинг 2088



РЕКОМЕНДУЮ




Лучшее от uginnk



Написать советник Комментариев 6
2023-01-01 23:48:26Рейтинг 0

Доработка советника

Доброго дня программистам.
Прошу небольшую доработку в советник из этого поста zakaz.opentraders.ru/103177.html
Добавить статистику по текущей прибыли/убытку в правый нижний угол, через кнопку вкл-выкл с возможностью регулировать размер шрифта, зрение не очень(
И убрать зону работы, в ней нет смысла. Заранее спасибо
  • 0
  • Просмотров: 2164
  • 25 сентября 2023, 14:29
  • uginnk
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

Вступите в группу "Стол заказов MQL", чтобы следить за обновлениями
ПРИСОЕДИНИТЬСЯ К ГРУППЕ
присоединиться
Следующая запись в группе  
Добавить параметр
25 сентября 2023
25 сентября 2023

Комментарии (12)

+
0
на 27-е
avatar

  34  AM2 Сообщений: 15882 - Андрей

  • 25 сентября 2023, 17:38
+
0
Хорошо, спасибо.
avatar

  3  uginnk Автор Сообщений: 50

  • 25 сентября 2023, 17:59
+
0
avatar

  34  AM2 Сообщений: 15882 - Андрей

  • 26 сентября 2023, 18:54
+
0
сделал комфортный размер и цифры ушли за пределы поля
avatar

  3  uginnk Автор Сообщений: 50

  • 27 сентября 2023, 08:31
+
+1
1. Вместо этой строки: extern int FontSize = 22; // размер шрифта
вставить это:
extern bool eaComment1   = TRUE;     // ПОКАЗ ИНФО
extern int FontSize      = 22;       // размер шрифта
extern color TextColour  = DeepSkyBlue; // цвет текста

2. найдите это:
void OnDeinit(const int reason)
{
Comment("");
}
и сделайте так:
void OnDeinit(const int reason)
  {
   Comment("");
   ObjectDelete("label_object1");
  }

3. Удалите это:
void PutLabel(string nm,string text,int x,int y)
  {
//--- создадим текстовую метку
   ObjectCreate(0,nm,OBJ_LABEL,0,0,0);
//--- установим координаты метки
   ObjectSetInteger(0,nm,OBJPROP_XDISTANCE,x);
   ObjectSetInteger(0,nm,OBJPROP_YDISTANCE,y);
//--- установим угол графика, относительно которого будут определяться координаты точки
   ObjectSetInteger(0,nm,OBJPROP_CORNER,3);
//--- установим текст
   ObjectSetString(0,nm,OBJPROP_TEXT,text);
//--- установим шрифт текста
   ObjectSetString(0,nm,OBJPROP_FONT,"Arial");
//--- установим размер шрифта
   ObjectSetInteger(0,nm,OBJPROP_FONTSIZE,FontSize);
//--- установим цвет
   ObjectSetInteger(0,nm,OBJPROP_COLOR,Red);
  }

4. После void OnTick()
{
вставьте это: if (eaComment1 == TRUE) Display_Info();
5. Удалите это:
PutLabel("Profit",string(AllProfit()),122,33);

   Comment("\n AllProfit: ",AllProfit());

6. В самом конце, после линии:
//+------------------------------------------------------------------+
вставьте это:
void Display_Info() {

  ObjectCreate("label_object1", OBJ_LABEL, 0, 0, 0);
  ObjectSet("label_object1", OBJPROP_CORNER, 3);
  ObjectSet("label_object1", OBJPROP_XDISTANCE, 10);  
  ObjectSet("label_object1", OBJPROP_YDISTANCE,5);
  ObjectSet("label_object1", OBJPROP_BACK, false);   
  ObjectSetText("label_object1", "Profit: " + DoubleToString (AllProfit(),2), FontSize, "Verdana", TextColour);

  }


Если сделаете всё правильно получите это:


В настройках можете менять размер шрифта (хоть на весь экран), И цвет шрифта… Так же можете отключить показ инфо.
avatar

  10  FEEX Сообщений: 361 - Владимир

  • 27 сентября 2023, 15:34
+
0
можете выгрузить здесь готовый?
avatar

  3  uginnk Автор Сообщений: 50

  • 27 сентября 2023, 17:10
+
+2
первая часть…
//+------------------------------------------------------------------+
//|                                                  Usrednitel4.mq4 |
//|                                              Copyright 2023, AM2 |
//|                                     https://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, AM2"
#property link      "https://www.forexsystems.biz"
#property version   "1.00"
#property strict

//--- Inputs
extern double Lots       = 0.1;      // лот
extern double PLot       = 0.1;      // прибавление лота
extern double MaxLot     = 5;        // максимальный лот
extern double Profit     = 11;       // профит

extern int StopLoss      = 0;        // лось
extern int TakeProfit    = 0;        // язь

extern int Step          = 333;      // шаг
extern int PStep         = 50;       // добавка к шагу

extern int Count         = 20;       // число поз
extern int Slip          = 30;       // реквот
extern int Magic         = 123;      // магик

extern int Delta         = 2000;     // зона работы

extern bool Buy          = 1;        // Buy
extern bool Sell         = 1;        // Sell

extern bool eaComment1   = TRUE;     // ПОКАЗ ИНФО
extern int FontSize      = 22;       // размер шрифта
extern color TextColour  = DeepSkyBlue; // цвет текста

extern string Comm       = "Quadro";

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   Comment("");
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Comment("");
   ObjectDelete("label_object1");
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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(type),NormalizeDouble(price,_Digits),Slip,sl,tp,Comm,Magic,0,clr);
   return;
  }
//+------------------------------------------------------------------+
//| Профит всех ордеров по типу ордера                               |
//+------------------------------------------------------------------+
double AllProfit(int ot=-1)
  {
   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 && (ot==0 || ot==-1))
              {
               pr+=OrderProfit()+OrderCommission()+OrderSwap();
              }

            if(OrderType()==1 && (ot==1 || ot==-1))
              {
               pr+=OrderProfit()+OrderCommission()+OrderSwap();
              }
           }
        }
     }
   return(pr);
  }
//+------------------------------------------------------------------+
//| Подсчет позиций                                                  |
//+------------------------------------------------------------------+
int CountTrades(int ot=-1)
  {
   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()==0 && (ot==0 || ot==-1))
               count++;
            if(OrderType()==1 && (ot==1 || ot==-1))
               count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double Lot(int type)
  {
   double lot=Lots;

   if(CountTrades(type)>0)
     {
      lot=NormalizeDouble(Lots+(PLot*CountTrades(type)),2);
     }

   if(lot>MaxLot)
      lot=Lots;

   return(lot);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int Steps(int type)
  {
   int st=Step;

   if(CountTrades(type)>0)
     {
      st=Step+PStep*CountTrades(type);
     }

   return(st);
  }
//+------------------------------------------------------------------+
//| Горизонтальная линия                                             |
//+------------------------------------------------------------------+
void PutHLine(string name,double p,color clr)
  {
   ObjectDelete(0,name);
   ObjectCreate(0,name,OBJ_HLINE,0,0,p);
//--- установим цвет линии
   ObjectSetInteger(0,name,OBJPROP_COLOR,clr);
//--- установим толщину линии
   ObjectSetInteger(0,name,OBJPROP_WIDTH,1);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CloseAll(int ot=-1)
  {
   bool cl=1;

   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();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,_Digits),Slip,White);
              }
            if(OrderType()==1 && (ot==1 || ot==-1))
              {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,_Digits),Slip,White);
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int FindOrderType()
  {
   int type=0;

   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            type=OrderType();
            break;
           }
        }
     }
   return(type);
  }
avatar

  10  FEEX Сообщений: 361 - Владимир

  • 27 сентября 2023, 17:22
+
+1
вторая часть
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double FindLastBuyPrice()
  {
   double p=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)
           {
            p=OrderOpenPrice();
            break;
           }
        }
     }
   return(p);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double FindLastSellPrice()
  {
   double p=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)
           {
            p=OrderOpenPrice();
            break;
           }
        }
     }
   return(p);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void ModifyOrders()
  {
   bool mod=1;
   double allb=0,alls=0;
   double countb=0,counts=0,tp=0,sl=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)
              {
               allb+=OrderOpenPrice()*OrderLots();
               countb+=OrderLots();
              }

            if(OrderType()==1)
              {
               alls+=OrderOpenPrice()*OrderLots();
               counts+=OrderLots();
              }
           }
        }
     }
   if(countb>0)
      allb=NormalizeDouble(allb/countb,_Digits);
   if(counts>0)
      alls=NormalizeDouble(alls/counts,_Digits);

   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==0)
              {
               if(TakeProfit>0)
                  tp=NormalizeDouble(allb+TakeProfit*_Point,_Digits);
               if(StopLoss>0)
                  sl=NormalizeDouble(allb-StopLoss*_Point,_Digits);
               if(OrderTakeProfit()!=tp || OrderStopLoss()!=sl)
                  mod=OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,0,Yellow);
              }
            else
               if(OrderType()==1)
                 {
                  if(TakeProfit>0)
                     tp=NormalizeDouble(alls-TakeProfit*_Point,_Digits);
                  if(StopLoss>0)
                     sl=NormalizeDouble(alls+StopLoss*_Point,_Digits);
                  if(OrderTakeProfit()!=tp || OrderStopLoss()!=sl)
                     mod=OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,0,Yellow);
                 }
           }
        }
     }
  }

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if (eaComment1 == TRUE) Display_Info();
   
   if(AllProfit()>Profit && Profit>0)
      CloseAll();

   if(Buy && CountTrades(0)<1)
     {
      PutOrder(0,Ask);
     }

   if(Sell && CountTrades(1)<1)
     {
      PutOrder(1,Bid);
     }

   if(CountTrades()>0 && CountTrades()<Count)
     {
      if(FindLastBuyPrice()-Ask>Steps(0)*_Point)
        {
         PutOrder(0,Ask);
         ModifyOrders();
        }

      if(Bid-FindLastSellPrice()>Steps(1)*_Point)
        {
         PutOrder(1,Bid);
         ModifyOrders();
        }
     }
}

//=============================================================================
void Display_Info() {

  ObjectCreate("label_object1", OBJ_LABEL, 0, 0, 0);
  ObjectSet("label_object1", OBJPROP_CORNER, 3);
  ObjectSet("label_object1", OBJPROP_XDISTANCE, 10);  
  ObjectSet("label_object1", OBJPROP_YDISTANCE,5);
  ObjectSet("label_object1", OBJPROP_BACK, false);   
  ObjectSetText("label_object1", "Profit: " + DoubleToString (AllProfit(),2), FontSize, "Verdana", TextColour);

  }
//+------------------------------------------------------------------+
avatar

  10  FEEX Сообщений: 361 - Владимир

  • 27 сентября 2023, 17:23
+
0
скомпилировал, нет ошибок, но не работает вообще (
на почту можете прислать в сборе ?
avatar

  3  uginnk Автор Сообщений: 50

  • 27 сентября 2023, 17:39
+
0
если что, сюда u-gin99@mail.ru
avatar

  3  uginnk Автор Сообщений: 50

  • 27 сентября 2023, 17:41
+
+1
отправил. Если снова не будет работать, то это что-то у вас… У меня всё работает)

P.S. Вообще не плохо было бы, чтобы или кол-во символов в сообщении увеличили (актуально для кода), или прикрепление файлов.
Редактирован: 27 сентября 2023, 18:00
avatar

  10  FEEX Сообщений: 361 - Владимир

  • 27 сентября 2023, 17:58
+
+1
добавил возможность ставить координату метки: www.opentraders.ru/downloads/3488/


extern int FontSize      = 22;       // размер шрифта
extern int FontX         = 122;      // координата X
extern int FontY         = 33 ;      // координата Y


сейчас вы можете выставить метку в нужное место экрана
avatar

  34  AM2 Сообщений: 15882 - Андрей

  • 27 сентября 2023, 20:31

Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий
Начать торговлю с Альпари