Автор |
Сообщение |
Яхфар
Зарегистрирован: 24.04.2011
Сообщения: 74
|
Написал систему на основе фракталов с фильтром на вход. Почему то сделки проходят не по цене закрытия. Не пойму почему.
Код такой:
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
|
Цитата: |
Не по цене закрытия |
На первый взгляд должно быть все ОК.
А если не по закрытию, то по какой цене? |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
Яхфар
Зарегистрирован: 24.04.2011
Сообщения: 74
|
000 писал(а): |
На первый взгляд должно быть все ОК.
А если не по закрытию, то по какой цене? |
Очень часто при sell and cover цена берется приблизительно средняя между открытием свечи и закрытием свечи. Закрытие сделок не проходит по закрытию свечи( тестирую часовые графики), это приводит к слишком хорошим результатам в тестере. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Яхфар писал(а): |
000 писал(а): |
На первый взгляд должно быть все ОК.
А если не по закрытию, то по какой цене? |
Очень часто при sell and cover цена берется приблизительно средняя между открытием свечи и закрытием свечи. Закрытие сделок не проходит по закрытию свечи( тестирую часовые графики), это приводит к слишком хорошим результатам в тестере. |
Попробуй в коде явно указать цену сделок.
Код: |
BuyPrice = SellPrice = ShortPrice = CoverPrice = Close; |
|
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
helgir
Зарегистрирован: 05.05.2020
Сообщения: 8
|
000 писал(а): |
Яхфар писал(а): |
000 писал(а): |
На первый взгляд должно быть все ОК.
А если не по закрытию, то по какой цене? |
Очень часто при sell and cover цена берется приблизительно средняя между открытием свечи и закрытием свечи. Закрытие сделок не проходит по закрытию свечи( тестирую часовые графики), это приводит к слишком хорошим результатам в тестере. |
Попробуй в коде явно указать цену сделок.
Код: |
BuyPrice = SellPrice = ShortPrice = CoverPrice = Close; |
|
а что еще может быть проблемой?
у меня робот прекрасно работает если шаг цены 1, но по результатам теста с дробными значенями цен - он их почему-то округляет в заявке |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Какой робот? |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
helgir
Зарегистрирован: 05.05.2020
Сообщения: 8
|
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
|
1. Я не вижу в коде вызова функции orders() а цена заявки pr округляется где то там (это не весь код).
2. Робот в принципе должен выставлять ордер хуже рынка чтобы сделка залилась по рынку. Не вижу принципиальной необходимости ставить цену точно. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
helgir
Зарегистрирован: 05.05.2020
Сообщения: 8
|
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
|
Ну вот.
Строки
Код: |
orders("S", round(C[BarCount-1]) - Otstup, abs(pos)); |
round() это округление до целого. Вот тут цена и загрубляется. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
helgir
Зарегистрирован: 05.05.2020
Сообщения: 8
|
000 писал(а): |
Ну вот.
Строки
Код: |
orders("S", round(C[BarCount-1]) - Otstup, abs(pos)); |
round() это округление до целого. Вот тут цена и загрубляется. |
Спасибо огромное, я думала в стратегии ошибка. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
|
|
Следующая тема
Предыдущая тема
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете вкладывать файлы Вы не можете скачивать файлы
|
|