OrderProfit() предпоследнего ордера - страница 2

 
Dmitry Fedoseev:

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

Поэтому надо надеться только на себя - сортировать по времени.  

Не сортируются они , давно уже.  

можно так

if(OrderSelect(1,SELECT_BY_POS, MODE_TRADES)) 

 При условии что позиции открыты только по этой паре и нет отложек

т.е последний  = 0, предпоследний = 1.

 
pako:

Не сортируются они , давно уже.  

можно так

 При условии что позиции открыты только по этой паре и нет отложек

Отложки есть, ну раз ни сортируются значит вопрос решен. Спасибо!

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

OrderProfit() предпоследнего ордера

Vitaly Muzichenko, 2016.08.16 08:10

Вот, выбираете номер нужного, не забывайте, первая с индексом "0"

 Comment( GetProfitOpenPosInCurrency(_Symbol, OP_SELL, -1, 1) ); // GetProfitOpenPosInCurrency( symbol, бай или селл(-1 - все), Magic(-1 - любой), индекс позиции (1-предпоследняя, 0-последняя)) 

//===============================================================================================
//------------- Возвращает суммарный профит открытых позиций в валюте депозита -----------------+
//===============================================================================================
double GetProfitOpenPosInCurrency(string symb="0", int type=-1, int mg=-1,int index=0) {
 double p[];
 int c=-1, pr=0;
  if(symb=="0") { symb=Symbol();}
   for (int i=OrdersTotal()-1; i>=0; i--) {
    if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
     if(OrderType()==OP_BUY || OrderType()==OP_SELL) {
      if((OrderSymbol()==symb||symb=="")&&(type<0||OrderType()==type)&&(mg<0||OrderMagicNumber()==mg)) {
       c++;
       ArrayResize(p, c+1);
       p[c]=OrderProfit()+OrderSwap()+OrderCommission();
       pr=c>=index?index:c; // если открытых меньше, чем указано в выборе по индексу, то выведет профит самой первой открытой
 }}}}
  return(c==-1?0:p[pr]);
 }

 
pako:

Не сортируются они , давно уже.  

можно так

 При условии что позиции открыты только по этой паре и нет отложек

т.е последний  = 0, предпоследний = 1.

      if(OrderSelect(1,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol())
           {
            if(OrderType()==OP_SELL || OrderType()==OP_BUY)
Ну а если указать пару и тип, так будет работать?
 
Vladimir Deryagin:

Отложки есть, ну раз ни сортируются значит вопрос решен. Спасибо!


имелось ввиду:  самая старая позиция по времени , всегда "0"
 
Vladimir Deryagin:
Хорошо возьму на вооружение (до первого сбоя), но то что дал Vitaly Muzichenko пока работает как часики. Да, я и не знаю как последний полученный ордер можно проигнорировать при повторном цикле.

Ну тогда так, хотя и первая будет работать:

//===============================================================================================
//------------- Возвращает суммарный профит открытых позиций в валюте депозита -----------------+
//===============================================================================================
double GetProfitOpenPosInCurrency(string symb="0", int type=-1, int mg=-1,int index=0) {
 double p[][2];
 int c=-1, pr=0;
  if(symb=="0") { symb=Symbol();}
   for (int i=OrdersTotal()-1; i>=0; i--) {
    if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
     if(OrderType()==OP_BUY || OrderType()==OP_SELL) {
      if((OrderSymbol()==symb||symb=="")&&(type<0||OrderType()==type)&&(mg<0||OrderMagicNumber()==mg)) {
       c++;
       ArrayResize(p, c+1);
       p[c][0]=OrderTicket();
       p[c][1]=OrderProfit()+OrderSwap()+OrderCommission();
  }}}}
// если есть позиции
  if(c>0) {
   ArraySort(p, WHOLE_ARRAY, 0, MODE_DESCEND);
    pr=c>=index?index:c;
    return(c==-1?0:p[pr][1]);
  }
  return(0);
 }
 
Vitaly Muzichenko:

Ну тогда так, хотя и первая будет работать:

ArraySort(p, WHOLE_ARRAY, 0, MODE_DESCEND);//где такое взяли?
 
pako:
имелось ввиду:  самая старая позиция по времени , всегда "0"

Вы имеете в виду если ордеров всего 2 то

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

OrderProfit() предпоследнего ордера

pako, 2016.08.16 13:57

Не сортируются они , давно уже.  

можно так

if(OrderSelect(1,SELECT_BY_POS, MODE_TRADES)) 

 При условии что позиции открыты только по этой паре и нет отложек

т.е последний  = 0, предпоследний = 1.

я правильно вас понял. Так как если

самая старая по времени "0" это значит первый открытый, видимо вы хотели сказать самая последняя открытая по времени. Во общем я уже запутался
 
Vladimir Deryagin:

Вы имеете в виду если ордеров всего 2 то

я правильно вас понял. Так как если

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

без разницы , сколько.

 

 

2016.08.16 15:30:30   -------------->"0"

2016.08.16 15:30:31  -------------->"1"

2016.08.16 15:30:38  -------------->"2" 

и т д 

       

 
Vitaly Muzichenko:

Ну тогда так, хотя и первая будет работать:

Во общем меня Ваш первый вариант очень даже устраивает. Вам огромное Спасибо! дальше без меня (битва умов). )))
 
pako:

без разницы , сколько.

 

 

2016.08.16 15:30:30   -------------->"0"

2016.08.16 15:30:31  -------------->"1"

2016.08.16 15:30:38  -------------->"2" 

и т д 

       

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

OrderProfit() предпоследнего ордера

pako, 2016.08.16 13:57

Не сортируются они , давно уже.  

можно так

if(OrderSelect(1,SELECT_BY_POS, MODE_TRADES)) 

 При условии что позиции открыты только по этой паре и нет отложек

т.е последний  = 0, предпоследний = 1.


В таком случае предпоследний по времени не 1

____________________________________________________________________

2016.08.16 15:30:30   -------------->"0"

2016.08.16 15:30:31  -------------->"1"

2016.08.16 15:30:38  -------------->"2"

2016.08.16 15:34:38  -------------->"3"  предпоследний

2016.08.16 15:39:38  -------------->"4"

и т д

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