Список форумов AmiSite.ru AmiSite.ru
Форум по Ами
 FAQ  •  Поиск  •  Пользователи  •  Группы   •  Регистрация  •  Профиль  •  Войти и проверить личные сообщения  •  Вход
 Получение данных из Access Следующая тема
Предыдущая тема
Начать новую тему  Ответить на тему
Автор Сообщение
000
Site Admin


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

СообщениеДобавлено: Чт Ноя 24, 2011 10:08 pm Ответить с цитатой Вернуться к началу

Да мне как то в голову не приходило их использовать.
Соответственно никогда не искал...

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
zxWizard



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

СообщениеДобавлено: Чт Дек 08, 2011 11:22 pm Ответить с цитатой Вернуться к началу

Вопрос по двухсторонней связи Ами и Квика через базы данных типа Access или SQL успешно решен с помощью AmiTrans2Quik AFL Plug-in,
можно получить данные в Ами из любых таблиц Квика и реализовать отправку заявок в Квик через API.
Причем SQL дает очень большое преимущество в скорости при анализе большого объема данных на пример «Таблицы всех сделок».

Возможно кому то будет интересно:
http://amisite.ru/phpBB2/viewtopic.php?t=1085

Но у меня возникло несколько вопросов по AFL, помогите разобраться:
Код:

Position= atqOdbcNum( QueryPosition );
/* Position присваивается значение «Текущая чистая позиция» из таблицы квика. (по сути это получается константа, то есть все элементы массива Position равны конкретному числу, которое возвращено функцией atqOdbcNum) */

if(Position ==0) Pos[BarCount-1]= 0;
else
   if(Position >0) Pos[BarCount-1]= 1;
   else
      if(Position <0) Pos[BarCount-1]= -1;



Или так:
Код:

if(Position ==0) Pos=0;
   else
      if(Position >0) Pos= 1;
         else
            if(Position <0) Pos= -1;


Вхожу в сделку ручками и сразу смотрю что получается в массиве Pos:
Код:

for( i = BarCount-50; i < BarCount; i++ )
   {
     printf("pos=%g\n", Pos[i] );   
    }


Выдает что все элементы массива Pos равны если в лонге =1, если в шорте =-1, и 0 если вне позиции,
а по задумке должно быть так чтобы элементы массива имели уникальное значение на баре в зависимости от реальной позиции в Квике,
а у меня весь массив имеет одно конкретное значение.

Моей системе нужно непросто знать что мы в позиции а еще и когда мы встали в позицию, т.к. вход осуществляется на данный момент в ручную.
В чем моя ошибка?
Объясните пожалуйста как работают массивы в Ами как я понимаю каждый элемент массива привязывается к конкретному бару на графике
и если я к примеру в 12ч-00м был не в позиции а в 12-01 встал в Лонг то нужно чтобы элементы массива до 12-01 имели значения 0 а после 12-01 равнялись 1 .


Последний раз редактировалось: zxWizard (Пт Дек 09, 2011 12:39 am), всего редактировалось 3 раз(а)
Посмотреть профиль Отправить личное сообщение
zxWizard



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

СообщениеДобавлено: Пт Дек 09, 2011 12:15 am Ответить с цитатой Вернуться к началу

Еще вопрос по циклам:

Получается так что в Ами весь код зациклен и выполняется с верху вниз настолько быстро на сколько позволяет это ПК.

Встает вопрос как в реалии обрабатывается, к примеру это цикл если учитывать что весь код тоже зациклен
Код:

for( i = 0; i < BarCount; i++ )
{
/* Какие ни будь сложные расчеты от начало базы
    которые и так не быстро происходят в силу своей сложности */
}

Получается так что Ами должен делать эти расчеты при каждом проходе.
Но по моим наблюдением Ами довольно быстро работает, единственно что приходит на ум что Ами при таком цикле рассчитывает только видимую часть графика.

Олег объясни пожалуйста, как это происходит?
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

СообщениеДобавлено: Пт Дек 09, 2011 12:34 am Ответить с цитатой Вернуться к началу

Не знаю как там на низком уровне, но с точки зрения кодировщика на AFL он не обрабатывает "с верху вниз настолько быстро на сколько позволяет это ПК", он считает сразу весь массив.

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
zxWizard



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

СообщениеДобавлено: Пт Дек 09, 2011 12:49 am Ответить с цитатой Вернуться к началу

000 писал(а):
он считает сразу весь массив.


Кажется понял, как и написано в документации Ами создает временные массивы по всем операциям и автоматом туда идут расчеты на каждом баре.
Олег так получается…

Скажи пожалуйста в чем ошибка у меня с массивом Pos?

Еще момент с циклами

Пишут в кодах
Код:

for( i = 0; i < BarCount; i++ )
или
for( i = 0; i < BarCount-1; i++ )

В чем разница между «BarCount» и «BarCount-1» как я понял «BarCount-1» это последний формирующийся бар тогда что такое BarCount?
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

СообщениеДобавлено: Пт Дек 09, 2011 1:14 am Ответить с цитатой Вернуться к началу

BarCount это число баров или число элементов массива.
Последний бар имеет индекс [BarCount-1] потому, что индексы начинаются с нулевого. Первый бар на чарте имеет индекс [0]

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
000
Site Admin


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

СообщениеДобавлено: Пт Дек 09, 2011 1:17 am Ответить с цитатой Вернуться к началу

По поводу "в чем ошибка". Я не вникал, но по моему вот в чем. Когда получаешь значение позиции его во первых надо сохранять в конкретный элемент массива (в последний на текущий момент) и кроме того надо сохранять сам массив т.к. при следующем прогоне AFL он обнулиться и пересчитается заново.
Массив удобно сохранять функцией ADDTOCOMPOSITE()

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
zxWizard



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

СообщениеДобавлено: Пт Дек 09, 2011 1:47 am Ответить с цитатой Вернуться к началу

000 писал(а):
BarCount это число баров или число элементов массива.
Последний бар имеет индекс [BarCount-1] потому, что индексы начинаются с нулевого. Первый бар на чарте имеет индекс [0]


Получается что если писать
Код:

for( i = 1; i < BarCount; i++ )

то код заглядывает в будущее на 1 бар? Или нет? зачем тогда так писать?
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

СообщениеДобавлено: Пт Дек 09, 2011 2:02 am Ответить с цитатой Вернуться к началу

При чем тут заглядывание в будущее?
Бар с индексом BarCount-1 последний и если попытаться обратиться к бару с индексом BarCount, то Ами ругнется на "выход за пределы массива"
Но только при записи
for( i = 1; i < BarCount; i++ )
никакого выхода за пределы не будет.
Последная итерация будет при i == BarCount-1. Когда i станет равна BarCount выражение i < BarCount станет ложным и цикл закончится.

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
zxWizard



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

СообщениеДобавлено: Пт Дек 09, 2011 2:14 am Ответить с цитатой Вернуться к началу

000 писал(а):
При чем тут заглядывание в будущее?
Бар с индексом BarCount-1 последний и если попытаться обратиться к бару с индексом BarCount, то Ами ругнется на "выход за пределы массива"
Но только при записи
for( i = 1; i < BarCount; i++ )
никакого выхода за пределы не будет.
Последная итерация будет при i == BarCount-1. Когда i станет равна BarCount выражение i < BarCount станет ложным и цикл закончится.


Понял Олег спасибо!
Посмотреть профиль Отправить личное сообщение
zxWizard



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

СообщениеДобавлено: Пт Дек 09, 2011 3:33 am Ответить с цитатой Вернуться к началу

Код:

Position[BarCount-1]= atqOdbcNum( QueryPosition );

AddToComposite (Position, "~ OpenPosCount", "V");

Pos= Foreign( "~OpenPosCount", "V");


Олег скажи пожалуйста не будет ли косяков с AddToComposite по тому как Position может быть отрицательна когда в шорте а по логике V (Объем) в тикере только положителен?
Посмотреть профиль Отправить личное сообщение
zxWizard



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

СообщениеДобавлено: Пт Дек 09, 2011 4:37 pm Ответить с цитатой Вернуться к началу

000 писал(а):

Массив удобно сохранять функцией ADDTOCOMPOSITE()

Странная вещь:
Код:

AddToComposite( MACD() > 0, "~BullMACD", "V");
Graph0 = Foreign("~BullMACD", "V");
Plot(Graph0 ,"Pos",colorBlack,styleLine);

for( i = BarCount-200; i < BarCount; i++ )
 {
  printf("Graph0 =%g\n", Graph0 [i] );
 }

AddToComposite даже на примере из хелпа выдает пустое значение
Олег как ее использовать?
Версия Ами 5.40

Из хелпа:
Цитата:

В начале тикера этого сивола будет ~ (тильда)
вновь добавленый расчетный символ по умолчанию будет помещен в группу 253 и
иметь характеристику "use only local database" ("использоваться только в локальной базе данных")


Пробовал без ~ (тильда) все равно пустое значение
Код:

AddToComposite( MACD() > 0, "BullMACD", "V");
Graph0 = Foreign("BullMACD", "V");


Мне нужно ее использовать в базе реал-тайм а не в локальной базе для тестов может в этом проблема?

Как можно в Ами сохранить текущее значение и при этом знать какое оно было некоторое время назад по сути это обычный массив но ни фига не получается...
Олег помоги пожалуйста разобраться...
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

СообщениеДобавлено: Вс Дек 11, 2011 8:56 pm Ответить с цитатой Вернуться к началу

А дальше в хелпере прочитать?
Цитата:

Функция AddToComposite обнаруживает режим в котором она запущена
(она работает только при сканировании, если не выставлены флаги atcFlagEnableInBacktest или atcFlagEnableInExplore ) и не влияет на расчетный символ из индикатора и коментария, так что возможно объединять сканер и индикатор в одном коде.

Т.е. в индикаторе эта функция не работает, а судя по Plot() это был индикатор.
В принципе в Ами можно сохранять массив и просто в памяти, но он будет помниться только до закрытия Амиброкера.
См функции StaticVarGet StaticVarSet

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
zxWizard



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

СообщениеДобавлено: Пн Дек 12, 2011 1:20 am Ответить с цитатой Вернуться к началу

000 писал(а):

См функции StaticVarGet StaticVarSet


Ты имеешь виду к примеру так?
Код:

pos=5; /* текущее значение которое может меняться для простоты примера написал как константу */

i=BarCount-1;
StaticVarSet( "ARRAY_"+i+"", pos );


Потому как только константы или текст поддерживаются статической переменной (не массив).

Тогда вопрос на сколько быстро это будет обрабатываться и есть ли какие ограничения по количеству статических переменных в AFL?

Меня с AddToComposite беспокоит то что Position может быть отрицательна когда в шорте а по логике V (Объем) в тикере только положителен.
Олег как думаешь будут глюки?


Последний раз редактировалось: zxWizard (Пн Дек 12, 2011 1:56 am), всего редактировалось 2 раз(а)
Посмотреть профиль Отправить личное сообщение
zxWizard



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

СообщениеДобавлено: Пн Дек 12, 2011 1:51 am Ответить с цитатой Вернуться к началу

Олег скажи пожалуйста как можно узнать дату\время бара по его индексу
к примеру Open[375] есть индекс 375 а как время этого бара узнать не нашел в хелпе, данные тиковые по этому и такой вопрос.
Во общем суть такая делаем расчеты на тиках переключимся на минутки а индексы тиковые теряются по этому нужно знать время на тиках.
Посмотреть профиль Отправить личное сообщение
Показать сообщения:      
Начать новую тему  Ответить на тему


 Перейти:   



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


Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme :: Часовой пояс: GMT + 3

File Attachment © by Meik Sievertsen