как узнать как закрылись два последних ордера? - страница 2

 

dmmikl86

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

_____________

В этом случае следует использовать различные магики. А в код функции добавить такое условие.

&& OrderMagicNumber() == MagicNumber

 
OnGoing:

Нет, возможно. Я к тому, что тогда получается вообще история ордеров в МТ работает некорректно?

Нет, просто другой подход. Надо перебрать все ордера и выбрать из них два с максимальным временем закрытия (или открытия, по желанию).

Но думаю даже в этом случае можно выйти из положения, фильтрануть обратно по времени и делов-то)

Не, это на авось. Зачем пользователю знать особенности реализации, если их можно избежать?

А по номеру ордера -- эффективная оптимизация скорости в тестере.

 
TheXpert:

Нет, просто другой подход. Надо перебрать все ордера и выбрать из них два с максимальным временем закрытия (или открытия, по желанию).

Не, это на авось. Зачем пользователю знать особенности реализации, если их можно избежать?

А по номеру ордера -- эффективная оптимизация скорости в тестере.

Согласен. Интересно, в 5-ке такую же кривулину с историей оставили?
 
TheXpert:

выбрать из них два с максимальным временем закрытия


находил функцию выбора последнего ордера у Кимива. а как выбрать второй (он же предпоследний)?
 
dmmikl86:

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

я с тайм-сериями не дружу.... а так в остальном довольно нормально...

 
Загнать данные ордеров в многомерный массив/первое измерение=время закрытия/фильтрануть массив/ выбрать нужный ордер по номеру в массиве
 
dmmikl86:

находил функцию выбора последнего ордера у Кимива. а как выбрать второй (он же предпоследний)?

Если решать в лоб, то запоминаете время закрытия + ордерпрофит

double lastProfit1 = OrderProfit() + OrderSwap();


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

OrderCloseTime()

меньшим, чем выбранный до этого, то также считаете уже его (этого - следующего закрытого ордера)

double lastProfit2 = OrderProfit() + OrderSwap();

увеличиваете счетчик ордеров - если он равен 2, то выходите принудительно из цикла перебора ордеров по истории от последнего закрытого к первому.

Причем здесь не забудьте учесть закодить работу сова на старте, когда закрытых вообще еще не было или был лишь один (первый) закрытый...

У меня подобная конструкция (для работы ТОЛЬКО с самым свежим закрытым) выполнена следующим образом - работает исправно, включая демо и реал.

Правьте под свои нужды - вот стартовый для Вас код.

int time = 0;                      // время - для определения факта работы только с последним закрытым ордером      

  
int start()    // -----------------------СТАРТ ЭКСПЕРТА--------------- 
{
 
//---Поиск последнего отработавшего ордера для открытия очередной позиции ---
   
   for (orderIndex = (OrdersHistoryTotal() - 1); orderIndex >= 0; orderIndex--)
   {   
      if (!OrderSelect(orderIndex, SELECT_BY_POS, MODE_HISTORY))
      {
         Print("Ошибка при доступе к исторической базе (",GetLastError(),")");
         continue;
      }
   
      if ((OrderSymbol() != Symbol()) || (OrderMagicNumber() != MagicNumber))
      {
         continue;
      }
      
        
   //-------------------------Принимаем в расчет только ордер, закрытый недавно-----------------------
if(time<OrderCloseTime())     //(сравниваем его с хранящимся в пероеменной time) 
  {
    time=OrderCloseTime();     //если время закрытия ордера больше - ложим его в переменную     
         int lastType = OrderType();
         double lastLots = OrderLots();
         double lastProfit = OrderProfit() + OrderSwap();
         
        // Print ("lastProfit = ", NormalizeDouble(lastProfit, 1));       
         
         // Анализ только что закрывшегося ордера
      
         if (lastProfit >= 0.0)
         {
  //---Ордер закрылся с прибылью 
         }
         else
         {
            // Ордер закрылся с убытком 
               
         }
         
         return (0);
      }
      
      // Найден закрытый ордер, но он старый
      
      break;
   }
   
// -----------------------Свежих закрытых ордеров не было   
   return(0);    //  ВЫХОД ИЗ СТАРТ
}
 
dmmikl86:

я с тайм-сериями не дружу.... а так в остальном довольно нормально...

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

 

Пипец, ну куда проще работать с массивом:

//+------------------------------------------------------------------+
//|                 Function:GetHistOrdTicketByNumber(int,string,int)|
//+------------------------------------------------------------------+
//|               Description:                                       |
//+------------------------------------------------------------------+
int GetHistOrdTicketByNumber(int num,string sy="",int mn=0){
   int i,ii,tickets[5000][2];
   for(i=OrdersHistoryTotal();i>=0;i--){
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)){
         if(sy!=""){if(OrderSymbol()!=sy){continue;}}
         if(mn!=0 ){if(OrderMagicNumber()!=mn){continue;}}
         tickets[ii][0]=OrderCloseTime();
         tickets[ii][1]=OrderTicket();
         ii++;
      }
   }
   ArrayResize(tickets,ii);
   ArraySort(tickets,WHOLE_ARRAY,0,MODE_DESCEND);
   return(tickets[num][1]);
}
Причина обращения: