Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 2113

 
Maxim Kuznetsov #:

переверни задачу и она решится :-) 

получить начальный и конечный баланс неделя/месяц , но с начала истории. " на

"получить начальный/конечный от сего дня и насколько хватит"

просто цикл в другую сторону. Всё такое эдакое про балансы так считать лучше - от современности в прошлое

PS/ И "при нехватке истории" (это по D1 то) не надо бросать всё...надо сделать паузу и переповторить.. и в самом начале до того как бежать циклом - дёрнуть iBarShift на самую "дальнюю дату" (оно может и сфейлить, но где-то внутри начнёт подкачивать)

PPS/ загвоздка в истории и в MT4, где она может быть неполная...её просто не дают до конца, зависит от того что пользователь натыркал во вкладке.. - в 4-ке (да и в 5 стоит того ) лучше сохранять свою историю самому и отдельно. Так-то всё просто - собрать все записи про закрытия ордеров и пополнения/снятия, отсоритривать по дате и накапливаемая сумма есть искомый баланс, то есть можно получить на любую/произвольную дату. 

Сбором истории никто заниматься не будет - пустое и затратное дело, и к тому-же - не нужное. Но суть не в том.

Сейчас вопрос больше в том, как сделать это:

 

 
Vitaly Muzichenko #:

Сбором истории никто заниматься не будет - пустое и затратное дело, и к тому-же - не нужное. Но суть не в том.

Сейчас вопрос больше в том, как сделать это:

 

к примеру, ты-же этим и занимаешься :-) без истории то что хочешь не решить

образно, в терминах SQL:

SELECT time, sum(profit+swap+commision) as prirost FROM orders ORDER BY time DESC

даст табличку прироста баланса. Чтобы получить абсолютные значения надо из текущего баланса их вычитать. На конкретную дату - просто найти диапазон в табличке куда эта дата попадает. Даты начала/конца недель и месяцев определить по календарю

PS/ (грустный сорказм)  в mt4/5 должно быть некое подобие "gregorian" - функции календаря, "первый понедельник месяца и тому подобное" . Как это нету ? "на несчастном острове нет календаря..."

 
Vitaly Muzichenko #:

Не совсем так, сбор статистики

Что-то подсказывает, что пошёл не по тому пути ...

Нужно получить начальный и конечный баланс неделя/месяц, но с начала истории.


Если это хотелки заказчика, то это точно неверная логика. Смысл может быть только в нужных для анализа участках. И считать конечно от сегодня вглубь. А с начала истории график есть штатный. Его возможно тоже можно расковырять приблизительно по датам.

 
Vitaly Muzichenko #:

Сбором истории никто заниматься не будет - пустое и затратное дело, и к тому-же - не нужное. Но суть не в том.

Сейчас вопрос больше в том, как сделать это:

 

Посмотри Кимовский i-Profit

возможно там найдется решение.

 

Добрый день, подскажите пожалуйста, этот цикл перебирает дневные Хай/Лоу, от текущего дня назад?

 for(int i=1;i<=180;i++) // Цикл из 180 дневных сессий
        {
         while(ExcludeSundayData && TimeDayOfWeek(iTime(Symbol(),PERIOD_D1,n))==0) n++; // If TimeDayOfWeek returns 0 add 1 to n to skip Sunday
         Daily_Range=Daily_Range+(iHigh(Symbol(),PERIOD_D1,n)-iLow(Symbol(),PERIOD_D1,n))/PipValue;
         if(i==1)  adr1 =MathRound(Daily_Range);
         if(i==5)  adr5 =MathRound(Daily_Range/5);
         if(i==30) adr30=MathRound(Daily_Range/30);
         if(i==180) adr180=MathRound(Daily_Range/180); 
         n++;
        }

i=1 это в данном цикле какой день? сегодняшний или первый 180 дней назад?

 

Из кода не видно как i связан с n

iTime(Symbol(),PERIOD_D1,n)
n=0 - сегодня,
n=1 - вчера

 
Aleksei Stepanenko #:

Из кода не видно как i связан с n


#property copyright "Copyright 2023" 
#property indicator_chart_window
// Параметры индикатора--------------------------------------------------------------------------+

extern  color  ADR_Color        = clrWhite;
extern  int    Font_Size        = 10;
extern  int    DisplayCorner    = 1;
extern  string font2            = FONT_ITALIC;
extern  bool   ExcludeSundayData= true;  // set to "false" to INCLUDE Sunday bar in the calculation
//---------------------------------------------------------------------------------------------+
int        x=10;
int        y=10;
int        LastBars0=0;
int        Todays_Range;           // current days range High to Low 
int        n=1;                    //  Used to loop back x days
int        m=1;
static int adr1,adr5,adr30,adr180,adry1; // stores ADR calcs
string     text;                   // 
double     PipValue=0.0001;
double     DailyPips;              // used to hold the daily move in pips  
double     Daily_Range=0.0;        //  Used to Total up the Daily Ranges
double     Daily_Range1=0.0;  
//+---------------------------------------------------------------------------------------------+
//|                                    Инициализация индикатора                                 |
//+---------------------------------------------------------------------------------------------+

int init()
  {
//Установим пипсы для 4- или 5-значных/дробных расчетов в пунктах

   if(Digits==2 || Digits==3) PipValue=PipValue*100; // Для пар с JPY
   if(Digits== 4 || Digits == 5) PipValue = PipValue;

// Создание и размещение надписей на экране-----------------------------------------------------+
   
// Average Daily Range ("ADR180" Label)
   ObjectCreate("xADR0",OBJ_LABEL,0,0,0);          
   ObjectSet("xADR0",OBJPROP_CORNER,DisplayCorner);
   ObjectSet("xADR0",OBJPROP_XDISTANCE,x);
   ObjectSet("xADR0",OBJPROP_YDISTANCE,y+20);     //20 шагов вниз от верхней границы экрана

// Average Daily Range ("ADR30" Label)
   ObjectCreate("xADR1",OBJ_LABEL,0,0,0);          
   ObjectSet("xADR1",OBJPROP_CORNER,DisplayCorner);
   ObjectSet("xADR1",OBJPROP_XDISTANCE,x);
   ObjectSet("xADR1",OBJPROP_YDISTANCE,y+35);     //35 шагов вниз от верхней границы экрана

// Average Daily Range ("ADR5" Label)
   ObjectCreate("xADR2",OBJ_LABEL,0,0,0);          
   ObjectSet("xADR2",OBJPROP_CORNER,DisplayCorner);
   ObjectSet("xADR2",OBJPROP_XDISTANCE,x);
   ObjectSet("xADR2",OBJPROP_YDISTANCE,y+50);     //50 шагов вниз от верхней границы экрана

// Average Daily Range ("Today" Label)
   ObjectCreate("xADR3",OBJ_LABEL,0,0,0);
   ObjectSet("xADR3",OBJPROP_CORNER,DisplayCorner);
   ObjectSet("xADR3",OBJPROP_XDISTANCE,x);
   ObjectSet("xADR3",OBJPROP_YDISTANCE,y+65);     //65 шагов вниз от верхней границы экрана
   
// Average Daily Range ("Today" Label)
   ObjectCreate("xADRY1",OBJ_LABEL,0,0,0);
   ObjectSet("xADRY1",OBJPROP_CORNER,DisplayCorner);
   ObjectSet("xADRY1",OBJPROP_XDISTANCE,x);
   ObjectSet("xADRY1",OBJPROP_YDISTANCE,y+80);     //65 шагов вниз от верхней границы экрана
   return(0);
  }   
//+--------------------------------------------------------------------------------------+
//|      Удаление индикатора                                                             |
//+--------------------------------------------------------------------------------------+
int deinit()
  {
   if(ObjectFind("xADR0")==0)             ObjectDelete("xADR0");// only delete it if it exists
   if(ObjectFind("xADR1") == 0 )          ObjectDelete("xADR1");
   if(ObjectFind("xADR2") == 0 )          ObjectDelete("xADR2");
   if(ObjectFind("xADR3") == 0 )          ObjectDelete("xADR3");
   if(ObjectFind("xADR4") == 0 )          ObjectDelete("xADR4");
   if(ObjectFind("xADR5") == 0 )          ObjectDelete("xADR5");
   if(ObjectFind("xADRY1") == 0 )          ObjectDelete("xADRY1");
   return(0);
  } 
//+--------------------------------------------------------------------------------------+
//|                      Запуск индикатора                                               |
//+--------------------------------------------------------------------------------------+
int start()
  {

   int Bars0=Bars;
//---------------------------------------------------------------------------------------+
//                      Расчёт  ADR на 5,30,180 дней                                     |
//---------------------------------------------------------------------------------------+           
   if(Bars0>LastBars0)
     {

      for(int i=1;i<=180;i++) // Цикл из 180 дневных сессий
        {
         while(ExcludeSundayData && TimeDayOfWeek(iTime(Symbol(),PERIOD_D1,n))==0) n++; // If TimeDayOfWeek returns 0 add 1 to n to skip Sunday
         Daily_Range=Daily_Range+(iHigh(Symbol(),PERIOD_D1,n)-iLow(Symbol(),PERIOD_D1,n))/PipValue;
         if(i==1)  adr1 =MathRound(Daily_Range);
         if(i==5)  adr5 =MathRound(Daily_Range/5);
         if(i==30) adr30=MathRound(Daily_Range/30);
         if(i==180) adr180=MathRound(Daily_Range/180); 
         n++;
        }
// Выводим даные за 5,30,180 дней на монитор---------------------------------------------+

      text="ADR(180) = "+adr180;
      ObjectSetText("xADR0",text,Font_Size,font2,ADR_Color);      //  "ADR180" Label       

      text="ADR(30) = "+adr30;
      ObjectSetText("xADR1",text,Font_Size,font2,ADR_Color);      //  "ADR30" Label    

      text="ADR(5)   = "+adr5;
      ObjectSetText("xADR2",text,Font_Size,font2,ADR_Color);      //  "ADR5" Label
      
       text="ADRY(1)   = "+adry1;
      ObjectSetText("xADRY1",text,Font_Size,font2,ADR_Color);      //  "ADRY1" Label

      LastBars0=Bars0;
     }
//---------------------------------------------------------------------------------------+
//                      Расчёт текущего ADR на сегодняшний день                          +
//---------------------------------------------------------------------------------------+ 
   double Todays_Low  =  iLow (Symbol(),PERIOD_D1,0);
   double Todays_High =  iHigh(Symbol(),PERIOD_D1,0);
   Todays_Range =  MathRound((Todays_High - Todays_Low)/PipValue );
   
// Вывод на экран значения "Today"-------------------------------------------------------+
   text="Today    = "+Todays_Range;                       
   ObjectSetText("xADR3",text,Font_Size,font2,ADR_Color);

   if(iClose(Symbol(),PERIOD_D1,0)>iOpen(Symbol(),PERIOD_D1,0)) DailyPips=(iClose(Symbol(),PERIOD_D1,0)-iOpen(Symbol(),PERIOD_D1,0))/PipValue;
   else if(iOpen(Symbol(),PERIOD_D1,0)>iClose(Symbol(),PERIOD_D1,0)) DailyPips=(iOpen(Symbol(),PERIOD_D1,0)-iClose(Symbol(),PERIOD_D1,0))/PipValue;

   return(0);
  }

n - задается в начале (желтым)

если  n=1 это "вчера", то  n++ это вера +один день всперед(т.е. сегодня), или это "вчера" + "позавчера" + "2 дня назад" и т.д.?
 
Тяжелый код какой-то. Получается, что при i=1, n=1, то есть i=1 - это вчера
 
Aleksei Stepanenko #:
Тяжелый код какой-то. Получается что при i=1, n=1, то есть i=1 - это вчера

получается  n++ это к "вчера" прибавляется "позавчера"?

 
увеличение n - движение в глубь истории: вчера, позавчера, позапозавчера
Причина обращения: