Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 1719

 
Snajper007 #:

Ещё вопрос возник. Вот функция расчёта средней цены:

Почему то пересчёт идёт через раз. Т.е. открылся 2й ордер на продажу, функция выдала среднюю цену. Но когда открывается 3й ордер, функция выдаёт и предыдущее значение и новое (через принт в журнале смотрел), а в итоге остаётся предыдущее. Что не так сделал?
//+----------------------------------------------------------------------------+
//| Расчет среденй цены (0)-buy (1)-sell                                       |
//+----------------------------------------------------------------------------+
double GetAveragePrice(int ot=-1)
  {
   double order_lots = 0, order_price = 0, avg_price = 0;
     {
      for(int i = OrdersTotal()-1; i>=0; i--)
        {
         if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
           {
            if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
              {
               if(OrderType()==ot||ot<0)
                 {
                  order_lots += OrderLots();
                  order_price += OrderOpenPrice() * OrderLots();
                 }
              }
           }
        }
     }
   avg_price = NormalizeDouble(order_price / order_lots, Digits);
   return(avg_price);
  }
//+----------------------------------------------------------------------------+
 
MakarFX #:
Спасибо!
 
Доброго дня, кто может помочь внедрить фильтр открытия сделок по индикаторам?
 
Sergei Pimenov #:
Доброго дня, кто может помочь внедрить фильтр открытия сделок по индикаторам?
Подробнее
 

Помогите доработать логику. Нужно чтобы между закрытыми ордерами и открытием нового делалась пауза в часах. Кое что навоял. Но не работает.

OrderCloseTime() > 0 && TimeCurrent() - OrderCloseTime() > FstOrderTimeHour*3600 // сигнал на открытие ордера

OrderCloseTime() == 0 // сигнал на открытие первого ордера

где int FstOrderTimeHour = 1 // пауза в часах
 
Порт-моне тв #:

Помогите доработать логику. Нужно чтобы между закрытыми ордерами и открытием нового делалась пауза в часах. Кое что навоял. Но не работает.

//--- input parameters
input int HourPause = 1;   // Пауза в часах
//--- global parameters
datetime  pause;
//+------------------------------------------------------------------+
void OnTick()
  {
   pause=GetInfoLastPos(3)+(HourPause*60*60);
   // выключаем торговлю
   if(TimeCurrent()<pause) return;
  .......
  }
//+----------------------------------------------------------------------------+
//|  Функция возвращает по символу и магику                             MakarFX|
//|  1 - размер лота последней закрытой позиции                                |
//|  2 - размер профита с учетом комиссии и свопа последней закрытой позиции   |
//|  3 - время последней закрытой позиции                                      |
//+----------------------------------------------------------------------------+
double GetInfoLastPos(int a=1)
  {
   datetime t=0;
   double result=0,l=0,p=0,f=0;
   int i=OrdersHistoryTotal();
   for(int pos=0; pos<i; pos++)
     {
      if(OrderSelect(pos, SELECT_BY_POS, MODE_HISTORY))
        {
         if(OrderSymbol()==_Symbol && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if(t<OrderCloseTime()) {t=OrderCloseTime(); l=OrderLots(); p=OrderProfit()+OrderCommission()+OrderSwap();}
              }
           }
        }
     }
   if(a==1) {result=l;} else
   if(a==2) {result=p;} else
   if(a==3) {result=(double)t;}
   else     {result=0;}
   return(result);
  }
//+----------------------------------------------------------------------------+

Если магик не нужен - желтое удали.

 
MakarFX #:

перед открытием ордера запоминаешь в prev_ticket текущий max_ticket

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

//+----------------------------------------------------------------------------+
//| Расчет тикета предпоследнего ордера в сетке                                 |
//+----------------------------------------------------------------------------+
int GetTicketPenultimateOrder()
  {
   penultimate_ticket = 0;
     {
      for(int cnt = OrdersTotal() - 1; cnt >= 0; cnt--)
        {
         if(OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES))
           {
            if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
              {
               if(OrderType() == OP_BUY || OrderType() == OP_SELL)
                 {
                  if(OrderTicket() > penultimate_ticket)
                     if(penultimate_ticket < GetTicketMaxOrder())
                        penultimate_ticket = OrderTicket();

                 }
              }
           }
        }
     }
   return(penultimate_ticket);
  }

  

 
EVGENII SHELIPOV #:

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

  

Я же тебе давал рабочий код!
 
MakarFX #:
Я же тебе давал рабочий код!

Вот с этим кодом  и происходит всё что я написал выше и даже картинку приложил 

 
EVGENII SHELIPOV #:

Вот с этим кодом  и происходит всё что я написал выше и даже картинку приложил 

Ошибка не коде поиска предпоследнего, а скорее всего в выводе информации в текст
Причина обращения: