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

 

Это же математика 5го класса школы, совсем я плохой стал)

баланс 100, эквити 105 или 95. Это 5%

как это высчитать правильно ?

 
Volodymyr Zubov #:

Это же математика 5го класса школы, совсем я плохой стал)

баланс 100, эквити 105 или 95. Это 5%

как это высчитать правильно ?

Дал же Вам формулу.

С уважением, Владимир.

 
Спасибо!
 
Volodymyr Zubov #:
Спасибо!

Пожалуйста!

С уважением, Владимир.

 
Volodymyr Zubov #:

Это же математика 5го класса школы, совсем я плохой стал)

баланс 100, эквити 105 или 95. Это 5%

как это высчитать правильно ?

Еще раз

AccountPercent = NormalizeDouble(((AccountEquity()/AccountBalance())-1),2);

105/100-1= 0,05 - эквити увеличилось на 5%

95 /100-1=-0,05 - эквити уменьшилось на 5%

 
ок
 

Вопрос:

Есть код, нужно получить историю с первых дней

  for(int d=CountDay-1; d>=0; d--) { // количество дней прошедших после первого пополнения
    datetime d0=iTime(Symbol(),PERIOD_D1,d);
    if(d0==0) continue; // При недостатке истории - дальше не выполняем. Нужно это исключить
    TimeToStruct(d0,dt);
    //--
    int NumWeek=(int)ceil(dt.day_of_year/7);
    if(NumWeek!=pNumWeek) {
      w++;
      pNumWeek=NumWeek;
    }
    datetime w0=iTime(Symbol(),PERIOD_W1,w)+86400; // получим неделю. Здесь аналогично - нужно заменить
    //--
    if(dt.mon!=pMon) {
      m++;
      pMon=dt.mon;
    }
    datetime m0=iTime(Symbol(),PERIOD_MN1,m); // получим месяц. И здесь заменить, так как истории также нет
    //--
    Profit[d].date=d0;

Проблема:

Если недостаточно истории, то дойти до конца уже не получается. Первое пополнение было в 2016, а истории только до 2018

Как решить, чем заменить ?

--

Полный код:

void GetHistory()
{
  int w=-1,m=-1;
  int pMon=-1,pNumWeek=-1;
  int CD=GetCountDay();
  ArrayResize(Profit,CD);
  ZeroMemory(Profit);
  //--
  for(int d=CD-1; d>=0; d--) {
    datetime d0=iTime(Symbol(),PERIOD_D1,d);
    if(d0==0) continue;
    TimeToStruct(d0,dt);
    //--
    int NumWeek=(int)ceil(dt.day_of_year/7);
    if(NumWeek!=pNumWeek) {
      w++;
      pNumWeek=NumWeek;
    }
    datetime w0=iTime(Symbol(),PERIOD_W1,w)+86400; // получим неделю
    //--
    if(dt.mon!=pMon) {
      m++;
      pMon=dt.mon;
    }
    datetime m0=iTime(Symbol(),PERIOD_MN1,m); // получим месяц
    //--
    Profit[d].date=d0;

    for(int i=OrdersHistoryTotal()-1; i>=0; i--) {
      if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
        //--
        if(OrderType()<2) {
          datetime OCT=OrderCloseTime();
          if(d0<OCT && d0+86400>OCT) Profit[d].today+=OrderProfit()+OrderCommission()+OrderSwap();
          if(w0<OCT && w0+604800>OCT) Profit[d].week+=OrderProfit()+OrderCommission()+OrderSwap();
          if(m0<OCT && m0+2592000>OCT) Profit[d].month+=OrderProfit()+OrderCommission()+OrderSwap();
        }
        //--
        if(OrderType()==6) {
          datetime OOT=OrderOpenTime();
          if(d0<OOT && d0+86400>OOT) Profit[d].depToday+=OrderProfit();
          if(w0<OOT && w0+604800>OOT) Profit[d].depWeek+=OrderProfit();
          if(m0<OOT && m0+2592000>OOT)Profit[d].depMonth+=OrderProfit();
        }
      }
    }
  }
}

Некоторый выход:

  string comm="";
  int CD=GetCountDay();
  //for(int d=0; d<CD; d++) {
  for(int d=CD-1; d>=0; d--) {
    if(Profit[d].depToday!=0) {
      comm+=(
              d+"==="+
              TimeToString(Profit[d].date)+"="+
              DoubleToString(Profit[d].today,2)+"="+
              DoubleToString(Profit[d].week,2)+"="+
              DoubleToString(Profit[d].month,2)+"="+
              DoubleToString(Profit[d].depToday,2)+"="+
              DoubleToString(Profit[d].depWeek,2)+"="+
              DoubleToString(Profit[d].depMonth,2)+"\n"
            );
    }
  }
  Comment(comm);

 

 

 
Vitaly Muzichenko #:

Вопрос:

Есть код, нужно получить историю с первых дней

Проблема:

Если недостаточно истории, то дойти до конца уже не получается. Первое пополнение было в 2016, а истории только до 2018

Как решить, чем заменить ?

--

Полный код:

судя по всему ты график баланс/еквити строишь ?

в обратную сторону считай - от текущего момента про который всё известно и вглубь истории. То есть идёшь назад и отнимаешь OrderProfit()+OrderSwap()... (а у тебя в коде проход от истории к современости и ты складываешь.. но история неполная и начинаются проблемы)

 
Maxim Kuznetsov #:

судя по всему ты график баланс/еквити строишь ?

в обратную сторону считай - от текущего момента про который всё известно и вглубь истории. То есть идёшь назад и отнимаешь OrderProfit()+OrderSwap()... (а у тебя в коде проход от истории к современости и ты складываешь.. но история неполная и начинаются проблемы)

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

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

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

--

Считаем прибыль/убыток, учитываем пополнения/снятия = результат

--

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

 

---

Нужно получить строку:

неделя0 "дата", начальный баланс =***,  конечный баланс =***, прибыль =***

неделя1 "дата", начальный баланс =***,  конечный баланс =***, прибыль =***

неделя2 "дата", начальный баланс =***,  конечный баланс =*** , прибыль =***

неделя3 "дата", начальный баланс =***,  конечный баланс =*** , прибыль =***

месяц0 "дата", начальный баланс =***,  конечный баланс =*** , прибыль =***

неделя4 "дата", начальный баланс =***, конечный баланс =***, прибыль =***

...

 
Vitaly Muzichenko #:

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

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

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

--

Считаем прибыль/убыток, учитываем пополнения/снятия = результат

--

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

 

---

Нужно получить строку:

неделя0 "дата", начальный баланс =***,  конечный баланс =***, прибыль =***

неделя1 "дата", начальный баланс =***,  конечный баланс =***, прибыль =***

неделя2 "дата", начальный баланс =***,  конечный баланс =*** , прибыль =***

неделя3 "дата", начальный баланс =***,  конечный баланс =*** , прибыль =***

месяц0 "дата", начальный баланс =***,  конечный баланс =*** , прибыль =***

неделя4 "дата", начальный баланс =***, конечный баланс =***, прибыль =***

...

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

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

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

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

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

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

Причина обращения: