Ваши вопросы по языку MQL4

batmanyuga

Прохожий
Здравствуйте. Есть индикатор . Хотел прикрутить его к советнику. Всегда все получалось. С этим индюком не получается. Разработчики чтоль какую гадость вставили в код ? В тестере на М5 с помощью Print выводил значения индикатора. Он показывает за несколько минут , а потом провал на час , два. А индюк за это время успевал несколько раз направление поменять. Мне вот эту смену направлений и нужно в советник.
В чем тут подвох с этим индюком ? Помогите, кто знает.
Заранее Спасибо !
 

Вложения

  • HA.mq4
    2,3 КБ · Просмотры: 13

Pepelac

Интересующийся
Подскажите пожалуйста как сделать, чтобы советник различал каждую цифру в цене. Например отдельно видел первую или вторую цифру после запятой.
 

Ugar

Гуру форума
Подскажите пожалуйста как сделать, чтобы советник различал каждую цифру в цене. Например отдельно видел первую или вторую цифру после запятой.
С помощью арифметики и округления в меньшую сторону можно посчитать

Первая цифра после запятой от цены Bid
a=floor((Bid-floor(Bid))*10);


Вторая цифра после запятой
b=floor((Bid*10-floor(Bid*10))*10);


Третья цифра после запятой
c=floor((Bid*100-floor(Bid*100))*10);
Другой вариант можно преобразовать цену в строку и вытащить любой символ строки. Но строчные операции медленнее.
 
Последнее редактирование:

AlexeyVik

Программист mql4 mql5
Подскажите пожалуйста как сделать, чтобы советник различал каждую цифру в цене. Например отдельно видел первую или вторую цифру после запятой.
Вот ещё вариант математических преобразований для достижения поставленной цели:
Код:
int f(double value, int i)
{
 int ii = int(pow(10, i));
 int ee = int(value*ii);
 int valMod = ee%10;
 return(valMod);
}
Но в этой функции отсутствует "защита от дурака". Если ввести 5 знаков после запятой, а запросить значение 7го знака, то получишь *** сами знаете что...
 

FEEX

Местный житель
Всем привет. Есть такой кусочек кода.

Код:
   int wonTrades=0;
   int lostTrades=0;
   [B]double profitToday=0;
   double profitYesterday=0;[/B]   
   double profitTotal=0;  
   double totalLotsTraded=0;
   double maxLotsizeUsed=0;
   double profitFactor=-1;
   double totalAmountWon=0;
   double totalAmountLost=0;
   [B]datetime today     = TimeCurrent() ;
   datetime yesterday = TimeCurrent() - (60 * 60 * 24);[/B]
   for (int l=OrdersHistoryTotal();l >= 0;l--)
   {
      if(OrderSelect(l, SELECT_BY_POS,MODE_HISTORY))
      {
        if ( OrderSymbol() == Symbol() )
        {
           if ( OrderMagicNumber() == magicbuy || OrderMagicNumber() == magicsell )
           {
               totalLotsTraded += OrderLots();
               maxLotsizeUsed   = MathMax(maxLotsizeUsed, OrderLots());
               if (OrderProfit() > 0) wonTrades++;
               else lostTrades++;
               
               double orderProfit = (OrderProfit() + OrderSwap() + OrderCommission());
               if (orderProfit<0) totalAmountLost += orderProfit;
               else totalAmountWon += orderProfit;
               
               profitTotal += orderProfit;
               
              [B] if( TimeDay   (OrderCloseTime()) == TimeDay(today) &&
                   TimeMonth (OrderCloseTime()) == TimeMonth(today) &&
                   TimeYear  (OrderCloseTime()) == TimeYear(today) )
               {
                  profitToday += orderProfit;
               }
               
               if( TimeDay  (OrderCloseTime()) == TimeDay(yesterday) &&
                   TimeMonth(OrderCloseTime()) == TimeMonth(yesterday) &&
                   TimeYear (OrderCloseTime()) == TimeYear(yesterday) )
               {
                  profitYesterday += orderProfit;
               }[/B]
               
            }
        }
      }
   }

Это вывод информации на график:
Код:
   SM("Profit today            : " + DoubleToString(profitToday, 2)+ " " + AccountCurrency() );
   SM("Profit yesterday        : " + DoubleToString(profitYesterday,2 )+ " " + AccountCurrency() );

Как добавить вывод на график
профит за неделю
профит за месяц?
 

mobidik

-----
Всем привет. Есть такой кусочек кода.

Код:
   int wonTrades=0;
   int lostTrades=0;
   [B]double profitToday=0;
   double profitYesterday=0;[/B]   
   double profitTotal=0;  
   double totalLotsTraded=0;
   double maxLotsizeUsed=0;
   double profitFactor=-1;
   double totalAmountWon=0;
   double totalAmountLost=0;
   [B]datetime today     = TimeCurrent() ;
   datetime yesterday = TimeCurrent() - (60 * 60 * 24);[/B]
   for (int l=OrdersHistoryTotal();l >= 0;l--)
   {
      if(OrderSelect(l, SELECT_BY_POS,MODE_HISTORY))
      {
        if ( OrderSymbol() == Symbol() )
        {
           if ( OrderMagicNumber() == magicbuy || OrderMagicNumber() == magicsell )
           {
               totalLotsTraded += OrderLots();
               maxLotsizeUsed   = MathMax(maxLotsizeUsed, OrderLots());
               if (OrderProfit() > 0) wonTrades++;
               else lostTrades++;
               
               double orderProfit = (OrderProfit() + OrderSwap() + OrderCommission());
               if (orderProfit<0) totalAmountLost += orderProfit;
               else totalAmountWon += orderProfit;
               
               profitTotal += orderProfit;
               
              [B] if( TimeDay   (OrderCloseTime()) == TimeDay(today) &&
                   TimeMonth (OrderCloseTime()) == TimeMonth(today) &&
                   TimeYear  (OrderCloseTime()) == TimeYear(today) )
               {
                  profitToday += orderProfit;
               }
               
               if( TimeDay  (OrderCloseTime()) == TimeDay(yesterday) &&
                   TimeMonth(OrderCloseTime()) == TimeMonth(yesterday) &&
                   TimeYear (OrderCloseTime()) == TimeYear(yesterday) )
               {
                  profitYesterday += orderProfit;
               }[/B]
               
            }
        }
      }
   }

Это вывод информации на график:
Код:
   SM("Profit today            : " + DoubleToString(profitToday, 2)+ " " + AccountCurrency() );
   SM("Profit yesterday        : " + DoubleToString(profitYesterday,2 )+ " " + AccountCurrency() );

Как добавить вывод на график
профит за неделю
профит за месяц?

Как пример, смотри код индюка в приложении:
 

Вложения

  • i-Profit v2.2.mq4
    58,6 КБ · Просмотры: 16

AlexeyVik

Программист mql4 mql5
Спасибо, но это совсем не то. Нужно на основе моего кода.
А там вообще всё по-другому.
Какой вопрос, такой и ответ.
Какое отношение имеют строки второго кода к первому???
Что такое SM() откуда взято и куда засунуто???
 

FEEX

Местный житель
Какой вопрос, такой и ответ.
Какое отношение имеют строки второго кода к первому???
Что такое SM() откуда взято и куда засунуто???

Это вывод информации на график:

SM вообще не имеет отношения к вопросу.
Если вам будет проще, то вообще эти две строки не смотрите.

Есть profitToday и profitYesterday и в этом коде показано как это получено.
Мне нужно получить profitWeek и profitMonth.
А Вы обращаете внимание на то, о чем речь вообще не шла.

P.S. Вот SM
Код:
void SM(string message)
{
   DisplayCount++;
   Display(message);
      
}
Это как-то поможет получить profitWeek и profitMonth?)
 
Последнее редактирование:

mobidik

-----
Спасибо, но это совсем не то. Нужно на основе моего кода.
А там вообще всё по-другому.

Как можно сделать на основе Вашего кода, если в нем нет необходимых данных???
Например, как Вы писали, нужно узнать профит за неделю - как по мне, сперва находим понедельник и от него считаем по "сегодня". Вопрос: и где в Вашем коде определение понедельника? Код, что Вам привел в качестве примера содержит:
PHP:
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 12.05.2008                                                     |
//|  Описание : Возвращает дату понедельника                                   |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|                                    (-2 - позатой недели)                   |
//|                                    (-1 - прошлой недели)                   |
//|    no - номер понедельника         ( 0 - текущей недели)                   |
//|                                    ( 1 - следующий, ближайший будущий)     |
//|                                    ( 2 - последующий)                      |
//+----------------------------------------------------------------------------+
datetime DateOfMonday(int no=0) 
{
   datetime dt = StrToTime(TimeToStr(TimeCurrent(), TIME_DATE));

   while (TimeDayOfWeek(dt)!=1) dt -= 24*60*60;
   dt += no*7*24*60*60;

   return(dt);
}
Вам, всего-то нужно, взять готовые функции и вставить в свой код и связать все воедино.
 

FEEX

Местный житель
Как можно сделать на основе Вашего кода, если в нем нет необходимых данных???
Например, как Вы писали, нужно узнать профит за неделю - как по мне, сперва находим понедельник и от него считаем по "сегодня". Вопрос: и где в Вашем коде определение понедельника? Код, что Вам привел в качестве примера содержит:
PHP:
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 12.05.2008                                                     |
//|  Описание : Возвращает дату понедельника                                   |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|                                    (-2 - позатой недели)                   |
//|                                    (-1 - прошлой недели)                   |
//|    no - номер понедельника         ( 0 - текущей недели)                   |
//|                                    ( 1 - следующий, ближайший будущий)     |
//|                                    ( 2 - последующий)                      |
//+----------------------------------------------------------------------------+
datetime DateOfMonday(int no=0) 
{
   datetime dt = StrToTime(TimeToStr(TimeCurrent(), TIME_DATE));

   while (TimeDayOfWeek(dt)!=1) dt -= 24*60*60;
   dt += no*7*24*60*60;

   return(dt);
}
Вам, всего-то нужно, взять готовые функции и вставить в свой код и связать все воедино.

У меня есть решение отдельными функциями
Код:
double ProfitMons(int Bar)
  {
   double OProfit=0;
   for(int i=0; i<OrdersHistoryTotal(); i++)
     {
      if(!(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))) break;
      if(OrderSymbol()==Symbol()&& OrderMagicNumber()==MAGICMA)
         if(OrderCloseTime()>=iTime(Symbol(),PERIOD_MN1,Bar) && OrderCloseTime()<iTime(Symbol(),PERIOD_MN1,Bar)+2592000) OProfit+=OrderProfit()+OrderCommission()+OrderSwap();
     }
   return (OProfit);
  }
//+------------------------------------------------------------------+
double ProfitWiks(int Bar)
  {
   double OProfit=0;
   for(int i=0; i<OrdersHistoryTotal(); i++)
     {
      if(!(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))) break;
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)
         if(OrderCloseTime()>=iTime(Symbol(),PERIOD_W1,Bar) && OrderCloseTime()<iTime(Symbol(),PERIOD_W1,Bar)+604800) OProfit+=OrderProfit()+OrderCommission()+OrderSwap();
     }
   return (OProfit);
  }

но мне надо не отдельными функциями, а встроить в уже имеющуюся функцию.
вот есть:
datetime today = TimeCurrent() ;
datetime yesterday = TimeCurrent() - (60 * 60 * 24);
и надо продолжение там же сделать:
datetime week = ...
datetime month = ....
 

FEEX

Местный житель
Привет! Я у себя для расчетов профита за какой-то из дней использовал такой вариант:
PHP:
double ProfitT(int shift=0)
  {
   double prof=0;
   for(int i=OrdersHistoryTotal()-1; i>=0; i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderSymbol()==_Symbol && ((Magic>0 && OrderMagicNumber()==Magic) || Magic<=0))
         if(OrderCloseTime()>=iTime(_Symbol,PERIOD_D1,shift) && OrderCloseTime()<iTime(_Symbol,PERIOD_D1,shift)+86400)
            prof+=OrderProfit()+OrderSwap()+OrderCommission();
   return(prof);
  }
Если период PERIOD_D1 заменить в коде на период PERIOD_W1 , то получим подсчет профита за неделю:
PHP:
double ProfitT(int shift=0)
  {
   double prof=0;
   for(int i=OrdersHistoryTotal()-1; i>=0; i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderSymbol()==_Symbol && ((Magic>0 && OrderMagicNumber()==Magic) || Magic<=0))
         if(OrderCloseTime()>=iTime(_Symbol,PERIOD_W1,shift+1) && OrderCloseTime()<iTime(_Symbol,PERIOD_W1,shift))
            prof+=OrderProfit()+OrderSwap()+OrderCommission();
   return(prof);
  }
Аналогично для месяца:
PHP:
double ProfitT(int shift=0)
  {
   double prof=0;
   for(int i=OrdersHistoryTotal()-1; i>=0; i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderSymbol()==_Symbol && ((Magic>0 && OrderMagicNumber()==Magic) || Magic<=0))
         if(OrderCloseTime()>=iTime(_Symbol,PERIOD_MN1,shift+1) && OrderCloseTime()<iTime(_Symbol,PERIOD_MN1,shift))
            prof+=OrderProfit()+OrderSwap()+OrderCommission();
   return(prof);
  }
В итоге получаем суммарный профит за нужный период profitWeek=ProfitT(1); для недели, где 1 в параметрах - это которую по счету неделю назад нужно посчитать. Для месяца аналогично. В коде есть проверка на магик - там переменную Magic нужно заменить на свою.

Привет) выше я описал примерно тот же вариант) но мне надо решить этот момент отталкиваясь от основного кода, т.е там всё вместе сделать.
не отдельными функциями, а всё в одном месте.
 

vladradon

Программист
Привет) выше я описал примерно тот же вариант) но мне надо решить этот момент отталкиваясь от основного кода, т.е там всё вместе сделать.
не отдельными функциями, а всё в одном месте.
Попробуй так:
PHP:
int wonTrades=0;
int lostTrades=0;
double profitToday=0;
double profitYesterday=0;
double profitWeek=0.0;
double profitMonth=0.0;
double profitTotal=0;
double totalLotsTraded=0;
double maxLotsizeUsed=0;
double profitFactor=-1;
double totalAmountWon=0;
double totalAmountLost=0;
datetime today     = TimeCurrent();
datetime yesterday = TimeCurrent() - (60 * 60 * 24);
for(int l=OrdersHistoryTotal();l>=0;l--)
  {
   if(OrderSelect(l,SELECT_BY_POS,MODE_HISTORY))
     {
      if(OrderSymbol()==Symbol())
        {
         if(OrderMagicNumber()==magicbuy || OrderMagicNumber()==magicsell)
           {
            totalLotsTraded += OrderLots();
            maxLotsizeUsed   = MathMax(maxLotsizeUsed, OrderLots());
            if(OrderProfit()>0) wonTrades++;
            else lostTrades++;

            double orderProfit=(OrderProfit()+OrderSwap()+OrderCommission());
            if(orderProfit<0) totalAmountLost+=orderProfit;
            else totalAmountWon+=orderProfit;

            profitTotal+=orderProfit;

            if( TimeDay   (OrderCloseTime()) == TimeDay(today) &&
               TimeMonth (OrderCloseTime()) == TimeMonth(today) &&
               TimeYear  (OrderCloseTime()) == TimeYear(today) )
              {
               profitToday+=orderProfit;
              }

            if( TimeDay  (OrderCloseTime()) == TimeDay(yesterday) &&
               TimeMonth(OrderCloseTime()) == TimeMonth(yesterday) &&
               TimeYear (OrderCloseTime()) == TimeYear(yesterday) )
              {
               profitYesterday+=orderProfit;
              }
            if(OrderCloseTime()>=iTime(_Symbol,PERIOD_W1,1) && OrderCloseTime()<iTime(_Symbol,PERIOD_W1,0)) profitWeek+=orderProfit;
            if(OrderCloseTime()>=iTime(_Symbol,PERIOD_MN1,1) && OrderCloseTime()<iTime(_Symbol,PERIOD_MN1,0)) profitMonth+=orderProfit;
           }
        }
     }
  }
Только если нужен подсчет профита не по календарным датам, а по текущим дням, то нужно по-другому делать.
 
Последнее редактирование:

vladradon

Программист
В таком варианте будет считать за последние 7 и 30 календарных дней. Если заморачиваться по количеству дней в месяце - надо подумать как лучше. Хотя, вряд ли что-то получится в этом плане, т.к. будет перескок с одного месяца на другой.
PHP:
int wonTrades=0;
int lostTrades=0;
double profitToday=0;
double profitYesterday=0;
double profitWeek=0.0;
double profitMonth=0.0;
double profitTotal=0;
double totalLotsTraded=0;
double maxLotsizeUsed=0;
double profitFactor=-1;
double totalAmountWon=0;
double totalAmountLost=0;
datetime today     = TimeCurrent();
datetime yesterday = TimeCurrent() - (60 * 60 * 24);
for(int l=OrdersHistoryTotal();l>=0;l--)
  {
   if(OrderSelect(l,SELECT_BY_POS,MODE_HISTORY))
     {
      if(OrderSymbol()==Symbol())
        {
         if(OrderMagicNumber()==magicbuy || OrderMagicNumber()==magicsell)
           {
            totalLotsTraded += OrderLots();
            maxLotsizeUsed   = MathMax(maxLotsizeUsed, OrderLots());
            if(OrderProfit()>0) wonTrades++;
            else lostTrades++;

            double orderProfit=(OrderProfit()+OrderSwap()+OrderCommission());
            if(orderProfit<0) totalAmountLost+=orderProfit;
            else totalAmountWon+=orderProfit;

            profitTotal+=orderProfit;

            if( TimeDay   (OrderCloseTime()) == TimeDay(today) &&
               TimeMonth (OrderCloseTime()) == TimeMonth(today) &&
               TimeYear  (OrderCloseTime()) == TimeYear(today) )
              {
               profitToday+=orderProfit;
              }

            if( TimeDay  (OrderCloseTime()) == TimeDay(yesterday) &&
               TimeMonth(OrderCloseTime()) == TimeMonth(yesterday) &&
               TimeYear (OrderCloseTime()) == TimeYear(yesterday) )
              {
               profitYesterday+=orderProfit;
              }
            if(OrderCloseTime()>iTime(_Symbol,PERIOD_D1,7) && OrderCloseTime()<=iTime(_Symbol,PERIOD_D1,0)) profitWeek+=orderProfit;
            if(OrderCloseTime()>iTime(_Symbol,PERIOD_D1,30) && OrderCloseTime()<=iTime(_Symbol,PERIOD_D1,0)) profitMonth+=orderProfit;
           }
        }
     }
  }
 
Последнее редактирование:

FEEX

Местный житель
В таком варианте будет считать за последние 7 и 30 календарных дней. Если заморачиваться по количеству дней в месяце - надо подумать как лучше. Хотя, вряд ли что-то получится в этом плане, т.к. будет перескок с одного месяца на другой.
PHP:
int wonTrades=0;
int lostTrades=0;
double profitToday=0;
double profitYesterday=0;
double profitWeek=0.0;
double profitMonth=0.0;
double profitTotal=0;
double totalLotsTraded=0;
double maxLotsizeUsed=0;
double profitFactor=-1;
double totalAmountWon=0;
double totalAmountLost=0;
datetime today     = TimeCurrent();
datetime yesterday = TimeCurrent() - (60 * 60 * 24);
for(int l=OrdersHistoryTotal();l>=0;l--)
  {
   if(OrderSelect(l,SELECT_BY_POS,MODE_HISTORY))
     {
      if(OrderSymbol()==Symbol())
        {
         if(OrderMagicNumber()==magicbuy || OrderMagicNumber()==magicsell)
           {
            totalLotsTraded += OrderLots();
            maxLotsizeUsed   = MathMax(maxLotsizeUsed, OrderLots());
            if(OrderProfit()>0) wonTrades++;
            else lostTrades++;

            double orderProfit=(OrderProfit()+OrderSwap()+OrderCommission());
            if(orderProfit<0) totalAmountLost+=orderProfit;
            else totalAmountWon+=orderProfit;

            profitTotal+=orderProfit;

            if( TimeDay   (OrderCloseTime()) == TimeDay(today) &&
               TimeMonth (OrderCloseTime()) == TimeMonth(today) &&
               TimeYear  (OrderCloseTime()) == TimeYear(today) )
              {
               profitToday+=orderProfit;
              }

            if( TimeDay  (OrderCloseTime()) == TimeDay(yesterday) &&
               TimeMonth(OrderCloseTime()) == TimeMonth(yesterday) &&
               TimeYear (OrderCloseTime()) == TimeYear(yesterday) )
              {
               profitYesterday+=orderProfit;
              }
            if(OrderCloseTime()>iTime(_Symbol,PERIOD_D1,7) && OrderCloseTime()<=iTime(_Symbol,PERIOD_D1,0)) profitWeek+=orderProfit;
            if(OrderCloseTime()>iTime(_Symbol,PERIOD_D1,30) && OrderCloseTime()<=iTime(_Symbol,PERIOD_D1,0)) profitMonth+=orderProfit;
           }
        }
     }
  }

Вот этот вариант вроде правильно считает, я погоняю еще, но вроде правильно))
Спасибо)
Если что-то всплывает не то, я напишу)
 

AlexeyVik

Программист mql4 mql5
Что-то мне кажется что вопрос в том, как из функции вернуть больше чем одно значение. Не так?
 

vladradon

Программист
Что-то мне кажется что вопрос в том, как из функции вернуть больше чем одно значение. Не так?
Просто в одном цикле переборки всех закрытых ордеров посчитать профиты за разные периоды времени по дням от сейчас и в прошлое.:D Или для вчерась от начала вчера по начало сегодня. Все в одном цикле считается легко, но вот зачем там в оригинале заморочки с проверкой на текущий месяц и текущий год - по-моему лишнее. Если отталкиваться от времени открытия баров, каждый подсчет за нужный период занимает одну строчку кода в цикле.:)
 

vladradon

Программист
Если что-то всплывает не то, я напишу)
Попробуй такую версию:
PHP:
int wonTrades=0;
int lostTrades=0;
double profitToday=0;
double profitYesterday=0;
double profitWeek=0.0;
double profitMonth=0.0;
double profitTotal=0;
double totalLotsTraded=0;
double maxLotsizeUsed=0;
double profitFactor=-1;
double totalAmountWon=0;
double totalAmountLost=0;
for(int l=OrdersHistoryTotal();l>=0;l--)
  {
   if(OrderSelect(l,SELECT_BY_POS,MODE_HISTORY))
     {
      if(OrderSymbol()==Symbol())
        {
         if(OrderMagicNumber()==magicbuy || OrderMagicNumber()==magicsell)
           {
            totalLotsTraded += OrderLots();
            maxLotsizeUsed   = MathMax(maxLotsizeUsed, OrderLots());
            if(OrderProfit()>0) wonTrades++;
            else lostTrades++;

            double orderProfit=(OrderProfit()+OrderSwap()+OrderCommission());
            if(orderProfit<0) totalAmountLost+=orderProfit;
            else totalAmountWon+=orderProfit;

            profitTotal+=orderProfit;

            if(OrderCloseTime()>=iTime(_Symbol,PERIOD_D1,0) && OrderCloseTime()<iTime(_Symbol,PERIOD_D1,0)+86400) profitToday+=orderProfit;
            if(OrderCloseTime()>=iTime(_Symbol,PERIOD_D1,1) && OrderCloseTime()<iTime(_Symbol,PERIOD_D1,0)) profitYesterday+=orderProfit;
            if(OrderCloseTime()>iTime(_Symbol,PERIOD_D1,7) && OrderCloseTime()<iTime(_Symbol,PERIOD_D1,0)+86400) profitWeek+=orderProfit;
            if(OrderCloseTime()>iTime(_Symbol,PERIOD_D1,30) && OrderCloseTime()<iTime(_Symbol,PERIOD_D1,0)+86400) profitMonth+=orderProfit;
           }
        }
     }
  }
Она более корректно должна работать. А в предыдущей нужно добавить в проверку +86400, как в этой версии, иначе текущие на этот день профиты не будут учитываться для недельного и месячного расчетов.
 
Последнее редактирование:

FEEX

Местный житель
Попробуй такую версию:
PHP:
int wonTrades=0;
int lostTrades=0;
double profitToday=0;
double profitYesterday=0;
double profitWeek=0.0;
double profitMonth=0.0;
double profitTotal=0;
double totalLotsTraded=0;
double maxLotsizeUsed=0;
double profitFactor=-1;
double totalAmountWon=0;
double totalAmountLost=0;
for(int l=OrdersHistoryTotal();l>=0;l--)
  {
   if(OrderSelect(l,SELECT_BY_POS,MODE_HISTORY))
     {
      if(OrderSymbol()==Symbol())
        {
         if(OrderMagicNumber()==magicbuy || OrderMagicNumber()==magicsell)
           {
            totalLotsTraded += OrderLots();
            maxLotsizeUsed   = MathMax(maxLotsizeUsed, OrderLots());
            if(OrderProfit()>0) wonTrades++;
            else lostTrades++;

            double orderProfit=(OrderProfit()+OrderSwap()+OrderCommission());
            if(orderProfit<0) totalAmountLost+=orderProfit;
            else totalAmountWon+=orderProfit;

            profitTotal+=orderProfit;

            if(OrderCloseTime()>=iTime(_Symbol,PERIOD_D1,0) && OrderCloseTime()<iTime(_Symbol,PERIOD_D1,0)+86400) profitToday+=orderProfit;
            if(OrderCloseTime()>=iTime(_Symbol,PERIOD_D1,1) && OrderCloseTime()<iTime(_Symbol,PERIOD_D1,0)) profitYesterday+=orderProfit;
            if(OrderCloseTime()>iTime(_Symbol,PERIOD_D1,7) && OrderCloseTime()<iTime(_Symbol,PERIOD_D1,0)+86400) profitWeek+=orderProfit;
            if(OrderCloseTime()>iTime(_Symbol,PERIOD_D1,30) && OrderCloseTime()<iTime(_Symbol,PERIOD_D1,0)+86400) profitMonth+=orderProfit;
           }
        }
     }
  }
Она более корректно должна работать. А в предыдущей нужно добавить в проверку +86400, как в этой версии, иначе текущие на этот день профиты не будут учитываться для недельного и месячного расчетов.

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

Вот эти функции считают всё четко, но они используются отдельно, вне основной функции. А я бы хотел как-то это использовать в основной функции расчета...
Код:
//+------------------------------------------------------------------+  
double ProfitMons(int Bar)
  {
   double OProfit=0;
   for(int i=0; i<OrdersHistoryTotal(); i++)
     {
      if(!(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))) break;
      if(OrderSymbol()==Symbol()&& (OrderMagicNumber()==magicbuy || OrderMagicNumber()==magicsell))
         if(OrderCloseTime()>=iTime(Symbol(),PERIOD_MN1,Bar) && OrderCloseTime()<iTime(Symbol(),PERIOD_MN1,Bar)+2592000) OProfit+=OrderProfit()+OrderCommission()+OrderSwap();
     }
   return (OProfit);
  }
//+------------------------------------------------------------------+
double ProfitWiks(int Bar)
  {
   double OProfit=0;
   for(int i=0; i<OrdersHistoryTotal(); i++)
     {
      if(!(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))) break;
      if(OrderSymbol()==Symbol() && (OrderMagicNumber()==magicbuy || OrderMagicNumber()==magicsell))
         if(OrderCloseTime()>=iTime(Symbol(),PERIOD_W1,Bar) && OrderCloseTime()<iTime(Symbol(),PERIOD_W1,Bar)+604800) OProfit+=OrderProfit()+OrderCommission()+OrderSwap();
     }
   return (OProfit);
  }
//+------------------------------------------------------------------+
 
Последнее редактирование:
Верх