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

Рейтинг 2146



РЕКОМЕНДУЮ



Индикатор просадки в % от депозита.

Тезка, приветствую!
Очень нужен индикатор просадки в % от депозита. Два параметра —
1) просадка в % от депозита за текущие сутки;
2) за определенный период (с какого числа по какое число можно выбрать).

Расположение справа в углу. Цвет текста черный, шрифт как минимум 14.

Как пример:

  • 0
  • Просмотров: 947
  • 6 апреля 2024, 19:22
  • poker
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

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

Брокер для ваших роботов, 15 лет на рынке

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

+
0
Очень нужен индикатор просадки в % от депозита


каким образом определять будем?
avatar

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

  • 7 апреля 2024, 13:11
+
0
Так как я не шуруплю в программировании (поэтому и ТЗ такое), моя версия — есть цифра (размер депо) на 00:00 времени. Это 100 %, есть минус по депу за время, это % просадки. На сколько это реально сделать я не знаю. Но есть вот такой индюк (Show_Money_v_2.mq4), где в моменте по валютной паре он показывает в % минус или плюс по открытым позам. Мне бы в целом по всем открытым позам. И так как в течении дня я не у компа, мне нужна цифра просадки за день (максимальная зафиксированная). Вечером после работы я бы её увидел и понял где подкрутить сов <img src='http://opentraders.ru/templates/skin/g6h/images/smilies/002.gif' alt=' <img src='http://opentraders.ru/templates/skin/g6h/images/smilies/002.gif' alt=' <img src='http://opentraders.ru/templates/skin/g6h/images/smilies/002.gif' alt=' <img src='http://opentraders.ru/templates/skin/g6h/images/smilies/002.gif' alt=' :) '>&nbsp; '>&nbsp; '>&nbsp; '>&nbsp; 
Если сложно за период, то можно без этой опции, а просто максимальныя просадка от депо по всем позам за сутки (с 00:00 до 23:59 по терминальному времени)

Ссылка на индюк:
cloud.mail.ru/public/FoTw/Bj9QxNFD4
Редактирован: 7 апреля 2024, 13:29
avatar

  22  poker Автор Сообщений: 849

  • 7 апреля 2024, 13:26
+
0
я могу сделать по сделкам в истории просадку, а как открытые позы мотнуло за период я не определю
avatar

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

  • 7 апреля 2024, 15:54
+
0
О, отлично. Давай тогда плясать от уже закрытых сделок. Другими словами — за сутки закрылись сделки и % максимальный от депо можно вывести. Те что висят, будем ждать когда закроются и там определим % просадки от депо.

Только тогда если можно 2 опции:
— за сутки
— за определенный период (с ХХ.ХХ.ХХХХ по ХХ.ХХ.ХХХХ)

Второй параметр мне нужен т.к. я подкручиваю настройки и хочу видеть с какими лучше (меньше) просадка.
Редактирован: 7 апреля 2024, 16:32
avatar

  22  poker Автор Сообщений: 849

  • 7 апреля 2024, 16:32
+
0
вот набросок:




//+------------------------------------------------------------------+
//|                                                     Prosadka.mq4 |
//|                                              Copyright 2024, AM2 |
//|                                     https://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2024, AM2"
#property link      "https://www.forexsystems.biz"
#property version   "1.00"
#property strict

//--- Inputs
extern double Lots       = 0.1;      // лот

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

extern int Slip          = 30;       // реквот
extern int Magic         = 123;      // магик

extern datetime T1       = 0;        //
extern datetime T2       = 0;        //

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   Comment("");
   PutButton("B",77,66,"BUY");
   PutButton("S",77,44,"SELL");
   PutButton("C",77,22,"CLOSE");
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Comment("");
   ObjectDelete(0,"B");
   ObjectDelete(0,"S");
   ObjectDelete(0,"C");
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutButton(string name,int x,int y,string text)
  {
   ObjectCreate(0,name,OBJ_BUTTON,0,0,0);
//--- установим координаты кнопки
   ObjectSetInteger(0,name,OBJPROP_XDISTANCE,x);
   ObjectSetInteger(0,name,OBJPROP_YDISTANCE,y);
//--- установим размер кнопки
   ObjectSetInteger(0,name,OBJPROP_XSIZE,60);
   ObjectSetInteger(0,name,OBJPROP_YSIZE,20);
//--- установим угол графика, относительно которого будут определяться координаты точки
   ObjectSetInteger(0,name,OBJPROP_CORNER,3);
//--- установим текст
   ObjectSetString(0,name,OBJPROP_TEXT,text);
//--- установим шрифт текста
   ObjectSetString(0,name,OBJPROP_FONT,"Arial");
//--- установим размер шрифта
   ObjectSetInteger(0,name,OBJPROP_FONTSIZE,10);
//--- установим цвет текста
   ObjectSetInteger(0,name,OBJPROP_COLOR,Red);
//--- установим цвет фона
   ObjectSetInteger(0,name,OBJPROP_BGCOLOR,White);
//--- установим цвет границы
   ObjectSetInteger(0,name,OBJPROP_BORDER_COLOR,Blue);
  }
//+------------------------------------------------------------------+
//| Закрытие позиции по типу ордера                                  |
//+------------------------------------------------------------------+
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 CountTrades(int type=-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()==type || type==-1)
               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,Lots,NormalizeDouble(price,_Digits),Slip,sl,tp,string(Magic) +" "+ WindowExpertName(),Magic,0,clr);
   return;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double Prosadka(datetime t1, datetime t2)
  {
   double p=0;

   for(int i=0; i<OrdersHistoryTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
        {
         if(OrderCloseTime()>t1 && OrderCloseTime()<t2)
            p+=OrderProfit();
        }
     }

   return(NormalizeDouble(p/AccountBalance()*100,2));
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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,12);
//--- установим цвет
   ObjectSetInteger(0,nm,OBJPROP_COLOR,Aqua);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(ObjectGetInteger(0,"B",OBJPROP_STATE)==1)
     {
      PutOrder(0,Ask);
      ObjectSetInteger(0,"B",OBJPROP_STATE,false);
     }

   if(ObjectGetInteger(0,"S",OBJPROP_STATE)==1)
     {
      PutOrder(1,Bid);
      ObjectSetInteger(0,"S",OBJPROP_STATE,false);
     }

   if(ObjectGetInteger(0,"C",OBJPROP_STATE)==1)
     {
      CloseAll();
      ObjectSetInteger(0,"C",OBJPROP_STATE,false);
     }

   PutLabel("day","Просадка за сутки: "+string(Prosadka(iTime(NULL,PERIOD_D1,0),TimeCurrent())),333,22);
   PutLabel("per","Просадка за период: "+string(Prosadka(T1,T2)),333,44);

   Comment("\n Prosadka: ",Prosadka(iTime(NULL,PERIOD_D1,0),TimeCurrent()));
  }
//+------------------------------------------------------------------+

avatar

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

  • 8 апреля 2024, 11:11
+
0
Спасибо ) поставил… потестирую
avatar

  22  poker Автор Сообщений: 849

  • 8 апреля 2024, 21:14
+
0
Тезка, суточную просадку показал цифру, а вот общую за период 0 (дыты выставил с начала этого года по вчерашний день.
avatar

  22  poker Автор Сообщений: 849

  • 9 апреля 2024, 06:11
+
0
покажите как даты выставили
avatar

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

  • 9 апреля 2024, 10:09
+
0
Я и так и так пробовал

avatar

  22  poker Автор Сообщений: 849

  • 10 апреля 2024, 06:16

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