Список форумов Trading tools Trading tools
?нструменты для торговли на FORTS
 

На сайт ttools.ru
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы  RSS-Подписка на форумRSS-Подписка на форум   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 

Помогите программисту-чайнику!
На страницу Пред.  1, 2, 3, 4, 5  След.
 
Начать новую тему   Ответить на тему    Список форумов Trading tools -> QuikOrdersDOM SDK
Предыдущая тема :: Следующая тема  
Автор Сообщение
majo
Наш человек


Зарегистрирован: 19.12.2009
Сообщения: 872
Откуда: Санкт-Петербург

СообщениеДобавлено: Вс Июл 31, 2011 8:18 pm    Заголовок сообщения: Ответить с цитатой

Fortis писал(а):
Кстати, Majo. Учиться сдк можно и в выходные дни. Открой таблицу всех сделок в рабочий день, вечером в пятницу. Данные из этой таблицы не удаляются. Можно потом даже закрыть Quik и выключить ПК, данные в таблице всех сделок при запуске все равно останутся без подключения к серверу. СДК легко их берет. Я осваивал его преимущественно в выходные дни таким образом. Не получится взять только данные из стакана по понятным причинам, но освоив азы в этом уже не будет сложности. Wink



Спасибо за чрезвычайно ценный для меня совет! ? огромное спасибо, за подсказку с активацией формы! Правда на этих выходных, я винд переустановил и поэкспериментировать с таблицей всех сделок не удалось. Но обязательно начну именно с вашего совета! Кстати, буду очень признателен, если вы найдете время комментировать мои посты в этой ветке Wink
_________________
C искренним уважением majo
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
majo
Наш человек


Зарегистрирован: 19.12.2009
Сообщения: 872
Откуда: Санкт-Петербург

СообщениеДобавлено: Вс Июл 31, 2011 9:00 pm    Заголовок сообщения: Ответить с цитатой

Я все таки ее победил)))

Форма наконец то появилась!!! Считаю это для себя первой маленькой победой, на пути к цели.



Решил написать програмку для высчитывания коэффициентов p\b и p\e для стоимостного инвестирования. ? наткнулся на простую процедуру запуска формы, когда посмотрел листинг самой первой программы из учебника по дельфи Confused

Правда код программы несколько отличается, от тех которые уже были показаны в этой ветке Данилой и Fortis.

Привожу листинг программы:

Код:
unit uAtLibMain;

interface
 uses uATLibrary,
      SysUtils,Dialogs, Forms,
      Unit1;
 

function AT_LIB_INIT (T : TLibInitialRecord): Cardinal; stdcall;
function AT_LIB_CYCLE: Cardinal ; stdcall;
function AT_LIB_DONE: Cardinal ; stdcall;
function AT_LIB_ABOUT: Cardinal; stdcall;
function AT_LIB_SETUP: Cardinal ; stdcall;

var
R : TLibInitialRecord ;

form1 : TForm1;


implementation


function AT_LIB_INIT (T : TLibInitialRecord): Cardinal; stdcall;
begin
R:= T ;

Application.Initialize;

Application.CreateForm(TForm1, Form1);

Application.Run;

end ;

function AT_LIB_CYCLE: Cardinal ; stdcall;
 begin

 end ;

function AT_LIB_DONE: Cardinal ; stdcall;
 begin

 Application.Free;

  {}
 end ;

function AT_LIB_SETUP: Cardinal ; stdcall;
 begin
  MessageDlg('Здесь должно быть окно настроек',mtInformation,[mbOK],0);

 end ;

function AT_LIB_ABOUT: Cardinal; stdcall;
 var
  S : String;
 begin
  S:='Пример модуля автотрейдинга '#13#10'для QuikOrdersDOM'#13#10;
  ShowMessage(S) ;
 end ;

end.


Правда вылетает ошибка, после закрытия библиотеки.


Но ее я постараюсь устранить. Возможно я написал лишние процедуры для запуска формы.
_________________
C искренним уважением majo
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Danila
Site Admin


Зарегистрирован: 24.07.2009
Сообщения: 837

СообщениеДобавлено: Вс Июл 31, 2011 11:30 pm    Заголовок сообщения: Ответить с цитатой

Application.Free никогда вызывать не надо. Освобождение памяти от объекта Application происходит в секции finalization модуля Forms.

т.е. просто надо убрать из проекта Application.Free и никогда в проект такую строчку не добавлять
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
majo
Наш человек


Зарегистрирован: 19.12.2009
Сообщения: 872
Откуда: Санкт-Петербург

СообщениеДобавлено: Сб Авг 06, 2011 7:31 pm    Заголовок сообщения: Ответить с цитатой

Danila писал(а):
Application.Free никогда вызывать не надо. Освобождение памяти от объекта Application происходит в секции finalization модуля Forms.

т.е. просто надо убрать из проекта Application.Free и никогда в проект такую строчку не добавлять


Спасибо Данила! Ошибка пропала! Но появилась другая, после закрытия формы. Но удалось ее устранить самостоятельно. Просто из кода убрал процедуру :
Код:
Application.Initialize;


Теперь все запускается и закрывается как положено. Буду продолжать эксперимент и попробую вывести информацию из таблицы всех сделок на эту форму.
_________________
C искренним уважением majo
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
majo
Наш человек


Зарегистрирован: 19.12.2009
Сообщения: 872
Откуда: Санкт-Петербург

СообщениеДобавлено: Вс Авг 07, 2011 10:42 pm    Заголовок сообщения: Ответить с цитатой

Данила подскажи пожалуйста какую функцию надо использовать для получения данных из таблицы всех сделок?

Я пытаюсь использовать функцию : TSecTableInfo. Если я правильно, понимаю, мне надо объявить эту функцию, а затем указать переменные, например: LastPrice : double ;
Далее присвоить значение lastprise переменной типа double?

например last : double;

? далее надо присвоить переменной last := LastPrice;

В итоге у меня получилось вот такое позорище:

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,uATLibrary;

type
  TForm1 = class(TForm)
    lbl1: TLabel;
   

  private
    { Private declarations }
  public
    { Public declarations }
  end;

{$R *.dfm}

var

LastPrice : double;

last : double;

lbl1 : Tlabel;

implementation

function TSecTableInfo: cardinal; stdCall;
begin

last := LastPrice;

lbl1.caption := FloatToStr(last);

end;



end.


Я наверное опять что то кромольное сделал. Но мне хотелось попробовать самому решить эту задачу.

Возможно после функции, мне надо прописать процедуру присваивания значения LastPrice моей переменной?
_________________
C искренним уважением majo
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Danila
Site Admin


Зарегистрирован: 24.07.2009
Сообщения: 837

СообщениеДобавлено: Вс Авг 07, 2011 11:23 pm    Заголовок сообщения: Ответить с цитатой

Сергей,
TSecTableInfo это не функция, а тип, объявленный в модуле uATLibrary.pas как запись (прочитай про типы, про записи в книге по Delphi, сделай пару упражнений до абсолютного понимания)

Объявлять функцию не надо, всё объявлено в uATLibrary.pas.
Механизм испольования qSDK такой: В функции AT_LIB_INIT, мы получаем переменную T, запись типа TLibInitialRecord. Это запись с адресами всех функций qSDK, нужно скопировать ее в свою переменную такого же типа. Это строка R:=T во всех примерах в функции AT_LIB_INIT. Далее спокойно используем переменную R для любых вызовов qSDK. Например R.fatlibGetTradeInfo(0,myTrade); для получения информации о первой сделке из таблицы всех сделок в структуру myTrade
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Fortis



Зарегистрирован: 11.05.2010
Сообщения: 99
Откуда: Сибири матушки

СообщениеДобавлено: Пн Авг 08, 2011 8:32 am    Заголовок сообщения: Ответить с цитатой

Цитата:
Данила подскажи пожалуйста какую функцию надо использовать для получения данных из таблицы всех сделок?
...
Я наверное опять что то кромольное сделал. Но мне хотелось попробовать самому решить эту задачу.

На самом деле все о-очень просто Wink
Пока пью кофе попробую описать последовательность действий.

Все функции СДК можно найти в хелпе скачиваемого дистрибутива QOD`а или на сайте - http://ttools.ru/?page_id=430
Находим нужную нам функцию:
Цитата:
fATLibGetTradeInfo : TATLibGetTradeInfo ;
тип описан как
TATLibGetTradeInfo = function (aTradeIdx : Cardinal;
aTradeInfo : PTradeInfo) : Cardinal; stdcall;

Возвращает информацию о сделке по ее номеру в QUIK
aTradeIdx – номер сделки в QUIK
aTradeInfo – возвращаемая информация о сделке
Для работы функции необходимо, чтобы в QUIK была открыта “Таблица всех сделок”
Возвращаемое значение – успешное исполнение=0, иное значение – ошибка в процессе исполнения

?з этого описания мы видим, что функция это называется fATLibGetTradeInfo. Так как все функции любезно перечислены в отдельном файле uATLibrary.pas который мы всегда подключаем к своим проектам(иначе программа не найдет такую функцию вашем проекте), то там мы можем легко найти эту функцию.
Все функции СДК записаны в виде структур(записей), то есть вызывать их нужно не напрямую, а через структуру. То есть, как показал Динила - R.fatlibGetTradeInfo(...); Красным выделено то, что превращает обычную функцию в структуру функций. Все СДК функции записаны в данной структуре.
Если мы посмотрим на раздел инициализации нашего файла, то заметим эту структуру:
Цитата:
function AT_LIB_INIT (T : TLibInitialRecord): Cardinal; stdcall;
begin
R:=T ;
(...)
Это и есть наша структура через которую мы будет потом вызывать ВСЕ функции СДК. Ее можно переименовать например на - 'Bot:=T', тогда все функции СДК можно будет вызвать только через такое название структуру и вызов функции взятия сделки будет выглядеть уже так Bot.fatlibGetTradeInfo(...);

Теперь посмотрим из чего состоит данная функция. ?з описания мы видим:
Цитата:
function (aTradeIdx : Cardinal;
aTradeInfo : PTradeInfo
)
Эта функция(не процедура) и она состоит из двух переменных. ?з того же описания мы обнаруживаем:
Цитата:
aTradeIdx – номер сделки в QUIK
aTradeInfo – возвращаемая информация о сделке
что первая переменная в этой функции используется для отправке данных, а вторая - это уже результат работы функции. То есть в aTradeIdx - нам нужно покласть номер сделки которую мы хотим получить из таблице всех сделок, а в переменную aTradeInfo мы получим данные по этой сделки.
Теперь нам нужно понять, какого типа данные нам необходимо использовать чтобы работать с данной функцией. Переменная aTradeIdx - является типом cardinal - это обычный числовой тип переменной Дельфи. Такой же простой тип переменной использует и сама функция:
Цитата:
function (aTradeIdx : Cardinal;
aTradeInfo : PTradeInfo):cardinal;

А вот переменная aTradeInfo уже не простая, ее тип PTradeInfo. Это не стандартный тип переменной Дельфи. Значит Данила ввел свой тип. Чтобы хорошо разобраться, что это за тип переменной такой, нужно найти объявление такой переменной в файле uATLibrary.pas. Можно прям из дельфи открыть код файла(меню - View->Units... - выбрать этот файл из списка подключенных файлов в проекте) и задать поиск такой переменной. Находим такую запись в файле:
Цитата:
PTradeInfo = ^TTradeInfo ;
То есть наша PTradeInfo есть TTradeInfo, ищем объявление TTradeInfo.
Находим такую запись:
Цитата:
TTradeInfo = packed record
N : Int64 ;
SecIdx : Cardinal ;
TradeDT : TDateTime;
Price : double ;
Quantity : Cardinal ;
OrderDirection : TATOrderDirection ;
Volume : Double ;
end;
Вот она родимая. Это структура состоящая из нескольких переменных. Все переменные которой, кроме одной, являются обычными типами данных Дельфи. Вот только 'OrderDirection : TATOrderDirection ;' - это не обычный тип данных дельфи. Нужно найти где объявляется такая переменная, чтобы точно знать что за тип данных используется в ней. Чуть выше мы находим следующую запись
Цитата:
TATOrderDirection = byte ;
а это уже хорошо известная обычная переменная дельфи. ?так, мы нашли все переменные и их типы которые использует эта функция. Теперь мы можем попробовать использовать эту функцию. Заведем две переменные в разделе var -
NSd, Err:cardinal;
Sd_Inf:PTradeInfo;

Первая переменная - это обычная переменная дельфи, а вторая - это переменная структура(запись) которую уже кто-то создал и объявил в файле uATLibrary.pas(это был Данила Smile ), мы все лишь объявляем такую же переменную.
Перед вызовом функции нам необходимо объявить высвобождение памяти для структуры строкой new(Sd_inf). Оператор New создает место для переменной структуры которую мы записываем в скобках.
Память выделена, теперь можем вызвать функцию строкой:
Err:=R.fatlibGetTradeInfo(NSd,Sd_Inf);
Переменная Nsd конечно же должна быть предварительно заполнена, то есть в нее необходимо положить цифру, порядковый номер в последовательности сделок которую мы хотим взять. Первая сделка лежит в нуле. То есть все начинается не с единицы, а с нуля. Переменная Sd_Inf должна быть объявлена таким же типом, и перед использованием обязательно выделена память под эту структуру. Переменная Err - это переменная фиксирующая качество исполнения функции, из описания мы видели что:
Цитата:
Возвращаемое значение – успешное исполнение=0, иное значение – ошибка в процессе исполнения
то есть результат работы функции возвращает ноль, если функция нормально отработала, и НЕ ноль, если в процессе работы была ошибка. Ошибка может быть, например если вы запрашиваете номер сделки 1000, а всего сделок на сегодняшний момент времени меньше 1000.
Далее мы можем взять данные полученной сделки, в структуре будут храниться данные следующим образом:
Sd_Inf.TradeDT - время сделки
Sd_Inf.Price - цена сделки
Sd_Inf.Quantity - количество
Sd_Inf.OrderDirection - направление сделки. 0-купили, 1-продали.
и так далее.
Присвоить эти данные своей переменной очень просто:
Sd_Price:=Sd_Inf.Price;
В переменной Sd_Price будет храниться цена взятой сделки. Переменная Sd_Price должна быть заранее объявлена по правилам Дельфи и иметь тот же тип, что и переменная в структуре Sd_Inf.Price.
Помните мы искали типы переменных в файле uATLibrary, там мы находили всю запись:
Цитата:
TradeDT : TDateTime;
Price : double ;
Quantity : Cardinal ;
То есть переменная в которую будем сохранять цену взятой сделки для возможной дальнейшей обработки этих данных должна быть типом только Double.
Ну и так далее по всей структуре.
После того, как переменная структура Sd_Inf будет не нужна, ее необходимо обратно "закрыть" командой Dispose(Sd_Inf);
New() освобождает память для структуры, а Dispose() наоборот освобождает память от структуры.

Ну вот, уже вторую кружку кофе выпил. Вроде все описал. Рад если помог. Замечания, комментарии от Данилы приветствуются.
Как уже писал Данила, нужно хорошо ознакомиться с разделом Дельфи по использованию структур(записей) и использование не стандартных типов данных.
P.S. На первый взгляд может показаться слишком сложным, но на самом деле все очень очень просто. Smile
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
majo
Наш человек


Зарегистрирован: 19.12.2009
Сообщения: 872
Откуда: Санкт-Петербург

СообщениеДобавлено: Пн Авг 08, 2011 8:19 pm    Заголовок сообщения: Ответить с цитатой

Danila писал(а):
Сергей,
TSecTableInfo это не функция, а тип, объявленный в модуле uATLibrary.pas как запись (прочитай про типы, про записи в книге по Delphi, сделай пару упражнений до абсолютного понимания)

Объявлять функцию не надо, всё объявлено в uATLibrary.pas.
Механизм испольования qSDK такой: В функции AT_LIB_INIT, мы получаем переменную T, запись типа TLibInitialRecord. Это запись с адресами всех функций qSDK, нужно скопировать ее в свою переменную такого же типа. Это строка R:=T во всех примерах в функции AT_LIB_INIT. Далее спокойно используем переменную R для любых вызовов qSDK. Например R.fatlibGetTradeInfo(0,myTrade); для получения информации о первой сделке из таблицы всех сделок в структуру myTrade


Спасибо! Теперь, все начинает казаться не таким сложным. А после разъяснения Fortis, остается только сесть и написать код) Надеюсь скоро отпраздную первую победу!
_________________
C искренним уважением majo
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
majo
Наш человек


Зарегистрирован: 19.12.2009
Сообщения: 872
Откуда: Санкт-Петербург

СообщениеДобавлено: Пн Авг 08, 2011 8:29 pm    Заголовок сообщения: Ответить с цитатой

Дай бог вам здоровья!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Very Happy
Дай бог здоровья Даниле, за его чудесную программу и вам за то, что так подробно все мне разжевали!!! Спасибо за терпение и потраченное время!

Уверен, этот пост поможет кроме меня, еще не одному чайнику-программисту в освоении qDoma!

Хоть и благодарю немного в шутливой форме, но действительно очень вам признателен. Причем ничего непонятного в вашем объяснении я для себя не нашел. Про процедуру записи, как раз сейчас читаю в учебнике. Так материал вроде понятен, а когда дело касается написания кода, сижу и не знаю с чего начать. Embarassed Теперь все упростилось благодаря вам!

Перечитал несколько раз. Думаю еще несколько раз перечитать, а потом уже возьмусь за написание кода. Очень понятно и доходчиво все описали. Даже мне стало все предельно понятно и теперь не вызывает у меня чувства паники Laughing Сегодня поэксперементировать с кодом не успеваю. Но прокручу все еще раз в голове и учебник почитаю. А завтра попробую наладить контакт с qDom! Уверен, что сумею его победить))) А дальше дело техники. Хотя это не умаляет необходимости плотно засесть за учебники.

Еще раз огромное искреннее СПАС?БО за ваш труд! Который уверен сделает из чайника - програмиста наконец!
_________________
C искренним уважением majo
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Danila
Site Admin


Зарегистрирован: 24.07.2009
Сообщения: 837

СообщениеДобавлено: Вт Авг 09, 2011 2:28 pm    Заголовок сообщения: Ответить с цитатой

Fortis,
спасибо большое! Очень подробно и исчерпывающе
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
majo
Наш человек


Зарегистрирован: 19.12.2009
Сообщения: 872
Откуда: Санкт-Петербург

СообщениеДобавлено: Чт Авг 11, 2011 9:02 pm    Заголовок сообщения: Ответить с цитатой

Fortis писал(а):
Приветствую коллеги!

Разрешите и мне вложить свои 10 копеек Smile

Я решил написать чистую форму для программистов.
Два файла:
1. проект.
2. основной файл программы.

Что находится внутри.
Листинг проекта:
Цитата:
library MyProject;

{ Important note about DLL memory management: ShareMem must be the
first unit in your library's USES clause AND your project's (select
Project-View Source) USES clause if your DLL exports any procedures or
functions that pass strings as parameters or function results. This
applies to all strings passed to and from your DLL--even those that
are nested in records and classes. ShareMem is the interface unit to
the BORLNDMM.DLL shared memory manager, which must be deployed along
with your DLL. To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters. }

uses
SysUtils,
Classes,
uATLibrary in 'uATLibrary.pas', // Это обязательно!
MyProg in 'MyProg.pas', // моя программа
AddFunction in 'AddFunction.pas'; // не обязательно

{$R *.res}



exports
AT_LIB_INIT name 'AT_LIB_INIT',
AT_LIB_CYCLE name 'AT_LIB_CYCLE',
AT_LIB_DONE name 'AT_LIB_DONE',
AT_LIB_SETUP name 'AT_LIB_SETUP',
AT_LIB_ABOUT name 'AT_LIB_ABOUT' ;


begin
end.


Листинг основного файла будущей программы:
Цитата:
unit MyProg;

interface
uses uATLibrary,
AddFunction,
SysUtils, Dialogs,
DateUtils, Forms, Controls, stdCtrls, ExtCtrls, extDlgs, buttons;

function AT_LIB_INIT (T : TLibInitialRecord): Cardinal; stdcall;
function AT_LIB_CYCLE: Cardinal ; stdcall;
function AT_LIB_DONE: Cardinal ; stdcall;
function AT_LIB_ABOUT: Cardinal; stdcall;
function AT_LIB_SETUP: Cardinal ; stdcall;


{---Здесь глобальные переменные!---}


{ -- end -- }

{--- здесь глобальные функции ---}


{ -- end -- }


implementation
uses Unit1; // подключаем модуль будущей формы.

function AT_LIB_INIT (T : TLibInitialRecord): Cardinal; stdcall;
begin
R:=T ;

Application.CreateForm(TForm1, Form1); // загрузка и
Form1.Show; // отображение формы

{--- заполнение и\или обнуление глобальных переменных ---}


{ -- end -- }

end;

{--- локальные функции и процедуры ---}


{ -- end -- }


function AT_LIB_CYCLE: Cardinal ; stdcall;
var
{ --- локальные переменные ---}


{ -- end --- }

begin
{ --- листинг программы!! --- }


{ -- end -- }

end;

function AT_LIB_DONE: Cardinal ; stdcall;
begin
{-- завершение программы описываем здесь. Не обязательное. --}
end;

function AT_LIB_SETUP: Cardinal ; stdcall;
begin
{ -- Настройки программы здесь. Не обязательное. -- }
end;

function AT_LIB_ABOUT: Cardinal; stdcall;
begin
{-- ?нформация о программе здесь. Не обязательное. -- }
end;

end.

Вроде бы все довольно понятно.

Как использовать?
1. Скачиваем оба файла и копируем в новую папку для своего нового проекта.
2. В дельфи открываем загрузить проект(Open Project..) и запускаем MyProject. Дельфи заругается на недостающий файл. ?гнорируем и после первой загрузке сохраняем данный проект, больше ругаться не будет.
3. Не забываем также, в новую папку с проектом скопировать файл uATLibrary.pas из последней версии QOD`а.

Вот и все, можно начинать писать новую программу.

Ссылки для скачивания данных форм.
http://cpu81.narod.ru/MyProject.dpr
http://cpu81.narod.ru/myProg.pas

Замечания, комментарии, предложения... готов внимательно выслушать. Smile
Предлагаю внести эти чисты формы в скачиваемый дистрибутив QOD`а в папку SRC. Smile



Что то я главную драгоценность и пропустил Embarassed Очень удобные формы для написания программы! Спасибо огромное! Только до меня дошло, что это именно то что мне и нужно!

Один вопрос; почему у вас листинг программы помещен внутрь функции AT_LIB_CYCLE?

Код:
function AT_LIB_CYCLE: Cardinal ; stdcall;
var
{ --- локальные переменные ---}


{ -- end --- }
begin
{ --- листинг программы!! --- }


{ -- end -- }
end;



Я считал, что листинг программы надо поместить в
Код:
function AT_LIB_INIT (T : TLibInitialRecord): Cardinal; stdcall;
begin
R:=T ;

Application.CreateForm(TForm1, Form1); // загрузка и
Form1.Show; // отображение формы

{--- заполнение и\или обнуление глобальных переменных ---}


{ -- end -- }
end;

Question

?ли это одно из моих многочисленных заблуждений?
_________________
C искренним уважением majo
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Fortis



Зарегистрирован: 11.05.2010
Сообщения: 99
Откуда: Сибири матушки

СообщениеДобавлено: Пт Авг 12, 2011 7:34 am    Заголовок сообщения: Ответить с цитатой

Цитата:
Один вопрос; почему у вас листинг программы помещен внутрь функции AT_LIB_CYCLE?

Я считал, что листинг программы надо поместить в
function AT_LIB_INIT (T : TLibInitialRecord): Cardinal; stdcall;

Откровенно говоря "листинг программы" это есть весь этот файл. Smile

В функции AT_LIB_INIT конечно тоже может быть код для исполнения, но он исполнится только один раз при запуске вашей программы. Поэтому я написал, что он служит в основном для "заполнение и\или обнуление глобальных переменных" при запуске своей программы. Например занулить важные переменные, присвоить первоначальные значения в глобальные переменные перед началом работы программы.

А функция AT_LIB_CYCLE исполняется каждую итерацию обновления стакана в QOD. По умолчанию 120 мс.
Таким образом, именно там будет хранится "сердце" вашего кода, высчитывающее важные значения и отображающая их на форме.
Поэтому я подписал ее как "листинг вашей программы".
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
majo
Наш человек


Зарегистрирован: 19.12.2009
Сообщения: 872
Откуда: Санкт-Петербург

СообщениеДобавлено: Пт Авг 12, 2011 5:13 pm    Заголовок сообщения: Ответить с цитатой

Fortis писал(а):
Цитата:
Один вопрос; почему у вас листинг программы помещен внутрь функции AT_LIB_CYCLE?

Я считал, что листинг программы надо поместить в
function AT_LIB_INIT (T : TLibInitialRecord): Cardinal; stdcall;

Откровенно говоря "листинг программы" это есть весь этот файл. Smile

В функции AT_LIB_INIT конечно тоже может быть код для исполнения, но он исполнится только один раз при запуске вашей программы. Поэтому я написал, что он служит в основном для "заполнение и\или обнуление глобальных переменных" при запуске своей программы. Например занулить важные переменные, присвоить первоначальные значения в глобальные переменные перед началом работы программы.

А функция AT_LIB_CYCLE исполняется каждую итерацию обновления стакана в QOD. По умолчанию 120 мс.
Таким образом, именно там будет хранится "сердце" вашего кода, высчитывающее важные значения и отображающая их на форме.
Поэтому я подписал ее как "листинг вашей программы".


Вот этого я как раз и не знал! Очередное, многократное спасибо! На выходных поупражняюсь в написании кода! Теперь должно все получиться!)))
_________________
C искренним уважением majo
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
majo
Наш человек


Зарегистрирован: 19.12.2009
Сообщения: 872
Откуда: Санкт-Петербург

СообщениеДобавлено: Пт Авг 12, 2011 10:08 pm    Заголовок сообщения: Ответить с цитатой

Подскажите пожалуйста, как в хелпе искать код ошибки? Что то нигде не могу найти как с ошибками работать Crying or Very sad
_________________
C искренним уважением majo
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
majo
Наш человек


Зарегистрирован: 19.12.2009
Сообщения: 872
Откуда: Санкт-Петербург

СообщениеДобавлено: Сб Авг 13, 2011 11:01 pm    Заголовок сообщения: Ответить с цитатой

Все нашел))) F1 надо нажимать)))
_________________
C искренним уважением majo
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов Trading tools -> QuikOrdersDOM SDK Часовой пояс: GMT + 3
На страницу Пред.  1, 2, 3, 4, 5  След.
Страница 3 из 5

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2005 phpBB Group
Русская поддержка phpBB


Яндекс.Метрика