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

 
Aleksey Vyazmikin #:

И с серверами синхронизации времени расходится? Ну, может и с кварцем проблемы, может какие иные элементы пришли в негодность и дают неправильные токи. Попробуйте на другом ПК.

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

 
Dmitriy Skub #:

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

А если сделать частую автоматическую синхронизацию?

 
Граждане, поставьте себе NTP (под виндоуc гуглить: Meinberg NTP) и будет у вашего компа расхождение времени 1-2 миллисекунды постоянно, всегда пока комп включен и подключен к хорошему интернету.
 
Dmitriy Skub #:

Да вот, заканчиваю написание коннектора. Думаю над тем как сократить время между отдачей торговой команды и получением реакции системы.

Вы сертифицировали свой коннектор? Какие были сложности?

Нет еще не сертифицировал, строительный сезон начался...

 
Dmitriy Skub #:

Вот, столкнулся с такой особенностью: отличие серверного времени биржи и локального на компе.


Сразу после синхронизации на компе отличие около нуля (+-5мс) потом уходит. Получается надо "забить" на локальное и использовать только серверное с биржи. У Вас как с этим? Или такая точность Вам не важна?

Мы же ведем торговлю по серверному времени, следовательно синхронизация нам вообще не нужна.

Я вообще не использую какое-либо время, а беру данные из таблицы session 

state i4 Состояние сессии

и таблицы  sys_events: Таблица событий для того чтобы расшифровать более точно что произошло....

  if(UData^.tName = 'FORTS_REFDATA_REPLsys_events') then
  begin
    Tx:= create_transaction(CGCntr.FStorage.DBase, kTxReadOnly);
    try
      Tx.init_child(Table, PAnsiChar('FORTS_REFDATA_REPLsys_events'));
      Cnt:= Table.get_size;
      if(Cnt > 0) then
      begin
        TableIter:= create_iterator(Table);
        try
          while(TableIter.is_valid()) do
          begin
            if(TableIter.init_child(Rec, PAnsiChar('sess_id')).get_int32(vi32) = true) then
            begin
              if(CGCntr.FStorage.FCurSessID = vi32) then
              begin
                if(TableIter.init_child(Rec, PAnsiChar('event_type')).get_int32(EvType) = true) then
                begin
                  if(EvType = 1) then
                    if(TableIter.init_child(Rec, PAnsiChar('message')).get_string(EvMess) = true) then
                      if(string(EvMess) = 'session_data_ready') then
                      begin
                        CGCntr.Storage.CreateHeaders();   // Create new headers
//--- Set experts Change data event ---
                        for Pair in CGCntr.Storage.ChDataEvents do
                        begin
                          if(CGCntr.Storage.ChDataEvents.TryGetValue(Pair.Key, FEvent) = true) then
                            FEvent.SetEvent;
                        end;
                        break;
                      end;
                end;
              end;
            end;
            next_iterator(TableIter);
          end;
        finally
          free_iterator(TableIter);
        end;
      end;
    finally
      free_transaction(Tx);
    end;
  end else
//--- Visual events ---


//--- Execute thread ---
  while(not Terminated) do
  begin
    Res:= WaitForMultipleObjects(NUM_EVENTS, @FEvents, false, INFINITE);
    case Res of
      WAIT_OBJECT_0: if(GetSession(FExpData) = true) then              // Session
      begin
        case ExpData.Session.state of
          0: begin                                                     // Mew Session set
               FMemoStr:= 'Новая сессия назначена. Загрузка данных...';
               Synchronize(UpdMemo);
             end;
          1: if(GetTickData(FPrimLeg, FSecLeg, FExpData) = true) then  // Tick
               OnTick();           // Сессия идет. Можно ставить и удалять заявки.
          2: begin
               FMemoStr:= 'Приостановка торгов по всем инструментам. Нельзя ставить заявки, но можно удалять.';
               Synchronize(UpdMemo);
          end;
          3: begin
               FMemoStr:= 'Сессия принудительно завершена. Нельзя ставить и удалять заявки.';
               Synchronize(UpdMemo);
          end;
          4: begin
               FMemoStr:= 'Сессия завершена по времени. Нельзя ставить и удалять заявки.';
               Synchronize(UpdMemo);
          end;
        end;
      end;
      WAIT_OBJECT_0 + 1: ;                                   // Order
      WAIT_OBJECT_0 + 2: ;                                   // MLOrder