Можно ли узнать в истории уровни SL и TP - страница 2

 
YuryK1980:
Спасибо за уделенное время. Буду решать проблему по другому. Вам всяческих успехов.

На вкладке журнал отображаются выставленные SL И TP.

Если вы закрыли терминал, то журнал можно посмотреть в логах в папке

C:\Users\***\AppData\Roaming\MetaQuotes\Terminal\9BF***E3\logs

DE    0    11:50:34.751    Trades    '111': modify order #119512222 buy stop 5.00 Si-3.20 at 73650 sl: 73500 tp: 0 -> 73700, sl: 73520 tp: 0
IG    0    11:50:36.285    Trades    '111': accepted modify order #119512222 buy stop 5.00 Si-3.20 at 73650 sl: 73500 tp: 0 -> 73700, sl: 73520 tp: 0
IS    0    11:50:36.302    Trades    '111': modify #119512222 buy stop 5.00 Si-3.20 -> price: 73700, sl: 73520, tp: 0) done in 1551.794 ms
JS    0    12:12:29.387    Trades    '111': cancel order #119512222 buy stop 5.00 Si-3.20 at 73700 sl: 73520

 
YuryK1980:
Ну это программа максимум. В принципе вопрос сводился к тому можно ли в принципе увидет уровни СЛ в истории, пока не понимаю в чем разница между установленным первый раз и передвинутым (в моем понимании один удалил, второй поставил), если инфа в истории сохраняется, то наверное должны быть все действия, если нет, то ничего и не будет. Просто в своийствах HistoryOrderGet... я ничего не нашел. Либо плохо искал, либо не там. Подскажите направление куда смотреть, может и вопрос сформулирую более внятно.

Всё это фиксируется событием

TRADE_TRANSACTION_POSITION

Изменение позиции, не связанное с исполнением сделки. Данный тип транзакции свидетельствует именно о том, что позиция была изменена на стороне торгового сервера. У позиции может быть изменен объем, цена открытия, а также уровни Stop Loss и Take Profit. Информация об изменениях передается в структуре MqlTradeTransaction через обработчик OnTradeTransaction. Изменение позиции (добавление, изменение или ликвидация) в результате совершения сделки не влечет за собой появление транзакции TRADE_TRANSACTION_POSITION.


В результате прошлое событие изменения SL\TP «затирается» последним событием. А ордера к этому никак не причастны. Только если был поставлен отложенный ордер с TP и SL, тогда можно получить только первоначально установленные значения.

 
Alexey Viktorov:

Всё это фиксируется событием

TRADE_TRANSACTION_POSITION

Изменение позиции, не связанное с исполнением сделки. Данный тип транзакции свидетельствует именно о том, что позиция была изменена на стороне торгового сервера. У позиции может быть изменен объем, цена открытия, а также уровни Stop Loss и Take Profit. Информация об изменениях передается в структуре MqlTradeTransaction через обработчик OnTradeTransaction. Изменение позиции (добавление, изменение или ликвидация) в результате совершения сделки не влечет за собой появление транзакции TRADE_TRANSACTION_POSITION.


В результате прошлое событие изменения SL\TP «затирается» последним событием. А ордера к этому никак не причастны. Только если был поставлен отложенный ордер с TP и SL, тогда можно получить только первоначально установленные значения.

Он хочет узнать в истории, т.е позиция уже закрыта. 

 
prostotrader:

Он хочет узнать в истории, т.е позиция уже закрыта. 

Я так и понял. Потому и сказал что предыдущее значение «затирается» последним и соответственно нигде не сохраняется.

 
lxa:

На вкладке журнал отображаются выставленные SL И TP.

Если вы закрыли терминал, то журнал можно посмотреть в логах в папке

C:\Users\***\AppData\Roaming\MetaQuotes\Terminal\9BF***E3

DE    0    11:50:34.751    Trades    '111': modify order #119512222 buy stop 5.00 Si-3.20 at 73650 sl: 73500 tp: 0 -> 73700, sl: 73520 tp: 0
IG    0    11:50:36.285    Trades    '111': accepted modify order #119512222 buy stop 5.00 Si-3.20 at 73650 sl: 73500 tp: 0 -> 73700, sl: 73520 tp: 0
IS    0    11:50:36.302    Trades    '111': modify #119512222 buy stop 5.00 Si-3.20 -> price: 73700, sl: 73520, tp: 0) done in 1551.794 ms
JS    0    12:12:29.387    Trades    '111': cancel order #119512222 buy stop 5.00 Si-3.20 at 73700 sl: 73520

Спасибо за идею, но уж больно трудно реализуемо (для меня) с точки зрения программирования. Инфа не структурирована, если я правильно понимаю, то надо вытаскивать строчки из всех файлов плюс анализ записей через текст и символы. Может быть когда-нибудь потом. Еще раз спасибо за инфу, буду знать.
 
YuryK1980:
Спасибо за идею, но уж больно трудно реализуемо (для меня) с точки зрения программирования. Инфа не структурирована, если я правильно понимаю, то надо вытаскивать строчки из всех файлов плюс анализ записей через текст и символы. Может быть когда-нибудь потом. Еще раз спасибо за инфу, буду знать.

Я думал вам просто нужно разобраться в конкретной ситуации...

А так можно же сделать логирование, и записывать вон в базу sqlite как предлагает MQL в новых релизах. И будет и структурировано и быстро извлекаемо.

 

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

Но он требует встраивать в советник  запись состояния каждого ордера.

К счастью разработчики позаботились , есть прекрасный механизм работы с SQL.

Можно просто сохранять структуру каждого ордера при выставление удалении модификации.


struct Person
  {
   int               id;
   string            name;
   int               age;
   string            address;
   double            salary;
  };

//+------------------------------------------------------------------+
//| Test                                                             |
//+------------------------------------------------------------------+
bool TestDB(string filename,int flags)
  {
   int db;
//--- open
   db=DatabaseOpen(filename,flags);
   if(db==INVALID_HANDLE)
     {
      Print("DB: ",filename," open failed with code ",GetLastError());
      return(false);
     }
//--- create a table
   if(!DatabaseTableExists(db,"COMPANY"))
      if(!DatabaseExecute(db,"CREATE TABLE COMPANY("
                          "ID INT PRIMARY KEY     NOT NULL,"
                          "NAME           TEXT    NOT NULL,"
                          "AGE            INT     NOT NULL,"
                          "ADDRESS        CHAR(50),"
                          "SALARY         REAL );"))
        {
         Print("DB: ",filename," create table failed with code ",GetLastError());
         DatabaseClose(db);
         return(false);
        }
//--- insert data
   if(!DatabaseExecute(db,"INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) VALUES (1, 'Paul', 32, 'California', 20000.00 ); "
                       "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) VALUES (2, 'Allen', 25, 'Texas', 15000.00 ); "
                       "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) VALUES (3, 'Teddy', 23, 'Norway', 20000.00 );"
                       "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) VALUES (4, 'Mark', 25, 'Rich-Mond ', 65000.00 );"))
     {
      Print("DB: ",filename," insert failed with code ",GetLastError());
      DatabaseClose(db);
      return(false);
     }
//--- prepare the request
   int request=DatabasePrepare(db,"SELECT * FROM COMPANY WHERE SALARY>15000");

   if(request==INVALID_HANDLE)
     {
      Print("DB: ",filename," request failed with code ",GetLastError());
      DatabaseClose(db);
      return(false);
     }
//--- выводим записи
   Person person;

   for(int i=0; DatabaseReadBind(request,person); i++)
      Print(i,":  ",person.id, " ", person.name, " ",person.age, " ",person.address, " ",person.salary);

   Print("");
//--- close all
   DatabaseFinalize(request);
   DatabaseClose(db);
   return(true);
  }

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   TestDB("test.sqlite",DATABASE_OPEN_READWRITE | DATABASE_OPEN_CREATE |DATABASE_OPEN_COMMON);
  }