Помогите пожалуйста.

 

Пытаюсь разобраться как писать советника на mql5 уже который день топчусь на месте. Разобрался как открывать ордера.

А с банальной вещью как проверка есть ли сейчас ордер в работе не могу

И не получается получить информацию по последнему ордеру в истории. Подскажите пожалуйста что как.

Тут как то всё перемудрили кстати. Позиции, ордера, сделки сам чёрт ногу сломит. На mql4 было куда понятнее всё.

 
ProfBis:

Пытаюсь разобраться как писать советника на mql5 уже который день топчусь на месте. Разобрался как открывать ордера.

А с банальной вещью как проверка есть ли сейчас ордер в работе не могу

И не получается получить информацию по последнему ордеру в истории. Подскажите пожалуйста что как.

Тут как то всё перемудрили кстати. Позиции, ордера, сделки сам чёрт ногу сломит. На mql4 было куда понятнее всё.

Вам нужно анализировать не ордера, а текущие позиции. Отправили ордер. Когда он исполниться - он откроет позицию. Эту позицию выбираете функцией PositionSelect, а затем получаете свойства, которые Вам нужны. Более конкретно ответить сложно, т.к. Ваш вопрос весьма общий.
 
ProfBis:

Пытаюсь разобраться как писать советника на 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);
 
nowi:

вот в посте выше предложен способ через оператор цикла, но возможно наверное и проще сделать, например если вы работаете по одному символу, то так как по определению на одном символе может быть только одна позиция то чтобы выяснить есть ли позиция воспользоватся функцией:

 

 

а для того чтоб получить информацию по последнему ордеру можно задать:




получив общее количество действующих ордеров, зная что индексация ордеров идет с нуля, можно получить номер ордера, а по номеру тикет, а по тикету свойство 

Дело в том что мне не нужны позиции. С ними я разобрался... Мне нужно пуличить информацию по последнему(последним) закрытым(отработавшим) ордерам(позициям). Я так понял позиция это то что открыто сейчас. А в истории только ордера?
 
ProfBis:
Дело в том что мне не нужны позиции. С ними я разобрался... Мне нужно пуличить информацию по последнему(последним) закрытым(отработавшим) ордерам(позициям). Я так понял позиция это то что открыто сейчас. А в истории только ордера?

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

цепочка такая:

HistorySelect() ;  // история сделок и ордеров в целом

HistoryDealsTotal(); или HistoryOrdersTotal(); // количество сделок и ордеров в истории(отработавшие)

HistoryOrderGetTicket(); или  HistoryDealGetTicket(); // получаем тикет ордера или сделки (зная общее количество сделок/ордеров вносим индекс последнего ор/сд)

а теперь можете запрашивать свойство.

 
опишите более подробно, что вам надо, может получится состряпать нужный кусочек кода
 
nowi:
опишите более подробно, что вам надо, может получится состряпать нужный кусочек кода
Мне нужно в случае если нет открытой позиции проверить историю взять последние 1-3 ордера и получить следующую информацию о них: дата время закрытия, профит и лот. по каждому из них.
 
вот пример получения информ. по последней сделке:

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);        //и время
}
   
  }
 
nowi:
вот пример получения информ. по последней сделке:

Спасибо большое.
Причина обращения: