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

 
Какая задержка получается между изменением цены и полной обработкой этого изменения? На один робот сколько потоков (системных, не плазовских)?
 
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
 

Отпишитесь по результатам

Теоретически задержек не должно быть,

Задержки возрастают пропорционально кол-ву роботов

вот здесь (как и в МТ5 кол-во роботов ограничено)

//--- 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 = isin_id) then
            begin
              Child.FExpert.FTickEvent.SetEvent;       // Set tick to expert
              break;
            end;
          end;
        end;
 

Hello, I am using 3 EA indicators, but the indicators need to be combined in one sub-window in MT5. Similar to the TDI indicator. The question is that rsi, ma, cci, can they be combined in one window, like the Tdi or wpr indicators. How it's done. I've read articles on MT5, but I can only find the answer for this one window.

Спасибо
 
Moatle Thompson #:
Hello, I am using 3 EA indicators, but the indicators need to be combined in one sub-window in MT5. Similar to the TDI indicator. The question is that rsi, ma, cci, can they be combined in one window, like the Tdi or wpr indicators. How it's done. I've read articles on MT5, but I can only find the answer for this one window.

This way for you

https://www.mql5.com/en/job

Trading applications for MetaTrader 5 to order
Trading applications for MetaTrader 5 to order
  • 2023.11.23
  • www.mql5.com
The largest freelance service with MQL5 application developers
 
prostotrader #:

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

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

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


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

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

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

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

Примерно так же планирую, только пред обработку еще делать в приемной нити, которая на WaitAny висит. Не на WaitForMultiple.

А process вызываете плазовский?

 
prostotrader #:

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

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

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

"Эксперт"

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

Соединение проходит, но кнопки остальные задизэйблены остаются.

Как-то так:

23.11.2023 23:03:27.817 --> Создание соединения...
23.11.2023 23:03:27.818 --> Соединение создано. Создание слушателей...
23.11.2023 23:03:27.819 --> Слушатели созданы. Открытие соединения...
23.11.2023 23:03:27.859 --> Соединение открыто. Идет получение начальных данных...
23.11.2023 23:03:27.983 --> 23.11.2023 9:40:05: Средства ГО составляют 778 451 583 568.88 руб., изменение к предыдущему дню -4 530 379 811.15 руб.
23.11.2023 23:03:27.987 --> 23.11.2023 9:50:02: Список участников, предоставляющих котировки на большие объемы - https://www.moex.com/s2996
23.11.2023 23:03:27.991 --> 23.11.2023 11:50:07: Курсы валют для расчета Вармаржи и ГO в дневной клиринговой сессии:CAD=64.36330,CHF=99.68880,CNY=12.32190,EUR=96.17390,GBP=110.49690,HKD=11.32930,JPY=0.59490,TRY=3.06410,USD/CHF=0.88343,USD/JPY=1.48000,USD/TRY=28.74200,USR=88.06830
23.11.2023 23:03:28.000 --> 23.11.2023 11:55:00: Начало технического перерыва в 12:00.
23.11.2023 23:03:28.002 --> 23.11.2023 12:02:29: Торги возобновятся в 12:15. Сейчас можно снимать заявки.
23.11.2023 23:03:28.004 --> 23.11.2023 13:44:09: Курсы валют для расчета Вармаржи и ГO в вечерней клиринговой сессии:CAD=64.36330,CHF=99.68880,CNY=12.33450,EUR=96.40350,GBP=110.49690,HKD=11.32930,JPY=0.59490,TRY=3.06410,USD/CHF=0.88517,USD/JPY=1.48300,USD/TRY=28.79860,USR=88.24180
23.11.2023 23:03:28.007 --> 23.11.2023 13:50:34: Сейчас можно снимать заявки.

 
Dmitriy Skub #:

Соединение проходит, но кнопки остальные задизэйблены остаются.

Как-то так:

23.11.2023 23:03:27.817 --> Создание соединения...
23.11.2023 23:03:27.818 --> Соединение создано. Создание слушателей...
23.11.2023 23:03:27.819 --> Слушатели созданы. Открытие соединения...
23.11.2023 23:03:27.859 --> Соединение открыто. Идет получение начальных данных...
23.11.2023 23:03:27.983 --> 23.11.2023 9:40:05: Средства ГО составляют 778 451 583 568.88 руб., изменение к предыдущему дню -4 530 379 811.15 руб.
23.11.2023 23:03:27.987 --> 23.11.2023 9:50:02: Список участников, предоставляющих котировки на большие объемы - https://www.moex.com/s2996
23.11.2023 23:03:27.991 --> 23.11.2023 11:50:07: Курсы валют для расчета Вармаржи и ГO в дневной клиринговой сессии:CAD=64.36330,CHF=99.68880,CNY=12.32190,EUR=96.17390,GBP=110.49690,HKD=11.32930,JPY=0.59490,TRY=3.06410,USD/CHF=0.88343,USD/JPY=1.48000,USD/TRY=28.74200,USR=88.06830
23.11.2023 23:03:28.000 --> 23.11.2023 11:55:00: Начало технического перерыва в 12:00.
23.11.2023 23:03:28.002 --> 23.11.2023 12:02:29: Торги возобновятся в 12:15. Сейчас можно снимать заявки.
23.11.2023 23:03:28.004 --> 23.11.2023 13:44:09: Курсы валют для расчета Вармаржи и ГO в вечерней клиринговой сессии:CAD=64.36330,CHF=99.68880,CNY=12.33450,EUR=96.40350,GBP=110.49690,HKD=11.32930,JPY=0.59490,TRY=3.06410,USD/CHF=0.88517,USD/JPY=1.48300,USD/TRY=28.79860,USR=88.24180
23.11.2023 23:03:28.007 --> 23.11.2023 13:50:34: Сейчас можно снимать заявки.

Странно...

А Вы ничего не меняли в TreeView ?

 
Dmitriy Skub #:

Примерно так же планирую, только пред обработку еще делать в приемной нити, которая на WaitAny висит. Не на WaitForMultiple.

А process вызываете плазовский?

Нет, все свое

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