Автор |
Сообщение |
Vladimir
Зарегистрирован: 30.10.2008
Сообщения: 62
|
У меня несколько роботов, каждый для своей бумаги и со своим фреймом, как их всех завязать через АА? Заявки и без АА выходят в квик, но не всегда, часто на тиках не выходит заявка. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
На тиках не проходит возможно потому, что в АА максимальная скорость прогона кода 1 раз в сек, а тики могут чаще поступать. Вероятна ситуация когда поступил сигнал, потом поступил еще один тик и сигнал "ушел". А потом прогоняется код и невидит сигнала. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
А несколько роботов придется объединять в один код. Тут имеет значение на разных символах они или все на одном? |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
Vladimir
Зарегистрирован: 30.10.2008
Сообщения: 62
|
У меня на два символа по два робота на 5-минутке, и тиках.
А если прогонять не через последнюю котировку, а через "от:..." последний день, сигналы будут на тиках? |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Давай я подробно распишу в воскресенье. А дальше будем смотреть... |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
Vladimir
Зарегистрирован: 30.10.2008
Сообщения: 62
|
Помню вот такую штуку:
Код: |
SetBarsRequired(100000,100000);
SetPositionSize(10, 4); // торгуем лотом
///////// система 1 /////////
if(Name() == "SRH9-1")
{
Buy = Cross(O,b1) AND a1>(Ref(a1,-1));
Short= Cross(b1,O) AND Ref(a1,-1)>(a1);
Sell = Short;
Cover= Buy ;
}
///////// система 2 /////////
if(Name() == "SRH9")
{
Buy = (Cross(O,b2) AND a2>Ref(a2,-1));
Short= (Cross(b2,O) AND Ref(a2,-1)>a2);
Sell = Short;
Cover= Buy ;
} |
можно ли в этот код записать строки с формированием транзакции для каждого кода, тогда будет одну формулу прогонять по разным символам и если имя совпадает с именем кода, то в случае сигдала, посылается сделка только по этому символу.
Вот только проблема, как в коде задать нужный фрейм, если одна система написана допустим для 5-минутки, а другая для 100-тиков |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
В общем так. Использование нескольких систем в роботе вводит некоторые ограничения. Совершенно нельзя использовать встроенные в ами функции тестирования ApplyStop(), Equity() и т.п. Поэтому придется стопы,если используются, описывать и расчитывать в коде
Кроме того если сигналы систем попадают на один бар и один символ, то надо или провести две одинаковые сделки на одном баре или провести одну сделку двойным лотом. С точки зрения контроля работы робота лучше две сделки с разными TRANS_ID т.е. в этот параметр желательно еще добавить идентификатор системы по которой проведена сделка.
Для разных фреймов проще всего использовать стандартные функции AFL TIMEFRAMESET() и TIMEFRAMEMODE()
По описанной задаче придется в качестве базового фрейма брать тиковый. Только его можно корректно пережимать и в минутные и тиковые бары. К сожалению я сам никогда не работал с не временными барами поэтому опыта практического использования нет.
В общих чертах код робота будет выглядеть примерно так.
Код: |
Account = "L01-00000F00"; // ваш аккаунт на бирже
Client = "49501"; // код клиента
Lots = 1; // сколько лотов желаете торговать
Otstup = 2; // в процентах. Заявка будет выставлена хуже текущей цены на столько процентов
FileName = "C:/Program Files/Quick/trans.tri"; // слэши прямые!!! имя файла с транзакциями для квика
dir = 0;
Classcode = GroupID(1);
if(TickSize == 0)
{
PopupWindow( "Не задан размер тика значение TickSize", "ошибка", timeout = 5, left = -1, top = -1 );
}
else
{
Otstup = round(LastValue(C)*Otstup/100/TickSize)*TickSize;
form = (1 + 0.1 * abs(floor(IIf(log10(TickSize)>0, 0, log10(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())+dir+sys"; ";
str = transid +
"PRICE=" +NumToStr(sprice, format = form, separator=False)+"; " +
"QUANTITY=" +NumToStr(Lots, format = 1.0, separator=False)+"; "+
"OPERATION=" +sOper+"; "+
"CLASSCODE=" +Classcode+"; "+
"ACTION=" +"NEW_ORDER; "+
"TYPE=" +"L; "+
"SECCODE=" +Name()+"; "+
"ACCOUNT=" +Account+"; "+
CCS;
savetrifile(transid, str);
}
function tri(Bu, Se, Sh, Co, s)
{
if(Bu)
{
price = Close[BarCount-1] + Otstup;
dir = "1";
sys = s;
makeandsave("B", price);
}
if(Se)
{
price = Close[BarCount-1] - Otstup;
dir = "2";
sys = s;
makeandsave("S", price);
}
if(Sh)
{
price = Close[BarCount-1] - Otstup;
dir = "3";
sys = s;
makeandsave("S", price);
}
if(Co)
{
price = Close[BarCount-1] + Otstup;
dir = "4";
sys = s;
makeandsave("B", price);
}
}
///////// Конец формирования транзакции. ///////
////////////////////////////////////////////////
/////////////////// Системы. ///////////////////
////////////////////////////////////////////////
////////// Правила системы 1 (5 мин) ///////////////
TimeFrameMode(0);
TimeFrameSet(in5Minute); // переключаемся на 5 минутки
Buy1 = Cross(C, MA(C, 10));
Sell1 = Cross(MA(C, 10), C);
Short1 = Sell1;
Cover1 = Buy1;
// фильтруем "лишние" сигналы
Buy1 = ExRem( Buy1, Sell1 );
Sell1 = ExRem( Sell1, Buy1 );
Short1 = ExRem( Short1, Cover1 );
Buy1 = ExRem( Cover1, Short1 );
// оставляем только последний зафиксированный сигнал
Buy1 = LastValue(Ref(Buy1, -1));
Sell1 = LastValue(Ref(Sell1, -1));
Short1 = LastValue(Ref(Short1, -1));
Cover1 = LastValue(Ref(Cover1, -1));
tri(Buy1, Sell1, Short1, Cover1, 1);
TimeFrameRestore();
////////// Правила системы 2 (100 tick) ///////////////
TimeFrameMode(1);
TimeFrameSet(100); // переключаемся на 100 тиковый график
Buy2 = Cross(C, Ref(HHV(H, 10), -1));
Sell2 = Cross(Ref(LLV(L, 10), -1), C);
Short2 = Sell2;
Cover2 = Buy2;
// фильтруем "лишние" сигналы
Buy2 = ExRem( Buy2, Sell2 );
Sell2 = ExRem( Sell2, Buy2 );
Short2 = ExRem( Short2, Cover2 );
Buy2 = ExRem( Cover2, Short2 );
// Тут оставлять только последний зафиксированный сигнал не надо т.к. пробой макс/мин
// и так фиксированный сигнал и не отменяется
Buy2 = LastValue(Buy2);
Sell2 = LastValue(Sell2);
Short2 = LastValue(Short2);
Cover2 = LastValue(Cover2);
tri(Buy2, Sell2, Short2, Cover2, 2);
TimeFrameRestore();
|
Только имейте ввиду, что я его не проверял а накидал только чтобы показать общую концепцию.
Почему запись в tri вызывается прямо изнутри сформированного фрейма? Т.к. базовый фрейм тиковый, а идентификация записи идет по времени бара то если сигналы расжать, то или расползутся на несколько тиков и будет несколько записей одного сигнала подряд или если их фильтрануть exrem'ом , т.к. максимальная скорость сканирования доступная в АА 1сек., будут закрываться следующим тиком и не попадать в tri. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
Vladimir
Зарегистрирован: 30.10.2008
Сообщения: 62
|
Забыл сказать, что одновременно торгую на споте и фьючах, т.е. акаунты разные, как и коды клиента, можно эти строки запихать в саму систему? Или как тут поступить? |
|
|
Посмотреть профиль Отправить личное сообщение |
|
Vladimir
Зарегистрирован: 30.10.2008
Сообщения: 62
|
И еще, я никогда не парился и торговал несколькими системами, т.е. на три символа открывал по своей системе, на некоторые даже две системы, включл АА на какую-то из них, любую, и все торговалось, ни один сигнал не пропускал, правда иногда вылетали левые сигналы, но редко, когда стал разбираться, увидел, что АА прогоняется только для одного кода, вот тогда и решил начать этот пост. Возможно запустить так АА, чтобы он прогонял по всем символам тот код, на котором он открыт, и вообще нужно ли запускать АА, если без него заявки выходят, проверял, работает, только бывает, что пропускает?
ЗЫ: АА я запускаю не на текущий символ, а на пользовательский фильтр (где выбираю фавориты, интересующие меня символы) и на каждом символе торгуется нужное кол-во лотов, заданное в роботе, написанном на данный символ... |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Vladimir писал(а): |
Забыл сказать, что одновременно торгую на споте и фьючах, т.е. акаунты разные, как и коды клиента, можно эти строки запихать в саму систему? Или как тут поступить? |
Тогда примерно так
Код: |
Account1 = "L01-00000F00"; // ваш аккаунт на бирже 1
Client1 = "49501"; // код клиента 1
Account2 = "L01-00000F01"; // ваш аккаунт на бирже 2
Client2 = "49502"; // код клиента 2
Lots = 1; // сколько лотов желаете торговать
Otstup = 2; // в процентах. Заявка будет выставлена хуже текущей цены на столько процентов
FileName = "C:/Program Files/Quick/trans.tri"; // слэши прямые!!! имя файла с транзакциями для квика
dir = 0;
Classcode = GroupID(1);
if(TickSize == 0)
{
PopupWindow( "Не задан размер тика значение TickSize", "ошибка", timeout = 5, left = -1, top = -1 );
}
else
{
Otstup = round(LastValue(C)*Otstup/100/TickSize)*TickSize;
form = (1 + 0.1 * abs(floor(IIf(log10(TickSize)>0, 0, log10(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, ak)
{
if(ak == 1)
{
Client = Client1;
Account = Account1;
}
else if (ak == 2)
{
Client = Client2;
Account = Account2;
}
CCS="";
if (Client != "") CCS="CLIENT_CODE="+Client+";";
transid = "TRANS_ID=" +FullName()+LastValue(TimeNum())+dir+sys"; ";
str = transid +
"PRICE=" +NumToStr(sprice, format = form, separator=False)+"; " +
"QUANTITY=" +NumToStr(Lots, format = 1.0, separator=False)+"; "+
"OPERATION=" +sOper+"; "+
"CLASSCODE=" +Classcode+"; "+
"ACTION=" +"NEW_ORDER; "+
"TYPE=" +"L; "+
"SECCODE=" +Name()+"; "+
"ACCOUNT=" +Account+"; "+
CCS;
savetrifile(transid, str);
}
function tri(Bu, Se, Sh, Co, s)
{
if(Bu)
{
price = Close[BarCount-1] + Otstup;
dir = "1";
sys = s;
makeandsave("B", price, sys);
}
if(Se)
{
price = Close[BarCount-1] - Otstup;
dir = "2";
sys = s;
makeandsave("S", price, sys);
}
if(Sh)
{
price = Close[BarCount-1] - Otstup;
dir = "3";
sys = s;
makeandsave("S", price, sys);
}
if(Co)
{
price = Close[BarCount-1] + Otstup;
dir = "4";
sys = s;
makeandsave("B", price, sys);
}
}
///////// Конец формирования транзакции. ///////
////////////////////////////////////////////////
/////////////////// Системы. ///////////////////
////////////////////////////////////////////////
////////// Правила системы 1 (5 мин) ///////////////
TimeFrameMode(0);
TimeFrameSet(in5Minute); // переключаемся на 5 минутки
Buy1 = Cross(C, MA(C, 10));
Sell1 = Cross(MA(C, 10), C);
Short1 = Sell1;
Cover1 = Buy1;
// фильтруем "лишние" сигналы
Buy1 = ExRem( Buy1, Sell1 );
Sell1 = ExRem( Sell1, Buy1 );
Short1 = ExRem( Short1, Cover1 );
Buy1 = ExRem( Cover1, Short1 );
// оставляем только последний зафиксированный сигнал
Buy1 = LastValue(Ref(Buy1, -1));
Sell1 = LastValue(Ref(Sell1, -1));
Short1 = LastValue(Ref(Short1, -1));
Cover1 = LastValue(Ref(Cover1, -1));
tri(Buy1, Sell1, Short1, Cover1, 1);
TimeFrameRestore();
////////// Правила системы 2 (100 tick) ///////////////
TimeFrameMode(1);
TimeFrameSet(100); // переключаемся на 100 тиковый график
Buy2 = Cross(C, Ref(HHV(H, 10), -1));
Sell2 = Cross(Ref(LLV(L, 10), -1), C);
Short2 = Sell2;
Cover2 = Buy2;
// фильтруем "лишние" сигналы
Buy2 = ExRem( Buy2, Sell2 );
Sell2 = ExRem( Sell2, Buy2 );
Short2 = ExRem( Short2, Cover2 );
Buy2 = ExRem( Cover2, Short2 );
// Тут оставлять только последний зафиксированный сигнал не надо т.к. пробой макс/мин
// и так фиксированный сигнал и не отменяется
Buy2 = LastValue(Buy2);
Sell2 = LastValue(Sell2);
Short2 = LastValue(Short2);
Cover2 = LastValue(Cover2);
tri(Buy2, Sell2, Short2, Cover2, 2);
TimeFrameRestore();
|
|
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Vladimir писал(а): |
Возможно запустить так АА, чтобы он прогонял по всем символам тот код, на котором он открыт, и вообще нужно ли запускать АА, если без него заявки выходят, проверял, работает, только бывает, что пропускает?
|
АА прогоняет код по символам которые выбраны в Apply to:
Это может быть только активный символ, или все символы в базе или только часть символов определяемая фильтром.
Vladimir писал(а): |
ЗЫ: АА я запускаю не на текущий символ, а на пользовательский фильтр (где выбираю фавориты, интересующие меня символы) и на каждом символе торгуется нужное кол-во лотов, заданное в роботе, написанном на данный символ... |
угу. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
Vladimir
Зарегистрирован: 30.10.2008
Сообщения: 62
|
Оромное СПАСИБО!!!
Скажи, как использовать на каждый аккаунт по две системы? Т.е. на на споте я торгую двумя системами, одна хорошо работает на больших изменениях цены, другая на маленькие изменения срабатывает, не объеденяю в одну систему, т.к. они на разных фреймах, также и на фортсе по две системы на разных фреймах но одной бумаге? |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
В последнем арианте кода 2 аккаунта (один для первой системы ворой для второй) и 2 клиента (аналогично). Забивай одинаковые и все дела. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
Vladimir
Зарегистрирован: 30.10.2008
Сообщения: 62
|
Я буду называть торговым кодом тот участок скрипта, который определяет, входить ли в позицию ли нет, и когда из нее выходить, в вышеописанном вареанте например это:
Код: |
Buy1 = Cross(C, MA(C, 10));
Sell1 = Cross(MA(C, 10), C);
Short1 = Sell1;
Cover1 = Buy1;
|
Я поставлю задачу более грамотно:
1. имеется один торговый код для спота на пятиминутке с одним колличеством лотов, допустим 100 лотов
2. имеется второй торговый код для спота на ту же акцию, только на сто тиков и на 10 лотов
3. имеется третий торговый код на фьючерсном рынке, т.е. др. аккаунт, на 1 минуте на 10 лотов
4. Имеется четвертый торговый код на тот же фьючерс, только на 5 лотов и на сто тиков.
Вот начал собирать все в кучу, но голова пошла кругом.
Не могу сообразить, как каждый код будет работать на свой аккаунт на свое колличество тиков и на свой фрейм.
Т.е. задача такова: необходим универсальный код-скелет, в который можно вставить несколько торговых кодов, каждый из которых только именно на свой аккаунт, на свой символ, на свое колличество тиков и на свой фрейм.
Получится универсальная машина, готовая совместить в себе всевозможные торговые коды, способная торговать разом на все площадки, или далее, унифицировать ее под системы, выбирающие лучшие из возможных бумаги для открытия позиций, имея лимитированное колличество днежных средств. По сути кибер машина.
ЗЫ: Простите за столь частое беспокойство и дотошность |
|
|
Посмотреть профиль Отправить личное сообщение |
|
Vladimir
Зарегистрирован: 30.10.2008
Сообщения: 62
|
Возможно так написать, чтобы с заданным фреймом для символа A-sim прогонялся код A-sim.afl, для символа B-sim прогонялся код B-sim.afl
Код: |
///////// система 1 /////////
if(Name() == "A-sim")
{
TimeFrameMode(0);
TimeFrameSet(in5Minute);
scan =>> A-sim.afl;
}
///////// система 2 /////////
if(Name() == "B-sim")
{
TimeFrameMode(1);
TimeFrameSet(100);
scan =>> b-sim.afl;
} |
а уже в самом коде А-sim.afl и В-sim.afl есть и аккаунт и "Сюда руками не лазить!!!" и колличество лотов и т.д. Одним словом, все то, что написанно именно под интересующий символ и интересующий фрем.
Т.е. логически это выглядит примерно так:
1. Из всей БД берется один символ
2. Расчет по выбранному символу ведется с 5-минутным фреймом
3. В расчете участвует формула A-sim.afl, в которой написан алгоритм формирования транзакции на интересующую бумагу с определенным колличеством лотов и своим торговым кодом
4. после прогона, далее берется второй символ из БД...
и т.д., тогда можно будет по данному алгоритму подключить много разных кодов по всем торговым площадкам, а путаници, думаю, будет значительно меньше, в отличие от того, если все торговые коды впихивать в один. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
|
|
Следующая тема
Предыдущая тема
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете вкладывать файлы Вы не можете скачивать файлы
|
|