Пытаюсь разобраться как писать советника на mql5 уже который день топчусь на месте. Разобрался как открывать ордера.
А с банальной вещью как проверка есть ли сейчас ордер в работе не могу
И не получается получить информацию по последнему ордеру в истории. Подскажите пожалуйста что как.
Тут как то всё перемудрили кстати. Позиции, ордера, сделки сам чёрт ногу сломит. На mql4 было куда понятнее всё.
Пытаюсь разобраться как писать советника на mql5 уже который день топчусь на месте. Разобрался как открывать ордера.
А с банальной вещью как проверка есть ли сейчас ордер в работе не могу
И не получается получить информацию по последнему ордеру в истории. Подскажите пожалуйста что как.
Тут как то всё перемудрили кстати. Позиции, ордера, сделки сам чёрт ногу сломит. На mql4 было куда понятнее всё.
Однозначно согласен , с ордерами намудрили ,сам тоже не раз мучался .
Как пример можно проверить есть ли позиция по данному символу c помощью функции :
int GetCountPos(string symbb) { int total=0; for(int i=0;i<PositionsTotal();i++){ if(PositionGetSymbol(i)==symbb ) total++; } return(total); }
или ордер :
int GetCountOrders(long const magic_number) { long order_ticket; int total=0; //--- сделаем выборку всей торговой истории HistorySelect(0,TimeCurrent()); for(int i=0;i<OrdersTotal();i++) if(order_ticket=OrderGetTicket(i)) if(magic_number==OrderGetInteger(ORDER_MAGIC)) total++; //--- return(total); }
вот в посте выше предложен способ через оператор цикла, но возможно наверное и проще сделать, например если вы работаете по одному символу, то так как по определению на одном символе может быть только одна позиция то чтобы выяснить есть ли позиция воспользоватся функцией:
bool position; if(PositionSelect(_Symbol) == true) position = true; else position = false;
а для того чтоб получить информацию по последнему ордеру можно задать:
int ordertotal = OrdersTotal();
получив общее количество действующих ордеров, зная что индексация ордеров идет с нуля, можно получить номер ордера, а по номеру тикет, а по тикету свойство
int orderindex = ordertotal - 1; ulong orderticket = OrderGetTicket(orderindex);
вот в посте выше предложен способ через оператор цикла, но возможно наверное и проще сделать, например если вы работаете по одному символу, то так как по определению на одном символе может быть только одна позиция то чтобы выяснить есть ли позиция воспользоватся функцией:
а для того чтоб получить информацию по последнему ордеру можно задать:
получив общее количество действующих ордеров, зная что индексация ордеров идет с нуля, можно получить номер ордера, а по номеру тикет, а по тикету свойство
Дело в том что мне не нужны позиции. С ними я разобрался... Мне нужно пуличить информацию по последнему(последним) закрытым(отработавшим) ордерам(позициям). Я так понял позиция это то что открыто сейчас. А в истории только ордера?
позиция да это то что имеется в настоящий момент. можно получать историю ордеров и историю сделок. сделка это совершившаяся торговая операция по ордеру. есть целый ряд функций по истории
цепочка такая:
HistorySelect() ; // история сделок и ордеров в целом
HistoryDealsTotal(); или HistoryOrdersTotal(); // количество сделок и ордеров в истории(отработавшие)
HistoryOrderGetTicket(); или HistoryDealGetTicket(); // получаем тикет ордера или сделки (зная общее количество сделок/ордеров вносим индекс последнего ор/сд)
а теперь можете запрашивать свойство.
опишите более подробно, что вам надо, может получится состряпать нужный кусочек кода
long pos; void OnTick() { //--- if (PositionSelect(_Symbol)== true) //позиция открыта pos = PositionGetInteger(POSITION_IDENTIFIER); //идентификатор позиции if(PositionSelect(_Symbol)==false) //позиция закрыта { HistorySelectByPosition(pos); //выбираем историю по последней позиции int deals_total = HistoryDealsTotal(); //всего сделок int deals_index = deals_total - 1; //получаем индекс сделки ulong hist_ticket = HistoryDealGetTicket(deals_index); //получаем тикет по индексу double hist_prof = HistoryDealGetDouble (hist_ticket,DEAL_PROFIT); //профит по последней сделке double hist_vol = HistoryDealGetDouble (hist_ticket,DEAL_VOLUME); //ее объем datetime his_time = HistoryDealGetInteger(hist_ticket,DEAL_TIME); //и время } }
вот пример получения информ. по последней сделке:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Пытаюсь разобраться как писать советника на mql5 уже который день топчусь на месте. Разобрался как открывать ордера.
А с банальной вещью как проверка есть ли сейчас ордер в работе не могу
И не получается получить информацию по последнему ордеру в истории. Подскажите пожалуйста что как.
Тут как то всё перемудрили кстати. Позиции, ордера, сделки сам чёрт ногу сломит. На mql4 было куда понятнее всё.