MT5 стал доступен в Финам - страница 106

 
Stanislav Korotky #:
Разве была речь про советник? Больше похоже на баг в шлюзе МТ5 сервер - MOEX.
Я сейчас торгую через шлюз - вообще нет проблем!
 
prostotrader #:
Я сейчас торгую через шлюз - вообще нет проблем!
Вы же свой софт писали, который не работает через серверный шлюз MT5, ибо MQ никому свой протокол не раскрывают.
 
Stanislav Korotky #:
Вы же свой софт писали, который не работает через серверный шлюз MT5, ибо MQ никому свой протокол не раскрывают.

Не только написал, но уже давно торгую.

Как бы не формировалась заявка в МТ-5, в конечном счете (на сервере МТ-5) она будет иметь 

стандартные параметры для заявок Срочного рынка.

Connector.fTRansConn.fOrderQueue.fQueue.PushTask(TMoveOrderTask.Create(ErrEvent,
                                         fExpert.fExpCallBacks.fExpQueue,
                                         fExpert.fExpCallBacks.fOrdTimeEvent,
                                         '', 0, Snap.fTicket, 1, StrPrice,
                                         Snap.fTransID, 0, 0, '', 0, 0, 0,
                                         fExpert.ClCode,
                                         Snap.fIsinId, 'R'));

Старая цена нигде не присутствует...

Вот поэтому и пишу, что старя цена не имеет никакого смысла, потому что она не участвует в модификации.

 

Если внимательно посмотреть на ранее опубликованный скрин лога:

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

MT5 стал доступен в Финам

Ivan Titov, 2026.07.28 17:14

Выставил лимитный ордер на продажу по цене 78.31. Вижу на графике, что ордер выставился по текущей цене (78.01). Пытаюсь подвинуть его вверх, но не успеваю и он срабатывает. Поддержка Финама заверяет меня, что это я сам выставил ордер по цене 78.01, хотя в логе ниже видно, что это не так. Опасно торговать в Финаме становится.



то там багообразность наблюдается не только в подчеркнутых красным моментах, но и например в двух последних строчках. В предпоследней сообщается, что ордер не удалось модифицировать с цены 78.16 на цену 78.27 (из-за близости рынку). А в последней пишется, что тот же самый ордер исполнился в сделке по цене 78.01. Не может такое быть для sell limit. Или они не выводят приказы как лимитные на биржу, а просто МТ5 сервер пытается маркет-ордером это эмулировать. Цена ушла чуть ниже на 77.97, поэтому всё что выше - уже лучше рынка и софт решил, что "псевдо-лимику" можно исполнять.

 
Stanislav Korotky #:

Если внимательно посмотреть на ранее опубликованный скрин лога:


то там багообразность наблюдается не только в подчеркнутых красным моментах, но и например в двух последних строчках. В предпоследней сообщается, что ордер не удалось модифицировать с цены 78.16 на цену 78.27 (из-за близости рынку). А в последней пишется, что тот же самый ордер исполнился в сделке по цене 78.01. Не может такое быть для sell limit. Или они не выводят приказы как лимитные на биржу, а просто МТ5 сервер пытается маркет-ордером это эмулировать. Цена ушла чуть ниже на 77.97, поэтому всё что выше - уже лучше рынка и софт решил, что "псевдо-лимику" можно исполнять.

Я не спорю, что "кругом" баги, я просто отметил, что старая цена не важна, важна только новая.

И, конечно, заявка должна была исполнится не по 78,01, а по 78,16.

Вот поэтому я и забросил МТ5, потому что это не Биржевой терминал.

Если бы Вы знали сколько информации по Срочному рынку нет в МТ5! 

Добавлено

Особенно "радуют" задержки исполнения торговых приказов!

У меня в терминале (коннекторе), при торговле из дома

30.07.2026 13:14:48.495 --> Заявка на продажу BOC устанавливается...
30.07.2026 13:14:48.495 --> Заявка на продажу 2026089588539338079 активна. (8.5266 ms)
30.07.2026 13:14:48.979 --> Заявка на продажу 2026089588539338079 модифицируется... 
30.07.2026 13:14:48.979 --> Заявка на продажу 2026089588539338091 активна. (10.187 ms)
30.07.2026 13:14:49.416 --> Заявка на продажу 2026089588539338091 модифицируется... 
30.07.2026 13:14:49.416 --> Заявка на продажу 2026089588539338098 активна. (9.4574 ms)
30.07.2026 13:14:49.901 --> Заявка на продажу 2026089588539338098 модифицируется... 
30.07.2026 13:14:49.901 --> Заявка на продажу 2026089588539338113 активна. (6.7416 ms)
30.07.2026 13:14:50.338 --> Заявка на продажу 2026089588539338113 модифицируется... 
30.07.2026 13:14:50.338 --> Заявка на продажу 2026089588539338123 активна. (7.8656 ms)

Но и бывают сбои в самом шлюзе

30.07.2026 14:21:45.063 --> Заявка на продажу 2026089588539359584 модифицируется... 
30.07.2026 14:21:45.984 --> Заявка на продажу 2026089588539359608 активна. (919.8926 ms)

30.07.2026 14:21:47.078 --> Заявка на продажу 2026089588539359608 модифицируется... 
30.07.2026 14:21:50.577 --> Ордер на продажу в состоянии: TransID = 90076666; Ticket = 2026089588539359608; State = ORDER_MODIFY
30.07.2026 14:21:51.624 --> Ордер на продажу в состоянии: TransID = 90076666; Ticket = 2026089588539359608; State = ORDER_MODIFY

30.07.2026 14:21:52.093 --> Таймаут шлюза! BOC ордер TransID: 90076666

30.07.2026 14:21:52.577 --> Заявка на продажу 2026089588539359608 модифицируется... 

30.07.2026 14:21:53.639 --> Ордер на продажу в состоянии: TransID = 90076667; Ticket = 2026089588539359608; State = ORDER_MODIFY
30.07.2026 14:21:54.764 --> Ордер на продажу в состоянии: TransID = 90076667; Ticket = 2026089588539359608; State = ORDER_MODIFY

30.07.2026 14:21:56.420 --> Код ошибки: 72 Заявка в процессе перемещения.

30.07.2026 14:21:56.420 --> Заявка на продажу 2026089588539359608 удалена. (1666.3059 ms)
 

Кто-то писал, что МТ-5 в Финаме работает через Транзак, а не через Плазу 2, как было в любимой Открывашке.

Транзак работает в XML формате, вот и представьте: Терминал --> Сервер МТ-5 --> Транзак --> Биржа

Сколько Багов можно собрать?

 
prostotrader #:

Я не спорю, что "кругом" баги, я просто отметил, что старая цена не важна, важна только новая.

И, конечно, заявка должна была исполнится не по 78,01, а по 78,16.

Вот поэтому я и забросил МТ5, потому что это не Биржевой терминал.

Если бы Вы знали сколько информации по Срочному рынку нет в МТ5! 

Добавлено

Особенно "радуют" задержки исполнения торговых приказов!

У меня в терминале (коннекторе), при торговле из дома

Но и бывают сбои в самом шлюзе

маленько завесу приоткройте зачем столько модификаций отложенных ордеров (заявок)?

 
Roman Shiredchenko #:

маленько завесу приоткройте зачем столько модификаций отложенных ордеров (заявок)?

Что бы заявка всегда была первой в стакане.
 
prostotrader #:

Не только написал, но уже давно торгую.

Кстати, написать и оттестировать было совсем не просто

Это не считая Базы данных

Стресс-тест БД (2 писателя писали, 150 читателей читали все работали одновременно!)

=== PURE STRESS TEST (5 MIN) ===
Запуск... Потоки будут молотить без пауз.
Прогресс: 147 / 300 сек | Блокировок: 0 [LOCK DETECTED] 18:20:34.367 | Время: 10785 мкс (10,79 мс)
Прогресс: 160 / 300 сек | Блокировок: 1
Остановка...

=== ФИНАЛЬНЫЙ ОТЧЕТ ===
Итераций выполнено:     3015011
Коллизий (>500 мкс):    1
Макс. зафиксированный лаг: 10785 мкс (10,79 мс)
Тест завершен.

Добавлено

Кстати, пользовался ИИ (Gemini pro version) для написания больших массивов кода 

например эту функцию написал ИИ

function TExpert.GetEnviroiment(var eData: TExpertData): boolean;
var
  Tx: PDtsTransaction;
  i: integer;
  rowCnt: TDtsSize;
  MapTable, IsinTable, Table, Rec, Field: TDtsVariant;
  TableIter: PDtsIterator;
  vi32: integer;
  vi64: int64;
  vd: double;
  vStr: PAnsiChar;
  Key: ansistring;
  Repls: TArray<int64>;
  Size: TDtsSize;
begin
  result:= true;
  //--- Money ---
  Tx:= create_transaction(Connector.fUserConn.fStorage.fDBase, kTxReadOnly);
  try
    Tx.init_child(Table, PAnsiChar('FORTS_PART_REPLpart'));
    rowCnt:= Table.get_size;
    if(rowCnt > 0) then
    begin
      TableIter:= create_iterator(Table);
      try
        while(TableIter.is_valid()) do
        begin
          if(TableIter.init_child(Field, PAnsiChar('client_code')).get_string(vStr) = true) then
            eData.Money.client_code:= AnsiString(vStr);
          if(TableIter.init_child(Field, PAnsiChar('money_free')).get_double(vd) = true) then
            eData.Money.money_free:= vd;
          if(TableIter.init_child(Field, PAnsiChar('money_blocked')).get_double(vd) = true) then
            eData.Money.money_blocked:= vd;
          if(TableIter.init_child(Field, PAnsiChar('vm_reserve')).get_double(vd) = true) then
            eData.Money.vm_reserve:= vd;
          if(TableIter.init_child(Field, PAnsiChar('fee')).get_double(vd) = true) then
            eData.Money.fee:= vd;
          if(TableIter.init_child(Field, PAnsiChar('limits_set')).get_int32(vi32) = true) then
            eData.Money.limits_set:= ShortInt(vi32);
          if(TableIter.init_child(Field, PAnsiChar('money_old')).get_double(vd) = true) then
            eData.Money.money_old:= vd;
          if(TableIter.init_child(Field, PAnsiChar('money_amount')).get_double(vd) = true) then
            eData.Money.money_amount:= vd;
          if(TableIter.init_child(Field, PAnsiChar('money_pledge_amount')).get_double(vd) = true) then
            eData.Money.money_pledge_amount:= vd;
          if(TableIter.init_child(Field, PAnsiChar('actual_amount_of_base_currency')).get_double(vd) = true) then
            eData.Money.actual_amount_of_base_currency:= vd;
          if(TableIter.init_child(Field, PAnsiChar('vm_intercl')).get_double(vd) = true) then
            eData.Money.vm_intercl:= vd;
          if(TableIter.init_child(Field, PAnsiChar('is_auto_update_limit')).get_int32(vi32) = true) then
            eData.Money.is_auto_update_limit:= ShortInt(vi32);
          if(TableIter.init_child(Field, PAnsiChar('broker_fee')).get_double(vd) = true) then
            eData.Money.broker_fee:= vd;
          if(TableIter.init_child(Field, PAnsiChar('penalty')).get_double(vd) = true) then
            eData.Money.penalty:= vd;
          if(TableIter.init_child(Field, PAnsiChar('premium_intercl')).get_double(vd) = true) then
            eData.Money.premium_intercl:= vd;
          if(TableIter.init_child(Field, PAnsiChar('net_option_value')).get_double(vd) = true) then
            eData.Money.net_option_value:= vd;
          if(TableIter.init_child(Field, PAnsiChar('actual_amount_of_base_currency')).get_double(vd) = true) then
            eData.Money.actual_amount_of_base_currency:= vd;
          if(TableIter.init_child(Field, PAnsiChar('moment')).get_double(vd) = true) then
            eData.Money.moment:= FloatToDateTime(vd);
          next_iterator(TableIter);
        end;
      finally
        free_iterator(TableIter);
      end;
    end else
    begin
      result:= false;
      exit;
    end;
  finally
    free_transaction(Tx);
  end;
//--- Market data --
  Tx:= create_transaction(Connector.fMDConn.fStorage.fDBase, kTxReadOnly);
  try
    Tx.init_child(Table, PAnsiChar('FORTS_REFDATA_REPLtrade_periods'));
//--- Trade periods ---
    size:= Table.get_size;
    if(size > 0) then
    begin
      TableIter:= create_iterator(Table);
      try
        SetLength(eData.Session.TradePer, size * 2);
        size:= 0;
        while TableIter.is_valid() do
        begin
          if(TableIter.init_child(Field, PAnsiChar('trade_period_id')).get_int64(vi64) = true) then
            eData.Session.TradePer[size].trade_period_id:= vi64;
          if(TableIter.init_child(Field, PAnsiChar('sess_id')).get_int32(vi32) = true) then
            eData.Session.TradePer[size].sess_id:= vi32;
          if(TableIter.init_child(Field, PAnsiChar('trade_period_type')).get_int64(vi64) = true) then
            eData.Session.TradePer[size].trade_period_type:= vi64;
          if(TableIter.init_child(Field, PAnsiChar('trade_period_begin')).get_double(vd) = true) then
            eData.Session.TradePer[size].trade_period_begin:= FloatToDateTime(vd);
          if(TableIter.init_child(Field, PAnsiChar('trade_period_end')).get_double(vd) = true) then
            eData.Session.TradePer[size].trade_period_end:= FloatToDateTime(vd);
          if(TableIter.init_child(Field, PAnsiChar('trade_period_name')).get_string(vStr) = true) then
            eData.Session.TradePer[size].trade_period_name:= ansistring(vStr);
          if(TableIter.init_child(Field, PAnsiChar('trade_period_flags')).get_int64(vi64) = true) then
            eData.Session.TradePer[size].trade_period_flags:= vi64;
          inc(size);
          next_iterator(TableIter);
        end;
        SetLength(eData.Session.TradePer, size);
      finally
        free_iterator(TableIter);
      end;
    end else
    begin
      result:= false;
      exit;
    end;
//--- Sesssion ---
    Tx.init_child(Table, PAnsiChar('FORTS_REFDATA_REPLsession'));
    rowCnt:= Table.get_size;
    if(rowCnt > 0) then
    begin
      SetLength(Repls, rowCnt * 2);
      rowCnt:= 0;
      TableIter:= create_iterator(Table);
      try
        while TableIter.is_valid do
        begin
          Key:= TableIter.get_key;
          if(Key <> '') then
          begin
            Repls[rowCnt]:= StrToInt64(string(Key));
            inc(rowCnt);
          end;
          next_iterator(TableIter);
        end;
      finally
        free_iterator(TableIter);
      end;
      if(rowCnt > 0) then
      begin
        SetLength(Repls, rowCnt);
        TArray.Sort<int64>(Repls);
        Table.init_child(Rec, PAnsiChar(ansistring(IntToStr(Repls[rowCnt - 1]))));
        if(Rec.init_child(Field, PAnsiChar('sess_id')).get_int32(vi32) = true) then
          eData.Session.sess_id:= vi32;
        if(Rec.init_child(Field, PAnsiChar('begin')).get_double(vD) = true) then
          eData.Session.s_begin:= FloatToDateTime(vD);
        if(Rec.init_child(Field, PAnsiChar('end')).get_double(vD) = true) then
          eData.Session.s_end:= FloatToDateTime(vD);
        if(Rec.init_child(Field, PAnsiChar('state')).get_int32(vi32) = true) then
          eData.Session.state:= vi32;
        if(Rec.init_child(Field, PAnsiChar('eve_on')).get_int32(vi32) = true) then
          eData.Session.eve_on:= ShortInt(vi32);
        if(Rec.init_child(Field, PAnsiChar('eve_begin')).get_double(vD) = true) then
          eData.Session.eve_begin:= FloatToDateTime(vD);
        if(Rec.init_child(Field, PAnsiChar('eve_end')).get_double(vD) = true) then
          eData.Session.eve_end:= FloatToDateTime(vD);
        if(Rec.init_child(Field, PAnsiChar('mon_on')).get_int32(vi32) = true) then
          eData.Session.mon_on:= ShortInt(vi32);
        if(Rec.init_child(Field, PAnsiChar('mon_begin')).get_double(vD) = true) then
          eData.Session.mon_begin:= FloatToDateTime(vD);
        if(Rec.init_child(Field, PAnsiChar('mon_end')).get_double(vD) = true) then
          eData.Session.mon_end:= FloatToDateTime(vD);
        if(Rec.init_child(Field, PAnsiChar('settl_sess_begin')).get_double(vD) = true) then
          eData.Session.settl_sess_begin:= FloatToDateTime(vD);
        if(Rec.init_child(Field, PAnsiChar('clr_sess_begin')).get_double(vD) = true) then
          eData.Session.clr_sess_begin:= FloatToDateTime(vD);
        if(Rec.init_child(Field, PAnsiChar('settl_price_calc_time')).get_double(vD) = true) then
          eData.Session.settl_price_calc_time:= FloatToDateTime(vD);
        if(Rec.init_child(Field, PAnsiChar('settl_sess_t1_begin')).get_double(vD) = true) then
          eData.Session.settl_sess_t1_begin:= FloatToDateTime(vD);
        if(Rec.init_child(Field, PAnsiChar('margin_call_fix_schedule')).get_double(vD) = true) then
          eData.Session.margin_call_fix_schedule:= FloatToDateTime(vD);
      end;
    end else
    begin
      result:= false;
      exit;
    end;
//--- Investor ---
    Tx.init_child(Table, PAnsiChar('FORTS_REFDATA_REPLinvestor'));
    rowCnt:= Table.get_size;
    if(rowCnt = 0) then
    begin
      result:= false;
      exit;
    end;
    TableIter:= create_iterator(Table);
    try
      while(TableIter.is_valid()) do
      begin
        if(TableIter.init_child(Field, PAnsiChar('client_code')).get_string(vStr) = true) then
          eData.Investor.client_code:= AnsiString(vStr);
        if(TableIter.init_child(Field, PAnsiChar('name')).get_string(vStr) = true) then
          eData.Investor.name:= AnsiString(vStr);
        if(TableIter.init_child(Field, PAnsiChar('calendar_spread_margin_type')).get_int32(vi32) = true) then
          eData.Investor.calendar_spread_margin_type:= ShortInt(vi32);
        if(TableIter.init_child(Field, PAnsiChar('is_blank')).get_int32(vi32) = true) then
          eData.Investor.is_blank:= vi32;
        if(TableIter.init_child(Field, PAnsiChar('short_option_minimum_charge_ratio')).get_double(vd) = true) then
          eData.Investor.short_option_minimum_charge_ratio:= vd;
        if(TableIter.init_child(Field, PAnsiChar('ics_margin_type')).get_int32(vi32) = true) then
          eData.Investor.ics_margin_type:= ShortInt(vi32);
        if(TableIter.init_child(Field, PAnsiChar('coeff_im')).get_double(vd) = true) then
          eData.Investor.coeff_im:= vd;
        if(TableIter.init_child(Field, PAnsiChar('no_fut_discount')).get_int32(vi32) = true) then
          eData.Investor.no_fut_discount:= ShortInt(vi32);
        if(TableIter.init_child(Field, PAnsiChar('num_clr_2delivery')).get_int32(vi32) = true) then
          eData.Investor.num_clr_2delivery:= vi32;
        if(TableIter.init_child(Field, PAnsiChar('exp_weight')).get_double(vd) = true) then
          eData.Investor.exp_weight:= vd;
        if(TableIter.init_child(Field, PAnsiChar('xstatus')).get_int64(vi64) = true) then
          eData.Investor.xstatus:= vi64;
        if(TableIter.init_child(Field, PAnsiChar('client_risk_level')).get_int32(vi32) = true) then
          eData.Investor.client_risk_level:= vi32;
        next_iterator(TableIter);
      end;
    finally
      free_iterator(TableIter);
    end;
//--- Rates ---
    Tx.init_child(Table, PAnsiChar('FORTS_REFDATA_REPLrates'));
    rowCnt:= Table.get_size;
    if(rowCnt > 0) then
    begin
      SetLength(eData.Rates, rowCnt * 2);
      rowCnt:= 0;
      TableIter:= create_iterator(Table);
      try
        while(TableIter.is_valid()) do
        begin
          if(TableIter.init_child(Field, PAnsiChar('rate_id')).get_int32(vi32) = true) then
            eData.Rates[rowCnt].rate_id:= vi32;
          if(TableIter.init_child(Field, PAnsiChar('curr_base')).get_string(vStr) = true) then
            eData.Rates[rowCnt].curr_base:= ansistring(vStr);
          if(TableIter.init_child(Field, PAnsiChar('curr_coupled')).get_string(vStr) = true) then
            eData.Rates[rowCnt].curr_coupled:= ansistring(vStr);
          if(TableIter.init_child(Field, PAnsiChar('radius')).get_double(vd) = true) then
            eData.Rates[rowCnt].radius:= vd;
          inc(rowCnt);
          next_iterator(TableIter);
        end;
        SetLength(eData.Rates, rowCnt);
      finally
        free_iterator(TableIter);
      end;
    end else
    begin
      result:= false;
      exit;
    end;
//--- Base contract params ---
    Tx.init_child(Table, PansiChar('FORTS_INFO_REPLbase_contracts_params'));
    rowCnt:= Table.get_size;
    if(rowCnt > 0) then
    begin
      SetLength(eData.BCParams, rowCnt * 2);
      rowCnt:= 0;
      TableIter:= create_iterator(Table);
      try
        while(TableIter.is_valid()) do
        begin
          if(TableIter.init_child(Field, PAnsiChar('base_contract_code')).get_string(vStr) = true) then
            eData.BCParams[rowCnt].base_contract_code:= ansistring(vStr);
          if(TableIter.init_child(Field, PAnsiChar('code_mcs')).get_string(vStr) = true) then
            eData.BCParams[rowCnt].code_mcs:= ansistring(vStr);
          if(TableIter.init_child(Field, PAnsiChar('volat_num')).get_int32(vi32) = true) then
            eData.BCParams[rowCnt].volat_num:= ShortInt(vi32);
          if(TableIter.init_child(Field, PAnsiChar('has_options')).get_int32(vi32) = true) then
            eData.BCParams[rowCnt].has_options:= ShortInt(vi32);
          if(TableIter.init_child(Field, PAnsiChar('percent_rate')).get_double(vd) = true) then
            eData.BCParams[rowCnt].percent_rate:= vd;
          if(TableIter.init_child(Field, PAnsiChar('somc')).get_double(vd) = true) then
            eData.BCParams[rowCnt].somc:= vd;
          if(TableIter.init_child(Field, PAnsiChar('msp_type')).get_int32(vi32) = true) then
            eData.BCParams[rowCnt].msp_type:= ShortInt(vi32);
          if(TableIter.init_child(Field, PAnsiChar('currency_id')).get_int32(vi32) = true) then
            eData.BCParams[rowCnt].currency_id:= vi32;
          if(TableIter.init_child(Field, PAnsiChar('spot_price')).get_double(vd) = true) then
            eData.BCParams[rowCnt].spot_price:= vd;
          if(TableIter.init_child(Field, PAnsiChar('mr1')).get_double(vd) = true) then
            eData.BCParams[rowCnt].mr1:= vd;
          if(TableIter.init_child(Field, PAnsiChar('mr2')).get_double(vd) = true) then
            eData.BCParams[rowCnt].mr2:= vd;
          if(TableIter.init_child(Field, PAnsiChar('mr3')).get_double(vd) = true) then
            eData.BCParams[rowCnt].mr3:= vd;
          if(TableIter.init_child(Field, PAnsiChar('mr1_lrc')).get_double(vd) = true) then
            eData.BCParams[rowCnt].mr1_lrc:= vd;
          if(TableIter.init_child(Field, PAnsiChar('mr2_lrc')).get_double(vd) = true) then
            eData.BCParams[rowCnt].mr2_lrc:= vd;
          if(TableIter.init_child(Field, PAnsiChar('mr3_lrc')).get_double(vd) = true) then
            eData.BCParams[rowCnt].mr3_lrc:= vd;
          if(TableIter.init_child(Field, PAnsiChar('mr1_mrc')).get_double(vd) = true) then
            eData.BCParams[rowCnt].mr1_mrc:= vd;
          if(TableIter.init_child(Field, PAnsiChar('mr2_mrc')).get_double(vd) = true) then
            eData.BCParams[rowCnt].mr2_mrc:= vd;
          if(TableIter.init_child(Field, PAnsiChar('mr3_mrc')).get_double(vd) = true) then
            eData.BCParams[rowCnt].mr3_mrc:= vd;
          if(TableIter.init_child(Field, PAnsiChar('mr1_hrc')).get_double(vd) = true) then
            eData.BCParams[rowCnt].mr1_hrc:= vd;
          if(TableIter.init_child(Field, PAnsiChar('mr2_hrc')).get_double(vd) = true) then
            eData.BCParams[rowCnt].mr2_hrc:= vd;
          if(TableIter.init_child(Field, PAnsiChar('mr3_hrc')).get_double(vd) = true) then
            eData.BCParams[rowCnt].mr3_hrc:= vd;
          if(TableIter.init_child(Field, PAnsiChar('mr1_erc')).get_double(vd) = true) then
            eData.BCParams[rowCnt].mr1_erc:= vd;
          if(TableIter.init_child(Field, PAnsiChar('mr2_erc')).get_double(vd) = true) then
            eData.BCParams[rowCnt].mr2_erc:= vd;
          if(TableIter.init_child(Field, PAnsiChar('mr3_erc')).get_double(vd) = true) then
            eData.BCParams[rowCnt].mr3_erc:= vd;
          if(TableIter.init_child(Field, PAnsiChar('lk1')).get_int64(vi64) = true) then
            eData.BCParams[rowCnt].lk1:= vi64;
          if(TableIter.init_child(Field, PAnsiChar('lk2')).get_int64(vi64) = true) then
            eData.BCParams[rowCnt].lk2:= vi64;
          if(TableIter.init_child(Field, PAnsiChar('risk_points_n')).get_int32(vi32) = true) then
            eData.BCParams[rowCnt].risk_points_n:= vi32;
          if(TableIter.init_child(Field, PAnsiChar('window_size')).get_double(vd) = true) then
            eData.BCParams[rowCnt].window_size:= vd;
          if(TableIter.init_child(Field, PAnsiChar('option_model')).get_int32(vi32) = true) then
            eData.BCParams[rowCnt].option_model:= ShortInt(vi32);
          if(TableIter.init_child(Field, PAnsiChar('asset_class')).get_int32(vi32) = true) then
            eData.BCParams[rowCnt].asset_class:= vi32;
          if(TableIter.init_child(Field, PAnsiChar('cf_risk')).get_double(vd) = true) then
            eData.BCParams[rowCnt].cf_risk:= vd;
          inc(rowCnt);
          next_iterator(TableIter);
        end;
      finally
        free_iterator(TableIter);
..........................................

Когда есть рутинная работа, то отдавал ее ИИ, пишет без ошибок!
 Сообщение превысило кол-во строк :)

 
prostotrader #:
Что бы заявка всегда была первой в стакане.

а... понял... лучший бид и лучший аск.... спс