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

 

Всем привет!

Столкнулся с необычной проблемой.

MDI приложение много дочерних окон, когда создается дочернее окно, то его хендл сохраняется.

CurChild.FExpert.FEHandle:= CurChild.Handle;

Далее, при обработке входящих данных, отсылается PostMessage() в дочернее окно, чтобы инициировать OnTick

if(Topic = 'spot') then
      begin
        for i:= 0 to Length(M_Data.Topics) - 1 do
        begin
          if(Topic = M_Data.Topics[i].Name) then  //topic fouund
          begin
            if(Cells.Top >= M_Data.Topics[i].Table.RowCount) then exit;
//--- Update common data ---
            for j:= 0 to Data.ColCount - 1 do
              M_Data.Topics[i].Table.Cells[Cells.Top, j]:= Data.Cells[0, j];
//--- Find Expert in child window ---
              for j:= 0 to MainForm.MDIChildCount - 1 do //Find Experts
              begin
                Child:= TMDIChild(MainForm.MDIChildren[j]);
                if(Child <> nil) then
                begin
                  b_found:= false;
                  for k:= 0 to Data.ColCount - 1 do
                  begin
                    if(Child.Expert.SpotName = Data.Cells[0, k]) then //found spot
                    begin
                      b_found:= true;
                      for z:= 0 to length(M_Data.FutNames) - 1 do  //more one future
                      begin
                        if(Child.Expert.FutName = M_Data.FutNames[z]) then
                        begin
                          if(CreateOutData(Child.Expert.FutName, Child.Expert.SpotName, z) = true) then // prepare out dada
                          begin
                              Child.FExpert.OnData(@OutData[z]);        //Send data
                              PostMessage(Child.Expert.EHandle, WM_ON_TICK, Child.Expert.EHandle, SPOT_DATA);  //Init OnTick
                          end;
                          break;
                        end;
                      end;
                    end;
                    if(b_found = true) then break;
                  end;
                end;
              end;
            break;
          end;
        end;
      end;

дочернее окно обрабатывает сообщение

const
  WM_ON_TICK  = WM_USER + 178;
  WM_ON_TRADE = WM_USER + 179;
  WM_ON_ERROR = WM_USER + 180;
  WM_TRADE_DONE = WM_USER + 181;

  TMDIChild = class(TForm)
    Memo1: TMemo;
    SetBtn: TBitBtn;
    StBtn: TBitBtn;
    GroupBox1: TGroupBox;
    GroupBox2: TGroupBox;
    PopupMenu1: TPopupMenu;
    CEntLabel: TLabel;
    СExitLabel: TLabel;
    FutLabel: TLabel;
    SpotLabel: TLabel;
    MaxLabel: TLabel;
    MinLabel: TLabel;
    CBLabel: TLabel;
    EntLabel: TLabel;
    ExtLabel: TLabel;
    MCntLabel: TLabel;
    AvlLabel: TLabel;
    N1: TMenuItem;
    CurDeltaLabel: TLabel;
    CurDivLabel: TLabel;
    PopupMenu2: TPopupMenu;
    N2: TMenuItem;
    ColorLabel: TLabel;
    SellLabel: TLabel;
    BuyLabel: TLabel;
    DivLabel: TLabel;
    Label1: TLabel;
    Label2: TLabel;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormCreate(Sender: TObject);
    procedure StBtnClick(Sender: TObject);
    procedure FormResize(Sender: TObject);
    procedure SetBtnClick(Sender: TObject);
    procedure N1Click(Sender: TObject);
    procedure N2Click(Sender: TObject);
  private
    { Private declarations }
  public
    FExpert: TExpert;
    { Public declarations }
    procedure ResiveMessTick(var Msg: TMessage); message WM_ON_TICK;
    procedure ResiveMessTrade(var Msg: TMessage); message WM_ON_TRADE;
    procedure ResiveMessError(var Msg: TMessage); message WM_ON_ERROR;
    procedure ResiveMessDone(var Msg: TMessage); message WM_TRADE_DONE;
    property Expert: TExpert read FExpert;
  end;

procedure TMDIChild.ResiveMessTick;
begin
  if(Msg.WParam = Expert.EHandle) then
  begin
    Mutex.Lock;
    try
      FExpert.FDoOnTick:= true;
      case Expert.ValidData of
        OLD_DATA: FExpert.FValidData:= integer(Msg.LParam);   //Set current data
        SPOT_DATA: if( integer(Msg.LParam) = FUT_DATA) then
        begin
          FExpert.FValidData:= VALID_DATA;
          inc(FExpert.FLblCnt1);  //DEBUG
        end;
        FUT_DATA: if(integer(Msg.LParam) = SPOT_DATA) then
        begin
         FExpert.FValidData:= VALID_DATA;
         inc(FExpert.FLblCnt2);  //DEBUG
        end;
        VALID_DATA:
        begin
          if(integer(Msg.LParam) = SPOT_DATA) then inc(FExpert.FLblCnt2) else //DEBUG
            if(integer(Msg.LParam) = FUT_DATA) then inc(FExpert.FLblCnt1);    //DEBUG
        end;
        else
        begin
          FExpert.FMemoStr:= 'Значение ValidData = ' + IntToStr(Expert.ValidData);
          FExpert.Synchronize(FExpert.UpdMemo);
        end;
      end;
    finally
      Mutex.Unlock;
    end;
    if(Expert.DoOnTick = true) then FExpert.FEvent.SetEvent;
  end else
  begin
    FExpert.FMemoStr:= 'Не совпадают хендлы!';
    FExpert.Synchronize(FExpert.UpdMemo);
  end;
end;

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

Сообщения PostMessage() отсылаются в это "спящее" окно, а функция 

 procedure ResiveMessTick(var Msg: TMessage); message WM_ON_TICK;

ничего не получает.

Почему может происходить такое?

 

Видимо из-за этого

A message queue can contain at most 10,000 messages. This limit should be sufficiently large.
If your application exceeds the limit, it should be redesigned to avoid consuming so many system resources.
To adjust this limit, modify the following registry key.
 

где цена открывает ордер на покупку в 40,00 и достигает TP в 50,00. не уверен, что это правильно,    

 

Привет!

Кто-нибудь смотрел API Transaq connector?

Файлы:
TXmlConnector.zip  1038 kb
 
Подключился к демо Transaq connextor, так там только Фондовый рынок
 
prostotrader #:
Подключился к демо Transaq connextor, так там только Фондовый рынок

Подключился к боевому Транзаку на моносчете (только фьючерсы). Что интересует?

 
pvs76 #:

Подключился к боевому Транзаку на моносчете (только фьючерсы). Что интересует?

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

Как Вы организовывали хранение данных?

 
prostotrader #:

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

Как Вы организовывали хранение данных?

я на торговой платформе ОСА engine. Я программист не оч). Максимум на что, был способен это написать криптобота на Питоне + postgres. 

 
Вы на обычном сервере или HFT?
 
pvs76 #:
Вы на обычном сервере или HFT?

Я пишу сам терминал для работы на HFT, но тестирую на обычном коннекторе, но на реальном счете.

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