Нужна помощь профессионального программиста - страница 33

 

Ребята!

Если у кого-то есть демо-доступ к Плаза 2, запустите, пожалуйста (вложение выше)

 
prostotrader #:

Тщательно сравнил логи - все нормально

Сообщение:

" 26.11.2023 20:18:39.648 --> Начальное получение данных завершено. Создание списков инструментов..." 

Приходит, если все потоки перешли в режим OnLine

Попробуйте запустить

Должно быть так (последовательность не обязательна):

Всего - 12 потоков (попросил еще 2 приятелей запустить, то же все нормально...)

Да я тоже посмотрел - совпадает с точностью до числа запрошенных таблиц.


Вот лог программы:

26.11.2023 22:21:26.824 --> Создание соединения...
26.11.2023 22:21:26.826 --> Соединение создано. Создание слушателей...
26.11.2023 22:21:26.827 --> Слушатели созданы. Открытие соединения...
26.11.2023 22:21:26.868 --> Соединение открыто. Идет получение начальных данных...
26.11.2023 22:21:26.966 --> Поток FORTS_USERORDERBOOK_REPL Перешел в режим Он-Лайн
26.11.2023 22:21:26.977 --> Поток FORTS_AGGR5_REPL Перешел в режим Он-Лайн
26.11.2023 22:21:26.997 --> Поток FORTS_PROHIBITION_REPL Перешел в режим Он-Лайн
26.11.2023 22:21:27.029 --> Поток FORTS_FEERATE_REPL Перешел в режим Он-Лайн
26.11.2023 22:21:27.032 --> Поток FORTS_FEE_REPL Перешел в режим Он-Лайн
26.11.2023 22:21:27.075 --> Поток FORTS_INFO_REPL Перешел в режим Он-Лайн
26.11.2023 22:21:27.085 --> Поток FORTS_BROKER_FEE_REPL Перешел в режим Он-Лайн
26.11.2023 22:21:27.100 --> Поток FORTS_BROKER_FEE_PARAMS_REPL Перешел в режим Он-Лайн
26.11.2023 22:21:27.312 --> Поток FORTS_REFDATA_REPL Перешел в режим Он-Лайн
26.11.2023 22:21:31.425 --> Поток FORTS_TRADE_REPL Перешел в режим Он-Лайн

 

Не хватает потоков

FORTS_POS_REPL 
FORTS_PART_REPL 

Какие действия с ними делаются?

И какой NET FRAMEWORK в настройках проекта установлен?

А что, сначала надо слушателей создавать, а потом только открывать соединение?
 
Dmitriy Skub #:

Не хватает потоков

Какие действия с ними делаются?

И какой NET FRAMEWORK в настройках проекта установлен?

А что, сначала надо слушателей создавать, а потом только открывать соединение?

1. Никаких других действий с этими 2 потоками, по отношению к другим потокам, не делается.

2 Делфи не использует  NET FRAMEWORK, это нативная программа (как С++)

3. да

procedure TCGConnection.Execute;
var
  h_res: CG_RESULT;
  s: string;
  state: uint32_t;
  i: integer;
  lsжn_done: boolean;
begin
  lsn_done:= false;
  CGCntr.FmMemoStr:= 'Создание соединения...';
  Synchronize(UpdMemo);
//--- Create connection and listener(s) ---
  if(CGCntr.cgSettings.ConType = 'p2tcp') then
   s:= CGCntr.cgSettings.ConType + '://' + CGCntr.cgSettings.Host + ':' +
       CGCntr.cgSettings.Port +
       ';app_name=' + CGCntr.cgSettings.ProgName +
       ';timeout=' + CGCntr.cgSettings.RoutTOut +
       ';local_timeout=' + CGCntr.cgSettings.LocTOut +
       ';name=' + CGCntr.cgSettings.ObjName else
   s:= CGCntr.cgSettings.ConType + '://' + CGCntr.cgSettings.Host + ':' +
       CGCntr.cgSettings.Port +
      ';app_name=' + CGCntr.cgSettings.ProgName +
       ';timeout='  + CGCntr.cgSettings.RoutTOut +
       ';local_timeout=' + CGCntr.cgSettings.LocTOut +
       ';lrpcq_buf=' + CGCntr.cgSettings.BuffSize +
       ';name=' + CGCntr.cgSettings.ObjName;
   h_res:= cg_conn_new(PAnsiChar(RawByteString(s)), FhConn);
   if(h_res <> CG_ERR_OK) then
   begin
     case h_res of
       CG_ERR_INVALIDARGUMENT: begin
         CGCntr.FmMemoStr:= 'Ошибка: Функции создания соединения были переданы некорректные аргументы.';
         Synchronize(UpdMemo);
       end;
       CG_ERR_INTERNAL: begin
         CGCntr.FmMemoStr:= 'Ошибка: Внутренняя ошибка в функци создания соединения.';
         Synchronize(UpdMemo);
       end;
     end;
   end else
   begin
     CGCntr.FmMemoStr:= 'Соединение создано. Создание слушателей...';
     Synchronize(UpdMemo);
//--- Create listeners ---
     for i:= 0 to length(Lsnrs) - 1 do
     begin
       Lsnrs[i].StreamData.Pos:= i;
       h_res:= MakeCallBack(hConn, Lsnrs[i].Settings,
                            FLsnrs[i].Lsn, @Lsnrs[i].StreamData);
       if(h_res <> CG_ERR_OK) then
       begin
         CGCntr.FmMemoStr:= 'Ошибка: Слушатель ' + Lsnrs[i].Settings + ' не создан!';
         Synchronize(UpdMemo);
         Break;
       end;
     end;
     CGCntr.FmMemoStr:= 'Слушатели созданы. Открытие соединения...';
     Synchronize(UpdMemo);
//---
    while (not Terminated) do
    begin
      CGCntr.FErr_exit:= false;
      h_res:= cg_conn_getstate(hConn, state);
      if(h_res = CG_ERR_OK) then
      begin
        case state of
          CG_STATE_CLOSED: cg_conn_open(hConn, nil);
          CG_STATE_ERROR: cg_conn_close(hConn);
          CG_STATE_OPENING: ;  // TODO  ???????????
          CG_STATE_ACTIVE: begin
            if(lsn_done = false) then
            begin
              lsn_done:= true;
              CGCntr.FmMemoStr:= 'Соединение открыто. Идет получение начальных данных...';
              Synchronize(UpdMemo);
            end;
//---
          {  for i:= 0 to MAX_STREAM_CNT - 1 do
            begin
              h_res:= cg_conn_process(hConn, 0, nil);
              if(h_res = CG_ERR_TIMEOUT) then break else      // no messages
              if((h_res <> CG_ERR_OK) and (h_res <> CG_ERR_TIMEOUT)) then
              begin
                CGCntr.FmMemoStr:= 'Внимание: Состояние соединения не определено.';
                Synchronize(UpdMemo);
              end;
            end; }
            h_res:= cg_conn_process(hConn, 1, nil);
            if((h_res <> CG_ERR_OK) and (h_res <> CG_ERR_TIMEOUT)) then
            begin
              CGCntr.FmMemoStr:= 'Внимание: Состояние соединения не определено.';
              Synchronize(UpdMemo);
            end;
//--- Query Listeners state ---
            for i:= 0 to length(Lsnrs) - 1 do
            begin
              h_res:= cg_lsn_getstate(Lsnrs[i].Lsn, state);
              if(h_res = CG_ERR_OK) then
              begin
                case state of
                  CG_STATE_ERROR: cg_lsn_close(Lsnrs[i].Lsn);
                  CG_STATE_CLOSED: begin
                    //  Lsnrs[i].StreamData.LNChange:= false;
                    s:= Lsnrs[i].LsnParams.LifeStrNum +
                        UintToStr(Lsnrs[i].StreamData.LifeNum);
                    cg_lsn_open(Lsnrs[i].Lsn, PansiChar(RawByteString(s)));
                  end;
                  CG_STATE_OPENING: ;  // TODO  ???????????
                  CG_STATE_ACTIVE: {nothing};
                end;
              end else
              begin
                CGCntr.FmMemoStr:= 'Внимание: Состояние слушателя не определено.';
                Synchronize(UpdMemo);
              end;
            end;
          end;
        end;
      end;
    end;
  end;
  if(CGCntr.Err_exit = true) then
  begin
    CGCntr.FmMemoStr:= 'Выйдите из программы. Запистите вновь и проверьте настройти.';
    Synchronize(UpdMemo);
  end else
  begin
    CGCntr.FmMemoStr:= 'Закрытие соединения...';
    Synchronize(UpdMemo);
  end;
end;

begin

end

 это

{

}

Добавлено

Это закомментарено

{  for i:= 0 to MAX_STREAM_CNT - 1 do
            begin
              h_res:= cg_conn_process(hConn, 0, nil);
              if(h_res = CG_ERR_TIMEOUT) then break else      // no messages
              if((h_res <> CG_ERR_OK) and (h_res <> CG_ERR_TIMEOUT)) then
              begin
                CGCntr.FmMemoStr:= 'Внимание: Состояние соединения не определено.';
                Synchronize(UpdMemo);
              end;
            end; }
 

Хрень какая-то все потоки обрабатываются одинаково!

А у Вас 2 потока пропадают :(

 
prostotrader #:

Хрень какая-то все потоки обрабатываются одинаково!

А у Вас 2 потока пропадают :(

есть уверенность, что проделав работу, будет где-то затуп и с ним ничего нельзя сделать?

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

+

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

 
lynxntech #:

есть уверенность, что проделав работу, будет где-то затуп и с ним ничего нельзя сделать?

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

К чему этот пост?

На 5 разных компах с разными ОС - работает, а у Дмитрия нет.

Вот и пытаемся понять причину.

 

Дмитрий!

Зайдите в Plazer  и посмотрите, есть ли на Вашем счете деньги?

И совпадает ли логин с Вашим

Эти 2 потока

FORTS_POS_REPL 
FORTS_PART_REPL 
Привязаны к логину и деньгам
 
Dmitriy Skub #:
Какая задержка получается между изменением цены и полной обработкой этого изменения? На один робот сколько потоков (системных, не плазовских)?

Коннектор Plaza, написанный на С++ под Linux.
Среднее время задержки между биржевым временем котировки и временем получения в системе ~ 12 мс. Минимальное, что наблюдалось - 3 мс. Расположение сервера в зоне коллокации биржи, пинг ~ 400 мкс.
В логах коннектора можно увидеть время обработки коллбэк функций, там всегда более 10 мс.
Время между отправкой заявки и её исполнением < 1 мс.

 
Vladimir Mikhailov #:

Коннектор Plaza, написанный на С++ под Linux.
Среднее время задержки между биржевым временем котировки и временем получения в системе ~ 12 мс. Минимальное, что наблюдалось - 3 мс. Расположение сервера в зоне коллокации биржи, пинг ~ 400 мкс.
В логах коннектора можно увидеть время обработки коллбэк функций, там всегда более 10 мс.
Время между отправкой заявки и её исполнением < 1 мс.

Доброй ночи Владимир!

У Вас же есть демо-счет на Плаза2.

Большая просьба запустите вложение в конце предыдущей страницы

и выложите лог, пожалуйста

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