Перейти к содержимому


Фото
* * * - - 2 голосов

SmartCOM data Plug-in для AmiBroker


  • Please log in to reply
487 ответов в этой теме

#421 Старый пень

Старый пень

    Участник

  • Трейдеры
  • PipPip
  • 140 сообщений

Отправлено 10 June 2012 - 06:37 PM

Я тоже начал писать блок проверки наличия открытых позиций. Но затык вышел. Непонятки, как работает файл StrFind( Name(), "Open position:" ); и ещё fclose(file_open_pos); Что писать в Name(), и в каком месте писать fclose(file_open_pos). Ами ругается на то, что я написал. Хотя, по логике вроде всё правильно. Файл открыли, нашли строку, в которой есть "Open position:". Если есть такая строка, то в окошке Message пишется "ИМЕЮТСЯ ОТКРЫТЫЕ ПОЗИЦИИ". Если нет новой записи "Open position:", то пишется "НЕТ ОТКРЫТЫХ ПОЗИЦИЙ". Далее надо разветвить программу на два пути. 1. Если есть открытые позы. 2. Если нет открытых поз.

_SECTION_BEGIN("АВТОМАТ");

/* ВКЛЮЧЕНИЕ АВТОМАТА */
Automat_status = ParamToggle("АВТОМАТ","ВЫКЛ.|ВКЛЮЧИТЬ",defaultval=0 );
if(Automat_status==1)
_TRACE("АВТОМАТ РАБОТАЕТ");
else
{
_TRACE("АВТОМАТ ВЫКЛЮЧЕН");
}
/* ПРОВЕРКА НАЛИЧИЯ ОТКРЫТЫХ ПОЗИЦИЙ */
/* ОТКРЫТИЕ ФАЙЛА */
file_open_pos = fopen( "C:\\Program Files (x86)\\AmiBroker\\transactions\\OpenPosStatement.dat", "r" );
if(file_open_pos)
_TRACE("ФАЙЛ OpenPosStatement.dat ОТКРЫТ УСПЕШНО");
else
{
_TRACE("ФАЙЛ OpenPosStatement.dat НЕ ОТКРЫВАЕТСЯ");
}
open_pos = fgets(file_open_pos);

/* ЕСЛИ НОВОЙ СТРОКИ НЕТ, ТО ВОЗВРАЩАЕТСЯ ЕДИНИЦА */
StrFind( Name(), "Open position:" );
fclose(file_open_pos);
_TRACE("ИМЕЮТСЯ ОТКРЫТЫЕ ПОЗИЦИЙ");
else
{
_TRACE("НЕТ ОТКРЫТЫХ ПОЗИЦИЙ");
}

#422 Старый пень

Старый пень

    Участник

  • Трейдеры
  • PipPip
  • 140 сообщений

Отправлено 10 June 2012 - 08:57 PM

Исправил. Заработало.

_SECTION_BEGIN("АВТОМАТ");

/* ВКЛЮЧЕНИЕ АВТОМАТА */
Automat_status = ParamToggle("АВТОМАТ","ВЫКЛ|ВКЛЮЧИТЬ",defaultval=0 );
if(Automat_status==1)
_TRACE("АВТОМАТ РАБОТАЕТ");
else
{
_TRACE("АВТОМАТ ВЫКЛЮЧЕН");
}
/* ПРОВЕРКА НАЛИЧИЯ ОТКРЫТЫХ ПОЗИЦИЙ */
/* ОТКРЫТИЕ ФАЙЛА */
file_open_pos = fopen( "C:\\Program Files (x86)\\AmiBroker\\transactions\\OpenPosStatement.dat", "r" );
if(file_open_pos)
_TRACE("ФАЙЛ OpenPosStatement.dat ОТКРЫТ УСПЕШНО");
else
{
_TRACE("ФАЙЛ OpenPosStatement.dat НЕ ОТКРЫВАЕТСЯ");
}
open_pos = fgets(file_open_pos); /* fgets читает файл OpenPosStatement.dat до конца, если есть новая строка, то возвращает её */
fclose(file_open_pos); /* Закрываем открытый ранее файл */
/* ЕСЛИ НОВОЙ СТРОКИ НЕТ, ТО ВОЗВРАЩАЕТСЯ ЕДИНИЦА */
if(StrFind( open_pos, "Open position:" )) /* StrFind ищет в той новой строке комбинацию символов "Open position:" */
_TRACE("НЕТ ОТКРЫТЫХ ПОЗИЦИЙ");
else
{
_TRACE("ИМЕЮТСЯ ОТКРЫТЫЕ ПОЗИЦИИ");
}

#423 Serval

Serval

    Участник

  • Трейдеры
  • PipPip
  • 155 сообщений

Отправлено 11 June 2012 - 10:24 AM

/* ОТКРЫТИЕ ФАЙЛА */
file_open_pos = fopen( "C:\\Program Files (x86)\\AmiBroker\\transactions\\OpenPosStatement.dat", "r" );

А у меня открывает файл путь с прямыми слешами.
/* ОТКРЫТИЕ ФАЙЛА */
file_open_pos = fopen( "C:/Program Files/AmiBroker/transactions/OpenPosStatement.dat", "r" );
Самого файла ещё не видел, тестовый доступ возобновлю после выходных, но предполагаю, что при торговле несколькими инструментами в нем будет несколько строчек, поэтому читать надо
found=0;
if (file_open_pos) {
while (!feof(file_open_pos)) {
open_pos = fgets(file_open_pos); // вот так fgets читает файл OpenPosStatement.dat до конца
if (StrFind(open_pos,FullName())>0 AND StrFind(open_pos, "Open position:")>0) {
// а так ищет вхождение биржевого кода инструмента в строке
// Из Хелпа: StrFind( string, substring )
//RETURNS NUMBER
//FUNCTION The StrFind function finds first occurrence of substring in string.
StrFounded=open_pos; //нашли, сохранили для дальнейшей обработки(пока предполагаем что запись одна, счет один
//выяснение какая поза, сколько)
found=1;
}
}
fclose(file_open_pos); нашли, закрываем файл.
}
if (found==1) {здесь пишем обработку и что делаем в случае открытых позиций}
как-то так.

#424 Старый пень

Старый пень

    Участник

  • Трейдеры
  • PipPip
  • 140 сообщений

Отправлено 12 June 2012 - 11:57 PM

В инструкции к НОВОМУ ПЛАГИНУ написано, что приказ, который должен отправлять Амиброкер, это отдельный файл, содержащий одну строку. Однако никак не могу найти функцию Амиброкера, которая создаёт файлы !!! Может кто-нибудь подскажет?

#425 Старый пень

Старый пень

    Участник

  • Трейдеры
  • PipPip
  • 140 сообщений

Отправлено 13 June 2012 - 09:08 AM

Нету в языке Амиброкера команды, которая создаёт файлы ! Оператор, создающий папки есть, а создающего файлы нет !!!

#426 Serval

Serval

    Участник

  • Трейдеры
  • PipPip
  • 155 сообщений

Отправлено 13 June 2012 - 11:14 AM

Нету в языке Амиброкера команды, которая создаёт файлы ! Оператор, создающий папки есть, а создающего файлы нет !!!

Просто открываешь файл для записи. что-то типа:
DirectoryName="C:/Program Files (x86)/Amibroker/transactions/"; // слэши прямые - имя папки с транзакциями для плагина
StringOrder=StrFormat("place_order?portfolio="+Account+"&security= "+FullName()+"&action="+sOper+"&type= LIMIT& validity= Day&price=%1."+
Point+"f&stop_price=%1."+Point+"f&amount=%g",sprice,StopPrice,Lots);//sprice-цена приказа,StopPrice-стоп цена(пока 0), Lots -число лотов(контрактов)
FileName=DirectoryName+Name()+"_"+Now(8)+"-"+Now(7)+"-"+Now(6)+"_"+Now(4)+".new";
f=fopen(FileName,"w");создает и открывает файл с именем типа RIM2_2012-6-13_110503.new
if (f) {
fputs(stringOrder+"\n",f); пишем строку приказа.
fclose(f);
}
Приказы я уже пишу в файлы, читаю позицию из файла, читаю открытую заявку из файла, всё это вывожу на чарт. Сегодня попробую в связке реал-тайм с плагином, если нормально, причешу код и выложу сегодня-завтра.

#427 Старый пень

Старый пень

    Участник

  • Трейдеры
  • PipPip
  • 140 сообщений

Отправлено 13 June 2012 - 11:49 AM

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

#428 Serval

Serval

    Участник

  • Трейдеры
  • PipPip
  • 155 сообщений

Отправлено 14 June 2012 - 10:51 AM

Вопрос к разработчикам.
На тестовом сервере выставляю заявки через плагин
в 11:28:00
place_order?portfolio=ST21422-RF-01&security=RTS-6.12_FT&action=SELL&type=LIMIT&validity=DAY&price=128500&stop_price=0&amount=1
проходит, в СмартТрейде вижу
5 RTS-6.12 SELL 128500 1 11:28:02 AM Продать 1 лот RTS-6.12 (RIM2) по цене 128500. приказ LIMIT 1627545128
в 11:28:58
place_order?portfolio=ST21422-RF-01&security=RTS-6.12_FT&action=BUY&type=LIMIT&validity=DAY&price=131275&stop_price=0&amount=1
не проходит вижу
8 RTS-6.12 BUY 131275 1 11:29:01 AM Купить 1 лот RTS-6.12 (RIM2) по цене 131275. приказ LIMIT iq81867864 Не разрешена встречная заявка на один счет и/или ИНН.
Вчера такое было несколько раз за день, это глюки тестового сервера? Или я что-то не так делаю.
Сегодня трижды iq81868620, iq81868308, iq81867864

#429 Эдуард Полозков

Эдуард Полозков

    Сотрудник WsiFranchise

  • Трейдеры
  • Pip
  • 81 сообщений

Отправлено 14 June 2012 - 11:47 AM

Это сообщение игровой биржи РТС. Очень похоже на то, что ваша заявка на продажу оказывается лучшей в стакане и при выставлении заявки на покупку они "встречаются". Соответственно, по правилам торгов вы не можете самому себе продать и у самого себя купить, отсюда и ошибка.

Вопрос к разработчикам.
На тестовом сервере выставляю заявки через плагин
в 11:28:00
place_order?portfolio=ST21422-RF-01&security=RTS-6.12_FT&action=SELL&type=LIMIT&validity=DAY&price=128500&stop_price=0&amount=1
проходит, в СмартТрейде вижу
5 RTS-6.12 SELL 128500 1 11:28:02 AM Продать 1 лот RTS-6.12 (RIM2) по цене 128500. приказ LIMIT 1627545128
в 11:28:58
place_order?portfolio=ST21422-RF-01&security=RTS-6.12_FT&action=BUY&type=LIMIT&validity=DAY&price=131275&stop_price=0&amount=1
не проходит вижу
8 RTS-6.12 BUY 131275 1 11:29:01 AM Купить 1 лот RTS-6.12 (RIM2) по цене 131275. приказ LIMIT iq81867864 Не разрешена встречная заявка на один счет и/или ИНН.
Вчера такое было несколько раз за день, это глюки тестового сервера? Или я что-то не так делаю.
Сегодня трижды iq81868620, iq81868308, iq81867864



#430 Serval

Serval

    Участник

  • Трейдеры
  • PipPip
  • 155 сообщений

Отправлено 14 June 2012 - 02:47 PM

Это сообщение игровой биржи РТС. Очень похоже на то, что ваша заявка на продажу оказывается лучшей в стакане и при выставлении заявки на покупку они "встречаются". Соответственно, по правилам торгов вы не можете самому себе продать и у самого себя купить, отсюда и ошибка.

К сожалению нет, разница между заявками 58 секунд и первая, исполнившись, закрыла позицию, вторая открывает новую на процент хуже рынка, других заявок нет. Третья после них также отклоняется, но она в другом направлении. Пока будем предполагать, что это глюк тестового сервера.

#431 koba

koba

    Новичок

  • Трейдеры
  • Pip
  • 28 сообщений

Отправлено 18 June 2012 - 05:02 PM

B вместо оправки ордеров через dll отправляем через файл?
А зачем для этого было писать dll?

#432 Андрей Осташов

Андрей Осташов

    Активный участник

  • Трейдеры
  • PipPipPip
  • 935 сообщений

Отправлено 18 June 2012 - 05:09 PM

dll изначально писалась для снабжения AmiBroker данными для анализа. И делает она это хорошо.
Проблема в том, что (как выяснилось) AFL не умеет работать с позициями, приказами и т.п.
Не умеет отслеживать их появление, исполнение, закрытие и пр.
Вот и приходится делать это в текстовых файлах.

Т.е. проблема на в dll (она на SmartCOM и все вышесказанное умеет по умолчанию), а в AmiBroker
Кстати, это неумение видно и по их сайту. Единственный плагин с попыткое сделать нечто подобное - плагин от IB.
Да и у IB ничего особо путного не вышло...


B вместо оправки ордеров через dll отправляем через файл?
А зачем для этого было писать dll?



#433 Старый пень

Старый пень

    Участник

  • Трейдеры
  • PipPip
  • 140 сообщений

Отправлено 18 June 2012 - 08:01 PM

Андрей. Поясните пожалуйста. Внизу таблица с примером из инструкции к новому плагину.

Active: BP0694-RF-02, SBRF-6.12_FT, 1184945893, 8207, 0, 1, Open
Структура описания приказа:

# поля Что содержит Пример
1 Признак активного приказа Active:
2 Портфель, по которому выставлен приказ BP0694-RF-02
3 Финансовый инструмент SBRF-6.12_FT
4 Номер приказа 1184945893
5 Цена приказа 8207
6 Цена STOP 0
7 Объем позиции в лотах (контрактах). 1
8 Статус приказа (открыт, частично выполнен).

Active: - это признак чего? Приказ поступил в торговую систему, но ещё не исполнен? Или приказ, который уже выполнен полностью? Не понимаю. А зачем тогда статус приказа Open ? Ведь если он уже Open, значит он уже не Active: . Наверное для автоматизации процесса нам нужно узавать Open приказ или нет. А зачем тогда нужно поле Active: ? Как его применить на практике ?

#434 Старый пень

Старый пень

    Участник

  • Трейдеры
  • PipPip
  • 140 сообщений

Отправлено 18 June 2012 - 08:18 PM

И ещё вопросик. Откуда берётся номер, который указан в графе "Номер приказа" ?

#435 Андрей Осташов

Андрей Осташов

    Активный участник

  • Трейдеры
  • PipPipPip
  • 935 сообщений

Отправлено 19 June 2012 - 11:07 AM

Боюсь ответить неточно. Поэтому подождем до завтра.
Программист из отпуска выйдет - он ответит досконально.

И ещё вопросик. Откуда берётся номер, который указан в графе "Номер приказа" ?



#436 Serval

Serval

    Участник

  • Трейдеры
  • PipPip
  • 155 сообщений

Отправлено 20 June 2012 - 12:04 AM

И ещё вопросик. Откуда берётся номер, который указан в графе "Номер приказа" ?

Это не простой вопросик. Такие номера 10-значные, например №1635263687 я вижу только в СмартТрейде В менеджере счета в таблице "Заявки", колонка "номер приказа", по-видимому, этот номер приказа присваивается биржей, а вот в файле TransacStatement.dat я вижу совсем другие номера типа 81964227, строки:
Active: ST21422-RF-01, RTS-9.12_FT, 81964227, 134770, 0, 1, Open
Active: ST21422-RF-01, RTS-9.12_FT, 81964251, 133695, 0, 1, Open
один на прдажу, другой на покупку. У обоих количество положительное. Я отличаю который на покупку, который на продажу, сравнивая с последним Close, больше и не исполнена - на продажу, меньше, на покупку, это правильно? Причем плагин видит приказы поставленные вручную, вне Амиброкера, это хорошо.
В СмартТрейде номера приказов 8-ми значные и начинающиеся с iq, например iq81962889, я вижу только если заявка отклонена биржей с комментарием "Не разрешена встречная заявка на один счёт и/или ИНН". (Глюки тестового сервера, никаких других заявок нет, ни встречных ни поперечных). Убедился, что глюк, когда из СмартТрейда закрывал позицию вручную перед выходом из программы и получил такой комментарий.
Жаль, что в случае отклонения биржей ничего не приходит никуда. Просто заявка не появляется в TransacStatement.dat.
Пока посылаю вторичную заявку такую же. Она проходит.
Но биржа ведь отклоняет приказы с разными формулировками - "Цена приказа вышла за лимиты цены", "Недостаточно денег на счёте для такой операции" и другие. Не зная этого ответа, робот будет долбить одну и ту же заявку до посинения, а если это простые тормоза на несколько секунд?. А если такую заявку пропустить, то нарушается логика процесса, робот думает, что тейк-профит не выставлен и пытается выставить его. В прошлом году тормоза доходили до 5 секунд, а сейчас как? Я могу в роботе поставить пищалку-оповещалку о таких ситуациях, а если оператора рядом с роботом нет? Что делать тогда? В журнале TransacJournal строка вс лучае отклонения биржей ничем не отличается от остальных.
Order accepted: portfolio=ST21422-RF-01, security=RTS-9.12_FT, amount=2, price=135565, price stop=0
кстати какой Order accepted? На покупку или на продажу? По цене не определить, нет времени события, а по одной цене может быть много ордеров при торговле от уровня на пробой-отбой. Прошу прояснить.

#437 Старый пень

Старый пень

    Участник

  • Трейдеры
  • PipPip
  • 140 сообщений

Отправлено 20 June 2012 - 10:29 AM

И ещё вопросик. В строке приказа Active: ST21422-RF-01, RTS-9.12_FT, 81964251, 133695, 0, 1, Open количество бумаг всегда положительное ???

#438 Serval

Serval

    Участник

  • Трейдеры
  • PipPip
  • 155 сообщений

Отправлено 20 June 2012 - 11:01 AM

И ещё вопросик. В строке приказа Active: ST21422-RF-01, RTS-9.12_FT, 81964251, 133695, 0, 1, Open количество бумаг всегда положительное ???

Сейчас проверил, у меня всегда положительны.
Active: ST21422-RF-01, RTS-9.12_FT, 81982278, 133195, 0, 1, Open
Active: ST21422-RF-01, RTS-9.12_FT, 81982284, 133195, 0, 1, Open
Active: ST21422-RF-01, RTS-9.12_FT, 81982350, 134050, 0, 1, Open
две на покупку, последняя на продажу.
У самого возник вопрос по частоте считывания файлов плагином и обрабатываются ли несколько файлов одновременно (вход в позицию по рынку, выставление трёх тейк-профитов по частям, я могу сразу создать 4 файла, а плагин их отработает?
Если поддержка не ответит, то сами проверим.

#439 Serval

Serval

    Участник

  • Трейдеры
  • PipPip
  • 155 сообщений

Отправлено 20 June 2012 - 11:48 AM

Проверил, в другой папке создал три new файла с приказами, два на продажу и один на покупку, скопировал все в transactions, в системе сразу появились три заявки. Результатом очень доволен. Плагин отрабатывает на ура. Этот вопрос почти снят. Если будут тормоза, то что будет? В пятницу с медленного инета с большим пингом повторю операцию с бОльшим количеством файлов.

#440 Serval

Serval

    Участник

  • Трейдеры
  • PipPip
  • 155 сообщений

Отправлено 21 June 2012 - 12:26 AM

На сегодняшний день тестирование плагина с отдачей приказов через текстовые файлы находится на следующем уровне:
1. Приказы на покупку и продажу ставятся и исполняются, пока без стопов, как просил Андрей Осташов. Проверено на тестовом сервере, более 100 сделок (200 приказов). Время исполнения приказов промерить пока не придумал как, но на глазок менее секунды в большинстве случаев. Одновременно можно выставить несколько заявок, т.е. войти в позицию и установить два тейк-профита для закрытия позиции частями. Это обрадовало, предполагал, что нужно будет ждать и отдавать приказы последовательно с определённым интервалом времени. Один недостаток, если приказ отклонён биржей, то заявка просто не появляется в системе, а Амиброкер не может узнать причину: недостаточно денег для исполнения? приказ выставлен по цене, выходящей за лимиты цены? Речь идёт о фьючерсах, тестировал на фьючерсе на индекс РТС. Перед началом разработки я просил выводить ещё файл с размером портфеля, и возможность получить текстовую информацию по инструменту - Лимиты цен и размер гарантийного обеспечения, если возможно.
2. Активные приказы и открытые позиции читаются Амиброкером и совпадают с отображаемыми в СмартТрейде. Пока у меня это проверено только на одном инструменте. На нескольких одновременно проверю в ближайшие дни.
3. Остаётся разобраться с отменой заявок, после чего afl код робота-индикатора выложу здесь.
С отменой заявок возникли вопросы по описанию плагина. В описании в таблице:
price -Цена для приказов LIMIT. Для приказов на покупку будут отменяться все приказы с ценой меньше или равной данной, а на продажу с ценой больше или равной данной.
amount -Объем приказа в лотах. Может быть 0.0, при этом не используется.
Что не используется? Количество не используется или приказ не проходит - не используется? Но если мы передали price -цену для приказов LIMIT, то будут отменяться все приказы с ценой меньше или равной данной. Пример ещё больше запутывает дело:
Пример записи, описывающей отмену LIMIT-приказа на покупку 10 контрактов фьючерса SBRF-6.12 по портфелю BP0694-RF-01 по цене 9050 рублей:
cancel_order? portfolio=BP0694-RF-01&security=SBRF-6.12_FT&action=BUY&type=LIMIT&price=9050& stop_price=0&amount=1
Рассмотрим ситуацию:
1. Открыта позиция - продано 10 контрактов фьючерса SBRF-9.12 по 9060,
2. Активные приказы :
а) на продажу 5 контрактов по 9070,
б) на покупку 10 контрактов по 9050,
в) на покупку 5 контрактов по 9040.
Прошу написать три строки приказов в трёх случаях:
хочу отменить все приказы,
хочу отменить все приказы на покупку, оставив на продажу и
хочу отменить 5 приказов из 10 на покупку по 9050.




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