Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Skymer
337
Skymer  

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

Victor Nikolaev
Модератор
15097
Victor Nikolaev  

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

IgorM М
4801
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);
}
Vladyslav Goshkov
2146
Vladyslav Goshkov  
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);
}

Не будут.

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

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

Не будут.



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

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

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

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

IgorM М
4801
IgorM М  
VladislavVG:

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

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


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

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

if(profit >= 0){   }

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

Aleksandr Chugunov
4924
Aleksandr Chugunov  
VladislavVG:

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

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

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


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

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

if(profit >= 0){ }

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

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

Удачи.

12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий