Прошу помочь с логикой расчетов прироста по дням - страница 4

 
elmucon:

странный тип - у него проблема а мы напрягайся - даром ....

иди учи учебник ... создаватель тем ... 

шща ещё кусок кода дам и начнёт тут носом крутить - декомпиль - тряпкой по морде - ....

пня бы дать тебе под зад, что бы базар фильтровал .... 

всё настроение помогать испортил а теперь выё....


Я промолчу, не хочу трепать себе нервы.

 
Vladimir Gribachev:

Я промолчу, не хочу трепать себе нервы.


молчанье золото - только на карточку не переводится .... 

 
Maxim Kuznetsov:
кстати, незабудьте пополнения/снятия учесть, а то лёгкое движение рукой и получается грааль с 1000% прибыли

Вот это решение вроде правильное

   double today_percent = NormalizeDouble(Today*100/(AccountInfoDouble(ACCOUNT_BALANCE)-Today),2);
   double yesterday_percent = NormalizeDouble(Yesterday*100/(AccountInfoDouble(ACCOUNT_BALANCE)-Yesterday-Today),2);
   double twodaysago_percent = NormalizeDouble(TwoDaysAgo*100/(AccountInfoDouble(ACCOUNT_BALANCE)-TwoDaysAgo-Yesterday-Today),2);
   double thismonth_percent = NormalizeDouble(ThisMonth*100/(AccountInfoDouble(ACCOUNT_BALANCE)-ThisMonth),2);
   double lastmonth_percent =  NormalizeDouble(LastMonth*100/(AccountInfoDouble(ACCOUNT_BALANCE)-LastMonth-ThisMonth),2);
   double growth_percent = NormalizeDouble(Growth*100/(AccountInfoDouble(ACCOUNT_BALANCE)-Growth),2);

щас еще учту пополнения/снятия и вроде готово

 

Собрал все в кучу.

Всем спасибо за помощь!

Выкладываю код, прибыль по дням в $ и в % с учетом снятия/пополнения

void DepositsWithdraw(double &initial_deposit,double &deposits,double &withdraw)
  {
   initial_deposit=AccountBalance();
   deposits=withdraw=0;
//---
   for(int i=OrdersHistoryTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
        {
         if(i==0 && OrderType()==6) break;
         if(OrderType()==OP_BUY || OrderType()==OP_SELL)initial_deposit-=OrderProfit()+OrderCommission()+OrderSwap();
         if(OrderType()==6)
           {
            initial_deposit-=OrderProfit();
            if(OrderProfit()+OrderCommission()+OrderSwap()>=0)deposits+=OrderProfit()+OrderCommission()+OrderSwap();
            if(OrderProfit()+OrderCommission()+OrderSwap()<0)withdraw-=OrderProfit()+OrderCommission()+OrderSwap();
           }
        }
     }
   return;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void TotalProfit(double &today,double &yesterday,double &twodaysago,double &thismonth,double &lastmonth,double &growth)
  {
   today=yesterday=twodaysago=thismonth=lastmonth=growth=0;

   for(int i=0; i<OrdersHistoryTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
        {
         if(OrderSymbol()==Symbol() && (OrderMagicNumber()==MagicNumber || MagicNumber==-1))
           {
            if(OrderCloseTime()>=iTime(Symbol(),PERIOD_D1,0))today+=OrderProfit()+OrderSwap()+OrderCommission();
            if(OrderCloseTime()>=iTime(Symbol(),PERIOD_D1,1)&& OrderCloseTime()<iTime(Symbol(),PERIOD_D1,0))yesterday+=OrderProfit()+OrderSwap()+OrderCommission();
            if(OrderCloseTime()>=iTime(Symbol(),PERIOD_D1,2)&& OrderCloseTime()<iTime(Symbol(),PERIOD_D1,1))twodaysago+=OrderProfit()+OrderSwap()+OrderCommission();
            if(OrderCloseTime()>=iTime(Symbol(),PERIOD_MN1,0))thismonth+=OrderProfit()+OrderSwap()+OrderCommission();
            if(OrderCloseTime()>=iTime(Symbol(),PERIOD_MN1,1)&& OrderCloseTime()<iTime(Symbol(),PERIOD_MN1,0))lastmonth+=OrderProfit()+OrderSwap()+OrderCommission();
            if(OrderCloseTime()>=iTime(Symbol(),PERIOD_W1,iBars(NULL,PERIOD_W1)))growth+=OrderProfit()+OrderSwap()+OrderCommission();
           }
        }
     }
   return;
  }


   Today=Yesterday=TwoDaysAgo=ThisMonth=LastMonth=Growth=0;
   TotalProfit(Today,Yesterday,TwoDaysAgo,ThisMonth,LastMonth,Growth);
//---
   InitialDeposit=Deposits=Withdraw=0;
   DepositsWithdraw(InitialDeposit,Deposits,Withdraw);
   Withdraw=MathAbs(Withdraw);
/*
Прирост без учета снятий и пополнений.
Прирост = (Баланс-Депозит)/Депозит*100

Прирост с учетом снятий и пополнений.
Прирост = (Баланс+Снятия-Депозит-Пополнения)/(Депозит+Пополнения)*100
(AccountInfoDouble(ACCOUNT_BALANCE)+Withdraw-InitialDeposit-Deposits)
*/
//---
// прибыль полученную за день делим на баланс на начало дня (текущий баланс минус указанная прибыль) 
   double today_percent=NormalizeDouble(Today/(AccountInfoDouble(ACCOUNT_BALANCE)+Withdraw-Deposits-Today)*100,2);
   double yesterday_percent=NormalizeDouble(Yesterday/(AccountInfoDouble(ACCOUNT_BALANCE)+Withdraw-Deposits-Yesterday-Today)*100,2);
   double twodaysago_percent= NormalizeDouble(TwoDaysAgo/(AccountInfoDouble(ACCOUNT_BALANCE)+Withdraw-Deposits-TwoDaysAgo-Yesterday-Today)*100,2);
   double thismonth_percent = NormalizeDouble(ThisMonth/(AccountInfoDouble(ACCOUNT_BALANCE)+Withdraw-Deposits-ThisMonth)*100,2);
   double lastmonth_percent =  NormalizeDouble(LastMonth/(AccountInfoDouble(ACCOUNT_BALANCE)+Withdraw-Deposits-LastMonth-ThisMonth)*100,2);
   double growth_percent=NormalizeDouble(Growth/(AccountInfoDouble(ACCOUNT_BALANCE)+Withdraw-Deposits-Growth)*100,2);
 
Vladimir Gribachev:

Выкладываю код, прибыль по дням в $ и в % с учетом снятия/пополнения

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

 
Andrey Khatimlianskii:

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


точно точно. спасибо, сделаю.

 
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double GetWithdraw(ENUM_TIMEFRAMES timeframe = PERIOD_CURRENT,int starbar=0,int endbar=0)
  {
   double withdraw=0;
   for(int i=OrdersHistoryTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
        {
         if(OrderType()>5 && OrderProfit()+OrderCommission()+OrderSwap()<0)
           {
            if(OrderCloseTime()>=iTime(Symbol(),timeframe,starbar) && 
               (OrderCloseTime()<iTime(Symbol(),timeframe,endbar) || endbar==-1))withdraw-=OrderProfit()+OrderCommission()+OrderSwap();
           }
        }
     }
   return(withdraw);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double GetDeposits(ENUM_TIMEFRAMES timeframe = PERIOD_CURRENT,int starbar=0,int endbar=0)
  {
   double deposits=0;
   for(int i=OrdersHistoryTotal()-1; i>=0; i--)
     {
       if(i==0 && OrderType()>5) break;
       if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
        {
         if(OrderType()>5 && OrderProfit()+OrderCommission()+OrderSwap()>=0)
           {
            if(OrderCloseTime()>=iTime(Symbol(),timeframe,starbar) && 
               (OrderCloseTime()<iTime(Symbol(),timeframe,endbar) || endbar==-1))deposits+=OrderProfit()+OrderCommission()+OrderSwap();
           }
        }
     }
   return(deposits);
  }

и по коду примерно так можно посчитать

   double today_percent=NormalizeDouble(Today/(AccountInfoDouble(ACCOUNT_BALANCE)-GetWithdraw(PERIOD_D1,0,-1)-GetDeposits(PERIOD_D1,0,-1)-Today)*100,2);
   double yesterday_percent=NormalizeDouble(Yesterday/(AccountInfoDouble(ACCOUNT_BALANCE)-GetWithdraw(PERIOD_D1,1,0)-GetDeposits(PERIOD_D1,1,0)-Today-Yesterday)*100,2);
   double thisweek_percent= NormalizeDouble(ThisWeek/(AccountInfoDouble(ACCOUNT_BALANCE)-GetWithdraw(PERIOD_W1,0,-1)-GetDeposits(PERIOD_W1,0,-1)-ThisWeek)*100,2);
   double lastweek_percent= NormalizeDouble(LastWeek/(AccountInfoDouble(ACCOUNT_BALANCE)-GetWithdraw(PERIOD_W1,1,0)-GetDeposits(PERIOD_W1,1,0)-ThisWeek-LastWeek)*100,2);
   double thismonth_percent = NormalizeDouble(ThisMonth/(AccountInfoDouble(ACCOUNT_BALANCE)-GetWithdraw(PERIOD_MN1,0,-1)-GetDeposits(PERIOD_MN1,0,-1)-ThisMonth)*100,2);
   double lastmonth_percent =  NormalizeDouble(LastMonth/(AccountInfoDouble(ACCOUNT_BALANCE)-GetWithdraw(PERIOD_MN1,1,0)-GetDeposits(PERIOD_MN1,1,0)-ThisMonth-LastMonth)*100,2);
 
Vladimir Gribachev:

и по коду примерно так можно посчитать

GetWithdraw и GetDeposits всегда вместе считаются, можно объединить.

А вообще, это все можно в одном цикле сделать ;)

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