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

 
prostotrader #:

Да нет, не статистика.

Каждое действие над ордером, записывается в таблицу с новым replID.

Как Вы узнаете, что ордер установился, модифицировался или удален, если записей в этой таблице будет несколько тысяч?

Должно же быть визуальное подтверждение.

 
prostotrader #:

Должно же быть визуальное подтверждение.

Отдельно таблица ордеров (в текущем состоянии), отдельно история действий над ними.

 
prostotrader #:

Должно же быть визуальное подтверждение.

Можно повторить нечто подобное в мт5, только не так криво, конечно.
 
Anatolii Mel'sitov #:

Добрый вечер!

В советнике есть нормализация цен и выравнивание по границам тиков. Похоже проблема в другом.

Ну значит печатаете значения цен и смотрите что не так. Все просто.

Хотя бы сообщения из лога привели, гаданием занимаемся.

 

Работа движется, не так быстро, как хотелось бы, но идет...

 


 
prostotrader #:

Разобрался с серверными часами!

Разрабы Плаза 2, меняют replID у сообщения!

Только "пенек" мог сделать такое!

Зачем "складировать" прошлое время?

Будьте внимательны, Дмитрий, возможно еще где-то меняют replID

Как и подозревал, что это не единственное место, где разные replID на одно и то же

сообщение (поток FORTS_REFDATA_REPL; таблица  sys_messages)


 

Еще один шажочек...


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

Я, пока, ничего не замерял.

Общий принцип работы у меня такой.

Данные с биржи "складируются" в буфер "Storage".

  TCGStorage = class
    FMutex: TMutex;            // Mitex
    FMarData: TMarketData;     // Market data
    FAccStrPos: Integer;       // Accout stream position
    FAccTblPos: Integer;       // Accout table position
    FOrdStrPos: Integer;       // Orders stream position
    FOrdTblPos: Integer;       // orders table position
    FMLOrdStrPos: Integer;     // multileg orders stream position
    FMLOrdTblPos: Integer;     // multileg orders table position
    FDealStrPos: Integer;      // deals stream position
    FDealTblPos: Integer;      // deals table position
    FMLDealStrPos: Integer;    // multileg deals stream position
    FMLDealTblPos: Integer;    // multileg deals table position
    FPosStrPos: Integer;       // positions stream position
    FPosTblPos: Integer;       // positions table position
    FMessStrPos: Integer;      // sys mrssages stream position
    FMessTblPos: Integer;      // sys mrssages table position
    Fisin_id: integer;
    private
      function GetFieldVar(const Field: pcg_field_desc_t; const buff: PByteArray): Variant;
    protected
      //
    public
      constructor Create();
      destructor Destroy(); override;
      procedure SetTblsDesc(const idx: integer; var StrData: TStreamData;
                            const Scheme: pcg_scheme_desc_t);
      procedure LNClearTables(const idx: integer);
      procedure ClearDeleted(const idx: integer; const ClDel: pcg_data_cleardeleted_t);
      procedure UpdStrMsg(const msg: pcg_msg_streamdata_t; const strData: TStreamData);
      function BuilHeaders(): boolean;
      function GetData(var Data: PMarketData): boolean;
      function GetHeaders(var FHdr: THeaders; var OHdr: THeaders;
                          var SHdr: TSHeaders): boolean; // '1' - futures; '2' - options
      function GetSpotHdr(var Hdr: array of TSpotHeader): boolean;
      function GetTable(const idx: integer; var Table: TTable): boolean;
    property Mutex: TMutex read FMutex;
    property MarData: TMarketData read FMarData;
    property AccStrPos: Integer read FAccStrPos;
    property AccTblPos: Integer read FAccTblPos;
    property OrdStrPos: Integer read FOrdStrPos;
    property OrdTblPos: Integer read FOrdTblPos;
    property MLOrdStrPos: Integer read FMLOrdStrPos;
    property MLOrdTblPos: Integer read FMLOrdTblPos;
    property DealStrPos: Integer read FDealStrPos;
    property DealTblPos: Integer read FDealTblPos;
    property MLDealStrPos: Integer read FMLDealStrPos;
    property MLDealTblPos: Integer read FMLDealTblPos;
    property PosStrPos: Integer read FPosStrPos;
    property PosTblPos: Integer read FPosTblPos;
    property MessStrPos: Integer read FMessStrPos;
    property MessTblPos: Integer read FMessTblPos;
    property isin_id: Integer read Fisin_id;
  end;


Каждый робот - это трэд, работающий в режиме ожидания и не расходует процессор

procedure TExpert.Execute;
var
  Res: Dword;
begin
  while (Terminated = false) do
  begin
    Res:= WaitForMultipleObjects(4, @FEvents, false, INFINITE);
    case Res of
      WAIT_OBJECT_0: ;             // Trade
      WAIT_OBJECT_0 + 1: begin     // Tick
        Synchronize(UpdMemo);
      end;
      WAIT_OBJECT_0 + 2: {};     //Error
      WAIT_OBJECT_0 + 3: exit;     //Exit from cycle
      WAIT_FAILED: {};             // Events error
    end;
  end;
end;

Когда обрабатываются данные в Storage, и приходит запись с isin_id (данные по инструменту), то срабатывает евента Tickvent

//--- Find exprt ---
        if(isin_id > -1) then
        begin
          for j:= 0 to MainForm.MDIChildCount - 1 do
          begin
            Child:= TMDIChild(MainForm.MDIChildren[j]);
            if(Child.FExpert.Fisin_id = Fisin_id) then
            begin
              Child.FExpert.FTickEvent.SetEvent;       // Set tick to expert
              break;
            end;
          end;
        end;

которая находится в роботе

//--- TExpert ---
constructor TExpert.Create;
begin
  inherited Create(val);
//--- Create Events ---
  FTickEvent:= TSimpleEvent.Create(nil, false, false,  '');
  FTradeEvent:= TSimpleEvent.Create(nil, false, false,  '');
  FErrorEvent:= TSimpleEvent.Create(nil, false, false,  '');
  FExitEvent:= TSimpleEvent.Create(nil, false, false,  '');
  FEvents[0]:= FTradeEvent.Handle;
  FEvents[1]:= FTickEvent.Handle;
  FEvents[2]:= FErrorEvent.Handle;
  FEvents[3]:= FExitEvent.Handle;
  FConn:= TConnection.Create(true);
end;

Робот обращается к Storage и забирает всю инфу по своему инструменту и сам "копается" в полученных данных
  

 

Для Вас сделал вывод времени

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

Чтобы открыть робота, нудно нажать кнопку

"Эксперт"

Не все отлажено, пока, иногда может подвисать  

Файлы:
P2CGTrader.zip  1225 kb