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



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

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

Написал систему на основе фракталов с фильтром на вход. Почему то сделки проходят не по цене закрытия. Не пойму почему.

Код такой:


var1=ValueWhen(
(Ref(H,-2) > Ref(H, -4)) AND
(Ref(H,-2) > Ref(H, -3)) AND
(Ref(H,-2) > Ref(H, -1)) AND
(Ref(H,-2) > H), Ref(H,-2),1);
FractalUp=HighestSince(var1>0,var1,1);

var2=
(Ref(L,-2) <= Ref(L, -1)) AND
(Ref(L,-2) <= Ref(L, 0)) AND
(Ref(L,-2) <= Ref(L, -3)) AND
(Ref(L,-2) <= Ref(L, -4));
FractalDown=ValueWhen( var2,Ref(L,-2),1);

Plot(FractalUp, "FractalUp", colorGreen);
Plot(FractalDown, "FractalDown", colorRed);

Period1 = Optimize("PeriodA", 4, 1, 10, 1);
Period2 = Optimize("PeriodB", 1.5, 0.1, 2.1, 0.1);
HI = Ref(HHV(H, Period1), -1);
Low = Ref(LLV(L, Period1), -1);

L1=ATR(14)/(HI-Low)*sqrt(Period1);

Buy = Cross(C, FractalUp) AND L1>Period2;
Sell =Cross(FractalDown, Close) ;

Short= Cross(FractalDown, C) AND L1>Period2;
Cover= Cross(C, FractalUp);

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

PlotShapes( Buy*shapeUpArrow, colorGreen, 0, L );
PlotShapes( Cover*shapeUpArrow, colorYellow, 0, L,8+16 );
PlotShapes( Sell*shapeDownArrow, colorRed, 0, H );
PlotShapes( Short*shapeDownArrow, colorBlue, 0, H,8+16 );
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

СообщениеДобавлено: Пт Дек 20, 2019 12:29 pm Ответить с цитатой Вернуться к началу

Цитата:
Не по цене закрытия

На первый взгляд должно быть все ОК.
А если не по закрытию, то по какой цене?

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



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

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

000 писал(а):

На первый взгляд должно быть все ОК.
А если не по закрытию, то по какой цене?


Очень часто при sell and cover цена берется приблизительно средняя между открытием свечи и закрытием свечи. Закрытие сделок не проходит по закрытию свечи( тестирую часовые графики), это приводит к слишком хорошим результатам в тестере.
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

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

Яхфар писал(а):
000 писал(а):

На первый взгляд должно быть все ОК.
А если не по закрытию, то по какой цене?


Очень часто при sell and cover цена берется приблизительно средняя между открытием свечи и закрытием свечи. Закрытие сделок не проходит по закрытию свечи( тестирую часовые графики), это приводит к слишком хорошим результатам в тестере.

Попробуй в коде явно указать цену сделок.
Код:
BuyPrice = SellPrice = ShortPrice = CoverPrice = Close;

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



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

СообщениеДобавлено: Пн Июн 15, 2020 9:40 pm Ответить с цитатой Вернуться к началу

000 писал(а):
Яхфар писал(а):
000 писал(а):

На первый взгляд должно быть все ОК.
А если не по закрытию, то по какой цене?


Очень часто при sell and cover цена берется приблизительно средняя между открытием свечи и закрытием свечи. Закрытие сделок не проходит по закрытию свечи( тестирую часовые графики), это приводит к слишком хорошим результатам в тестере.

Попробуй в коде явно указать цену сделок.
Код:
BuyPrice = SellPrice = ShortPrice = CoverPrice = Close;


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


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

СообщениеДобавлено: Пн Июн 15, 2020 10:46 pm Ответить с цитатой Вернуться к началу

Какой робот?

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



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

СообщениеДобавлено: Вт Июн 16, 2020 11:07 am Ответить с цитатой Вернуться к началу

000 писал(а):
Какой робот?

Доброе утро! Робот с вашего сайта, без стопов. На Si работает, на Br выдает округленные цены в звявке.
Единственное - мне пришлось изменить Order через AS_STRING_ORDER иначе заявки не отправлялись - Ами выделял Lots.
Полный код такой:

if(Name() == "BR")
{ //символ как называется в ами
SecCode = "BRN0";
Class = "SPBFUT";
Lots = 1;
TickS = 0.01; // Минимальный шаг цены торгуемой бумаги
Otstup = 0; // Заявка будет выставлена хуже текущей цены на Otstup рублей
LimB = 0; // Максимальное число лотов позиции когда еще возможна доливка на покупку
LimS = 0; // Максимальное число лотов позиции когда еще возможна доливка на шорт

}


per=Optimize("EMA start period",1,1,1000,10);

per1=Optimize("Trend",201,1,2000,10);
deal=0;


EMA1=EMA(C,per1);

----------------------------
Buy=H>Ref(H,-1) AND H>EMA(C,per);
Buy=Ref(Buy,-1);
Sell=C<EMA1;
SellPrice=EMA1;


Short=L<Ref(L,-1) AND L<EMA(C,per);
Short=Ref(Short,-1);
Cover=H>EMA1;
CoverPrice=EMA1;


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

----------------------------

//ВЫВОД НА ГРАФИК
Plot(Close, "Price", colorBlack, styleCandle);
PlotShapes(IIf(Buy, shapeUpArrow, shapeNone),colorSkyblue, 0,Low,-15);
PlotShapes(IIf(Sell, shapeHollowDownArrow, shapeNone),colorLightYellow, 0,High,-15);
PlotShapes(IIf(Cover, shapeHollowUpArrow, shapeNone),colorTan, 0,Low,-25);
PlotShapes(IIf(Short, shapeDownArrow, shapeNone),colorRed, 0,High,-25);

///////////////////////


text = iz = sd = order = "";
color = coloriz = colorDefault;
price = 0;
str = Now(0) + " " + Name();
pos = AS_READ_PARAM("Quik_Robot", Name(), "pos");

////////////////////////////

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)
{
if(Name() == "SI1")
{Order = AS_STRING_ORDER("ACCOUNT=SPBFUT00ih4; CLIENT_CODE=27437; TYPE=L; TRANS_ID=1; CLASSCODE=SPBFUT; SECCODE=SiU0; ACTION=NEW_ORDER; OPERATION="+bs+"; PRICE="+pr+"; QUANTITY=1;");
AS_WRITE_FILE("log.quik", bs,pr);
}
if(Name() == "BR")
{Order = AS_QUIK_SEND_SYNC_NEWORDER("ACCOUNT=SPBFUT00ih4; CLIENT_CODE=27437; TYPE=L; TRANS_ID=1; CLASSCODE=SPBFUT; SECCODE=BRN0; ACTION=NEW_ORDER; OPERATION="+bs+"; PRICE="+pr+"; QUANTITY=1;");
AS_WRITE_FILE("log.quik", bs,pr);
}
}
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

СообщениеДобавлено: Вт Июн 16, 2020 12:48 pm Ответить с цитатой Вернуться к началу

1. Я не вижу в коде вызова функции orders() а цена заявки pr округляется где то там (это не весь код).
2. Робот в принципе должен выставлять ордер хуже рынка чтобы сделка залилась по рынку. Не вижу принципиальной необходимости ставить цену точно.

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



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

СообщениеДобавлено: Вт Июн 16, 2020 1:56 pm Ответить с цитатой Вернуться к началу

000 писал(а):
1. Я не вижу в коде вызова функции orders() а цена заявки pr округляется где то там (это не весь код).
2. Робот в принципе должен выставлять ордер хуже рынка чтобы сделка залилась по рынку. Не вижу принципиальной необходимости ставить цену точно.


а дальше вот:

if(StrToNum(order) > 100)
{
iz = "исполнена";
coloriz = colorGreen;
str = str + " заяка исполнена" + " ответ сервера" + order;
if(pos > 0 AND bs == "S") // закрытие лонга
{
AS_WRITE_PARAM("Quik_Robot", Name(), "pos", 0);
AS_WRITE_PARAM("Quik_Robot", Name(), "BarID", 0);
}
else 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 == "B") // доливка к покупке
{
AS_WRITE_PARAM("Quik_Robot", Name(), "pos", pos + Lot);
AS_WRITE_PARAM("Quik_Robot", Name(), "BarID", BarID);
}
else if(pos < 0 AND bs == "S") // доливка к шорту
{
AS_WRITE_PARAM("Quik_Robot", Name(), "pos", pos - Lot);
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(Buy[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(Sell[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(Short[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(Cover[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);
}




эту часть вообще не
трогал, как в исходном роботе без стопов, отсюда:
http://www.amisite.ru/afl/exp/0002.htm
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

СообщениеДобавлено: Вт Июн 16, 2020 3:26 pm Ответить с цитатой Вернуться к началу

Ну вот.
Строки
Код:
orders("S", round(C[BarCount-1]) - Otstup, abs(pos));

round() это округление до целого. Вот тут цена и загрубляется.

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



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

СообщениеДобавлено: Вт Июн 16, 2020 4:44 pm Ответить с цитатой Вернуться к началу

000 писал(а):
Ну вот.
Строки
Код:
orders("S", round(C[BarCount-1]) - Otstup, abs(pos));

round() это округление до целого. Вот тут цена и загрубляется.


Спасибо огромное, я думала в стратегии ошибка.
Посмотреть профиль Отправить личное сообщение
Показать сообщения:      
Начать новую тему  Ответить на тему


 Перейти:   



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


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

File Attachment © by Meik Sievertsen