Автор |
Сообщение |
Старый Пень
Зарегистрирован: 22.02.2012
Сообщения: 41
|
АйТиИнвест выпустил новый плагин для автоматизации общения Амиброкера с их торговой системой. Для выставления приказов Амиброкет должен создавать новые файлы, содержащие одну строку.
Среди операторов Ами я такой функции не встречал. Есть создание директории. А создания файла нет. Кто-нибудь может подсказать, как можно в коде Ами создавать файлы, причём строка названия файла должна содержать изменяемые данные - номер приказа, дату и время ??? |
|
|
Посмотреть профиль Отправить личное сообщение |
![](images/spacer.gif) |
000
Site Admin
![](images/avatars/183029264847fb5337d4ea4.gif)
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Функция fopen() прекрасно создает файл если такого еще нет.
Попробуй код.
Код: |
fh = fopen("myfile.test", "w");
fclose(fh); |
и в папке куда установлен Ами найдешь пустой файл myfile.test |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
![](images/spacer.gif) |
Старый Пень
Зарегистрирован: 22.02.2012
Сообщения: 41
|
Да. Действительно создаёт. Спасибо. А где можно посмотреть код робота для квика, чтобы попытаться сделать анелогичный для СмартКома? |
|
|
Посмотреть профиль Отправить личное сообщение |
![](images/spacer.gif) |
000
Site Admin
![](images/avatars/183029264847fb5337d4ea4.gif)
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
![](images/spacer.gif) |
kosbar
Зарегистрирован: 17.03.2009
Сообщения: 356
|
а можно ссылку на описание всей новизны нового плагина? |
|
|
Посмотреть профиль Отправить личное сообщение ICQ Number |
![](images/spacer.gif) |
Старый Пень
Зарегистрирован: 22.02.2012
Сообщения: 41
|
Пробую писать код для чтения списка открытых позиций из файла и чтения активных приказов из файла списка приказов. Не уверен, будет ли он работать. Прошу знатоков оказать помошь. Непонятки, как из function выводить большой список переменных, которые могут понадобиться позже. И как работает слово return. И ещё вопросик. Код функции может находиться в любом месте по отношению к основной программе? |
|
|
Посмотреть профиль Отправить личное сообщение |
![](images/spacer.gif) |
Старый Пень
Зарегистрирован: 22.02.2012
Сообщения: 41
|
ParamList( "Ticker","RIU2|GZU2|SRU2|SiU2|VBU2",defaultval = 0 );
Ticker = FullName();
/////////////////////////////////////////////////////////////////////////////////////////////
// ФУНКЦИЯ ЧТЕНИЯ ФАЙЛА ОТКРЫТЫХ ПОЗИЦИЙ OpenPosStatement.dat
/////////////////////////////////////////////////////////////////////////////////////////////
function OpenPosReading()
{
OpenPosStatement="C:/ProgramFiles(x86)/AmiBroker/transactions/OpenPosStatement.dat";
file_open_pos = fopen( OpenPosStatement, "r" );
printf("ФАЙЛ OpenPosStatement ОТКРЫТ ДЛЯ ЧТЕНИЯ\n");
if (file_open_pos)
{
while (!feof(file_open_pos))
{
open_pos = fgets(file_open_pos); // вот так fgets читает файл OpenPosStatement.dat до конца
printf( fgets(file_open_pos) );
printf("ФАЙЛ OpenPosStatement ПРОЧИТАН И ЗАКРЫТ\n");
}
fclose(file_open_pos); //нашли, закрываем файл.
StrFound = StrFind(file_open_pos,"Open position: BP0001-RF-01"); //Сохраняем значение
printf("ОТКРЫТАЯ ПОЗИЦИЯ НАЙДЕНА\n");
printf(StrFound+"\n");
Number_of_Lots = StrToNum(StrExtract( StrFound, 2 )); // Извлекаем количество лотов, переводим в текстовый формат
Weighted_price = StrToNum(StrExtract( StrFound, 3 )); // Извлекаем цену, переводим в текстовый формат
/*" Open position: BP0001-RF-01, SBRF-6.12_FT, -1, 8264, 0" Так выглядит файл открытых позиций */
}
StaticVarSet("Number_of_Lots",Number_of_Lots);// will return число лотов
printf(Number_of_Lots+"\n"); // Печатаем число лотов имеющейся открытой позиции
StaticVarSetText("Pos_status",StrFound)==IIf(StrFound,Opened,Not_opened);
StaticVarSetText("Opened_pos",Number_of_Lots)==IIf((Number_of_Lots>0),Long,0); //will return направление открытой позиции Long
printf(Opened_pos+"\n"); // Печать направления открытой позиции
StaticVarSetText("Opened_pos",Number_of_Lots)==IIf((Number_of_Lots<0),Short,0); //will return направление открытой позиции Short
printf(Opened_pos+"\n"); // Печать направления открытой позиции
StaticVarSet("Weighted_price",Weighted_price);// will return средневзвешенную цену
printf(Weighted_price+"\n"); // Печатаем цену позиции
printf("ФАЙЛ OpenPosStatement ПРОЧИТАН\n");
}
/////////////////////////////////////////////////////////////////////////////////////////////
// ФУНКЦИЯ ЧТЕНИЯ ФАЙЛА ВЫСТАВЛЕННЫХ ПРИКАЗОВ TransacStatement.dat
/////////////////////////////////////////////////////////////////////////////////////////////
function ReadTransactions()
{
TransacStatement="C:/ProgramFiles(x86)/AmiBroker/transactions/TransacStatement.dat";
file_Transac_open = fopen( TransacStatement, "r" );
Number_of_Transac=0;
Transac_price=0;
if (file_Transac_open)
{
while (!feof(file_Transac_open))
{
open_Transac = fgets(file_Transac_open); // fgets читает файл TransacStatement.dat до конца
}
fclose(open_Transac); //нашли, закрываем файл.
}
StrFound = StrFind(open_Transac,"Open"); //Сохраняем строку, содержащую значение "Open"
Open_or_not = StrExtract( StrFound, 6); // Нашли и сохранили статус - открыто или нет
Transac_is_opened == IIf(Open_or_not == "Open",1,0);
printf("СТАТУС ПРИКАЗА" +Open_or_not+"\n");
printf(StrFound+"\n");
Ticker_open_Transac = StrToNum(StrExtract( StrFound, 1)); // Нашли и сохранили тикер. Потом разберёмся он нужен или нет
printf(Ticker_open_Transac+"\n"); // Печать тикера
Transac_num = StrToNum(StrExtract( StrFound, 2)); // Нашли и сохранили номер приказа. Потом разберёмся он нужен или нет
printf(Transac_num+"\n"); // Печать номера приказа
Transac_price = StrToNum(StrExtract( StrFound, 3)); // Нашли и сохранили цену исполнения. Потом разберёмся она нужна или нет
printf(Transac_price+"\n"); // Печать цены исполнения
Transac_Lots_num = StrToNum(StrExtract( StrFound, 5)); // Нашли и сохранили количество бумаг. Потом разберёмся оно нужно или нет
printf(Transac_Lots_num+"\n"); // Печать цены исполнения
//if (StrFind(open_Transac,FullName())>0 AND StrFind(open_Transac, "BP0001")>0) //AND StrFind(open_Transac,"Active:")>0)
// Текст активного приказа - Active: BP0001-RF-01, SBRF-6.12_FT, 1184945893, 8207, 0, 1, Open
{
StrFound = open_Transac; //нашли строку с активным приказом, сохранили для дальнейшей
//обработки(пока предполагаем что запись одна, счет один для выяснения какая поза, сколько)
found=1;
}
VarSet("Number_of_Transac"+i,StrToNum(StrExtract( StrFound, 5 )));// will return число лотов
VarSet("Transac_price"+i,StrToNum(StrExtract( StrFound, 3 )));// will return цену заявки
}
OpenPosReading()
/////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
Посмотреть профиль Отправить личное сообщение |
![](images/spacer.gif) |
000
Site Admin
![](images/avatars/183029264847fb5337d4ea4.gif)
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Старый Пень писал(а): |
Пробую писать код для чтения списка открытых позиций из файла и чтения активных приказов из файла списка приказов. Не уверен, будет ли он работать. Прошу знатоков оказать помошь. Непонятки, как из function выводить большой список переменных, которые могут понадобиться позже. И как работает слово return. И ещё вопросик. Код функции может находиться в любом месте по отношению к основной программе? |
1. Надо разобраться чем отличается функция и процедура.
И то и другое это кусок длинного кода, который потом можно вызвать короткой строкой. Разница в том, что функция обязательно вернет какое либо значение
Код: |
функция БлаБла()
{
x = считаем x;
return x;
}
....
qqq = БлаБла(); |
В данном случае qqq будет равно x,
а процедура ничего не возвращает
Код: |
процедура БлаБла()
{
x = считаем x;
}
....
БлаБла(); |
Просто будет выпонен код который внутри процедуры.
Функция и процедура должны быть описаны в коде раньше, чем они вызываются.
Функция возвращает только одно значение или массив, но внутри себя (как и процедура) она может присвоить нужные значения нужному количеству глобальных переменных.
Вот так... |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
![](images/spacer.gif) |
Старый Пень
Зарегистрирован: 22.02.2012
Сообщения: 41
|
Я это понимаю. Однако на практике когда пишу return , а потом много переменных, AFL ругается. Как выводить много переменных из функции? |
|
|
Посмотреть профиль Отправить личное сообщение |
![](images/spacer.gif) |
Старый Пень
Зарегистрирован: 22.02.2012
Сообщения: 41
|
А если функция присвоит значения нескольким глобальным переменным, как потом обращаться к этим переменным из любой точки программы? Писать VarGet или как ? |
|
|
Посмотреть профиль Отправить личное сообщение |
![](images/spacer.gif) |
000
Site Admin
![](images/avatars/183029264847fb5337d4ea4.gif)
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Я же написал, что никак. Функция возвращает только одну переменную или только один массив. Если надо, чтобы функция считала несколько значений, то из просто внутри функции присваиваешь глобальным переменным.
Сам подумай, если напишешь qqq = функция(), а функция вернет несколько значений, то как это будет выглядеть???? |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
![](images/spacer.gif) |
Старый Пень
Зарегистрирован: 22.02.2012
Сообщения: 41
|
Задача такова: из строки выбрать нужные поля и в зависимости от содержания полей, присвоить переменным нужные значения. Причём эти переменные должны быть доступны из любой точки программы. Получается, что function для этих целей не годится? |
|
|
Посмотреть профиль Отправить личное сообщение |
![](images/spacer.gif) |
Старый Пень
Зарегистрирован: 22.02.2012
Сообщения: 41
|
Делать отдельную function для каждого поля это глупо. Как же быть? |
|
|
Посмотреть профиль Отправить личное сообщение |
![](images/spacer.gif) |
000
Site Admin
![](images/avatars/183029264847fb5337d4ea4.gif)
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Если надо узнать позицию по конкретной бумаге, то зачем знать все позиции? Напимер робот сейчас сканирует SBER, ищем сбер в файле и возвращаем из функции позицию.
Но можно и по другому.
Заводим 3 переменных
posSBER = 0;
posLKOH = 0;
posGAZ = 0;
потом пишем код который просматривает текстовый файл и присваивает соответствующие значения этим переменным.
и далее имеем возможность в любой момент х посмотреть. Тогда ни функция ни процедура не нужна.
Вообще функцию или процедуру пишут в двух случаях.
1. Когда в коде надо несколько раз выполнять один и тот же кусок, чтобы его не переписывать каждый раз
2. Иногда это делают просто для удобства, по привычке.... |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
![](images/spacer.gif) |
Старый Пень
Зарегистрирован: 22.02.2012
Сообщения: 41
|
Мне не надо все позиции.
/*" Open position: BP0001-RF-01, SBRF-6.12_FT, -1, 8264, 0" Так выглядит файл открытых позиций */
Мне надо в файле найти строку где есть подстрока Open position:
Присвоить какой нибудь переменной Open_pos значение True если эта подстрока найдена.
Потом найти поле после второй запятой. Это поле содержит значение "минус один". Если это значение больше 0, то открытая позиция является позицией ЛОНГ, если меньше 0, то открытая позиция является ШОРТом. Потом также выделить цену исполнения, может пригодится потом. Смысл какой? До формирования и отправки приказа проверяем наличие открытых позиций. Если поза есть, то не открываем новых позиций. Если не находим строку Open position:, значит можно формировать новый приказ. После того как приказ отправлен в нужный файл, программа игнорирует любые сигналы до момента появления строки, содержащей Open position:, потом снова находим нужные поля, проверяем, ЛОНГ это или ШОРТ, проверяем количество лотов, если оно совпадает с приказом, значит поза открыта полностью. Если поза открыта полностью, значит далее игнорируем все сигналы BUY, ждём сигнала SELL итд итп... |
|
|
Посмотреть профиль Отправить личное сообщение |
![](images/spacer.gif) |
|