Список форумов AmiSite.ru AmiSite.ru
Форум по Ами
 FAQ  •  Поиск  •  Пользователи  •  Группы   •  Регистрация  •  Профиль  •  Войти и проверить личные сообщения  •  Вход
 Несколько роботов через АА Следующая тема
Предыдущая тема
Начать новую тему  Ответить на тему
Автор Сообщение
Vladimir



Зарегистрирован: 30.10.2008
Сообщения: 62

СообщениеДобавлено: Пт Апр 17, 2009 2:04 pm Ответить с цитатой Вернуться к началу

У меня несколько роботов, каждый для своей бумаги и со своим фреймом, как их всех завязать через АА? Заявки и без АА выходят в квик, но не всегда, часто на тиках не выходит заявка.
Посмотреть профиль Отправить личное сообщение
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Пт Апр 17, 2009 6:03 pm Ответить с цитатой Вернуться к началу

На тиках не проходит возможно потому, что в АА максимальная скорость прогона кода 1 раз в сек, а тики могут чаще поступать. Вероятна ситуация когда поступил сигнал, потом поступил еще один тик и сигнал "ушел". А потом прогоняется код и невидит сигнала.

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Пт Апр 17, 2009 6:04 pm Ответить с цитатой Вернуться к началу

А несколько роботов придется объединять в один код. Тут имеет значение на разных символах они или все на одном?

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Vladimir



Зарегистрирован: 30.10.2008
Сообщения: 62

СообщениеДобавлено: Пт Апр 17, 2009 7:50 pm Ответить с цитатой Вернуться к началу

У меня на два символа по два робота на 5-минутке, и тиках.

А если прогонять не через последнюю котировку, а через "от:..." последний день, сигналы будут на тиках?
Посмотреть профиль Отправить личное сообщение
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Пт Апр 17, 2009 8:46 pm Ответить с цитатой Вернуться к началу

Давай я подробно распишу в воскресенье. А дальше будем смотреть...

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Vladimir



Зарегистрирован: 30.10.2008
Сообщения: 62

СообщениеДобавлено: Пт Апр 17, 2009 9:09 pm Ответить с цитатой Вернуться к началу

Помню вот такую штуку:
Код:
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-тиков Question
Посмотреть профиль Отправить личное сообщение
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Вс Апр 19, 2009 7:54 pm Ответить с цитатой Вернуться к началу

В общем так. Использование нескольких систем в роботе вводит некоторые ограничения. Совершенно нельзя использовать встроенные в ами функции тестирования 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

СообщениеДобавлено: Вс Апр 19, 2009 10:24 pm Ответить с цитатой Вернуться к началу

Забыл сказать, что одновременно торгую на споте и фьючах, т.е. акаунты разные, как и коды клиента, можно эти строки запихать в саму систему? Или как тут поступить?
Посмотреть профиль Отправить личное сообщение
Vladimir



Зарегистрирован: 30.10.2008
Сообщения: 62

СообщениеДобавлено: Вс Апр 19, 2009 10:32 pm Ответить с цитатой Вернуться к началу

И еще, я никогда не парился и торговал несколькими системами, т.е. на три символа открывал по своей системе, на некоторые даже две системы, включл АА на какую-то из них, любую, и все торговалось, ни один сигнал не пропускал, правда иногда вылетали левые сигналы, но редко, когда стал разбираться, увидел, что АА прогоняется только для одного кода, вот тогда и решил начать этот пост. Возможно запустить так АА, чтобы он прогонял по всем символам тот код, на котором он открыт, и вообще нужно ли запускать АА, если без него заявки выходят, проверял, работает, только бывает, что пропускает? Question

ЗЫ: АА я запускаю не на текущий символ, а на пользовательский фильтр (где выбираю фавориты, интересующие меня символы) и на каждом символе торгуется нужное кол-во лотов, заданное в роботе, написанном на данный символ... Idea
Посмотреть профиль Отправить личное сообщение
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Пн Апр 20, 2009 10:38 am Ответить с цитатой Вернуться к началу

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

СообщениеДобавлено: Пн Апр 20, 2009 10:43 am Ответить с цитатой Вернуться к началу

Vladimir писал(а):
Возможно запустить так АА, чтобы он прогонял по всем символам тот код, на котором он открыт, и вообще нужно ли запускать АА, если без него заявки выходят, проверял, работает, только бывает, что пропускает? Question

АА прогоняет код по символам которые выбраны в Apply to:
Это может быть только активный символ, или все символы в базе или только часть символов определяемая фильтром.
Vladimir писал(а):

ЗЫ: АА я запускаю не на текущий символ, а на пользовательский фильтр (где выбираю фавориты, интересующие меня символы) и на каждом символе торгуется нужное кол-во лотов, заданное в роботе, написанном на данный символ... Idea

угу.

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Vladimir



Зарегистрирован: 30.10.2008
Сообщения: 62

СообщениеДобавлено: Пн Апр 20, 2009 8:36 pm Ответить с цитатой Вернуться к началу

Very Happy Оромное СПАСИБО!!!

Скажи, как использовать на каждый аккаунт по две системы? Т.е. на на споте я торгую двумя системами, одна хорошо работает на больших изменениях цены, другая на маленькие изменения срабатывает, не объеденяю в одну систему, т.к. они на разных фреймах, также и на фортсе по две системы на разных фреймах но одной бумаге?
Посмотреть профиль Отправить личное сообщение
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Пн Апр 20, 2009 10:56 pm Ответить с цитатой Вернуться к началу

В последнем арианте кода 2 аккаунта (один для первой системы ворой для второй) и 2 клиента (аналогично). Забивай одинаковые и все дела.

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Vladimir



Зарегистрирован: 30.10.2008
Сообщения: 62

СообщениеДобавлено: Вт Апр 21, 2009 12:01 am Ответить с цитатой Вернуться к началу

Я буду называть торговым кодом тот участок скрипта, который определяет, входить ли в позицию ли нет, и когда из нее выходить, в вышеописанном вареанте например это:

Код:
   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 лотов и на сто тиков.

Вот начал собирать все в кучу, но голова пошла кругом.
Не могу сообразить, как каждый код будет работать на свой аккаунт на свое колличество тиков и на свой фрейм.
Т.е. задача такова: необходим универсальный код-скелет, в который можно вставить несколько торговых кодов, каждый из которых только именно на свой аккаунт, на свой символ, на свое колличество тиков и на свой фрейм.
Получится универсальная машина, готовая совместить в себе всевозможные торговые коды, способная торговать разом на все площадки, или далее, унифицировать ее под системы, выбирающие лучшие из возможных бумаги для открытия позиций, имея лимитированное колличество днежных средств. По сути кибер машина. Wink

ЗЫ: Простите за столь частое беспокойство и дотошность Wink
Посмотреть профиль Отправить личное сообщение
Vladimir



Зарегистрирован: 30.10.2008
Сообщения: 62

СообщениеДобавлено: Вт Апр 21, 2009 9:58 am Ответить с цитатой Вернуться к началу

Возможно так написать, чтобы с заданным фреймом для символа 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. после прогона, далее берется второй символ из БД...
и т.д., тогда можно будет по данному алгоритму подключить много разных кодов по всем торговым площадкам, а путаници, думаю, будет значительно меньше, в отличие от того, если все торговые коды впихивать в один. Wink
Посмотреть профиль Отправить личное сообщение
Показать сообщения:      
Начать новую тему  Ответить на тему


 Перейти:   



Следующая тема
Предыдущая тема
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете вкладывать файлы
Вы не можете скачивать файлы


Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme :: Часовой пояс: GMT + 3

File Attachment © by Meik Sievertsen