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

vladradon

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

FEEX

Местный житель
FEEX,

Вот я про что и писал выше как считать профит по календарной неделе или по текущим 7-ми дням (и про месяц тоже) - либо мы считаем чисто по календарным датам недели и месяца, либо за конкретное количество дней назад + текущий день. Ты просто сам определись, какой вариант тебе нужен. Или оба можно заложить и в настройках ввести параметр-переключатель.

Ну, по логике, как бы, неделя - это рабочая неделя - с понедельника по пятницу (плюс выходные), а месяц - это календарный месяц - с 1.01 по 1.02 к примеру)
 

vladradon

Программист
Ну, по логике, как бы, неделя - это рабочая неделя - с понедельника по пятницу (плюс выходные), а месяц - это календарный месяц - с 1.01 по 1.02 к примеру)
Пробуй такой вариант:
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)) profitToday+=orderProfit;
            if(OrderCloseTime()>=iTime(_Symbol,PERIOD_D1,1) && OrderCloseTime()<iTime(_Symbol,PERIOD_D1,0)) profitYesterday+=orderProfit;
            if(OrderCloseTime()>=iTime(_Symbol,PERIOD_W1,0)) profitWeek+=orderProfit;
            if(OrderCloseTime()>=iTime(_Symbol,PERIOD_MN1,0)) profitMonth+=orderProfit;
           }
        }
     }
  }
 

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)) profitToday+=orderProfit;
            if(OrderCloseTime()>=iTime(_Symbol,PERIOD_D1,1) && OrderCloseTime()<iTime(_Symbol,PERIOD_D1,0)) profitYesterday+=orderProfit;
            if(OrderCloseTime()>=iTime(_Symbol,PERIOD_W1,0)) profitWeek+=orderProfit;
            if(OrderCloseTime()>=iTime(_Symbol,PERIOD_MN1,0)) profitMonth+=orderProfit;
           }
        }
     }
  }

Вот так нормально получается)

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,0)) profitToday+=orderProfit;
               //if(OrderCloseTime()>=iTime(_Symbol,PERIOD_D1,1) && OrderCloseTime()<iTime(_Symbol,PERIOD_D1,0)) profitYesterday+=orderProfit;
               if(OrderCloseTime()>=iTime(_Symbol,PERIOD_W1,0)) profitWeek+=orderProfit;
               if(OrderCloseTime()>=iTime(_Symbol,PERIOD_MN1,0)) profitMonth+=orderProfit;
               
            }
        }
      }
   }
 

vladradon

Программист
Вот так нормально получается)
Мне вариант с суммированием профита не по календарным неделе и месяце, а по дням больше нравится - он как-то более информативней получается - статистика работы сова более наглядная. А то наступил новый месяц, все старые расчеты обнулились и приходится лезть в историю, чтобы проанализировать торговлю.
 
Последнее редактирование:

FEEX

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

У меня не все обнуляется, профит за день и за вчера виден каждый день, плюс профит за всё время у меня еще выводится., а вот профит за неделю должен стартовать с началом каждой новой недели, тоже самое с месяцем - старт с каждым новым месяцем. Иначе вообще какой смысл в этих строках?))
 

FEEX

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

Этот вариант, скорее, интересен для тестирования) На реале же, как мне кажется, интереснее в конце каждой недели понимать что получилось конкретно за торговую неделю.. А вообще да, кому как нравится)
 

FEEX

Местный житель
Может еще кто подскажет:
как вывести на график текущий день недели по серверному времени?
Например, если понедельник, то "Mon", и т.д.
 

AlexeyVik

Программист mql4 mql5
Этот вариант, скорее, интересен для тестирования) На реале же, как мне кажется, интереснее в конце каждой недели понимать что получилось конкретно за торговую неделю.. А вообще да, кому как нравится)
А если ордера остались на выходные, то в какую неделю считать их профит? И считать-ли их текущий профит среди недели?
 

vladradon

Программист
Может еще кто подскажет:
как вывести на график текущий день недели по серверному времени?
Например, если понедельник, то "Mon", и т.д.
Чирканул чисто преобразование дня недели в текст. То, что в кавычках, можешь сам поправить для себя. По поводу вывода на график - текстовое значение в переменной DayNow, а вот как ты хочешь его выводить на график - это нужно обсудить дополнительно.
PHP:
string DayNow="";
switch(DayOfWeek())
  {
   case 0: DayNow="Sun"; break;
   case 1: DayNow="Mon"; break;
   case 2: DayNow="Tues"; break;
   case 3: DayNow="Wed"; break;
   case 4: DayNow="Thurs"; break;
   case 5: DayNow="Fri"; break;
   case 6: DayNow="Sat"; break;
   default: DayNow=""; break;
  }
 
Последнее редактирование:
  • Like
Реакции: FEEX

FEEX

Местный житель
Чирканул чисто преобразование дня недели в текст. То, что в кавычках, можешь сам поправить для себя. По поводу вывода на график - текстовое значение в переменной DayNow, а вот как ты хочешь его выводить на график - это нужно обсудить дополнительно.
PHP:
string DayNow="";
switch(DayOfWeek())
  {
   case 0: DayNow="Sun"; break;
   case 1: DayNow="Mon"; break;
   case 2: DayNow="Tues"; break;
   case 3: DayNow="Wed"; break;
   case 4: DayNow="Thurs"; break;
   case 5: DayNow="Fri"; break;
   case 6: DayNow="Sat"; break;
   default: DayNow=""; break;
  }
Вот у меня есть вывод на график дата и время сервера:
SM("Server Time : " + TimeToStr(TimeCurrent(), TIME_DATE|TIME_MINUTES));
на графике получается так:
2018.12.07 11:26
и я бы хотел чтобы день недели выводился в той же строке:
2018.12.07 11:26, Mon
 

vladradon

Программист
Вот у меня есть вывод на график дата и время сервера:
SM("Server Time : " + TimeToStr(TimeCurrent(), TIME_DATE|TIME_MINUTES));
на графике получается так:
2018.12.07 11:26
и я бы хотел чтобы день недели выводился в той же строке:
2018.12.07 11:26, Mon
Примерно так:
PHP:
SM("Server Time : " + TimeToStr(TimeCurrent(), TIME_DATE|TIME_MINUTES)+", "+DayNow);
А функция, которую выложил выше, должна стоять выше по коду - чтобы сначала она отрабатывала, а потом уже функция вывода на график.
 
  • Like
Реакции: FEEX

FEEX

Местный житель
Примерно так:
PHP:
SM("Server Time : " + TimeToStr(TimeCurrent(), TIME_DATE|TIME_MINUTES)+", "+DayNow);
А функция, которую выложил выше, должна стоять выше по коду - чтобы сначала она отрабатывала, а потом уже функция вывода на график.

Спасибо!! Работает))
С утра рою гугл и ничего, и я думал через свитч, но не знал как именно..))
 

FEEX

Местный житель
А если ордера остались на выходные, то в какую неделю считать их профит? И считать-ли их текущий профит среди недели?

По закрытию профит посчитается. )
если открыты были в пятницу, а закрылись в понедельник, то профит уже будет в понедельник. Мы же считаем профит, фиксированный профит, на текущий момент, а не когда что открылось?))
Открытый ордер это еще не профит, зачем его считать тогда?))
 
Последнее редактирование:

vladradon

Программист
Открытый ордер это еще не профит, зачем его считать тогда?))
Открытые ордера и не присутствуют в истории торгов - их профит можно считать только на текущий момент и можно, кстати, добавлять его (суммировать) к текущему профиту за день для ориентира - это чисто мысли вслух.))
 

FEEX

Местный житель
Открытые ордера и не присутствуют в истории торгов - их профит можно считать только на текущий момент и можно, кстати, добавлять его (суммировать) к текущему профиту за день для ориентира - это чисто мысли вслух.))

с "курент профит" то понятно) но лично я не вижу смысл его прибавлять, т.к он еще не зафиксирован))
Поэтому я не знаю почему человек так волнуется за открытые ордера))
Закроются, тогда посчитаем :D
 

vladradon

Программист
С утра рою гугл и ничего, и я думал через свитч, но не знал как именно..))
Я пользуюсь Яндексом - только сегодня обсуждали с другом - движок тот же, но гугл не отрубает ненужную рекламу, как Яндекс браузер (особенно, когда смотришь фильмы онлайн).)))
 

AlexeyVik

Программист mql4 mql5
По закрытию профит посчитается. )
если открыты были в пятницу, а закрылись в понедельник, то профит уже будет в понедельник. Мы же считаем профит, фиксированный профит, на текущий момент, а не когда что открылось?))
Открытый ордер это еще не профит, зачем его считать тогда?))
У каждого свои тараканы в голове. Кто считает, кто нет...:) Поэтому такие моменты всегда оговариваются.
 

Artem1584

Прохожий
Множитель ордеров

Привет!
Помогите пожалуйста)
Есть ли такая функция которая множит не лот, а количество ордеров в сеточном советники?
Или как ее прописать?

int order_type = FindLastOrderType();
if ( order_type== OP_BUY)
{
price=FindLastOrderPrice( OP_BUY);
if( Ask<=price - Step*Point )
{
lastlot= FindLastLots( OP_BUY);
lastlot = NormalizeDouble ( lastlot*Multiplier,2);
ticket = OrderSend(Symbol(), OP_BUY, lastlot, Ask,5,0, 0, "", Magic,0, Blue);
if ( ticket < 1)
Print ( "Ошибка открытия ордера на покупку");
ModifyOrders( OP_BUY);
 
Верх