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

 
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
 
    Здравствуйте всем! Хочу реализовать одну вещь. А именно что бы главным условием было то, что бы после открытия ордера цена должна пройти определенное количество пунктов в любую из сторон. А уже потом реагировать на другие условия. Для этого у меня есть функция определения цены по которой был открыт ордер. Она рабочая, я ее проверял через Commetnt(). Далее я пишу условие if((Bid>=(FindLastOrderPrice()+200*_Point)) || (Bid<=(FindLastOrderPrice()-200*Point)) {...}  
  Но хочется так что бы: цена должна пройти определенное количество пунктов, после чего даже если она вернtться назад то ордер уже все равно мог бы открываться по другим условиям. Короче я так понимаю что в условие должно быть обнуление после того как цена прошла заданные пункты. Как это сделать?
 
Artur Sm #:
    Здравствуйте всем! Хочу реализовать одну вещь. А именно что бы главным условием было то, что бы после открытия ордера цена должна пройти определенное количество пунктов в любую из сторон. А уже потом реагировать на другие условия. Для этого у меня есть функция определения цены по которой был открыт ордер. Она рабочая, я ее проверял через Commetnt(). Далее я пишу условие if((Bid>=(FindLastOrderPrice()+200*_Point)) || (Bid<=(FindLastOrderPrice()-200*Point)) {...}  
  Но хочется так что бы: цена должна пройти определенное количество пунктов, после чего даже если она вернtться назад то ордер уже все равно мог бы открываться по другим условиям. Короче я так понимаю что в условие должно быть обнуление после того как цена прошла заданные пункты. Как это сделать?
Флаг сделайте.  Как только прошла цена нужное кол-во пунктов,  значение тру, иначе фалсе.  И проверяйте её значение.  Сбрасывайте на фалсе, если инет сделок. 

 
  С флагом попробую. Есть еще вопрос. А как сделать так, чтобы после открытия ордера отсчет был не на пункты, а на заданное количество баров которое должно пройти после открытия сделки?
 
Artur Sm #:
  С флагом попробую. Есть еще вопрос. А как сделать так, чтобы после открытия ордера отсчет был не на пункты, а на заданное количество баров которое должно пройти после открытия сделки?
Наверное проще время. При открытии сделки запомните время и потом сравнивайте с актуальным. Прошло или нет. 
 
Artur Sm #:
    Здравствуйте всем! Хочу реализовать одну вещь. А именно что бы главным условием было то, что бы после открытия ордера цена должна пройти определенное количество пунктов в любую из сторон. А уже потом реагировать на другие условия. Для этого у меня есть функция определения цены по которой был открыт ордер. Она рабочая, я ее проверял через Commetnt(). Далее я пишу условие if((Bid>=(FindLastOrderPrice()+200*_Point)) || (Bid<=(FindLastOrderPrice()-200*Point)) {...}  
  Но хочется так что бы: цена должна пройти определенное количество пунктов, после чего даже если она вернtться назад то ордер уже все равно мог бы открываться по другим условиям. Короче я так понимаю что в условие должно быть обнуление после того как цена прошла заданные пункты. Как это сделать?

Рекомендую еще ограничить "определенное количество пунктов" значением сверху. Иначе, рано или поздно влетите на резкое изменение цены.

Цена изменяется дискретно.

 
Dmitriy Skub #:

Рекомендую еще ограничить "определенное количество пунктов" значением сверху. Иначе, рано или поздно влетите на резкое изменение цены.

Цена изменяется дискретно.

Не очень понял как ограничить?