Как получить данные по цене закрытия последней позиции по одному инструменту?

 

Как получить данные о цене закрытия последней позиции по одному инструменту?  

В МТ4 все просто было. Посмотрел по какой цене последний ордер закрылся, сравнил со стоплоссом. Если цена закрытия равна стопу или цена хуже стоплосса, то принимаем решение.   А как это реализовать в МТ5? 

Документация по MQL5: Стандартные константы, перечисления и структуры / Константы индикаторов / Ценовые константы
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы индикаторов / Ценовые константы
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы индикаторов / Ценовые константы - Документация по MQL5
 
dimeon:

Как получить данные о цене закрытия последней позиции по одному инструменту?  

В МТ4 все просто было. Посмотрел по какой цене последний ордер закрылся, сравнил со стоплоссом. Если цена закрытия равна стопу или цена хуже стоплосса, то принимаем решение.   А как это реализовать в МТ5? 

Почитай документацию там все написано https://www.mql5.com/ru/docs/trading/positiongetdouble
Документация по MQL5: Торговые функции / PositionGetDouble
Документация по MQL5: Торговые функции / PositionGetDouble
  • www.mql5.com
Торговые функции / PositionGetDouble - Документация по MQL5
 
да почитал, но там нашел только цену сделки, и не совсем понятно, как отследить последнюю сделку по заданному инструменту и сравнить ее цену со стоплоссом ? 
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства сделок
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства сделок
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Свойства сделок - Документация по MQL5
 
dimeon:
да почитал, но там нашел только цену сделки, и не совсем понятно, как отследить последнюю сделку по заданному инструменту и сравнить ее цену со стоплоссом ? 
Есть несколько способов как отследить сделку, по ее тикету или по индексу в списке сделок, для этого нужно запросить историю сделок с помощью функции HistorySelect, ну а дальше уже запрашивать соответствуещее свойство сделки.
 
sergey1294:
Есть несколько способов как отследить сделку, по ее тикету или по индексу в списке сделок, для этого нужно запросить историю сделок с помощью функции HistorySelect, ну а дальше уже запрашивать соответствуещее свойство сделки.

в том то и дело, что у сделки нету стоплосса. Как узнать, закрылась позиция по стоплоссу (или хуже) или просто в минус ? 

Выложите кусок кода плиз... 

 
dimeon:

в том то и дело, что у сделки нету стоплосса. Как узнать, закрылась позиция по стоплоссу (или хуже) или просто в минус ? 

Выложите кусок кода плиз... 

Посмотрите комментарий к сделке, если указан стоплосс ( if (StringFind(str_comment,"sl")!=-1) ), значит закрылась по стоплоссу.

Вроде везде так.

 

bool b=0, s=0; 

void Check_History()
{
HistorySelect(0,TimeCurrent());
int    deals=HistoryDealsTotal(); 
for(int i=deals-0;i>=0;i--)
        {
         ulong ticket=HistoryDealGetTicket(i);
         if(ticket==0)
           {
            Print("HistoryDealGetTicket failed, no trade history");
            {s=1;b=1; break;}
           }
         //  проверяем символ
         if (HistoryDealGetString(ticket,DEAL_SYMBOL)!=_Symbol) continue;
         //  проверяем тип сделки (вход или выход)
         if (HistoryDealGetInteger(ticket,DEAL_ENTRY)==DEAL_ENTRY_OUT) continue;
         string  comment=HistoryDealGetString(ticket,DEAL_COMMENT);
          if (StringFind(comment,"sl")<0) {s=1;b=1; break;}
          if (StringFind(comment,"sl")>=0)continue;
          if (HistoryDealGetInteger(ticket,DEAL_TYPE)==DEAL_TYPE_BUY) s=0;
          if (HistoryDealGetInteger(ticket,DEAL_TYPE)==DEAL_TYPE_SELL) b=0;
          
          }
  Print ("b=", b,"   s=",s);
 return;        

вот набросал, вообщем, если s=0 то запрет на продажу, если b=0 - запрет на покупку 

 но что-то не так, не срабатывает...  Поправьте плииз , где ошибка ? 

 
dimeon:

bool b=0, s=0; 

void Check_History()
{
HistorySelect(0,TimeCurrent());
int    deals=HistoryDealsTotal(); 
for(int i=deals-0;i>=0;i--)
        {
         ulong ticket=HistoryDealGetTicket(i);
         if(ticket==0)
           {
            Print("HistoryDealGetTicket failed, no trade history");
            {s=1;b=1; break;}
           }
         //  проверяем символ
         if (HistoryDealGetString(ticket,DEAL_SYMBOL)!=_Symbol) continue;
         //  проверяем тип сделки (вход или выход)
         if (HistoryDealGetInteger(ticket,DEAL_ENTRY)==DEAL_ENTRY_OUT) continue;
         string  comment=HistoryDealGetString(ticket,DEAL_COMMENT);
          if (StringFind(comment,"sl")<0) {s=1;b=1; break;}
          if (StringFind(comment,"sl")>=0)continue;
          if (HistoryDealGetInteger(ticket,DEAL_TYPE)==DEAL_TYPE_BUY) s=0;
          if (HistoryDealGetInteger(ticket,DEAL_TYPE)==DEAL_TYPE_SELL) b=0;
          
          }
  Print ("b=", b,"   s=",s);
 return;        

вот набросал, вообщем, если s=0 то запрет на продажу, если b=0 - запрет на покупку 

 но что-то не так, не срабатывает...  Поправьте плииз , где ошибка ? 

 Вы же анализируете закрытие позиции, а сами ее пропускаете в цикле и соответсвенно ищете в коменте  входов ( DEAL_ENTRY_IN) " sl " :))  которого там и быть не может, если конечно сами при открытии не поставили такой комент!

 if (HistoryDealGetInteger(ticket,DEAL_ENTRY)==DEAL_ENTRY_IN) continue; 

Если Вас интересует закрытие только последней позиции, то и искать надо не с самого начала истории, а с конца, зачем же так удлинять цикл.

 

 
GSB:

 Вы же анализируете закрытие позиции, а сами ее пропускаете в цикле и соответсвенно ищете в коменте  входов ( DEAL_ENTRY_IN) " sl " :))  которого там и быть не может, если конечно сами при открытии не поставили такой комент!

 if (HistoryDealGetInteger(ticket,DEAL_ENTRY)==DEAL_ENTRY_IN) continue; 

Если Вас интересует закрытие только последней позиции, то и искать надо не с самого начала истории, а с конца, зачем же так удлинять цикл.

 

1. На счет с конца это верно подмечено. Но тут как кому проще, да и все от алгоритма зависит.

В мультах, придется к примеру искать придется последнюю по определенному символу. Также неплохо найти последнюю по sl и tp.

2. На счет комментария "sl" - так если позиция (ордер) закрывается по sl или tp сервер сам прописывет следующее [tp/sl и цену].

Отсюда вывод:

а. чтобы отследить закрытие по sl нужно по необходимой паре найти последнюю сделку с комментарием [sl (а не sl) в левой части комментария. Цену в зависимости от алгоритма получаем по цене сделке либо из правой части комментария.

б. чтобы отследить закрытие по tp нужно по необходимой паре найти последнюю сделку с комментарием [tp (а не tp) в левой части комментария. Цену в зависимости от алгоритма получаем по цене сделке либо из правой части комментария.

3. На сколько я понимаю нужно так

//Вариант 1. проверяем тип сделки (вход или выход)
if (HistoryDealGetInteger(ticket,DEAL_ENTRY)!=DEAL_ENTRY_OUT) continue;
//Вариант 2. проверяем тип сделки (вход или выход)
if (HistoryDealGetInteger(ticket,DEAL_ENTRY)!=DEAL_ENTRY_IN) continue;

4. А что должно возвращаться тут?

Print ("b=", b,"   s=",s);
return;