События клиентского терминала - страница 3

 
denkir:

"Согласие есть продукт непротивления сторон" (с) Монтёр Мечников, 12 стульев.
 
В общем ситуация на уровне догадок, поэтому без комментариев разработчиков тут делать нечего.

 
Urain:

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

Сейчас это просто сигнал о событии на сервере, я предлагаю в этом сигнале ещё передать 2 байта моде и 8 байт тикет.

а ты видел сколько килобайт занимает ответ сервера?

попробуй отправить 100 ордеров и засеки объем в терминале внизу.

приходит намного больше инфы чем просто дилинь в пару байт.

Хотя если терминал потом из этого дилинь сформирует событие как ты описал я не против, но передавать с сервака информацию обо всех ордерах на каждом дилинь, считаю ересью, разве что только дилинь будет приходить от пачки ордеров, тогда да.

Ну ты сам посуди. Ты же видишь в журнале терминала про исполнение ордера. Все тикета, цены и т.д. Это все шлет сервер в любом случае.

Так вот все эти приходящие данные (которые идут в журнал)  должны идти в OnTrade. Со всеми подробностями (то есть те, которые торговые).


 

В справку добавлен пример для функции OderSendAsync(). Будет доступен после новой выкладки.

#property description "Эксперт для демонстрации работы асинхронной функции OrderSendAsync()."
#property description "Отправка торговых запросов осуществляется по щелчку мышки на графике."
#property description "Первое нажатие мышки приводит к посылке запросов на выставление ордеров BUY LIMIT,"
#property description "следующее нажатие удаляет все отложенные ордера, и так далее. Сообщения о работе"
#property description "советника выводятся в Журнал 'Эксперты' и в диалоговое окно 'Alert'."
//--- input parameters
input int  SyncOrders=1;
input int  AsyncOrders=10;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- проверим разерешение на автотрейдинг
   if(!TerminalInfoInteger(TERMINAL_TRADE_ALLOWED))
     {
      Alert("Автотрейдинг в терминале запрещен, эксперт будет удален");
      ExpertRemove();
      return(-1);
     }
//--- на реальном счете торговать нельзя
   if(AccountInfoInteger(ACCOUNT_TRADE_MODE)==ACCOUNT_TRADE_MODE_REAL)
     {
      Alert("Советнику запрещено торговать на реальном счете!");
      ExpertRemove();
      return(-2);
     }
//--- можно ли торговать на данном счете (под инвест-паролем нельзя, например)
   if(!AccountInfoInteger(ACCOUNT_TRADE_ALLOWED))
     {
      Alert("Торговля на данном счете запрещена");
      ExpertRemove();
      return(-3);
     }
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Trade function                                                   |
//+------------------------------------------------------------------+
void OnTrade()
  {
//--- выведем имя обработчика и количество ордеров на момент обработки
   Print(__FUNCTION__,": OrdersTotal() = ",OrdersTotal());
  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//--- обработка события CHARTEVENT_CLICK ("Нажатие кнопки мышки на графике")
   if(id==CHARTEVENT_CLICK)
     {
      //--- запускаем удаление всех отложенных ордеров
      if(OrdersTotal()>0)
         DeleteAllOrders();
      else // запускаем отправку серии отложенных ордеров
      PlaceOrders(SyncOrders,AsyncOrders);
     }
  }
//+------------------------------------------------------------------+
//| Выставление отложенных ордеров с максимальной скоростью          |
//+------------------------------------------------------------------+
void PlaceOrders(const int deals_sync,const int deals_async)
  {
//--- проверка
   if(deals_sync<1 || deals_async<1) return;
//--- сообщим о старте и запомним время
   Alert("");
   Alert("1. Отправка ",deals_sync," отложенных ордеров синхронно, подождите...");
//--- подготовим данные
   MqlTradeRequest req={0};
   MqlTradeResult  res={0};

   req.action      =TRADE_ACTION_PENDING;
   req.symbol      =_Symbol;
   req.magic       =12345;
   req.volume      =0.1;
   req.type        =ORDER_TYPE_BUY_LIMIT;
   req.price       =0.0;
   req.sl          =0.0;
   req.tp          =0.0;
   req.deviation   =10;
   req.comment     ="Speed testing";
//--- посылаем синхронные заявки
   int   errors=0;
   uint  start=GetTickCount();

   for(int i=0;i<deals_sync;i++)
     {
      //--- выставим цену на 100 пунктов ниже Bid
      req.price=SymbolInfoDouble(req.symbol,SYMBOL_BID)-100*_Point;
      //--- пошлем синхронный запрос
      if(!OrderSend(req,res))
        {
         errors++;
         Print("   #",i,": ошибка ",GetLastError(),",  retcode = ",res.retcode);
         break;
        }
     }
//--- сообщим о времени прохождения
   start=GetTickCount()-start;
   if(start>0)
      Alert("2. Размещение ",deals_sync," отложенных ордеров синхронно заняло ",
            start," ms, ",start/deals_sync," ms на сделку, ",errors," ошибок");

//--- сообщим о старте и запомним время
   Alert("3. Отправка ",deals_async," отложенных ордеров асинхронно, подождите...");
   start=GetTickCount();
   errors=0;
//--- запустим ордера
   for(int i=0;i<deals_async;i++)
     {
      //--- выставим цену на 200 пунктов ниже Bid
      req.price=SymbolInfoDouble(req.symbol,SYMBOL_ASK)-200*_Point;
      ResetLastError();
      //--- пошлем асинхронный запрос
      if(!OrderSendAsync(req,res))
        {
         errors++;
         Print("   #",i,": ошибка ",GetLastError(),", retcode = ",res.retcode);
        }
     }
//--- сообщим о времени прохождения
   start=GetTickCount()-start;
   if(start>0)
      Alert("4. Размещение ",deals_async," отложенных ордеров асинхронно заняло ",
            start," ms, ",start/deals_async," ms на сделку, ",errors," ошибок");
//---
  }
//+------------------------------------------------------------------+
//| Удаление всех отложенных ордеров                                 |
//+------------------------------------------------------------------+
void DeleteAllOrders()
  {
//--- проверка
   int orders=OrdersTotal();
   if(orders==0) return;
//--- сообщим о старте и запомним время
   Alert("");
   Alert("1. Удаление ",orders," отложенных ордеров асинхронно, подождите...");
//--- подготовим данные
   MqlTradeRequest req={0};
   MqlTradeResult  res={0};

   req.action=TRADE_ACTION_REMOVE;
//--- посылаем асинхронные заявки
   int   errors=0;
   uint  start=GetTickCount();
//--- удалим ордера
   for(int i=orders-1;i>=0;i--)
     {
      ResetLastError();
      req.order=OrderGetTicket(i);
      if(!OrderSendAsync(req,res))
        {
         errors++;
         Print("   #",i,": ошибка ",GetLastError(),", retcode = ",res.retcode);
        }
     }
//--- сообщим о времени прохождения
   start=GetTickCount()-start;
   if(start>0)
      Alert("2. Удаление ",orders," отложенных ордеров асинхронно заняло ",
            start," ms, ",start/orders," ms на сделку, ",errors," ошибок");
  }
 
sergeev:

а ты видел сколько килобайт занимает ответ сервера?

попробуй отправить 100 ордеров и засеки объем в терминале внизу.

приходит намного больше инфы чем просто дилинь в пару байт.

Ну ты сам посуди. Ты же видишь в журнале терминала про исполнение ордера. Все тикета, цены и т.д. Это все шлет сервер в любом случае.

Так вот все эти приходящие данные (которые идут в журнал)  должны идти в OnTrade. Со всеми подробностями (то есть те, которые торговые).

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

Rosh:

В справку добавлен пример для функции OderSendAsync(). Будет доступен после новой выкладки.

Жаль щас не проверишь, придётся ждать понедельника.

 
sergeev:

мой вариант

OnTrades(struct &TradeEvent[], int count)  // массив структур + их количество.

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

как и по сабжу:

denkir:Событие History, имхо, могло бы генерироваться после того, как поменялась торговая история.

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

хотя, правильнее так ответить:

sergeev:

надо бы ввести в правила пункт:

- Бан за глупые вопросы.

Ну а если серьезно, то проблема потери связи со всеми вытекающими обстоятельствами возможно была бы решена созданием события "disconect()"
 
Rosh:

В справку добавлен пример для функции OderSendAsync(). Будет доступен после новой выкладки.

Так понимаю вы сегодня на дежурстве (за всех отдуваетесь).

А есть что добавить по темам "параметры в OnTrade" или "контроль исполнения" ?

Ну или хотя бы пожурить типа "вы тут ребята фигнёй маетесь, тема высосана из пальца" и на этих самых пальцах почему.

 
IgorM:

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

как и по сабжу:

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

хотя, правильнее так ответить:

Ну а если серьезно, то проблема потери связи со всеми вытекающими обстоятельствами возможно была бы решена созданием события "disconect()"

disconect() можно контролировать в таймере по состоянию конектед, это всё чепуха.

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

Выставили ордер получили тикет, а его не реализовали и как вы в истории отследите это событие по отсутствию изменения истории? тогда в какой момент неизменение истории  нужно считать событием неисполения ордера? через 10 сек через 30 сек через час, когда? когда слать повторный приказ?

 
OnTrade безусловно будем апгрейдить, но пока не определились с моделью.
 
Renat:
OnTrade безусловно будем апгрейдить, но пока не определились с моделью.
Вот мы собственно тут и пытаемся вывести модель, и ваше вмешательство этому во многом бы помогло.
Причина обращения: