Ответить
03.12.2018, 12:40
Аватар для batmanyuga
batmanyuga batmanyuga вне форума Прохожий
Регистрация: 24.11.2018 / Сообщений: 1
Поблагодарили 0 раз(а) / Репутация: 1
Здравствуйте. Есть индикатор . Хотел прикрутить его к советнику. Всегда все получалось. С этим индюком не получается. Разработчики чтоль какую гадость вставили в код ? В тестере на М5 с помощью Print выводил значения индикатора. Он показывает за несколько минут , а потом провал на час , два. А индюк за это время успевал несколько раз направление поменять. Мне вот эту смену направлений и нужно в советник.
В чем тут подвох с этим индюком ? Помогите, кто знает.
Заранее Спасибо !
04.12.2018, 16:58
Аватар для Pepelac
Pepelac Pepelac вне форума Интересующийся
Регистрация: 18.10.2012 / Сообщений: 18
Поблагодарили 1 раз в 1 сообщении / Репутация: 2
Подскажите пожалуйста как сделать, чтобы советник различал каждую цифру в цене. Например отдельно видел первую или вторую цифру после запятой.
04.12.2018, 18:28
Аватар для Ugar
Ugar Ugar на форуме
Регистрация: 13.03.2009 / Сообщений: 2,595
Поблагодарили 2,102 раз(а) / Репутация: 2179
Подскажите пожалуйста как сделать, чтобы советник различал каждую цифру в цене. Например отдельно видел первую или вторую цифру после запятой.
С помощью арифметики и округления в меньшую сторону можно посчитать

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


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


Третья цифра после запятой
c=floor((Bid*100-floor(Bid*100))*10);
Другой вариант можно преобразовать цену в строку и вытащить любой символ строки. Но строчные операции медленнее.
Глубокое понимание процессов помогает в работе, но сильно мешает в отдыхе.
http://forexsystems.ru/signaturepics/sigpic3798_1.gif
Чужие программы не переделываю!

Последний раз редактировалось Ugar; 04.12.2018 в 18:30.
04.12.2018, 19:17
Аватар для Pepelac
Pepelac Pepelac вне форума Интересующийся
Регистрация: 18.10.2012 / Сообщений: 18
Поблагодарили 1 раз в 1 сообщении / Репутация: 2
Спасибо!
05.12.2018, 08:37
Аватар для AlexeyVik
AlexeyVik AlexeyVik на форуме Программист mql4 mql5
Регистрация: 19.11.2009 / Сообщений: 2,907
Поблагодарили 4,014 раз(а) / Репутация: 4003
Подскажите пожалуйста как сделать, чтобы советник различал каждую цифру в цене. Например отдельно видел первую или вторую цифру после запятой.
Вот ещё вариант математических преобразований для достижения поставленной цели:
Код:
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го знака, то получишь *** сами знаете что...
05.12.2018, 12:28
Аватар для FEEX
FEEX FEEX на форуме Активный участник
Регистрация: 27.08.2018 / Сообщений: 118
Поблагодарили 75 раз(а) / Репутация: 76
Всем привет. Есть такой кусочек кода.

Код:
   int wonTrades=0;
   int lostTrades=0;
   double profitToday=0;
   double profitYesterday=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;
               }
               
            }
        }
      }
   }
Это вывод информации на график:
Код:
   SM("Profit today            : " + DoubleToString(profitToday, 2)+ " " + AccountCurrency() );
   SM("Profit yesterday        : " + DoubleToString(profitYesterday,2 )+ " " + AccountCurrency() );
Как добавить вывод на график
профит за неделю
профит за месяц?
Многие думают, но это не так
05.12.2018, 13:53
Аватар для mobidik
mobidik mobidik на форуме
Регистрация: 09.08.2012 / Адрес: Ua_Khm / Сообщений: 2,424
Поблагодарили 11,434 раз(а) / Репутация: 11447
Всем привет. Есть такой кусочек кода.

Скрытый текст

Код:
   int wonTrades=0;
   int lostTrades=0;
   double profitToday=0;
   double profitYesterday=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;
               }
               
            }
        }
      }
   }
Это вывод информации на график:
Код:
   SM("Profit today            : " + DoubleToString(profitToday, 2)+ " " + AccountCurrency() );
   SM("Profit yesterday        : " + DoubleToString(profitYesterday,2 )+ " " + AccountCurrency() );
[свернуть]


Как добавить вывод на график
профит за неделю
профит за месяц?
Как пример, смотри код индюка в приложении:
05.12.2018, 14:05
Аватар для FEEX
FEEX FEEX на форуме Активный участник
Регистрация: 27.08.2018 / Сообщений: 118
Поблагодарили 75 раз(а) / Репутация: 76
Как пример, смотри код индюка в приложении:
Спасибо, но это совсем не то. Нужно на основе моего кода.
А там вообще всё по-другому.
Многие думают, но это не так
05.12.2018, 16:08
Аватар для AlexeyVik
AlexeyVik AlexeyVik на форуме Программист mql4 mql5
Регистрация: 19.11.2009 / Сообщений: 2,907
Поблагодарили 4,014 раз(а) / Репутация: 4003
Спасибо, но это совсем не то. Нужно на основе моего кода.
А там вообще всё по-другому.
Какой вопрос, такой и ответ.
Какое отношение имеют строки второго кода к первому???
Что такое SM() откуда взято и куда засунуто???
05.12.2018, 16:32
Аватар для FEEX
FEEX FEEX на форуме Активный участник
Регистрация: 27.08.2018 / Сообщений: 118
Поблагодарили 75 раз(а) / Репутация: 76
Какой вопрос, такой и ответ.
Какое отношение имеют строки второго кода к первому???
Что такое SM() откуда взято и куда засунуто???
Цитата:
Это вывод информации на график:
SM вообще не имеет отношения к вопросу.
Если вам будет проще, то вообще эти две строки не смотрите.

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

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

Последний раз редактировалось FEEX; 05.12.2018 в 16:42.
05.12.2018, 17:21
Аватар для mobidik
mobidik mobidik на форуме
Регистрация: 09.08.2012 / Адрес: Ua_Khm / Сообщений: 2,424
Поблагодарили 11,434 раз(а) / Репутация: 11447
Спасибо, но это совсем не то. Нужно на основе моего кода.
А там вообще всё по-другому.
Как можно сделать на основе Вашего кода, если в нем нет необходимых данных???
Например, как Вы писали, нужно узнать профит за неделю - как по мне, сперва находим понедельник и от него считаем по "сегодня". Вопрос: и где в Вашем коде определение понедельника? Код, что Вам привел в качестве примера содержит:

Скрытый текст

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)!=1dt -= 24*60*60;
   
dt += no*7*24*60*60;

   return(
dt);

[свернуть]

Вам, всего-то нужно, взять готовые функции и вставить в свой код и связать все воедино.
05.12.2018, 18:50
Аватар для FEEX
FEEX FEEX на форуме Активный участник
Регистрация: 27.08.2018 / Сообщений: 118
Поблагодарили 75 раз(а) / Репутация: 76
Как можно сделать на основе Вашего кода, если в нем нет необходимых данных???
Например, как Вы писали, нужно узнать профит за неделю - как по мне, сперва находим понедельник и от него считаем по "сегодня". Вопрос: и где в Вашем коде определение понедельника? Код, что Вам привел в качестве примера содержит:

Скрытый текст

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)!=1dt -= 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 = ....
Многие думают, но это не так
05.12.2018, 19:09
Аватар для FEEX
FEEX FEEX на форуме Активный участник
Регистрация: 27.08.2018 / Сообщений: 118
Поблагодарили 75 раз(а) / Репутация: 76
Привет! Я у себя для расчетов профита за какой-то из дней использовал такой вариант:
PHP код:
double ProfitT(int shift=0)
  {
   
double prof=0;
   for(
int i=OrdersHistoryTotal()-1i>=0i--)
      if(
OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderSymbol()==_Symbol && ((Magic>&& 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()-1i>=0i--)
      if(
OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderSymbol()==_Symbol && ((Magic>&& 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()-1i>=0i--)
      if(
OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderSymbol()==_Symbol && ((Magic>&& 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 нужно заменить на свою.
Привет) выше я описал примерно тот же вариант) но мне надо решить этот момент отталкиваясь от основного кода, т.е там всё вместе сделать.
не отдельными функциями, а всё в одном месте.
Многие думают, но это не так
05.12.2018, 19:24
Аватар для vladradon
vladradon vladradon на форуме Почётный гражданин
Регистрация: 12.02.2015 / Сообщений: 742
Поблагодарили 391 раз(а) / Репутация: 398
Привет) выше я описал примерно тот же вариант) но мне надо решить этот момент отталкиваясь от основного кода, т.е там всё вместе сделать.
не отдельными функциями, а всё в одном месте.
Попробуй так:
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(maxLotsizeUsedOrderLots());
            if(
OrderProfit()>0wonTrades++;
            else 
lostTrades++;

            
double orderProfit=(OrderProfit()+OrderSwap()+OrderCommission());
            if(
orderProfit<0totalAmountLost+=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; 05.12.2018 в 19:32.
05.12.2018, 19:37
Аватар для vladradon
vladradon vladradon на форуме Почётный гражданин
Регистрация: 12.02.2015 / Сообщений: 742
Поблагодарили 391 раз(а) / Репутация: 398
В таком варианте будет считать за последние 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(maxLotsizeUsedOrderLots());
            if(
OrderProfit()>0wonTrades++;
            else 
lostTrades++;

            
double orderProfit=(OrderProfit()+OrderSwap()+OrderCommission());
            if(
orderProfit<0totalAmountLost+=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;
           }
        }
     }
  } 
Можно вечно смотреть на то, как горит огонь, как течет вода... и как работает трал...

Последний раз редактировалось vladradon; 05.12.2018 в 20:05.
05.12.2018, 20:29
Аватар для FEEX
FEEX FEEX на форуме Активный участник
Регистрация: 27.08.2018 / Сообщений: 118
Поблагодарили 75 раз(а) / Репутация: 76
В таком варианте будет считать за последние 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(maxLotsizeUsedOrderLots());
            if(
OrderProfit()>0wonTrades++;
            else 
lostTrades++;

            
double orderProfit=(OrderProfit()+OrderSwap()+OrderCommission());
            if(
orderProfit<0totalAmountLost+=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;
           }
        }
     }
  } 
Вот этот вариант вроде правильно считает, я погоняю еще, но вроде правильно))
Спасибо)
Если что-то всплывает не то, я напишу)
Многие думают, но это не так
05.12.2018, 20:30
Аватар для AlexeyVik
AlexeyVik AlexeyVik на форуме Программист mql4 mql5
Регистрация: 19.11.2009 / Сообщений: 2,907
Поблагодарили 4,014 раз(а) / Репутация: 4003
Что-то мне кажется что вопрос в том, как из функции вернуть больше чем одно значение. Не так?
05.12.2018, 20:50
Аватар для vladradon
vladradon vladradon на форуме Почётный гражданин
Регистрация: 12.02.2015 / Сообщений: 742
Поблагодарили 391 раз(а) / Репутация: 398
Что-то мне кажется что вопрос в том, как из функции вернуть больше чем одно значение. Не так?
Просто в одном цикле переборки всех закрытых ордеров посчитать профиты за разные периоды времени по дням от сейчас и в прошлое. Или для вчерась от начала вчера по начало сегодня. Все в одном цикле считается легко, но вот зачем там в оригинале заморочки с проверкой на текущий месяц и текущий год - по-моему лишнее. Если отталкиваться от времени открытия баров, каждый подсчет за нужный период занимает одну строчку кода в цикле.
Можно вечно смотреть на то, как горит огонь, как течет вода... и как работает трал...
05.12.2018, 21:46
Аватар для vladradon
vladradon vladradon на форуме Почётный гражданин
Регистрация: 12.02.2015 / Сообщений: 742
Поблагодарили 391 раз(а) / Репутация: 398
Если что-то всплывает не то, я напишу)
Попробуй такую версию:
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(maxLotsizeUsedOrderLots());
            if(
OrderProfit()>0wonTrades++;
            else 
lostTrades++;

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

            
profitTotal+=orderProfit;

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

Последний раз редактировалось vladradon; 05.12.2018 в 21:57.
06.12.2018, 18:32
Аватар для FEEX
FEEX FEEX на форуме Активный участник
Регистрация: 27.08.2018 / Сообщений: 118
Поблагодарили 75 раз(а) / Репутация: 76
Попробуй такую версию:
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(maxLotsizeUsedOrderLots());
            if(
OrderProfit()>0wonTrades++;
            else 
lostTrades++;

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

            
profitTotal+=orderProfit;

            if(
OrderCloseTime()>=iTime(_Symbol,PERIOD_D1,0) && OrderCloseTime()<iTime(_Symbol,PERIOD_D1,0)+86400profitToday+=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)+86400profitWeek+=orderProfit;
            if(
OrderCloseTime()>iTime(_Symbol,PERIOD_D1,30) && OrderCloseTime()<iTime(_Symbol,PERIOD_D1,0)+86400profitMonth+=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);
  }
//+------------------------------------------------------------------+
Многие думают, но это не так

Последний раз редактировалось FEEX; 06.12.2018 в 18:48.
Ответить

Метки
mql4, mql4 помощь, вопросы mql4


Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Текущее время: 18:18. Часовой пояс GMT.


Перевод: zCarot
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.