Самый дальний ордер в серии

 

У меня есть поиск крайних ордеров в серии
А как мне найти самый крайний предыдущий ордер и т.д. по убыванию??

//+------------------------------------------------------------------+ 
//| МAX и MIN цена ордеров в серии                                   | 
//+------------------------------------------------------------------+ 
double MAXprice(int type=-1){
   double pr=0.0;  
   for(i=OrdersTotal()-1;i>=0;i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol() && OrderMagicNumber()==Magic){
      if(OrderType()==type||type<0){
      if(pr==0.0) pr=OrderOpenPrice();
      if(OrderOpenPrice()>pr) pr=OrderOpenPrice();}}    
return(pr);}
//+--------+
double MINprice(int type=-1){
   double pr=0.0;  
   for(i=OrdersTotal()-1;i>=0;i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol() && OrderMagicNumber()==Magic){
      if(OrderType()==type||type<0){ 
      if(pr==0.0) pr=OrderOpenPrice();
      if(OrderOpenPrice()<pr) pr=OrderOpenPrice();}}
return(pr);}
//+------------------------------------------------------------------+ 
 
forex2030:

У меня есть поиск крайних ордеров в серии
А как мне найти самый крайний предыдущий ордер и т.д. по убыванию??

Точно так же, только добавьте проверку не соответствует новая цена самому крайнему. Или в массив сортируйте...
 
Yevhenii Levchenko:
Точно так же, только добавьте проверку не соответствует новая цена самому крайнему. Или в массив сортируйте...

Словами не понятно, примером всё прояснится))

Т.е. в двухмерный массив собрать все цены по возрастанию и присвоить каждому номер от крайнего 1,2,3..., а потом вызывать под нужным номером (1=дальний, 2=предыдущий) ??
 
forex2030:

Словами не понятно, примером всё прояснится))

Т.е. в двухмерный массив собрать все цены по возрастанию и присвоить каждому номер от крайнего 1,2,3..., а потом вызывать под нужным номером (1=дальний, 2=предыдущий) ??

Вот такой код у меня работал нормально. Правильнее наверно, делать массив структур, но для моих задач так было удобнее.

#include <Trade\OrderInfo.mqh>
#include <Trade\PositionInfo.mqh>
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>

COrderInfo    m_order;
CPositionInfo m_position;
CTrade        m_trade;
CSymbolInfo   m_symbol;
long          Magic = 123;
ulong slippage = 10;
double ArrayBuy[][4], ArraySell[][4];
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   if(!m_symbol.Name(Symbol()))
      return(INIT_FAILED);

   IsRefreshRates();
   m_trade.SetExpertMagicNumber(Magic);

   if(IsFillingTypeAllowed(SYMBOL_FILLING_FOK))
      m_trade.SetTypeFilling(ORDER_FILLING_FOK);
   else
      if(IsFillingTypeAllowed(SYMBOL_FILLING_IOC))
         m_trade.SetTypeFilling(ORDER_FILLING_IOC);
      else
         m_trade.SetTypeFilling(ORDER_FILLING_RETURN);
   m_trade.SetDeviationInPoints(slippage);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
void OnTick()
  {
   IsArrayPick();
  }
//+------------------------------------------------------------------+
void IsArrayPick()
  {
   int orders_Buy = 0;
   int orders_Sell = 0;
   for(int i = PositionsTotal() - 1; i >= 0; i--)
      if(m_position.SelectByIndex(i))
         if(m_position.Symbol() == m_symbol.Name() && m_position.Magic() == Magic)
            if(m_position.PositionType() == POSITION_TYPE_BUY)
              {
               orders_Buy ++;
               ArrayResize(ArrayBuy, orders_Buy, 0);
               ArrayBuy[orders_Buy - 1][0] =  m_position.PriceOpen();
               ArrayBuy[orders_Buy - 1][1] = (double)m_position.PositionType();
               ArrayBuy[orders_Buy - 1][2] = (double)m_position.Ticket();
               ArrayBuy[orders_Buy - 1][3] = (double)m_position.Volume();
              }
            else
              {
               orders_Sell ++;
               ArrayResize(ArraySell, orders_Sell, 0);
               ArraySell[orders_Sell - 1][0] =  m_position.PriceOpen();
               ArraySell[orders_Sell - 1][1] = (double)m_position.PositionType();
               ArraySell[orders_Sell - 1][2] = (double)m_position.Ticket();
               ArraySell[orders_Sell - 1][3] = (double)m_position.Volume();
              }

   for(int i = OrdersTotal() - 1; i >= 0; i--)
     {
      if(m_order.SelectByIndex(i))
         if(m_order.Symbol() == m_symbol.Name() && m_order.Magic() == Magic)
            if(m_order.OrderType() == ORDER_TYPE_BUY_STOP)
              {
               orders_Buy ++;
               ArrayResize(ArrayBuy, orders_Buy, 0);
               ArrayBuy[orders_Buy - 1][0] =  m_order.PriceOpen();
               ArrayBuy[orders_Buy - 1][1] = (double)m_order.OrderType();
               ArrayBuy[orders_Buy - 1][2] = (double)m_order.Ticket();
               ArrayBuy[orders_Buy - 1][3] = (double)m_order.VolumeInitial();
              }
            else
              {
               orders_Sell ++;
               ArrayResize(ArraySell, orders_Sell, 0);
               ArraySell[orders_Sell - 1][0] =  m_order.PriceOpen();
               ArraySell[orders_Sell - 1][1] = (double)m_order.OrderType();
               ArraySell[orders_Sell - 1][2] = (double)m_order.Ticket();
               ArraySell[orders_Sell - 1][3] = (double)m_order.VolumeInitial();
              }
     }
   ArraySort(ArrayBuy);
   ArraySort(ArraySell);
  }
//+------------------------------------------------------------------+
bool IsRefreshRates()
  {
   if(!m_symbol.RefreshRates())
     {
      Print("не удалось обновить котировки!");
      return(false);
     }
   if(m_symbol.Ask() == 0 || m_symbol.Bid() == 0)
      return(false);
   return(true);
  }
//+------------------------------------------------------------------+
bool IsFillingTypeAllowed(int fill_type)
  {
   int filling = m_symbol.TradeFillFlags();
   return((filling & fill_type) == fill_type);
  }
//+------------------------------------------------------------------+
 
Aleksandr Slavskii:

Вот такой код у меня работал нормально. Правильнее наверно, делать массив структур, но для моих задач так было удобнее.

Ну здесь так же определяется самый дальний, а я пытаюсь по порядку удалённости определить.

Перебираю цены по удалённости, но порядок получается не по удалённости

void start()
{
   NumPrice(1);
}
//=========================================================|
int n;
void NumPrice(int type=-1){
   int tf=PERIOD_CURRENT;
   int bars=iBars(Symbol(),tf);
   double price[];
   n=0;
   if(ArraySize(price)<Bars){ArraySetAsSeries(price,false); ArrayResize(price,bars); ArraySetAsSeries(price,true);} 

   for(i=OrdersTotal()-1;i>=0;i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol() && OrderMagicNumber()==Magic){
      if(OrderType()==type||type<0){
      double prc=0.0;
      if(prc==0.0) prc=OrderOpenPrice();
      if(prc>OrderOpenPrice()) prc=OrderOpenPrice();
      if(prc==OrderOpenPrice()){
         n++; 
         price[n]=prc; 
         Print("ЦЕНА ПО ПОРЯДКУ = ", price[n]," == ",n);}}}}
//=========================================================|
 
forex2030:

Ну здесь так же определяется самый дальний, а я пытаюсь по порядку удалённости определить.

Перебираю цены по удалённости, но порядок получается не по удалённости

Извиняюсь, не обратил внимание, что у вас MQL4.

У вас вообще ордера могут записаться в массив через один или  вовсе в массиве будет один ордер если самый дальний окажется самым первым.

У вас в коде сортировка не правильная, попробуйте . 

ArraySort
 
forex2030:

Ну здесь так же определяется самый дальний, а я пытаюсь по порядку удалённости определить.

Перебираю цены по удалённости, но порядок получается не по удалённости

Немного переделал Ваш код, не проверял но должно работать...

void start()
{
   NumPrice(1);
}
//=========================================================|
void NumPrice(int type=-1)
{
   int i;
   int n;
   double price[]; 

   for(i=OrdersTotal()-1;i>=0;i--)
   {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
      {
         if(OrderType()==type||type<0)
         {
            n=ArrayResize(price,ArraySize(price)+1);
            price[n - 1]=OrderOpenPrice();
         }
      }
   }
// отсортируем массив
   ArraySort(price);
// выведем результат в журнал
   for(i=ArraySize(price)-1;i>=0;i--)
      Print("ЦЕНА ПО ПОРЯДКУ = ", price[i]," == ",i);
}
//=========================================================|
 
Sergey Kolemanov:

Немного переделал Ваш код, не проверял но должно работать...

Ну да, работает, цены теперь по порядку убывания.
Спасибо, вопрос решился.

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