четверг, 13 января 2011 г.

Проверка возвращаемых результатов функций QuikOrdersDOM SDK

При написании своих торговых роботов с помощью QuikOrdersDOM SDK никогда не забывайте проверять результат, возвращаемый функциями! Будьте предельно внимательны, не повторяйте моих ошибок! %D

У меня бывает так, что, увлекшись, пишу функцию за функцией, забывая про эту проверку, а потом ошибку вылавливаю долго...

Приведу пример. Вот, допустим, функция нахождения лучшей цены спроса:


function GetBestSellPrice(aInitRec : TLibInitialRecord; aSecInfo : PSecInfo) : double;
var
cnt : integer;
tmpQuotes : PAtQuoteArray;
tmpPBestBuy,
tmpPBestSell : PATQuote;
begin
Result := -1;
cnt:=aInitRec.fATLibGetQuotesCount(aSecInfo^.Idx);
GetMem (tmpQuotes,cnt*sizeOf(TATQuote));
if aInitRec.fATLibGetQuotes(aSecInfo^.Idx,cnt,
tmpPBestBuy,tmpPBestSell,tmpQuotes)<>0 then exit;

if (tmpPBestSell<>nil) then Result := tmpPBestSell.Price;

FreeMem (tmpQuotes,cnt*sizeOf(TATQuote));
end;


Сначала я забыла проверить, что fATLibGetQuotes возвращает 0 (т.е. функция успешно отрабатывает). Это привело к тому, что время от времени вылезал непонятный баг с определением цены.

Обратите внимание, что проверка на nil указателя возвращенного tmpPBestSell в этом случае оказалась бесполезной (она была, но не спасала от ошибочного определения цены).

Самое противное в таких ошибках — их несистематичность. То есть прога может отработать несколько часов подряд без сбоев или сбой повторится раза 3 за минуту после запуска. Это связано с механизмом — QuikOrdersDOM работает напрямую с памятью. А проверка результатов, возвращаемых функциями, и их грамотная обработка — полностью защитит вас от непредвиденных ситуаций и вернет работу робота под контроль.

Комментариев нет:

Отправить комментарий