Amibroker + Альфа Директ API

  • Автор темы articool
  • Дата начала

articool

New member
Доброе время суток!

Вопрос: кому нибудь удалось заставить Амиброкер поставить лимитированную заявку в терминал Альфа Директ по открытому интерфейсу (API)?

Я пишу в Ами следующий код (упрощен):

------------------------
myobj = CreateObject ("ADLite.AlfaDirect");

OrderNum = myobj.CreateLimitOrder ("CCCC-ППП", "MICEX_SHR", "GAZP", "14.02.2008 18:00", "buy comment", "RUR", "B", "1", "312", Null, Null, Null, Null, Null, "Y", Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, 10);
// CCCC - номер счета, ППП - номер портфеля, цена например 312 р.
--------------------------

Но заявка в Альфа Директ не ставится, Ами все время сообщает о каких-то ошибках (через переменную myobj.LastResultMsg)

Пробовал вместо Null ставить "0", но это тоже не помогает, меняется только формулировка ошибки. :(

Подскажите плиз, как правильно задать
параметры функции CreateLimitOrder в Ами,
чтоб наконец заявка прошла в Альфа Директ?
 

articool

New member
Вывод по моим экпериментом над связкой Amibroker + Альфа Директ API такой пока:

не может амиброкер поставить заявку в Альфу, потому как не знает такого типа переменной как Null, и корректно передать ее не может...


чувствую, что придется копать Visual Basic или C++ или Delphi и так далее, блин..

Что скажете, знатоки программирования?

Кстати, если у когото есть работающий код, который ставит заявки в Альфу, отзовитесь, очень нужен...

не важно даже на каком языке, сам наверно смогу адаптировать...
 

articool

New member
Мож пробел в кавычках попробовать или просто кавычки
на данный момент я перепробовал следующие варианты
Null
"Null"
""
" "
0
"0"

первые 4 варианта выдают ошибку конвертации из одного типа переменных в другой.

а когда используются нули, то тогда просто команда выполняет совсем не ту операцию, которая требуется (она ищет предыдущую заявку с номером 0 и пытается ее изменить)...
 

Dim_plus

New member
Доброе время суток!

Вопрос: кому нибудь удалось заставить Амиброкер поставить лимитированную заявку в терминал Альфа Директ по открытому интерфейсу (API)?

Я пишу в Ами следующий код (упрощен):

------------------------
myobj = CreateObject ("ADLite.AlfaDirect");

OrderNum = myobj.CreateLimitOrder ("CCCC-ППП", "MICEX_SHR", "GAZP", "14.02.2008 18:00", "buy comment", "RUR", "B", "1", "312", Null, Null, Null, Null, Null, "Y", Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, 10);
// CCCC - номер счета, ППП - номер портфеля, цена например 312 р.
--------------------------

Но заявка в Альфа Директ не ставится, Ами все время сообщает о каких-то ошибках (через переменную myobj.LastResultMsg)

Пробовал вместо Null ставить "0", но это тоже не помогает, меняется только формулировка ошибки. :(

Подскажите плиз, как правильно задать
параметры функции CreateLimitOrder в Ами,
чтоб наконец заявка прошла в Альфа Директ?
К сожалению не знаю совсем встроенного языка Амиброкера и его возможностей по созданию встроенных процедур и функций, но в вышеприведнном примере, имхо, в функцию передаются некоторые параметры НЕВЕРНЫХ типов, т.е. где должны быть числа передаются строки и наоборот. Вот список типов значений для параметров функции:

function CreateLimitOrder(Account: String; PlaceCode: String; PCode: String; EndDate: TDateTime; Comments: String; Currency: String; BuySell: String; Quantity: Integer; Price: Double;
... все остальные параметры (кроме последнего) можно задать значением Null (или константой, которая в Амиброкере имеет значение "пустой. неопределенный"),
Timeout: Integer): Integer; safecall;
 

inevity

New member
Думаю, амиброкер тут не причем, т.к. это API альфы и все параметры совпадают с моими.
у меня работает такой код(брокер-альфадирект, прога на дельфи).

FAD := CoAlfaDirect.Create;
FAD.CreateLimitOrder('11111-001', 'FORTS', 'GAZP-3.08', IncDay(FAD.Get_SessionTime,1),
'', 'RUR', 'B', 1, 28000.0,
Null, Null, Null, Null, Null, Null, Null, Null, Null,
Null, Null, Null, Null, Null, Null, Null, 10);

либо кавычки надо ставить одинарные везде, либо поставить как у меня и поменять первые параметры на свои и проверить. думаю быстро все станет ясно.
 

articool

New member
Вот список типов значений для параметров функции:

function CreateLimitOrder(Account: String; PlaceCode: String; PCode: String; EndDate: TDateTime; Comments: String; Currency: String; BuySell: String; Quantity: Integer; Price: Double;
... все остальные параметры (кроме последнего) можно задать значением Null (или константой, которая в Амиброкере имеет значение "пустой. неопределенный"),
Timeout: Integer): Integer; safecall;
переменные типа string передаются без проблем, integer тоже, даже double передается,
но вот чего не может понять APi альфы, так это Null.

Какая то есть разница между Null Амиброкера и Null альфы... Ругается вот так: Overflow while converting variant of type (Single) into type (Integer)

А как задать в Амиброкере константу, которая имеет значение "пустой, неопределенный"?
Читал хэлп, по этому поводу нашел только: The null (empty) string is written "". Больше ничего не нашел, мож просмотрел...?
 

articool

New member
Думаю, амиброкер тут не причем, т.к. это API альфы и все параметры совпадают с моими.
у меня работает такой код(брокер-альфадирект, прога на дельфи).

FAD := CoAlfaDirect.Create;
FAD.CreateLimitOrder('11111-001', 'FORTS', 'GAZP-3.08', IncDay(FAD.Get_SessionTime,1),
'', 'RUR', 'B', 1, 28000.0,
Null, Null, Null, Null, Null, Null, Null, Null, Null,
Null, Null, Null, Null, Null, Null, Null, 10);

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

Насчет одинарных кавычек не прокатило, элементарно Ами ругается на синтактическую ошибку (Syntax error)...

Такой же код тоже ставил вот :
myobj.CreateLimitOrder ("1111-000", "MICEX_SHR", "GAZP", mydata, "", "RUR", "B", 1, 312.0, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, 10);


но не помогает, Api ругается как и раньше: "Ошибка при формировании заявки: Overflow while converting variant of type (Single) into type (Integer)"...
 

Dim_plus

New member
ну да,я Амиброкер не ругаю, прога хорошая, но у Ами и API Альфы есть разница в используемых типах переменных, что и сказывается.
Насчет одинарных кавычек не прокатило, элементарно Ами ругается на синтактическую ошибку (Syntax error)...

Такой же код тоже ставил вот :
myobj.CreateLimitOrder ("1111-000", "MICEX_SHR", "GAZP", mydata, "", "RUR", "B", 1, 312.0, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, 10);

но не помогает, Api ругается как и раньше: "Ошибка при формировании заявки: Overflow while converting variant of type (Single) into type (Integer)"...
попробуйте скачать с сайта http://stockgraphics.narod.ru/autotrading_complex.htm файл MoveOrderADirect3.exe и запустите его из Амиброкера с такими параметрами:
c:\MoveOrderADirect3.exe" "MICEX_SHR" "1111-000" "GAZP" "-1" "1" "312,0" "B" "0,00000" "Y" "2" "0,00000" "Simple" "311,00" "2" "12" "3" "10"
заявка должна появиться в АД-терминале
 

articool

New member
попробуйте скачать с сайта http://stockgraphics.narod.ru/autotrading_complex.htm файл MoveOrderADirect3.exe и запустите его из Амиброкера с такими параметрами:
c:\MoveOrderADirect3.exe" "MICEX_SHR" "1111-000" "GAZP" "-1" "1" "312,0" "B" "0,00000" "Y" "2" "0,00000" "Simple" "311,00" "2" "12" "3" "10"
заявка должна появиться в АД-терминале
скачал файл MoveOrderADirect3.exe, но так просто запустить его из Амиброкера стандартными средствами не получится, помойму нет таких встроенных функций запуска exe...

Это надо тогда либо скрипты использовать VBscript или Jscript, или свою dll писать, из которой запускается exe :)

кстати из командной строки Windows (Run...) файл исполняется без проблем и заявка ставится в Альфу и исполняется!

Но проблемы создания МТС это не решает, буду дальше думать :)
Какие еще есть соображения? :)
 

articool

New member
ААААА, наконец догадался!!!
!
:)
:) !

В Амиброкере надо

функции API Альфы, которые имеют аргументы типа Variant

вызывать из под VBscript или Jscript,

Амиброкер понимает вставки кода на этих скриптах...

То есть написать примерно так:

-------------------------
EnableScript("vbscript");
<%
Dim AD
Set AD = CreateObject("ADLite.AlfaDirect")

function OrderBuy(vbdata, vblots, vbprice)
vbordernum = AD.CreateLimitOrder ("1111-000", "MICEX_SHR", "GAZP", vbdata, "Buy comment", "RUR", "B", vblots, vbprice, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, 10)
OrderBuy = vbordernum
End function

' здесь аналогично прописать функции продажи, шорта, стопы и т.д.
%>
--------------------------

а потом уж с помощью стандартного языка Амиброкера AFL эти функции вызывать, например вот так:

-----------------------
// присоединение функций VB скрипта к AFL
script = GetScriptObject();

// обращение к функции в скрипте
OrderNum = script.OrderBuy (mydata, lots, price);

//вывод номера заявки в Альфе
WriteVal (OrderNum);
-----------------------

вот, может кому пригодится... я протестил, работает :)
 

orange2000

New member
ААААА, наконец догадался!!!
!
:)
:) !

В Амиброкере надо

функции API Альфы, которые имеют аргументы типа Variant

вызывать из под VBscript или Jscript,

Амиброкер понимает вставки кода на этих скриптах...

То есть написать примерно так:

-------------------------
EnableScript("vbscript");
<%
Dim AD
Set AD = CreateObject("ADLite.AlfaDirect")

function OrderBuy(vbdata, vblots, vbprice)
vbordernum = AD.CreateLimitOrder ("1111-000", "MICEX_SHR", "GAZP", vbdata, "Buy comment", "RUR", "B", vblots, vbprice, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, 10)
OrderBuy = vbordernum
End function

' здесь аналогично прописать функции продажи, шорта, стопы и т.д.
%>
--------------------------

а потом уж с помощью стандартного языка Амиброкера AFL эти функции вызывать, например вот так:

-----------------------
// присоединение функций VB скрипта к AFL
script = GetScriptObject();

// обращение к функции в скрипте
OrderNum = script.OrderBuy (mydata, lots, price);

//вывод номера заявки в Альфе
WriteVal (OrderNum);
-----------------------

вот, может кому пригодится... я протестил, работает :)
Тема интересна! Автор темы, нужна ваша помощь!
 

koistya

New member
AlfaDirect + AmiBroker + C#

Вот пример создания плагина для AmiBroker на C#

Google: AmiBroker CodePlex

Скоро планирую выложить плагины для AlfaDirect, Google Finance, TD Ameritrade..

Можете использовать код из этого проекта как основу для создания собственных плагинов.
 

Magnum

New member
Столкнулся с тем, что при запуске анализатора в AMI с такой вставкой кода VB приложение adirect.exe начинает постепенно пожирать оперативную память.
Дошло до того, что съелся 1Гб памяти, после чего вылетело по ошибке. Причем, пожирает даже тогда, когда нет сигналов и не выставляются заявки.

Как побороть? set ad = nothing не помогает :(
 

Dim_plus

New member
Столкнулся с тем, что при запуске анализатора в AMI с такой вставкой кода VB приложение adirect.exe начинает постепенно пожирать оперативную память.
Дошло до того, что съелся 1Гб памяти, после чего вылетело по ошибке. Причем, пожирает даже тогда, когда нет сигналов и не выставляются заявки.

Как побороть? set ad = nothing не помогает :(
Работая с АПИ Альфа-директ выяснил, что пожирание памяти происходит при многоразовом пересоздании интерфейса COM-объекта. Чтобы не происходила утечка памяти нужно иметь хотя бы одно постоянное (непрерываемое) соединение с АД по COM-интерфейсу.
 

Dymytry

New member
Товарищи, а кому-нибудь удалось решить описанную автором темы проблему?

У меня та же хрень при работе из Джавы. При попытке создания CreateLimitOrder с null параметрами выдает ошибку "не могу сконвертить в Double", а если вводить нули или пустые строки то пишет "Недопустимые параметры заявки (более одного условия активации).". То есть я не могу ввести в Альфу пустые параметры. Пробовал вводить Double Not a Number - получил критическую ошибку при float операции.

Есть какой-нибудь выход?
Кто кодил на других языках - могли бы запостить сюда работающий пример CreateLimitOrder, а дучше пару разных, плиз.
 
Your email address will not be publicly visible. We will only use it to contact you to confirm your post.
Сверху