Получить данные от последнего закрытого ордера

 

Как найти в истории именно последний закрывшийся ордер?

 

Взять ордер, у которого время закрытия максимальное

 
int history(){
int time = 0;double profit = 0;//обьявляем необходимые нам переменные куда мы положим интересующие нас характеристики ордера
for(int i = OrdersHistoryTotal();i>=0;i--){// Перебираем все закрытые ордера
  if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)){//если ордер с таким номером (i) в списке закрытых ордеров есть ( не путать с тикетом)
    if(OrderSymbol() == Symbol()){//если выбранный ордер был открыт по нашей валютной паре
      if(time<OrderCloseTime()){//(сравниваем его с хранящимся в пероеменной time) 
        time=OrderCloseTime();//если время закрытия ордера больше - ложим его в переменную
        profit=OrderProfit();//и заодно запоминаем прибыль ордера
      }
    }
  }
}
//по окончании этой процедуры в наших переменных будут сидет наибольшее время закрытия, и его профит. Или по нулям если история чистая.
//теперь мы можем выставлять условия в зависимости от результата процедуры
   
if(profit == 0 &&time == 0){//действия если история чистая}

}
if(profit >= 0){//действия если последний ордер был прибыльным, или нулевым}

}
if(profit <  0 ){//действия если последний ордер был убыточным}

}
return(0);
}
 
IgorM:

int history(){
int time = 0;double profit = 0;//обьявляем необходимые нам переменные куда мы положим интересующие нас характеристики ордера
for(int i = OrdersHistoryTotal();i>=0;i--){// Перебираем все закрытые ордера
  if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)){//если ордер с таким номером (i) в списке закрытых ордеров есть ( не путать с тикетом)
    if(OrderSymbol() == Symbol()){//если выбранный ордер был открыт по нашей валютной паре
      if(time<OrderCloseTime()){//(сравниваем его с хранящимся в пероеменной time) 
        time=OrderCloseTime();//если время закрытия ордера больше - ложим его в переменную
        profit=OrderProfit();//и заодно запоминаем прибыль ордера
      }
    }
  }
}
//по окончании этой процедуры в наших переменных будут сидет наибольшее время закрытия, и его профит. Или по нулям если история чистая.
//теперь мы можем выставлять условия в зависимости от результата процедуры
   
if(profit == 0 &&time == 0){//действия если история чистая}

}
if(profit >= 0){//действия если последний ордер был прибыльным, или нулевым}

}
if(profit <  0 ){//действия если последний ордер был убыточным}

}
return(0);
}

Не будут.

 
for ( int i = OrdersHistoryTotal() - 1; i >= 0; i -- ) {...}
 
hasayama:

Это только одна ошибка (в данном случае не существенная, хотя игнорирование контроля выхода за пределы массивов черевато последствиями и в 5-ке это уже ошибка), есть еще : область видимости для переменных ;).
 
VladislavVG:

Не будут.



;), уже дважды на одни и те же грабли я наступаю - сохраняю у себя чужой код (этот код написал xRust ) и с одной и той же ошибкой выкладываю
 
IgorM:

;), уже дважды на одни и те же грабли я наступаю - сохраняю у себя чужой код (этот код написал xRust ) и с одной и той же ошибкой выкладываю

Там еще область видимости:

Переменные time, profit внутри процедуры и вне - это разные переменные, не смотря на схожие названия. Те, что внутри, будут уничтожены при завершении процедуры и результат не сохранится.

 
VladislavVG:

Там еще область видимости:

Переменные time, profit внутри процедуры и вне - это разные переменные, не смотря на схожие названия. Те, что внутри, будут уничтожены при завершении процедуры и результат не сохранится.


конечно, внутри вызываемых ф-ций, область видимости переменных заканчивается при выходе из ф-ции, не знаю как в mql, на Delphi и пр. ЯВУ локальные переменные ф-ции создаются в стеке, при выходе из ф-ции данные переменных будут утеряны

в этой ф-ции, необходимо производить действия здесь:

if(profit >= 0){   }

где-то у себя я пробовал - ф-ция работала норм
 

 
VladislavVG:

Там еще область видимости:

Переменные time, profit внутри процедуры и вне - это разные переменные, не смотря на схожие названия. Те, что внутри, будут уничтожены при завершении процедуры и результат не сохранится.

В том коде нет выхода за пределы процедуры
 
IgorM:


конечно, внутри вызываемых ф-ций, область видимости переменных заканчивается при выходе из ф-ции, не знаю как в mql, на Delphi и пр. ЯВУ локальные переменные ф-ции создаются в стеке, при выходе из ф-ции данные переменных будут утеряны

в этой ф-ции, необходимо производить действия здесь:

if(profit >= 0){ }

где-то у себя я пробовал - ф-ция работала норм

В мкл - так же. А, сорри: я неверно посчитал скобки.... Да, все ок.

Удачи.