Автор |
Сообщение |
mamen
Зарегистрирован: 29.11.2011
Сообщения: 8
|
У меня еще такой вопрос почему atqOdbcConnect всегда выдает 0? почему нет ошибки? |
|
|
Посмотреть профиль Отправить личное сообщение |
|
MOAX
Зарегистрирован: 13.03.2011
Сообщения: 44
|
mamen писал(а): |
Именно системный DNS а не пользовательский?
пробовал указывать DNS тоже к сожалению ничего! при всем при этом используя плагин ODBC получается установить соединение и посылать SQL запросы! Правда не все запросы проходят,возможно я в SQL слабоват!
|
Ну, даже не знаю чем помочь. У меня все работает.
Проверьте все и попробуйте подключиться к БД с DSN еще раз. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
mamen
Зарегистрирован: 29.11.2011
Сообщения: 8
|
можешь подробнее описать принцип работы ф-ии atqOdbcConnect ? напиши пожалуйста что в какой последовательности делать что бы произошло подключение к db! |
|
|
Посмотреть профиль Отправить личное сообщение |
|
MOAX
Зарегистрирован: 13.03.2011
Сообщения: 44
|
mamen писал(а): |
можешь подробнее описать принцип работы ф-ии atqOdbcConnect ? напиши пожалуйста что в какой последовательности делать что бы произошло подключение к db! |
1) В меню Пуск->Администрирование ->Источники данных ODBC создаешь системный источник данных, присваиваешь ему имя (DSN).
2) Настраиваешь вывод из Quik по ODBC таблиц позиций по фьючерсам, таблицы заявок, стоп-заявок, сделок в базу данных.
Открываешь базу данных и проверяешь что данные в нее действительно передаются из Quik. Читай справку Quik.
3) В Ами подключаешься к базе данных функцией atqOdbcConnect( "YouDSN", "", "" )
Все.
PS. atqOdbcConnect реализует стандартный набор действий из библиотеки odbc32.dll, если интересуют подробности - смотри MSDN, или справку к среде разработки. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
mamen
Зарегистрирован: 29.11.2011
Сообщения: 8
|
Я все так же делаю. Пытался данные получать из базы посредствам ODBC/SQL Universal AFL plugin. там тоже есть поблемы.
odbcOpenDatabase("ODBC;DSN=QuikDB;DBQ=C:\odbc.mdb;DriverId=25;FIL=MS Access;MaxBufferSize=2048;PageTimeout=5");
Graph1=odbcGetValueSQL("SELECT nMoney FROM tAccount WHERE sAccount= 'SPBFUT00115';");
AddTextColumn(NumToStr( Graph1, 1.2 ), "odbc ", 1.2, colorDefault, colorWhite);
Вообщем к базе подключается! По запросу выдергивает данные. НО все работает нормально с первой таблицей. Из остальных таблиц данные не достает. почему не знаю! Есть мысли что у меня с Access? Что можно еще сделать? подскажите какие еще возможны варианты передачи данных из Quik в Ami? |
|
|
Посмотреть профиль Отправить личное сообщение |
|
mamen
Зарегистрирован: 29.11.2011
Сообщения: 8
|
может есть проблема с x64? может плагин не корректно работать?
у меня x64 и Windows 7 стоит! |
|
|
Посмотреть профиль Отправить личное сообщение |
|
MOAX
Зарегистрирован: 13.03.2011
Сообщения: 44
|
mamen писал(а): |
может есть проблема с x64? может плагин не корректно работать?
у меня x64 и Windows 7 стоит! |
У меня тоже 7, но х32, проверить негде.
Попробуй робота DDE -> Excel от spitfire
PS. В среде разработки библиотеки ODBC для х64 не нашел. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
zxWizard
Зарегистрирован: 25.09.2011
Сообщения: 46
|
MOAX при тестировании твоего плагина обнаружил интересный момент:
Код: |
Код:
dPrice= atqOdbcNum( "SELECT dPrice FROM Trades WHERE sTicker= '"+Name()+"' AND sOperation= 'SELL' ;");
dNumber= atqOdbcNum("SELECT dNumber FROM Trades WHERE sTicker= '"+Name()+"' AND sOperation= 'SELL' ;");
dOrder= atqOdbcNum( "SELECT dOrder FROM Trades WHERE sTicker= '"+Name()+"' AND sOperation= 'SELL';");
Plot(dPrice,"\n dPrice",16,styleNoDraw|styleOwnScale);
Plot(dNumber,"\n dNumber",16,styleNoDraw|styleOwnScale);
Plot(dOrder,"\n Order",16,styleNoDraw|styleOwnScale);
|
Ами выдает:
Price=146,255.00 dNumber=461,426,848.00 Order=6,040,484,864.00
Хотя в базе другое значение dOrders (6040484993) и dNumber (461426846)
Посмотрел в Ами окно Data Window там переменная имеет такое значение: dOrder=6.04048e+009 получается какая-то погрешность в округлении или числа более шестизначных не поддерживаются?
Причем через StrToNum( atqOdbcNumToStr( strQuery, 0,50 )) такая же проблема... |
|
|
Посмотреть профиль Отправить личное сообщение |
|
zxWizard
Зарегистрирован: 25.09.2011
Сообщения: 46
|
MOAX Помоги пожалуйста разобраться.
Задача прежняя проанализировать таблицу Trades и вычислить среднюю цену входа в сделку, получается мне нужно ее прочитать построчно
и если там уже есть строки после которых позиция была равна нулю их нужно игнорировать при следующем проходе.
1) Смотрим были ли сделки и запоминаем номер заявки
Код: |
YesBuy= atqOdbcStr("SELECT dOrder FROM Trades WHERE sTicker= '"+Name()+"' AND sOperation= 'BUY' ;", 50);
YesSell= atqOdbcStr( "SELECT dOrder FROM Trades WHERE sTicker= '"+Name()+"' AND sOperation= 'SELL' ;", 50); |
2) Если были сделки к примеру BUY то нужно проверить следующие строчки таблицы где есть BUY а номер заявки другой
Код: |
TempBuyOrder=atqOdbcStr( "SELECT dOrder FROM Trades WHERE sTicker= '"+Name()+"' AND sOperation= 'BUY' AND dOrder != '"+YesBuy+"' ;" ,50); |
Так вот 2п. не работает переменная TempBuyOrder пустая.
Вопрос:
Можно ли в SQL запросе как условие поиска писать тот столбец по которому и идет вывод данных (dOrder != '"+YesBuy+"')
и в AFL «!=» это не равно можно ли писать так в SQL запросе? |
|
|
Посмотреть профиль Отправить личное сообщение |
|
MOAX
Зарегистрирован: 13.03.2011
Сообщения: 44
|
zxWizard писал(а): |
MOAX при тестировании твоего плагина обнаружил интересный момент:
Код: |
Код:
dPrice= atqOdbcNum( "SELECT dPrice FROM Trades WHERE sTicker= '"+Name()+"' AND sOperation= 'SELL' ;");
dNumber= atqOdbcNum("SELECT dNumber FROM Trades WHERE sTicker= '"+Name()+"' AND sOperation= 'SELL' ;");
dOrder= atqOdbcNum( "SELECT dOrder FROM Trades WHERE sTicker= '"+Name()+"' AND sOperation= 'SELL';");
Plot(dPrice,"\n dPrice",16,styleNoDraw|styleOwnScale);
Plot(dNumber,"\n dNumber",16,styleNoDraw|styleOwnScale);
Plot(dOrder,"\n Order",16,styleNoDraw|styleOwnScale);
|
|
Выше писал про проблеммы преобразования из double в float.
Посмотрите в коде робота, там используется atqOdbcNumToStr:
Код: |
sQuery = "SELECT dNumber FROM Orders WHERE sStatus = 'ACTIVE' AND sTicker = '" + Name() + "';";
sOrder = atqOdbcNumToStr( sQuery, 0, 64 ); |
Код: |
sQuery = "SELECT dNumber FROM Orders WHERE sStatus = 'ACTIVE' AND sOperation = '" + CodeOp + "' AND sTicker = '" + Ticker + "';";
sOrder = atqOdbcNumToStr( sQuery, 0, 64 ); |
|
|
|
Посмотреть профиль Отправить личное сообщение |
|
MOAX
Зарегистрирован: 13.03.2011
Сообщения: 44
|
zxWizard писал(а): |
MOAX Помоги пожалуйста разобраться.
Задача прежняя проанализировать таблицу Trades и вычислить среднюю цену входа в сделку, получается мне нужно ее прочитать построчно
и если там уже есть строки после которых позиция была равна нулю их нужно игнорировать при следующем проходе.
1) Смотрим были ли сделки и запоминаем номер заявки
Код: |
YesBuy= atqOdbcStr("SELECT dOrder FROM Trades WHERE sTicker= '"+Name()+"' AND sOperation= 'BUY' ;", 50);
YesSell= atqOdbcStr( "SELECT dOrder FROM Trades WHERE sTicker= '"+Name()+"' AND sOperation= 'SELL' ;", 50); |
2) Если были сделки к примеру BUY то нужно проверить следующие строчки таблицы где есть BUY а номер заявки другой
Код: |
TempBuyOrder=atqOdbcStr( "SELECT dOrder FROM Trades WHERE sTicker= '"+Name()+"' AND sOperation= 'BUY' AND dOrder != '"+YesBuy+"' ;" ,50); |
Так вот 2п. не работает переменная TempBuyOrder пустая.
Вопрос:
Можно ли в SQL запросе как условие поиска писать тот столбец по которому и идет вывод данных (dOrder != '"+YesBuy+"')
и в AFL «!=» это не равно можно ли писать так в SQL запросе? |
Тут тоже используй atqOdbcNumToStr
Определить среднюю цену - как-то не складывается картинка. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
zxWizard
Зарегистрирован: 25.09.2011
Сообщения: 46
|
MOAX писал(а): |
Тут тоже используй atqOdbcNumToStr
|
использую atqOdbcNumToStr
Код: |
YesBuy= atqOdbcNumToStr("SELECT dOrder FROM Trades WHERE sTicker= '"+Name()+"' AND sOperation= 'BUY' ;",0, 50);
TempBuyOrder=atqOdbcNumToStr( "SELECT dOrder FROM Trades WHERE sTicker= '"+Name()+"' AND sOperation= 'BUY' AND dOrder != '"+YesBuy+"' ;",0 ,50); |
Но все равно не получается.
То есть первую сточку по условиям находим, а как к последующим строкам обратится вот это не понятно.
То бишь что бы тоже был BUY а номер заявки другой (больше чем мы в первой команде считали). |
|
|
Посмотреть профиль Отправить личное сообщение |
|
zxWizard
Зарегистрирован: 25.09.2011
Сообщения: 46
|
Цитата: |
То есть первую сточку по условиям находим, а как к последующим строкам обратится вот это не понятно. |
Кажется, понял как это можно сделать, возможно кому то будет полезно:
Нужно в таблицу добавить столбец «счетчик» строк и запросы делать построчно… |
|
|
Посмотреть профиль Отправить личное сообщение |
|
zxWizard
Зарегистрирован: 25.09.2011
Сообщения: 46
|
Появилась у меня новая задача не просто считывать данные из базы, а еще и записывать их туда из Ами.
MOAX твой плагин работает только на чтение базы, пришлось с ново взглянуть на ODBC/SQL Universal AFL Plugin
Возник вопрос:
1) Если я открою базу через твой плагин atqOdbcConnect то будет ли она доступна для команд ODBC/SQL Universal AFL Plugin или нужно еще открыть командой odbcOpenDatabase( "connectstring" )?
Схема работы:
а) Через AmiTrans2Quik AFL Plug-in считываем данные из базы.
б) Делаем необходимые расчеты в Ами.
в) Сохраняем результат в базу SQL.
2) Если нужно открывать odbcOpenDatabase то перед открытием необходимо ли закрывать базу atqOdbcDisconnect для AmiTrans2Quik или они будут прекрасно работать совместно?
3) Можно ли добавить в твой плагин функцию записи в базу по типу odbcExecuteSQL( "sql statement" ) из ODBC/SQL Universal AFL Plugin? |
|
|
Посмотреть профиль Отправить личное сообщение |
|
MOAX
Зарегистрирован: 13.03.2011
Сообщения: 44
|
zxWizard писал(а): |
MOAX твой плагин работает только на чтение базы, пришлось с ново взглянуть на ODBC/SQL Universal AFL Plugin
|
По моему, запросы на вставку (INSERT INTO), обновление (UPDATE) и удаление (DELETE) данных в плагине должны работать корректно.
Попробуй, расскажешь.
PS. Для общего развития - на первых порах с базой данных я пробовал работать через COM интерфейс, используя ADO, получалось. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
|