Особенности языка mql5, тонкости и приёмы работы - страница 173

 
fxsaber:

Выше обновил.

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Особенности языка mql5, тонкости и приёмы работы

fxsaber, 2020.04.09 13:13

Похоже, совсем не сталкивались. Посмотрите в Документации. Там два объема на ордер.

Это живые лимитники. Первое число - исходный объем, второй - залитый. Как только станут равны или будет удален, попадет в историю.


А это не один ордер двумя частями исполненный? Как-то странно совпали не исполненные объёмы.

 
Alexey Viktorov:

А это не один ордер двумя частями исполненный? Как-то странно совпали не исполненные объёмы.

Совпадение. У них даже мэджики разные.

 
fxsaber:

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


Нашел в истории.

 
fxsaber:

при схлопывании через CloseBy, вроде, теряются мэджики. Нужно проверять.

Похоже, по этой причине первый код ниже работать не будет.

Forum on trading, automated trading systems and testing trading strategies

History Profit in MQL5 ?

fxsaber, 2017.08.26 19:16

  1. MQL5
    double Profit( void )
    {
     double Res = 0;
    
     if (HistorySelect(0, INT_MAX))
       for (int i = HistoryDealsTotal() - 1; i >= 0; i--)
       {
         const ulong Ticket = HistoryDealGetTicket(i);
         
         if((HistoryDealGetInteger(Ticket, DEAL_MAGIC) == MagicNumber) && (HistoryDealGetString(Ticket, DEAL_SYMBOL) == Symbol()))
           Res += HistoryDealGetDouble(Ticket, DEAL_PROFIT);
       }
         
      return(Res);
    }


  2. MQL5 + MQL4
    #include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006
    
    double Profit( void )
    {
     double Res = 0;
    
     for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)
       if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && (OrderMagicNumber() == MagicNumber) && (OrderSymbol() == Symbol()))
         Res += OrderProfit();
         
      return(Res);
    }

Посчитать профит по мэджику, похоже, проблема.

 
Цены ордеров нормализованы, сделок - нет. Скрипт находит такие сделки.
void OnStart()
{
  if (HistorySelect(0, INT_MAX))
    for (int i = HistoryDealsTotal() - 1; i >= 0; i--) // Перебираем все сделки
    {
      const ulong Ticket = HistoryDealGetTicket(i); // Тикет сделки
      const double Price = HistoryDealGetDouble(Ticket, DEAL_PRICE); // Цена сделки
      
      if (NormalizeDouble(Price, 5) != Price) // Если цена сделки не нормализована,      
        Print(Ticket);                        // печатаем тикет сделки.
    }
}
 

Стрелочки открытия/закрытия позиций, которые MT5 автоматически расставляет в реал-тайме, основываются на TradeTransaction-событиях.


Только что видел, как эти события (открытие и закрытие около десятка позиций) не дошли до Терминала из-за кратковременного обрыва связи - так совпало, сидел у компа и смотрел воочию. По итогу соответствующих стрелок нет.


И, как тут говорили иногда, нельзя полагаться на OnTradeTransaction в боевых советниках. Жаль, надежного публичного механизма работы с OrderSendAsync нет. 

 
fxsaber:

Жаль, надежного публичного механизма работы с OrderSendAsync нет. 

а сервисы могут получить доступ к торговым операциям? - если да, то мониторить каждые 10 мс и отправлять событие чарту можно

глянул в справку, думал может дописали про сервисы, но по моему так и было в прошлом году:

•Сервис — программа, которая в отличие от индикаторов, советиников и скриптов для своей работы не требует привязки к графику. Как и скрипты, сервисы не обрабатывают никаких событий, кроме события запуска. Для запуска сервиса в его коде обязательно должна быть функция-обработчик OnStart. Сервисы не принимают никаких других событий кроме Start, но могут сами отправлять графикам пользовательские события с помощью EventChartCustom

UPD: набросал скрипт-сервис

struct SOrderInfo
{
   int positionstotal;
   int orderstotal;
   int historyorderstotal;
   bool operator==(const SOrderInfo &v){return(positionstotal==v.positionstotal && orderstotal==v.orderstotal && historyorderstotal==v.historyorderstotal);}
};
//+------------------------------------------------------------------+
int OnStart()
{
   SOrderInfo CurrState = UpdateOrdersInfo();
   SOrderInfo LastState = CurrState;
   while(!IsStopped())
   {
      Sleep(10);
      CurrState = UpdateOrdersInfo();
      if(CurrState == LastState) continue;
      LastState = CurrState;
      Print("Orders changed!");
   }
   return(0);
}
//+------------------------------------------------------------------+
SOrderInfo UpdateOrdersInfo()
{
   SOrderInfo result;
   result.positionstotal     = PositionsTotal();
   result.orderstotal        = OrdersTotal();
   result.historyorderstotal = HistoryOrdersTotal();
   return(result);
}
//+------------------------------------------------------------------+

открыл руками несколько ордеров, закрыл, по моему работает без проблем

 
Igor Makanu:

а сервисы могут получить доступ к торговым операциям? - если да, то мониторить каждые 10 мс и отправлять событие чарту можно

Это ничем не отличается от такого же перебора в совтенике. Только недостаточно сравнивать кол-во, поменяться может внутренность.

 
Andrey Khatimlianskii:

Это ничем не отличается от такого же перебора в совтенике. Только недостаточно сравнивать кол-во, поменяться может внутренность.

Сервисы, как Алертеры, очень хороши. Не нужны чарты, автоматически запущены с Терминалом. Надо только отрабатывать ситуации переключения между счетами.

ЗЫ Сервис может быть и боевым советником. Без GUI только не очень удобно.
 
Andrey Khatimlianskii:

Это ничем не отличается от такого же перебора в совтенике. Только недостаточно сравнивать кол-во, поменяться может внутренность.

отличается

есть, так называемые, задачи Контроля и Управления

ЕА - управление, сервис - контроль

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

нужно определить критичность событий, имхо, закрытие и открытие ордеров - это критичные события требующие контроля, а изменение ТП и СЛ, можно проводить как и ранее делали (несколько неудачных попыток - бросили, на следующем тике еще раз повторим)

а так, как Вы предлагаете - контролировать всё, ну как бы можно - можно повторить в SQLite состояние ордеров, потом появится задача синхронизации этой БД с сервисом и ЕА.... лишнее все это


думаю, что проще схема должна быть - примерно так: получили событие OnTradeTransaction от терминала в ЕА и сгенерировали событие OnChartEvent из сервиса для дополнительного контроля в ЕА

Причина обращения: