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


batmanyuga

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

Вложения

  • 2,3 КБ Просмотры: 8

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() );

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

Вложения

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;
           }
        }
     }
  }
Вот этот вариант вроде правильно считает, я погоняю еще, но вроде правильно))
Спасибо)
Если что-то всплывает не то, я напишу)
 

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);
  }
//+------------------------------------------------------------------+
 
Последнее редактирование:

Онлайн статистика

Пользователи онлайн
69
Гости онлайн
89
Всего посетителей
158

Статистика

Гостевая
Help Users
  • (Guest) SamuraQZ:
    всем добрый вечер
    Цитата
  • (Guest) SamuraQZ:
    хотел спросить, я вот недавно начал торговать в компании Instaforex, есть ли какие нибудь отзывы о нем? или где вы сами торгуете
    Цитата
  • (Guest) SamuraQZ:
    просто на всех форумах пишут обо всех ДЦ Форекс что они все мошенники, даже не знаю кому верить
    Цитата
  • Дмитрий007:
    в инсте самые убогие условия
    Цитата
  • Дмитрий007:
    имхо, но forex4you вроде норм щас, fxopen ниче должен быть, был классный fortfs, но испаганился в корень
    Цитата
  • Геша5:
    SamuraQZ сказал(а):
    хотел спросить, я вот недавно начал торговать в компании Instaforex, есть ли какие нибудь отзывы о нем? или где вы сами торгуете
    Есть конечно отзывы для всех брокеров.На форуме есть темы про рекомендуемых брокеров,на которых торгуют и без существеных претензий...
    Цитата
  • doperst:
    (Guest) SamuraQZ, с Инстой не стоит связываться. Работал там лично. Сначала кинули на партнерские, потом на ребейтинг, а потом два счета просто перестали существовать. По копейкам выводят, чуть приличная сумма - начинаются проблемы, вплоть до обнуления счетов.
    +2
    Цитата
  • doperst:
    А так вы правы, 98% форекс брокеров зарабатывают на потерях своих клиентов. Именно поэтому менеджеры достают вас своими звонками, брокеры дают бонусы и якобы «удваивают» депозиты. Форекс в Российской Федерации не регулируются законодательством. Налог на доход трейдеров есть, а сам процесс торговли никем не контролируется. Теоретически, любой брокер может делать с котировками (графиком) что угодно и когда угодно. Этот факт мошенничества с его стороны очень тяжело доказать. Поэтому есть смысл работать только с теми форекс-брокерами, которые дорожат своей репутацией.
    +1
    Цитата
  • ЛИС151:
    Здоров народ из старых кто заходит ??? сюда
    Цитата
  • ANDR77:
    Ужас! Кто в Инсте еще торгует? Мрак полный.......бегите отдуда!!!!
    Цитата
  • ANDR77:
    Лет 7 назад от них убежал- ..... не пожалел ни на копейку))))
    Цитата
  • ANDR77:
    Как дела в мире? Люди?!
    Цитата
  • jouri:
    Мире не знаю ,а у меня ОК
    Цитата
  • jouri:
    (y)На счёт доверия брокерам 12 лет с форекс-фою дружу , и всегда выводил без проблем, вот вчера вывел 500 баков ,несколько часов рассматривали заявку и перевели на карту.Хотя отзывов об этом брокере в последние 2-3 года как под копирку негативные. Я даже сам чють в это не поверил ,так красиво обсирают. Так .что верить на слово не стоит надо, всё самим проверять.Думаю пока продолжать с ними дружить .Если чё сами можете попробывать вывод денег , это не реклама , а подсказка для тех кто разочаровался в ДЦ.;)
    Цитата
  • Denis1231999:
    РЕБЯТ А ПОДСКАЖИТЕ КАК ПОЛУЧИТЬ КЛЮЧ К ИНДИКАТОРУ MONEY GES
    Цитата
  • jouri:
    Вы ещё торгуете индикаторами ...... В топку их все и проблем не будет с ключами.Торгуйте так-- это просто, но реально будете в плюсе, ставите магд и смотрите его , пересечение с нулём ,,нулевые точки , , если вход по магду снизу баем, профит на предыдущую вершину магда которая на истории в положительной зоне, это направление ,а тонкости сами надеюсь увидеть можно в процессе торговли ,посмотрите внимательно на историю этих горбов на магде. Желательно таймы повыше от м30 до Н4.
    Цитата
  • track:
    фигасе
    Цитата
  • track:
    а какие еще схемы, ведь макд это тоже индикатор
    Цитата
  • erex:
    Давайте все же отделять мух от ... других мух. Есть индикаторы, обрабатывающие график - кривые, косые, средние и полусредние. Есть информаторы - новости, данные с мухокниги и ФХбли, с СМЕ и оанды. И есть статистика - атр, пивоты, пр. Мухи получаются очень разные.
    Цитата
  • garry119:
    Denis1231999 сказал(а):
    РЕБЯТ А ПОДСКАЖИТЕ КАК ПОЛУЧИТЬ КЛЮЧ К ИНДИКАТОРУ MONEY GES
    это параболик. вопрос тейков только решить
    Цитата
  • track:
    неправильно нарисованы профиты
    Цитата
  • track:
    работает только система эллиота
    Цитата
  • hassansquee:
    i need profitabe indicator
    Цитата
  • kit888:
    Подарите мне вход на 100000$
    Цитата
  • kit888:
    Δ Δ Δ
    Цитата
    Верх