Начать новую тему Ответить на тему |
Список форумов AmiSite.ru » Роботы |
На страницу Пред. 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55 След. |
Автор |
Сообщение |
Skornet
Зарегистрирован: 22.02.2014
Сообщения: 31
Откуда: как и все
|
Добрый вечер Олег.
Всё оказалось гораздо интересней и проще, в этой строке:
rk5 = ( ys1 - rk3 ) * 200 / rk4; удалил " * 200 / rk4" , стало :
rk5 = ( ys1 - rk3 ) и всё. Этот множитель перемасштабирует шкалу индикатора. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
BFG
Зарегистрирован: 17.03.2014
Сообщения: 17
|
Ты просил напомнить по поводу отливок в начале недели, ну так вот, напоминаю
Цитата: |
Я сам не прогреммер, но по аналогии внес изменения в твой код доливки, в целях экономии твоего времени выделил жирным то, что я поменял, посмотри плиз при возможности:
Код: |
Filter = 1;
TimeFrame = 60*15; // таймфрейм в секундах.
Account = "NL0011100043"; // Номер счета
Client_Code = "38000"; // Код Клиента
Quik = "C:\\QUIK"; // путь к Квику
Tickers = "LKOH,SBER"; // торгуемые символы через запятую без пробелов. Для контроля ошибок. Так, как они называются в Ами
/////////////
///////////////
// задаем размер лотов, коды и отступ для разных символов
/////////////
if(Name() == "LKOH") { //Символ как он называется в Ами
SecCode = "LKOH";
Class = "EQBR";
Lots = 12;
TickS = 0.1; // Минимальный шаг цены торгуемой бумаги
Otstup = 20; // Заявка будет выставлена хуже текущей цены на Otstup рублей
[b]LimS = 6; // число лотов для фикса по покупке
LimC = 6; // число лотов для фикса по шорту[/b]
}
else if(Name() == "SBER") { //Символ как он называется в Ами
SecCode = "SBER03";
Class = "EQBR";
Lots = 12;
TickS = 0.01; // Минимальный шаг цены торгуемой бумаги
Otstup = 1; // Заявка будет выставлена хуже текущей цены на Otstup рублей
[b]LimS = 6; // число лотов для фикса по покупке
LimC = 6; // число лотов для фикса по шорту[/b]
}
//////////////Система///////////////
Buy1 = Cross(C, MA(C, 40)) AND C > MA(C, 20);
Sell1 = Cross(MA(C, 20), C);
Short1 = Cross(MA(C, 40), C) AND C < MA(C, 20);
Cover1 = Cross(C, MA(C, 20));
[b] for(i=BarCount-1;i>1;i--)
{
if(Buy[i] == 1)
{
entry = C[i];
sig = "BUY";
targetS = entry + (entry * .0092);
bars = i;
i = 0;
}
if(Sell[i] == 1)
{
sig = "SELL";
entry = C[i];
targetC = entry - (entry * .0112);
bars = i;
i = 0;
}
}
Sell2 = Close>=targetS;
Cover2 = Close<=targetC; [/b]
///////////Конец Системы////////////
Buy1 = Ref(Buy1, -1);
Sell1 = Ref(Sell1, -1);
Short1 = Ref(Short1, -1);
Cover1 = Ref(Cover1, -1);
[b]
Sell2 = Ref(Buy2, -1);
Cover2 = Ref(Short2, -1); [/b]
////////////////////////////////////
text = iz = sd = order = "";
color = coloriz = colorDefault;
price = 0;
str = Now(0) + " " + Name();
pos = AS_READ_PARAM("Quik_Robot", Name(), "pos");
SdID = AS_READ_PARAM("Quik_Robot", Name(), "BarID");
BarID = LastValue(Ref(DayOfWeek()*1000000 + TimeNum(), -1));
///////////// проверка наличия символа в списке для торговли ////////////////
k = 0;
Permit_Ticker = False;
do {
Tick = StrExtract(Tickers, k);
k++;
if(Name() == Tick)
Permit_Ticker = True;
} while(Tick != "");
/////////// Функции ////////////
procedure orders(bs, pr, Lot)
{
connection = 0;
QC = AS_QUIK_CONNECT(Quik);
if (QC == 1)
{
connection = 1;
text = "Есть соединение с сервером";
Color = colorGreen;
}
else if (QC == -1)
{
text = "нет соединения с квиком";
Color = colorRed;
}
else if (QC == -2)
{
text = "нет соединения с сервером";
Color = colorRed;
}
else
{
text = "фигня какая то";
Color = colorRed;
}
if(connection == 1)
{
order = AS_QUIK_SEND_SYNC_NEWORDER( "123", // OrderID - Любые цифры
Account,
Client_Code,
"L", // Тип заявки M-рыночная, L-лимитированная
Class,
SecCode,
bs,
pr,
Lot);
}
if(StrToNum(order) > 100)
{
iz = "исполнена";
coloriz = colorGreen;
str = str + " заяка исполнена" + " ответ сервера=" + order;
if(pos == 0 AND bs == "S") // шорт
{
AS_WRITE_PARAM("Quik_Robot", Name(), "pos", -1*Lot);
AS_WRITE_PARAM("Quik_Robot", Name(), "BarID", 0);
}
else if(pos < 0 AND bs == "B") // закрытие шорта
{
AS_WRITE_PARAM("Quik_Robot", Name(), "pos", 0);
AS_WRITE_PARAM("Quik_Robot", Name(), "BarID", 0);
}
else if(pos == 0 AND bs == "B") // лонг
{
AS_WRITE_PARAM("Quik_Robot", Name(), "pos", Lot);
AS_WRITE_PARAM("Quik_Robot", Name(), "BarID", 0);
}
else if(pos > 0 AND bs == "S") // закрытие лонга
{
AS_WRITE_PARAM("Quik_Robot", Name(), "pos", 0);
AS_WRITE_PARAM("Quik_Robot", Name(), "BarID", 0);
}
else if[b](pos = Lots AND bs == "S") // отливка от покупки (частичный фикс позы ) [/b] -- здесь не знаю как условие правильно написать
{
AS_WRITE_PARAM("Quik_Robot", Name(), "pos", [b]pos -LimS); [/b]
AS_WRITE_PARAM("Quik_Robot", Name(), "BarID", BarID);
}
else if[b](abs(pos) = Lots AND bs == "B") // отливка от шорта (частичный фикс позы )[/b] -- здесь не знаю как условие правильно написать
{
AS_WRITE_PARAM("Quik_Robot", Name(), "pos",[b] pos + LimC); [/b]
AS_WRITE_PARAM("Quik_Robot", Name(), "BarID", BarID);
}
str = str + " позиция на момент исполнения " + pos;
}
else {
iz = "не исполнена";
coloriz = colorRed;
str = str + " заяка НЕ исполнена" + " ответ сервера=" + order;
}
////////// конец Функций //////////
if (TimeFrame == Interval() AND Permit_Ticker)
{
if(Buy1[BarCount-1] AND pos == 0) {
str = str + " Buy";
sd = "Buy";
orders("B", round(C[BarCount-1]) + Otstup, Lots);
AS_WRITE_FILE("log.quik", str);
}
else if(Sell1[BarCount-1] AND pos > 0) {
str = str + " Sell";
sd = "Sell";
orders("S", round(C[BarCount-1]) - Otstup, abs(pos));
AS_WRITE_FILE("log.quik", str);
}
else if(Short1[BarCount-1] AND pos == 0) {
str = str + " Short";
sd = "Short";
orders("S", round(C[BarCount-1]) - Otstup, Lots);
AS_WRITE_FILE("log.quik", str);
}
else if(Cover1[BarCount-1] AND pos < 0) {
str = str + " Cover";
sd = "Cover";
orders("B", round(C[BarCount-1]) + Otstup, abs(pos));
AS_WRITE_FILE("log.quik", str);
}
else if([b]Sell2[BarCount-1] AND pos =Lots AND BarID != SdID)[/b] -- здесь не знаю как условие правильно написать
{
str = str +[b] " Sell (отливка)"; [/b]
sd = [b] "SellOut";[/b]
orders[b]("S", round(C[BarCount-1]) - Otstup, LimS); [/b]
AS_WRITE_FILE("log.quik", str);
}
else if([b]Cover2[BarCount-1] AND abs(pos) =Lots AND BarID != SdID)[/b] -- здесь не знаю как условие правильно написать
{
str = str + [b] " Cover (отливка)"; [/b]
sd = [b] "CoverOut";[/b]
orders [b]("B", round(C[BarCount-1]) + Otstup,LimC); [/b]
AS_WRITE_FILE("log.quik", str);
}
}
else if(TimeFrame != Interval()) {
PopupWindow( "Не соответствует временной интервал в настройках АА и в коде",
"ошибка", timeout = 5, left = -1, top = -1 );
} |
|
|
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Ок. Сегодня посмотрю. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Значит так.
Поскольку поза сокращается только один раз, то все эти заморочки с запоминанием индекса бара (BarID) при сделке не нужны. Просто отслеживаем текущий размер позиции и по нему определяем целая это позиция или сокращение уже было.
Код: |
Filter = 1;
TimeFrame = 60*15; // таймфрейм в секундах.
Account = "NL0011100043"; // Номер счета
Client_Code = "38000"; // Код Клиента
Quik = "C:\\QUIK"; // путь к Квику
Tickers = "LKOH,SBER"; // торгуемые символы через запятую без пробелов. Для контроля ошибок. Так, как они называются в Ами
/////////////
///////////////
// задаем размер лотов, коды и отступ для разных символов
/////////////
if(Name() == "LKOH") { //Символ как он называется в Ами
SecCode = "LKOH";
Class = "EQBR";
Lots = 12;
TickS = 0.1; // Минимальный шаг цены торгуемой бумаги
Otstup = 20; // Заявка будет выставлена хуже текущей цены на Otstup рублей
LimS = 6; // число лотов для фикса по покупке
LimC = 6; // число лотов для фикса по шорту
}
else if(Name() == "SBER") { //Символ как он называется в Ами
SecCode = "SBER03";
Class = "EQBR";
Lots = 12;
TickS = 0.01; // Минимальный шаг цены торгуемой бумаги
Otstup = 1; // Заявка будет выставлена хуже текущей цены на Otstup рублей
LimS = 6; // число лотов для фикса по покупке
LimC = 6; // число лотов для фикса по шорту
}
//////////////Система///////////////
pos = AS_READ_PARAM("Quik_Robot", Name(), "pos");
target = AS_READ_PARAM("Quik_Robot", Name(), "target");
Buy1 = Cross(C, MA(C, 40)) AND C > MA(C, 20);
Sell1 = Cross(MA(C, 20), C);
Short1 = Cross(MA(C, 40), C) AND C < MA(C, 20);
Cover1 = Cross(C, MA(C, 20));
if(Buy[BarCount - 1] == 1)
{
target = entry + (entry * .0092);
}
if(Sell[BarCount - 1] == 1)
{
target = entry - (entry * .0112);
}
if(pos == Lots AND C[BarCount - 2] >= target)
{
Sell2 = 1;
}
if(pos == -1*Lots AND C[BarCount - 2] <= target)
{
Cover2 = 1;
}
///////////Конец Системы////////////
Buy1 = Ref(Buy1, -1);
Sell1 = Ref(Sell1, -1);
Short1 = Ref(Short1, -1);
Cover1 = Ref(Cover1, -1);
////////////////////////////////////
text = iz = sd = order = "";
color = coloriz = colorDefault;
price = 0;
str = Now(0) + " " + Name();
///////////// проверка наличия символа в списке для торговли ////////////////
k = 0;
Permit_Ticker = False;
do {
Tick = StrExtract(Tickers, k);
k++;
if(Name() == Tick)
Permit_Ticker = True;
} while(Tick != "");
/////////// Функции ////////////
procedure orders(bs, pr, Lot)
{
connection = 0;
QC = AS_QUIK_CONNECT(Quik);
if (QC == 1)
{
connection = 1;
text = "Есть соединение с сервером";
Color = colorGreen;
}
else if (QC == -1)
{
text = "нет соединения с квиком";
Color = colorRed;
}
else if (QC == -2)
{
text = "нет соединения с сервером";
Color = colorRed;
}
else
{
text = "фигня какая то";
Color = colorRed;
}
if(connection == 1)
{
order = AS_QUIK_SEND_SYNC_NEWORDER( "123", // OrderID - Любые цифры
Account,
Client_Code,
"L", // Тип заявки M-рыночная, L-лимитированная
Class,
SecCode,
bs,
pr,
Lot);
}
if(StrToNum(order) > 100)
{
iz = "исполнена";
coloriz = colorGreen;
str = str + " заяка исполнена" + " ответ сервера=" + order;
if(pos == 0 AND bs == "S") // шорт
{
AS_WRITE_PARAM("Quik_Robot", Name(), "pos", -1*Lot);
AS_WRITE_PARAM("Quik_Robot", Name(), "target", target);
}
else if(pos < 0 AND bs == "B") // закрытие шорта
{
AS_WRITE_PARAM("Quik_Robot", Name(), "pos", 0);
AS_WRITE_PARAM("Quik_Robot", Name(), "target", 0);
}
else if(pos == 0 AND bs == "B") // лонг
{
AS_WRITE_PARAM("Quik_Robot", Name(), "pos", Lot);
AS_WRITE_PARAM("Quik_Robot", Name(), "target", target);
}
else if(pos > 0 AND bs == "S") // закрытие лонга
{
AS_WRITE_PARAM("Quik_Robot", Name(), "pos", 0);
AS_WRITE_PARAM("Quik_Robot", Name(), "target", 0);
}
else if(pos = Lots AND bs == "S") // отливка от покупки (частичный фикс позы )
{
AS_WRITE_PARAM("Quik_Robot", Name(), "pos", pos - LimS);
AS_WRITE_PARAM("Quik_Robot", Name(), "target", 0);
str = str + " сокращение длинной позиции ";
}
else if[b](abs(pos) = Lots AND bs == "B") // отливка от шорта (частичный фикс позы )
{
AS_WRITE_PARAM("Quik_Robot", Name(), "pos", pos + LimC);
AS_WRITE_PARAM("Quik_Robot", Name(), "target", 0);
str = str + " сокращение короткой позиции ";
}
str = str + " позиция на момент исполнения " + pos;
}
else {
iz = "не исполнена";
coloriz = colorRed;
str = str + " заяка НЕ исполнена" + " ответ сервера=" + order;
}
////////// конец Функций //////////
if (TimeFrame == Interval() AND Permit_Ticker)
{
if(Buy1[BarCount-1] AND pos == 0) {
str = str + " Buy";
sd = "Buy";
orders("B", round(C[BarCount-1]) + Otstup, Lots);
AS_WRITE_FILE("log.quik", str);
}
else if(Sell1[BarCount-1] AND pos > 0) {
str = str + " Sell";
sd = "Sell";
orders("S", round(C[BarCount-1]) - Otstup, abs(pos));
AS_WRITE_FILE("log.quik", str);
}
else if(Short1[BarCount-1] AND pos == 0) {
str = str + " Short";
sd = "Short";
orders("S", round(C[BarCount-1]) - Otstup, Lots);
AS_WRITE_FILE("log.quik", str);
}
else if(Cover1[BarCount-1] AND pos < 0) {
str = str + " Cover";
sd = "Cover";
orders("B", round(C[BarCount-1]) + Otstup, abs(pos));
AS_WRITE_FILE("log.quik", str);
}
else if(Sell2 AND pos == Lots)
{
str = str + " Sell (отливка)";
sd = "SellOut";
orders("S", round(C[BarCount-1]) - Otstup, LimS);
AS_WRITE_FILE("log.quik", str);
}
else if(Cover2 AND pos == -Lots)
{
str = str + " Cover (отливка)";
sd = "CoverOut";
orders("B", round(C[BarCount-1]) + Otstup, LimC);
AS_WRITE_FILE("log.quik", str);
}
}
else if(TimeFrame != Interval()) {
PopupWindow( "Не соответствует временной интервал в настройках АА и в коде",
"ошибка", timeout = 5, left = -1, top = -1 );
}
|
|
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
BFG
Зарегистрирован: 17.03.2014
Сообщения: 17
|
ОГРОМНОЕ СПАСИБО!!!
Буду тестить
Созрел еще один вопрос:
В выложенном тобой роботе со стопом используются проценты. Во многих местах попадалось мнение, что ApplyStop не очень удобная тема. А мне нужно как вариант выхода автоматизировать выход по трейлу вида:
Код: |
ApplyStop(stopTypeTrailing, stopModePoint, 10, True, True );
|
В коде много нужно будет переколбасить под это дело?
Если много, то напиши плиз пример хотя бы одной строки как это должно быть, а я сам по аналогии постараюсь доделать.
И еще один нубо вопрос :
Если в настройках АА будет выставлен трэил, будет ли он работать при запущеном роботе? |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Увы. Ничего не могу сейчас ответить. У меня тут с компами полный пипец. Все стоит, работать неначем, все потерял. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
MrDrJOKER
Зарегистрирован: 22.06.2009
Сообщения: 489
|
000 писал(а): |
Увы. Ничего не могу сейчас ответить. У меня тут с компами полный пипец. Все стоит, работать неначем, все потерял. |
что потерял? |
|
|
Посмотреть профиль Отправить личное сообщение |
|
spitfire
Зарегистрирован: 29.04.2010
Сообщения: 729
Откуда: Moscow
|
Чаво потерялось? Если файловая система нарушена то всякие афлки восстановить не будет проблемой - главное ничего не писать на диск и не форматировать. |
|
|
Посмотреть профиль Отправить личное сообщение ICQ Number |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Потерял ВСЕ. Даже, блять, пароль от яндекс денег.... |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
MrDrJOKER
Зарегистрирован: 22.06.2009
Сообщения: 489
|
000 писал(а): |
Потерял ВСЕ. Даже, блять, пароль от яндекс денег.... |
хард накрылся? обычный, ssd? |
|
|
Посмотреть профиль Отправить личное сообщение |
|
spitfire
Зарегистрирован: 29.04.2010
Сообщения: 729
Откуда: Moscow
|
Если хард накрылся, то не опускай руки - мона восстановить если не все, то большинство данных. Чем меньше файл, тем больше вероятность восстановления. Я лично пользовался R-Studio - очень положительные впечатления. Легко находится на торрентах. На крайняк мона обратиться в спец сервис по восстановлению данных. Какой хз - надо гуглить, смотреть отзывы.
А если угнали аккаунт - думаю письмо в службу поддержки поможет решить проблему.
Так расскажи поподробней чо случилось - ща решим коллективным разумом. |
|
|
Посмотреть профиль Отправить личное сообщение ICQ Number |
|
Mechanic
Зарегистрирован: 10.06.2008
Сообщения: 359
|
spitfire писал(а): |
Если хард накрылся, то не опускай руки - мона восстановить если не все, то большинство данных. Чем меньше файл, тем больше вероятность восстановления. Я лично пользовался R-Studio - очень положительные впечатления. Легко находится на торрентах. На крайняк мона обратиться в спец сервис по восстановлению данных. Какой хз - надо гуглить, смотреть отзывы.
А если угнали аккаунт - думаю письмо в службу поддержки поможет решить проблему.
Так расскажи поподробней чо случилось - ща решим коллективным разумом. |
Угу. У меня пару лет назад тоже хард накрывался. Запил на стартовой дорожке. Это значит, что диск больше стартануть не может в принципе, т.к. на стартовой дорожке находится инфа о разметке. Единственный вариант восстановления - вытаскивать пакет пластин из корпуса и вставлять в специальную приладу, которая будет их вращать и тупо считает бит за битом всё, что на них осталось. Прилада эта есть в Питере и в Германии, цена вопроса - 5 тыщ. нерусских денег (с учётом почтовых расходов), причём результат не гарантируется (деньги в случае неудачи, конечно, вернули бы, за исключением расходов). Пришлось всплакнуть и забить. А потерял тоже всё, наработанное за 10 лет - все проекты, сделанные на предыдущих местах работы, фотки с молодых свадеб-пьянок-гулянок, все наработки по трейдингу, все накопленные файлы... В общем, абсолютно всё, как будто у меня никогда и не было компа. Теперь учёный, облачные хранилища - мои лучшие друзья. Чего и всем советую. |
|
|
Посмотреть профиль Отправить личное сообщение ICQ Number |
|
spitfire
Зарегистрирован: 29.04.2010
Сообщения: 729
Откуда: Moscow
|
А зачем все яйца хранить в одной корзине?? Никто не отменял резервные копирования и рейд-массивы. А облакам я как то не доверяю - потенциально небезопасно. |
|
|
Посмотреть профиль Отправить личное сообщение ICQ Number |
|
Mechanic
Зарегистрирован: 10.06.2008
Сообщения: 359
|
Вот резервные копии в облаках и хранятся. Что там небезопасного? Архивируешь всю нужную инфу в рар с 20-30-значным паролем и спокойно хранишь его в облаке. Фиг кто взломает. |
|
|
Посмотреть профиль Отправить личное сообщение ICQ Number |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
У меня железо нифига не сломалось. И резервные копии были. Просто я тщательно руками все похерил. Не нарочно конечно. Типа по невнимательности.
Удалось восттановить часть семейного фотоархива.
Богу слава хоть пароль админа от сайта помню и вообще доступ к аккаунту сайта восстановил. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
|
Начать новую тему Ответить на тему |
Список форумов AmiSite.ru » Роботы |
На страницу Пред. 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55 След. |
|
Следующая тема
Предыдущая тема
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете вкладывать файлы Вы не можете скачивать файлы
|
|