MQL5 Ордера истории - страница 3

 
Maxim Kuznetsov #:

возьми библиотеку fxsaber MT4Orders и не мучай себя.. :-)

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

Я так и сделал - я взял именно эту библиотеку. В первом посте именно это я и отписал. Эта библиотека - это костыль. Чтоб прилепить её к советнику и выставить советника в маркет что нужо сделать? Её можно вообще туда сторонним файлом залить? Не файлом советника.

 

в маркет выставляются скомпилированные продукты...

библиотека будет в него естественно включена

--

ровно так-же как перенести советник на другой комп - нужен только ex5, исходники не нужны для работы

 
Vitaly Murlenko #:
Чтоб прилепить её к советнику и выставить советника в маркет что нужо сделать?

Скомпилировать

 

кстати, может повременить с маркетом-то ?

раз такое...

 
Странно, получилось. На MQL4 если файла нет ни в инклудниках, ни в библиотеках, то код корректно не работал. Со стронними индикаторами, подключаемыми к советнику такое тоже прокатит?
 
Maxim Kuznetsov #:

кстати, может повременить с маркетом-то ?

раз такое...

Я не тороплюсь, но ясность иметь должен. И не только я один. Таких как я будут ещё десятки и сотни.

 
Vitaly Murlenko #:
 Со стронними индикаторами, подключаемыми к советнику такое тоже прокатит?
Если как ресурс зашить, то автономно работать будет
 
Vitaly Murlenko #:

@Alexey Viktorov спасибо. Пример этот видел, по нему и пытался разобраться. Не понял зачем было так усложнять язык? Было же хорошо OrderClosePrice() и всё. Который раз убеждаюсь: лучшее - враг хорошего. Чем лучше стало - не понимаю. А чем хуже - понятно: хрен разберёшься. Это в духе метаквотесов - дать крупицу инфы и ни какой ясности :(

Не надо сожалеть о прошлом. Как-бы там ни было, а пользоваться надо тем что есть. Понимать это не так уж и сложно.

Попробуйте запустить этот скрипт на своём компе

Скрипт ИСКЛЮЧИТЕЛЬНО для hadge счетов.

struct POSITION
 {
  string             symbol;
  ulong              ticket;
  double             lot;
  double             priceOpen;
  double             priceClose;
  datetime           timeOpen;
  datetime           timeClose;
  double             profit;
  ENUM_DEAL_TYPE     type;
  ENUM_DEAL_ENTRY    entry;
 } position[];

/********************Script program start function*******************/
void OnStart()
 {
  HistorySelect(0,TimeCurrent());
  uint      total = HistoryDealsTotal();
  ulong     ticket;
  long      position_ID;
  long      entry;
  int       arraySize;
  for(uint i = 0; i < total; i++)
   {
    if((ticket = HistoryDealGetTicket(i)) > 0)
     {
      entry   = (ENUM_DEAL_ENTRY)HistoryDealGetInteger(ticket, DEAL_ENTRY);
      if(entry == DEAL_ENTRY_IN)
       {
        arraySize = ArrayResize(position, ArraySize(position)+1, 1000)-1;
        position_ID = HistoryDealGetInteger(ticket, DEAL_POSITION_ID);
        HistorySelectByPosition(position_ID);
        //HistoryDealsTotal();
        position[arraySize].ticket      = HistoryDealGetTicket(0);
        position[arraySize].symbol      = HistoryDealGetString(ticket, DEAL_SYMBOL);
        position[arraySize].lot         = HistoryDealGetDouble(HistoryDealGetTicket(0), DEAL_VOLUME);
        position[arraySize].priceOpen   = HistoryDealGetDouble(HistoryDealGetTicket(0), DEAL_PRICE);
        position[arraySize].priceClose  = HistoryDealGetDouble(HistoryDealGetTicket(1), DEAL_PRICE);
        position[arraySize].timeOpen    = (datetime)HistoryDealGetInteger(HistoryDealGetTicket(0), DEAL_TIME);
        position[arraySize].timeClose   = (datetime)HistoryDealGetInteger(HistoryDealGetTicket(1), DEAL_TIME);
        position[arraySize].type        = (ENUM_DEAL_TYPE)HistoryDealGetInteger(HistoryDealGetTicket(0), DEAL_TYPE);
        position[arraySize].profit      = HistoryDealGetDouble(HistoryDealGetTicket(1), DEAL_PROFIT)+
                                          HistoryDealGetDouble(HistoryDealGetTicket(1), DEAL_SWAP)+
                                          HistoryDealGetDouble(HistoryDealGetTicket(1), DEAL_COMMISSION);
        HistorySelect(0,TimeCurrent());
       }
      DebugBreak();
     }
   }
  ArrayPrint(position);
 }/******************************************************************/
/*****************************End program****************************/
2023.11.21 11:33:33.072 !!0 (AUDUSD,H1)      [symbol]   [ticket]   [lot] [priceOpen] [priceClose]          [timeOpen]         [timeClose]    [profit] [type] [entry]
2023.11.21 11:33:33.072 !!0 (AUDUSD,H1) [ 0] ""       1493646698 0.00000     0.00000      0.00000 2022.11.14 20:33:51 1970.01.01 00:00:00     0.00000      2       0
2023.11.21 11:33:33.072 !!0 (AUDUSD,H1) [ 1] "XAUUSD" 1500903119 0.30000  1745.93000   1771.99000 2022.11.22 15:14:32 2022.12.06 10:42:07   728.88000      0       0
2023.11.21 11:33:33.072 !!0 (AUDUSD,H1) [ 2] "EURUSD" 1500903716 0.30000     1.02732      1.04747 2022.11.22 15:15:03 2022.11.28 12:53:47   603.24000      0       0

Сделка без символа это пополнение счёта. Сумму можно получить из 

HistoryDealGetDouble(HistoryDealGetTicket(0), DEAL_PROFIT)

Просто из за одной сделки отсеивать её было лениво…

Потому и несоответствие количества ордеров и количества сделок в этом сообщении.

Vitaly Murlenko #:

По-ходу я вообще еду мимо. Раз ясности нет, будем вычислять. Пишем простой скрипт.

Кидаем на график, получаем в журнале экспертов результат:

Файлы:
w80.mq5  6 kb
 
Alexey Viktorov #:

Попробуйте запустить этот скрипт на своём компе

Скрипт ИСКЛЮЧИТЕЛЬНО для hadge счетов.

К сожалению, выполнения до конца этого скрипта (убрал ArrayPrint) почти не дождаться при 30К сделок.

2023.11.21 14:00:04.856 Scripts script Test6 (EURGBP,M1) loaded successfully
2023.11.21 14:03:45.412 Scripts script Test6 (EURGBP,M1) removed

220 секунд.


К сожалению, такая строка неверная по трем причинам.

position[arraySize].profit      = HistoryDealGetDouble(HistoryDealGetTicket(1), DEAL_PROFIT)

  1. Позиция может быть не закрыта. Например, нет второй сделки.
  2. Вторая сделка может быть ENTRY_IN.
  3. Позиция была закрыта частично.

Поэтому суммарная собранная прибыль таким образом не будет соответствовать общей прибыли.


Простых рабочих решений нет. Даже не говоря про производительные.

 
fxsaber #:

К сожалению, выполнения до конца этого скрипта (убрал ArrayPrint) почти не дождаться при 30К сделок.

220 секунд.


К сожалению, такая строка неверная по трем причинам.

  1. Позиция может быть не закрыта. Например, нет второй сделки.
  2. Вторая сделка может быть ENTRY_IN.
  3. Позиция была закрыта частично.

Поэтому суммарная собранная прибыль таким образом не будет соответствовать общей прибыли.


Простых рабочих решений нет. Даже не говоря про производительные.

Наверное надо было ещё сказать, что это не готовый вариант.

Все необходимые проверки Виталий, для кого писался этот пример, сам в состоянии дописать. А вам, видимо, просто надо обязательно придраться к чему либо.

Вторая сделка IN на счёте hadge может быть только в недокомпании ранна. У всех остальных такого не встречается.

Собственно дописать цикл по сделкам одного ID не составляет труда.

А вот по комиссии вы замечание не сделали. Недогляд очевиден. Комиссия в сделке IN тоже есть но не учтена.