Как проверить сделки в рамках недели????

 

Здравствуйте дорогие форумчане!

Помогите решить одну задачу...

Как узнать сколько убыточных сделок было совершено в текущую неделю?

С уважением...

 
правой кнопкой на истори сдделок и выбраь период....
 

Нет я в смысле Как это сделать с помощью mql???

Пишу советник и вот на этой проблеме застрял.

 
Для советника надо что бы он имел ограничение по убыточным сделкам в неделю. Если уже совершены две убыточные то не разрешать ему торговать в этой недели.
 
jhon:

Здравствуйте дорогие форумчане!

Помогите решить одну задачу...

Как узнать сколько убыточных сделок было совершено в текущую неделю?

С уважением...


Здравствуйте. Предлагаю Вам для примера и правки под Ваши условия свой участок кода, отвечающий за поиск по истории ордеров количество подряд убыточных сделок, начиная с самой свежей закрытой позиции

 //---------------------расчет по истории ордеров номера очередной итерации----------------------------------------------- 
  Iteration = 0; // зануляем инерации перед их учетом в цикле по истории
  Sum_Loss = 0;  // суммарный убыток по этим итерациям

datetime 
Time_at_History_Current = 0,
Time_at_History_Previos = 0;  
    
 
 if(OrdersHistoryTotal() != 0)
   {
    for(int counter = OrdersHistoryTotal()-1; counter >= 0; counter--)
      {
       OrderSelect(counter, SELECT_BY_POS, MODE_HISTORY);
       if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
         {
          if(OrderType() == OP_BUY || OrderType() == OP_SELL)
            {
             if(OrderProfit() < 0) // если убыток по выбранному ордеру, то считаем суммарный и записываем время закрытия ордера
                                   // для последующего его анализа при подсчете количества итераций
                {
                 double lastLoss = OrderProfit();
                 Sum_Loss=Sum_Loss+lastLoss;  // считаем общий убыток по закрытым подряд убыточным ордерам
                 Time_at_History_Current = OrderCloseTime();
                } 
             
             //Print(" Time_at_History_Current_в цикле = ", TimeToStr(Time_at_History_Current, TIME_DATE|TIME_SECONDS));
             //Print(" Time_at_History_Previos_в цикле = ", TimeToStr(Time_at_History_Previos, TIME_DATE|TIME_SECONDS));
             
             if(Time_at_History_Current != Time_at_History_Previos) // если они не равны, то считаем итерации и делаем их равными
               {
                Time_at_History_Previos = Time_at_History_Current ;
                Iteration++;
                //Print("Iteration at History в условии сравнения  = ",  Iteration);
               }   
             else // они равны, то проверяем, дополнительно, наличие профита по выбранному следующему ордеру и выходим из цикла
               {
                if(OrderProfit() >= 0)
                  break;
               }
            }
         }
      }
   }

Разбирайтесь, вносите правки под свои условия, например, для определения недели от настоящего момента - первое, что пришло это использовать переменные даты и времени, например, TimeLocal(). Далее о этого значения отнимаете количество секунд, находящихся в одной неделе, т.е. 60(сек в мин) * 60 (минут в час) * 24 (часа в сутках) * 5 (торговых суток в одной неделе) = 432 000. Получаете Ваше значение времени, например, некое, ВРЕМЯ_Ч, до которого считаете убыточные ордера, т.е.

 ВРЕМЯ_Ч = TimeLocal()- 432 000;
Затем сравниваете ВРЕМЯ_Ч со временем закрытия очередного выбранного ордера из истории, также в цикле от свежего закрытого, OrderCloseTime() и если OrderCloseTime() этого очередного выбранного ордера меньше, чем ВРЕМЯ_Ч, то время недели закончилось, выходите из цикла, естественно, в цикле считаете количество убыточных сделок неделю назад. Как-то так, для начала.
 
jhon:
Для советника надо что бы он имел ограничение по убыточным сделкам в неделю. Если уже совершены две убыточные то не разрешать ему торговать в этой недели.

+ соответственно в этот же цикл вносите условие, что если уже совершены две убыточные, то выход из цикла. И запрет торговли на неделю. Если до конца недели, то можете пользовать эту ф-ию.
 
Спасибо огромное. Попробую разобраться! Результат скину сюда что бы вновь пришедшие уже такой вопрос не задавали.
 
jhon:

...

Как узнать сколько убыточных сделок было совершено в текущую неделю?

Щас вчитался в условие... :-)

Если за текущую неделю, то ВРЕМЯ_Ч ищите отнимая из ф-ии TimeLocal(), секунды прошедшие за количество дней, возвращаемых ф-ией int DayOfWeek().

Например, в четверг была была с понедельника совершена вторая убыточная сделка,т.е. Вы в этом цикле постоянно отслеживаете самую свежую убыточную сделку, по времени ее закрытия - получаете день недели через int DayOfWeek(). И если происходит следующая картина, что

ВРЕМЯ_Ч = TimeLocal() - 60(сек в мин) * 60 (минут в час) * 24 (часа в сутках) * 4 (торговых суток в одной неделе), т.к. ф-ия int DayOfWeek() вернет значение 4 и если до этого времени_Ч будет еще одна сделка в истории с OrderCloseTime() > ВРЕМЯ_Ч, то Вы выходите из цикла и прерываете торговлю сова до конца текущей недели.

П.С. Этот расчет сделан грубо, а именно не учитываются часы и минуты дня недели, на котором прошла вторая убыточная сделка, т.е. считаются сутки полностью, т.е. если был убыток получен в 2 часа, то время будет "отматываться", какое интересное слово...:-) к началу недели учитывая полностью эти текущие сутки, т.е. все 24 часа, а не 2. До нужной Вам точности расчета можете довернуть используя ф-ии расчета даты и времени.

П.П.С. Это строго мое видение решения этого вопроса, уверен, что существуют и иные варианты, не исключая, что и более элегантные.

 
jhon:
Спасибо огромное. Попробую разобраться! Результат скину сюда что бы вновь пришедшие уже такой вопрос не задавали.


О! Эт грамотная мысль...

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

 
Вообщем что-то у меня не получается. Всё ещё в поиске решения! Кому не трудно пусть напишет.
 
void CalculateLossOrders()
{ 
   
   for(int i=OrdersHistoryTotal();i>=0;i--)
   {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) break;
      if(OrderType() == OP_SELLSTOP)
      {         
         Print(OrderProfit());
         if(OrderProfit() < 0)
         {
            Print("Metka");
            if(minusSell == 0)
            {
               minusSell = 1;
               SellDay1 = TimeDayOfWeek(OrderOpenTime());
            }
            else if(minusSell == 1)
            {
               minusSell = 0;
               SellDay2 = TimeDayOfWeek(OrderOpenTime());
               if((SellDay2 + (SellDay1 - SellDay2)) <= 5)
               {
                  SellBan = True;
                  mySellDay = SellDay2;
                  Print("Два Sella за неделю в -");
               }
               else
               {
                  SellBan = False;
               }
            }
         }
      }
      else if(OrderType() == OP_BUYSTOP)
      {
         if(OrderProfit() < 0)
         {
            if(minusBuy == 0)
            {
               minusBuy = 1;
               BuyDay1 = TimeDayOfWeek(OrderOpenTime());
            }
            else if(minusBuy == 1)
            {
               minusBuy = 0;
               BuyDay2 = TimeDayOfWeek(OrderOpenTime());
               if((BuyDay2 + (BuyDay1 - BuyDay2)) <= 5)
               {
                  BuyBan = True;
                  myBuyDay = BuyDay2;
                  Print("Два Buya за неделю в -");
               }
               else
               {
                  BuyBan = False;
               }
            }
         }
      }
   }   
}

Вот пытаюсь сделать что-то подобное...

Только не понимаю почем Print(OrderProfit) - постоянно показывает 0. А к Print("Metka"); даже не доходит. Как думаете что это может быть?

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