Торговый автомат Амиброкер+Квик

  • Автор темы mehanizator1
  • Дата начала
Понял ты ограничил генерацию сигналов, а я подумал что ты систему транзакции правил. :)
Подумал еще немного о твоей проблеме. Теоретически вторая заявка может не попадать вот по какой причине. Возможно, в AmiBroker'е обработка графиков реализована параллельно. В момент одновременного возникновения нескольких сигналов соответствующий код индикатора обращается к файлу. Поскольку в AmiBroker'е используются древние функции для работы с файлами, то они открывают файл в монопольном режиме и поэтому когда первый индикатор открыл файл на запись или на чтение, то другой индикатор уже не может получить доступ к этому файлу. Если несколько сигналов поступило на последней минуте текущего бара, то сигнал, который был не обработан по причине заблокированного файла, останется необработанным. Соответственно, решение этой проблемы может состоять в увеличении попыток доступа к файлу транзакций, например так:

procedure savetrifile(stransid,sstr) {
f = 0; n = 100;
while (n > 0 AND f = 0)
{
f=fopen(FileName,"r");
n--;
}
found=0;
if (f) {
while (!feof(f)) {
s=fgets(f);
if (StrFind(s,stransid)>0) {
found=1;
}
}
fclose(f);
}
if (found==0) {
n = 100;
while (n > 0 AND f = 0)
{
f=fopen(FileName,"a");
n--;
}
if (f) {
fputs(sstr+"\n",f);
fclose(f);
}
}
}
 

Commenced

New member
Понял ты ограничил генерацию сигналов, а я подумал что ты систему транзакции правил. :)
Подумал еще немного о твоей проблеме.
Спасибо. Меня больше беспокоит другая проблема, у меха идет жесткая привязка к текущей С бара, при отправке сигнала, я сейчас строю систему со смещением на 1 бар, т.e. при наступлении условия, кидается заявка равная например значению ref(O,-1) можно конечно тупо добавлять Buy = <условие> and < c>=ref(O,-1) и она отправится конечно, но обычно это произходит уколом и можно просто не успеть. Хотелось бы чтоб при наступлении только условия сразу выставлялась расчитанная заявка и при неисполнении в течении например 20 минут снималась. Не подскажиш как с этой проблемой побороться.
 
Спасибо. Меня больше беспокоит другая проблема, у меха идет жесткая привязка к текущей С бара, при отправке сигнала, я сейчас строю систему со смещением на 1 бар, т.e. при наступлении условия, кидается заявка равная например значению ref(O,-1) можно конечно тупо добавлять Buy = <условие> and < c>=ref(O,-1) и она отправится конечно, но обычно это произходит уколом и можно просто не успеть. Хотелось бы чтоб при наступлении только условия сразу выставлялась расчитанная заявка и при неисполнении в течении например 20 минут снималась. Не подскажиш как с этой проблемой побороться.
Я понял так, что при отправке транзакции берется текущая цена и на базе ее вычисляется цена покупки/продажи на основании заданного отступа, т.е. фактически идет покупка/продажа по рынку. Чтобы контролировать исполнение заявки, нужно анализировать tro файл, а это геморойно, т.к. заявка может выполниться и частично. Для этого в квике аж специальную DLL сделали. Если нужно гибко управлять заявками, то нужно писать отдельный непростой модуль. Такой модуль - это составная часть любой скальперской системы.
 

Commenced

New member
Спасибо. Меня больше беспокоит другая проблема, у меха идет жесткая привязка к текущей С бара, при отправке сигнала, я сейчас строю систему со смещением на 1 бар, т.e. при наступлении условия, кидается заявка равная например значению ref(O,-1) можно конечно тупо добавлять Buy = <условие> and < c>=ref(O,-1) и она отправится конечно, но обычно это произходит уколом и можно просто не успеть. Хотелось бы чтоб при наступлении только условия сразу выставлялась расчитанная заявка и при неисполнении в течении например 20 минут снималась. Не подскажиш как с этой проблемой побороться.
Я понял так, что при отправке транзакции берется текущая цена и на базе ее вычисляется цена покупки/продажи на основании заданного отступа, т.е. фактически идет покупка/продажа по рынку. Чтобы контролировать исполнение заявки, нужно анализировать tro файл, а это геморойно, т.к. заявка может выполниться и частично. Для этого в квике аж специальную DLL сделали. Если нужно гибко управлять заявками, то нужно писать отдельный непростой модуль. Такой модуль - это составная часть любой скальперской системы.
Вот я и хотел отойти от текущей цены, забивая конкретную до того как эту точку пересечет С. Насчет контроля думаю, что если станет очень необходимо придется забить систему в сам квик он вроде позволяет писать системы.
 

empenoso

New member
Подача стопов

Уважаемый mehanizator, подскажите, можно при помощи вашего отличного скрипта посылать стопы?

Идея вкратце: при открытиии позиции на сервер отсылаетя стоп - на самый крайний случай (он не используется для управления позицией - только если обрыв связи или все плохо...) Ставить его ниже цены покупки на opt1.
Выход из позиции так и остается отдельным выходом.

Для реализации стопа понимаю, что можно подредактировать скрипт и вместо ACTION=NEW_ORDER писать ACTION=NEW_STOP_ORDER (создать отдельную функцию только для стопов - параллельно с функцией записи транзакций).

Он их будет ставить (в теории) - но самое главное при выходе из позиции - поствленный стоп надо снимать. Чтобы его снять надо считывать текстовый *.tro файл для получения ID стопа.
Хочу у Вас узнать - эти рассуждения можно практически реализовать без использования API Квика?
 

SV

New member
выставить то можно, а как вы будете контроллировать исполнился он или нет? амиброкером так не сделаешь.
Что значит контролировать? Ведь если цена побывала на уровне этого стопа, то он исполнился, а иначе неисполнился. Правильно?

Убивать заявки тоже можно довольно просто:
после ACTION=NEW_STOP_ORDER; записываем CLIENT_CODE= code//key;
после ACTION=KILL_ALL_STOP_ORDERS; записываем COMMENT=key;
где key - ключик, которым вы обозначаете свой стоп
code - собственно код клиента

зы: возможно в последнем Квике что-то изменилось
 

SV

New member
ну может быть... по-моему надежней это все-таки в экселе сделать.
Кстати, вы в соседней теме писали, что у вас роботы на экселе сделаны и на дельфях. Можно узнать почему вы отказались от ами? и какие, по вашему, плюсы/минусы есть при построении робота в ами, екселе, дельфи?
 

mehanizator1

New member
ну может быть... по-моему надежней это все-таки в экселе сделать.
Кстати, вы в соседней теме писали, что у вас роботы на экселе сделаны и на дельфях. Можно узнать почему вы отказались от ами? и какие, по вашему, плюсы/минусы есть при построении робота в ами, екселе, дельфи?
отказался? я на нем и не торговал никогда. просто в процессе изучения языка амиброкера написал простой скрипт для автоматизации - вдруг кому понадобится :)
 
ну может быть... по-моему надежней это все-таки в экселе сделать.
Кстати, вы в соседней теме писали, что у вас роботы на экселе сделаны и на дельфях. Можно узнать почему вы отказались от ами? и какие, по вашему, плюсы/минусы есть при построении робота в ами, екселе, дельфи?
отказался? я на нем и не торговал никогда. просто в процессе изучения языка амиброкера написал простой скрипт для автоматизации - вдруг кому понадобится :)
А чем excel то понравился? Как ты в нем всякие индикторы считаешь?
 

SV

New member
Кстати, вы в соседней теме писали, что у вас роботы на экселе сделаны и на дельфях. Можно узнать почему вы отказались от ами? и какие, по вашему, плюсы/минусы есть при построении робота в ами, екселе, дельфи?
отказался? я на нем и не торговал никогда. просто в процессе изучения языка амиброкера написал простой скрипт для автоматизации - вдруг кому понадобится :)
Понял.
И все таки интересно услышать еще ответ на второй вопрос о плюсах/минусах :)
 

mehanizator1

New member
А чем excel то понравился? Как ты в нем всякие индикторы считаешь?
эксель простой, мощный и удобный. я когда первого робота писал, просто вижуал бейсика не знал, а с дельфой хорошо ладил, поэтому и написал на дельфе.
а индикаторы какие проблемы посчитать если есть формула?
 

mehanizator1

New member
И все таки интересно услышать еще ответ на второй вопрос о плюсах/минусах :)
ну эксель и дельфа достаточно мощные средства разработки, тут уже кому что нравится, а создать можно что угодно.
а амиброкер - ну одну систему по одной фишке по не сильно короткому таймфрейму можно еще наверное вести, а целую кучу я бы не рискнул, вдруг чего сбойнет...
 

rbatyrkaev

New member
Внес некоторые изменения, теперь можно торговать одновременно много систем на многих бумагах:

Диверсифицируйтесь на здоровье :)
А можно поподробней, как заставить автомат работать одновременно по нескольким инструментам. Если я правильно понял дело в "TickerID", но как его присвоить разным бумагам непонятно. Если не трудно приведите пример кода. Заранее спосибо.[/code]
 
Внес некоторые изменения, теперь можно торговать одновременно много систем на многих бумагах:

Диверсифицируйтесь на здоровье :)
А можно поподробней, как заставить автомат работать одновременно по нескольким инструментам. Если я правильно понял дело в "TickerID", но как его присвоить разным бумагам непонятно. Если не трудно приведите пример кода. Заранее спосибо.[/code]
У меня сделано так. Открываем несколько окон и для каждого окна выбираем свой тикер. Создаем свою систему для каждого тикера, устанавливаем для них разные TickerID. Если по какому-то тикеру нужно несколько систем, то можно задействовать вкладки.
 

mehanizator1

New member
Внес некоторые изменения, теперь можно торговать одновременно много систем на многих бумагах:

Диверсифицируйтесь на здоровье :)
А можно поподробней, как заставить автомат работать одновременно по нескольким инструментам. Если я правильно понял дело в "TickerID", но как его присвоить разным бумагам непонятно. Если не трудно приведите пример кода. Заранее спосибо.
одной системе присваеваете 1, другой 2, третьей 3. просто разным системам разные, чтоб не путались.
 

000

New member
робот

Блин. Господа, я не выдержал и зарегился чтобы сказать. Зачем так издеваться над ами? Все делается совсем не так.
1. Создаете базу.
2. Распихиваете бумаги по группам в базе (А1 в одну группу, Б в другую, внесписочные в третью и т.д.)
3. эти группы переименовываете в соответствии с кодами класса (EQBR, EQNL и т.д.) Это делается при помощи Symbol -> Categories
4. В Information, в поле FullName пишем 01, 02, 03, и т.д. Для каждой бумаги свой номер.
5. Обязательно заносите в Information значение минимального шага цены (в поле Tick Size)
6. зафигачиваем примерно такого работа
Код:
///////// Установки ///////////

TimeFrame		= 60;						// таймфрейм в секундах.
Account			= "L01-00000000";	// ваш аккаунт на бирже
Client			= "";				// код клиента
Lots				= 1;							// сколько лотов желаете торговать
Otstup			= 2;							// в процентах. заявка будет выставлена хуже текущей цены на столько процентов
FileName		="C:/Program Files/QUIK-Junior/trans.tri"; // слэши прямые!!! имя файла с транзакциями для квика


////////// Правила системы ///////////////


Buy =  Cross(MACD(), Signal());
Sell = Cross(Signal(), MACD());
Short = 0;
Cover = 0;

////// Убираем лишние сигналы /////////////

Buy=ExRem(Buy,Sell);
Sell=ExRem(Sell,Buy);

Buy = Ref(Buy, -1);
Sell = Ref(Sell, -1);
Short = Ref(Short, -1);
Cover = Ref(Cover, -1);

Buy = LastValue(Buy);
Sell = LastValue(Sell);
Short = LastValue(Short);
Cover = LastValue(Cover);



//////////// Формируем транзакцию.//////////////
////////////////////////////////////////////////
//////// !!!!СЮДА РУКАМИ НЕ ЛАЗИТЬ!!!! /////////
////////////////////////////////////////////////

Classcode = GroupID(1);
Otstup = round(LastValue(C)*Otstup/100/TickSize)*TickSize;


procedure savetrifile(stransid,sstr) 
{
	f = fopen(FileName, "r");
	found = 0;
	if(f) 
	{
		while(!feof(f)) 
		{
			s = fgets(f);
			if(StrFind( s, stransid) > 0) found = 1;
		}
		fclose(f);
	}
	if (NOT found) 
		{
			f = fopen(FileName, "a");
				if(f) 
				{
					fputs(sstr+"\n",f);
					fclose(f);
				}
		}
}

function makeandsave(sOper, sprice) 
{
	CCS="";
	if (Client != "")  CCS="CLIENT_CODE="+Client+";";

	transid = "TRANS_ID="	+FullName()+LastValue(TimeNum())+"; ";

	str = transid	+
	"PRICE="			+NumToStr(sprice, format = 1.3, separator=False)+"; " +
	"QUANTITY="		+NumToStr(Lots, format = 1.0)+"; "+
	"OPERATION="	+sOper+"; "+
	"CLASSCODE="	+Classcode+"; "+
	"ACTION="			+"NEW_ORDER; "+
	"TYPE="				+"L; "+
	"SECCODE="		+Name()+"; "+
	"ACCOUNT="		+Account+"; "+
	CCS;

	savetrifile(transid, str);
}

if (TimeFrame == Interval() & FullName() != "") 
{
	if(Buy) 
	{ 
		price = Close[BarCount-1] + Otstup;
		makeandsave("B", price);
	}
	if(Sell) 
	{ 
		price = Close[BarCount-1] - Otstup;
		makeandsave("S", price);
	}
	if(Short) 
	{ 
		price = Close[BarCount-1] - Otstup;
		makeandsave("S", price);
	}
	if(Cover) 
	{ 
		price = Close[BarCount-1] + Otstup;
		makeandsave("B", price);
	}

}

//// mehanizator (c) 2004, ссылки мне запрещены
//// 000 (c) 2008, реклама покоцана мной
7. Засовываете этот код в автоматический анализатор.
8. ставим настройки. All symbols или Curent или use filter (какие бумаги торговать будем)
9. В settings в Periodicity: устанавливаем правильный фрейм.
10. Range устанавливаем n-last quotations n = 1
11. Отмечаем опцию Run every: и пишем 30sec (например)
12. Топчем Scan
13. Пьем чай
14. Переключаем бумаги на чарте
15. меняем фреймы
16. сворачиваем ами в панель задачь
17. Играем в Luxor

А ами тем временем херачит заявки не смотря ни на что.
 
Your email address will not be publicly visible. We will only use it to contact you to confirm your post.
Сверху