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

 
makssub #:

Выдает последний, а не предпоследний(


Посмотри что ты писал:

" Если цена уходит вниз и открывается еще ордер, то предпоследнем становиться ордер с максимальным OrderOpenPrice. "

Функция ищет максимальную или минимальную цену открытия.

Если ты хочешь просто предпоследний, то лучше запомнить тикет при открытии.

 
MakarFX #:

Посмотри что ты писал:

" Если цена уходит вниз и открывается еще ордер, то предпоследнем становиться ордер с максимальным OrderOpenPrice. "

Функция ищет максимальную или минимальную цену открытия.

Если ты хочешь просто предпоследний, то лучше запомнить тикет при открытии.

Извиняюсь, иногда не очень доходчиво доношу свою мысль.

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

Я писал до этого по предпоследнему, и он выдавал. Одна проблема, не отличал OP_SELL и OP_BUY. При появлении второго, он начинает считать его(

 
makssub #:

Извиняюсь, иногда не очень доходчиво доношу свою мысль.

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

Я писал до этого по предпоследнему, и он выдавал. Одна проблема, не отличал OP_SELL и OP_BUY. При появлении второго, он начинает считать его(

Напиши проще что тебе надо найти(если это произошло, то надо это получить)...а то я тоже уже запутался

 
MakarFX #:

Напиши проще что тебе надо найти(если это произошло, то надо это получить)...а то я тоже уже запутался

Выделил цветом, цену какого ордера нужно найти

Не сложно, если нет OP_BUY. Если появляется OP_BUY мой код не работает(

double FindPenultSellPrice()
{
   double  UpPrice = DBL_MAX, profit = 0;
   int    i;
   for(i = OrdersTotal()-2; i >=0; i--)
   {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_SELL)
         {
            if ( OrderOpenPrice() < UpPrice)
            {
               UpPrice = OrderOpenPrice();
            }
         }
      }
   }
   return(UpPrice);
}
 
MakarFX #:

Напиши проще что тебе надо найти(если это произошло, то надо это получить)...а то я тоже уже запутался

Ему нужен не предпоследний ордер по времени, а предпоследний по цене, если цена ушла в другую сторону. Алексей правильно написал, искать нужно по цене. Самый верхний или нижний не трогаем, а перед ним искомый.

Зы. Я бы запоминал при открытии последнего ордера (это же сетка) Тикет предпоследнего в свою переменную. Алгоритм начала только нужно доработать, если верх один и сразу вниз один и опять вверх один и сразу вниз один)))) Если два ордера в одну сторону, то запоминаем тикет предпоследнего и последнего на всякий случай, если открывается третий, то тикет предпоследнего равен тикету последнего, а тикет последнего равен тикету третьего.

 
makssub #:

Выделил цветом, цену какого ордера нужно найти

Не сложно, если нет OP_BUY. Если появляется OP_BUY мой код не работает(

Попробуй так

//+------------------------------------------------------------------+
//|  Функция возвращает по символу и магику                          |
//|  1 - размер лота последней позиции                               |
//|  2 - цена последней открытой позиции                             |
//|  3 - время последней открытой позиции                            |
//+------------------------------------------------------------------+
double GetInfoLastPos(int a=1)
  {
   datetime t=0;
   double result=0,l=0,p=0,f=0;
   
   for(int pos=OrdersTotal()-1;pos>=0;pos--)
     {
      if(OrderSelect(pos, SELECT_BY_POS, MODE_TRADES))
        {
         if(OrderSymbol()==_Symbol && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if(t<OrderCloseTime()) {t=OrderOpenTime(); l=OrderLots(); p=OrderOpenPrice();}
              }
           }
        }
     }
   if(a==1) {result=l;} else
   if(a==2) {result=p;} else
   if(a==3) {result=(double)t;}
   else     {result=0;}
   return(result);
  }
//+------------------------------------------------------------------+
double FindOpenPrice()
  {
   double AbsPoint=DBL_MAX;
   double openprice=0;
   
   for(int pos=OrdersTotal()-2;pos>=0;pos--)
     {
      if(OrderSelect(pos, SELECT_BY_POS, MODE_TRADES))
        {
         if(OrderSymbol()==_Symbol && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if(AbsPoint>MathAbs(OrderOpenPrice()-GetInfoLastPos(2)))
                 {
                  AbsPoint=MathAbs(OrderOpenPrice()-GetInfoLastPos(2));
                  openprice = OrderOpenPrice();
                 }
              }
           }
        }
     }
   return(openprice);
  }
//+------------------------------------------------------------------+
 
MakarFX #:

Попробуй так

Спасибо за труд.

Есть один нюанс) Он находит сверху, отметил  красным. Для OP_SELL нужно снизу, отметил синим. И сразу скажу, не проверял, как будет считать если появится OP_BUY.

 
makssub #:

Спасибо за труд.

Есть один нюанс) Он находит сверху, отметил  красным. Для OP_SELL нужно снизу, отметил синим. И сразу скажу, не проверял, как будет считать если появится OP_BUY.

Сверху и есть ближайший!

Я же просил написать что тебе надо найти, а ты какие-то порции выдаешь...

Например мне надо:"Если открылся СЕЛЛ, то надо найти ближайший СЕЛЛ сверху...и т.д."

P.S. А что ты отметил красным? не вижу 0_о
 
MakarFX #:

Сверху и есть ближайший!

Я же просил написать что тебе надо найти, а ты какие-то порции выдаешь...

Например мне надо:"Если открылся СЕЛЛ, то надо найти ближайший СЕЛЛ сверху...и т.д."

P.S. А что ты отметил красным? не вижу 0_о

У меня бывает. Думаю одно пишу другое. Не внимательность Сорри) На счет красного сам в шоке)

 
makssub #:

У меня бывает. Думаю одно пишу другое. Не внимательность Сорри) На счет красного сам в шоке)

Так что тебе все таки надо?)
Причина обращения: