Автор |
Сообщение |
IzBu
Зарегистрирован: 28.06.2016
Сообщения: 83
|
Тестировать буду в реале 20 сделок фьюч Брент.
Я использую робот со стопами Олега.
Код который я выложил выше от туда, там уже есть открытие на следующей свече.
Код: |
Buy1 = Buy1[BarCount - 2] AND L[BarCount - 1] > C[BarCount - 2]*(1 - Stop/100);//Buy1[BarCount - 2] AND L[BarCount - 1] > C[BarCount - 2]*(1 - Stop/100);
Sell1 = Sell1[BarCount - 2];
Short1 = Short1[BarCount - 2] AND H[BarCount - 1] < C[BarCount - 2]*(1 + Stop/100);
Cover1 = Cover1[BarCount - 2];
|
Если его убрать, то стопы работать не будут. А я хочу что бы открытие сделки было по рынку, и стоп работали вот. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Значит так.
Ты хочешь входить не на следующей свечке, а сразу как только возник сигнал.
Собственно для этого надо убрать сдвиг сигнала
Код: |
Buy1 = Buy1[BarCount - 2] AND L[BarCount - 1] > C[BarCount - 2]*(1 - Stop/100);
Sell1 = Sell1[BarCount - 2];
Short1 = Short1[BarCount - 2] AND H[BarCount - 1] < C[BarCount - 2]*(1 + Stop/100);
Cover1 = Cover1[BarCount - 2]; |
Надо заменить на
Код: |
Buy1 = Buy1[BarCount - 1];
Sell1 = Sell1[BarCount - 1];
Short1 = Short1[BarCount - 1];
Cover1 = Cover1[BarCount - 1]; |
Однако у тебя сигнал определяется при пересечении линий расчет которых ведется по текущей цене закрытия. Поскольку цена закрытия при формировании свечки меняется соответственно и линии плавают. Т.е. возможно пропадание уже полученного сигнала. С этим бороться нельзя. Только перенести сигнал на открытие следующей свечки.
Ну хрен с ним. Допустим ты согласен торговать сигнал который пропадает.
Далее. Поскольку входить будешь посередине свечки надо убрать проверку стопа при входе. Это то что в первом коде после AND ну и контроль срабатывания стопа надо делать по текущей цене а не по H/L.
В общем конечный результат типа такой
Код: |
Tickers = "Br8,SBER"; // торгуемые символы через запятую без пробелов. Для контроля ошибок. Так, как они называются в Ами
/////////////
///////////////
// задаем размер лотов, коды и отступ для разных символов
/////////////
TimeFrame = 60*15; // таймфрейм в секундах.
Account = "NL0011100043"; // Номер счета
Client_Code = "38000"; // Код Клиента
Quik = "C:\\QUIK"; // путь к Квику
if(Name() == "Br8") { //Символ как он называется в Ами
SecCode = "BRQ8";
Class = "SPBFUT";
Lots = 4;
TickS = 0.01; // Минимальный шаг цены торгуемой бумаги
Stop = 1; // стоп в %
profit = 2; // профит в %
Otstup = 0.05; // Заявка будет выставлена хуже текущей цены на Otstup рублей
}
else if(Name() == "SBER") { //Символ как он называется в Ами
SecCode = "SBER03";
Class = "EQBR";
Lots = 0;
TickS = 0.01; // Минимальный шаг цены торгуемой бумаги
Stop = 2; // стоп в %
profit = 4; // профит в %
Otstup = 1; // Заявка будет выставлена хуже текущей цены на Otstup рублей
}
////////////////////////////////////
text = iz = sd = order = "";
color = coloriz = colorDefault;
price = 0;
str = Now(0) + " " + Name();
pos = AS_READ_PARAM("Quik_Robot", Name(), "pos");
//////////////Система///////////////
// Buy adjustments
bs=Param("BUY Sensitivity",3,2,20,1);
bf=Param("BUY Finetune",2,0.1,20,0.1);
// Sell Adjustments
ss=Param("SELL Sensitivity",3,2,20,1);
sf=Param("SELL Finetune",1,0.1,20,0.1);
// common
fast = 2/(2+1);
slow = 2/(30+1);
//BUY part
dirb=abs(Close-Ref(Close,-bs));
volb=Sum(abs(Close-Ref(Close,-1)),bs);
ERb=dirb/volb;
scb =( ERb*(fast-slow)+slow)^2;
xb = AMA( C, scb );
flb=bf*StDev(xb-Ref(xb,-1),20);
j=xb-Ref(xb,-3);
//SELL part
dirs=abs(Close-Ref(Close,-ss));
vols=Sum(abs(Close-Ref(Close,-1)),ss);
ERs=dirs/vols;
scs =( ERs*(fast-slow)+slow)^2;
xs = AMA( C, scs );
fls=sf*StDev(xs-Ref(xs,-1),20);
k=Ref(Xs,-3)-Xs;
Buy1=Cross(j,flb);
Sell1=Cross(k,fls);
Buy1 = ExRem(Buy1,Sell1);
Sell1 = ExRem(Sell1,Buy1);
Short1=Sell1;
Cover1=Buy1;
///////////Конец Системы////////////
Buy1 = Buy1[BarCount - 1];
Sell1 = Sell1[BarCount - 1];
Short1 = Short1[BarCount - 1];
Cover1 = Cover1[BarCount - 1];
/// стопы ///
if(pos > 0 AND C[BarCount-1] < AS_READ_PARAM("Quik_Robot", Name(), "price")*(1 - Stop/100))
{
Sell1 = 1;
str = str + " сработал стоп при лонге";
}
else if(pos < 0 AND C[BarCount-1] > AS_READ_PARAM("Quik_Robot", Name(), "price")*(1 + Stop/100))
{
Cover1 = 1;
str = str + " сработал стоп при шорте";
}
/// профит ///
if(pos > 0 AND C[BarCount-1] > AS_READ_PARAM("Quik_Robot", Name(), "price")*(1 + profit/100))
{
Sell1 = 1;
str = str + " сработал стоп при лонге";
}
else if(pos < 0 AND C[BarCount-1] > AS_READ_PARAM("Quik_Robot", Name(), "price")*(1 - profit/100))
{
Cover1 = 1;
str = str + " сработал стоп при шорте";
}
///////////// проверка наличия символа в списке для торговли ////////////////
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", 0);
AS_WRITE_PARAM("Quik_Robot", Name(), "price", 0);
}
else if(pos == 0 AND bs == "S") // шорт
{
AS_WRITE_PARAM("Quik_Robot", Name(), "pos", -1*Lot);
AS_WRITE_PARAM("Quik_Robot", Name(), "price", Close[BarCount - 2]);
}
else if(pos < 0 AND bs == "B") // закрытие шорта
{
AS_WRITE_PARAM("Quik_Robot", Name(), "pos", 0);
AS_WRITE_PARAM("Quik_Robot", Name(), "price", 0);
}
else if(pos == 0 AND bs == "B") // лонг
{
AS_WRITE_PARAM("Quik_Robot", Name(), "pos", Lot);
AS_WRITE_PARAM("Quik_Robot", Name(), "price", Close[BarCount - 2]);
}
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);
}
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);
}
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);
}
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(TimeFrame != Interval()) {
PopupWindow( "Не соответствует временной интервал в настройках АА и в коде",
"ошибка", timeout = 5, left = -1, top = -1 );
}
SetOption( "NoDefaultColumns", 1 );
AddTextColumn(Name(), "Символ", 1.0, colorDefault, colorDefault, 60);
AddColumn( C[BarCount-1], "Последняя цена", 1.2, colorDefault, colorDefault, 100 );
AddColumn( AS_READ_PARAM("Quik_Robot", Name(), "pos"), "Позиция", 1.0, colorDefault,
IIf(AS_READ_PARAM("Quik_Robot", Name(), "pos") > 0, colorGreen,
IIf(AS_READ_PARAM("Quik_Robot", Name(), "pos") < 0, colorRed, colorDefault)), 60);
AddTextColumn(sd, "Сигнал", 1.0, colorDefault, colorDefault, 60);
AddTextColumn(text, "Соединение", 1.2, colorDefault, color, 170);
AddTextColumn(iz, "Исполнение заявки", 1.2, colorDefault, coloriz, 120 );
AddTextColumn(order, "Заявка", 1.2, colorDefault, IIf(StrToNum(order) > 100, colorGreen, colorRed), 90);
|
|
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
IzBu
Зарегистрирован: 28.06.2016
Сообщения: 83
|
Огромное спасибо.
Протестирую отпишусь. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
IzBu
Зарегистрирован: 28.06.2016
Сообщения: 83
|
А еще вопрос, А если я хочу отключить стопы и тейк профит.
Надо ставить 0 или значение 100 % например. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
IzBu писал(а): |
А еще вопрос, А если я хочу отключить стопы и тейк профит.
Надо ставить 0 или значение 100 % например. |
Ставь побольше. Например 100. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
IzBu
Зарегистрирован: 28.06.2016
Сообщения: 83
|
|
Посмотреть профиль Отправить личное сообщение |
|
IzBu
Зарегистрирован: 28.06.2016
Сообщения: 83
|
QC = AS_QUIK_CONNECT(Quik);
выдает ошибку |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
А как же робот у тебя работал раньше?
Путь к Квику свой напиши в начале кода. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
IzBu
Зарегистрирован: 28.06.2016
Сообщения: 83
|
Мой косяк. вчера делал откат системы. Плагины переустановил все пошло.
Извините. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
IzBu
Зарегистрирован: 28.06.2016
Сообщения: 83
|
Запустил робота со стопом на другом компе. Поставил TeamViewer будем посмотреть.
Еще возникло несколько вопросов.
Будет ли стоп выполняться при дробный значениях 0,5 например?
Как роботу указать принудительно что квик в позиции ?
Можно ли поменять стоп когда робот в позиции? |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
IzBu писал(а): |
Будет ли стоп выполняться при дробный значениях 0,5 например? |
IzBu писал(а): |
Так и пиши. 0.5
Как роботу указать принудительно что квик в позиции ? |
Никак. Можно конечно такое накодить, но там это не предусмотрено.
IzBu писал(а): |
Можно ли поменять стоп когда робот в позиции? |
Можно. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
IzBu
Зарегистрирован: 28.06.2016
Сообщения: 83
|
|
Посмотреть профиль Отправить личное сообщение |
|
IzBu
Зарегистрирован: 28.06.2016
Сообщения: 83
|
Вообщем не открывает позиции пишет заявка не исполнена,
если выключить и запустить заново, при появившемся сигнале, то исполняет сделку, но при появлении сигнала на обратную сделку опять не исполняет. А последний раз на сигнале на продажу начал открывать и закрывать с периодичностью в секунду код выкладываю. Help.
Код: |
Filter = 1;
SetBarsRequired(sbrAll, sbrAll);
TimeFrame = 60*30; // таймфрейм в секундах.
Account = "00000"; // Номер счета
Client_Code = "00000"; // Код Клиента
Quik = "QUIK"; // путь к Квику
Tickers = "Br8,SBER"; // торгуемые символы через запятую без пробелов. Для контроля ошибок. Так, как они называются в Ами
/////////////
///////////////
// задаем размер лотов, коды и отступ для разных символов
/////////////
if(Name() == "Br8") { //Символ как он называется в Ами
SecCode = "BRQ6";
Class = "SPBFUT";
Lots = 5;
TickS = 0.01; // Минимальный шаг цены торгуемой бумаги
Stop = 1; // стоп в %
profit = 100; // профит в %
Otstup = 0.50; // Заявка будет выставлена хуже текущей цены на Otstup рублей
}
else if(Name() == "SBER") { //Символ как он называется в Ами
SecCode = "SBER03";
Class = "EQBR";
Lots = 0;
TickS = 0.01; // Минимальный шаг цены торгуемой бумаги
Stop = 0; // стоп в %
profit = 4; // профит в %
Otstup = 1; // Заявка будет выставлена хуже текущей цены на Otstup рублей
}
////////////////////////////////////
text = iz = sd = order = "";
color = coloriz = colorDefault;
price = 0;
str = Now(0) + " " + Name();
pos = AS_READ_PARAM("Quik_Robot", Name(), "pos");
//////////////Система///////////////
Buyperiods=Param("Breakout periods best is usually 18",6,1,100,1,1);
Sellperiods=Param("Exit Breakout",7,1,100,1,1);
Buy1= C>Ref(HHV(High,Buyperiods),-1) ;
Sell1= C<Ref(LLV(Low,Sellperiods),-1);
Buy1 = ExRem(Buy1, Sell1);
Sell1 = ExRem(Sell1, Buy1);
Short1 = Sell1;
Cover1 = Buy1;
_SECTION_BEGIN("Alerts");
AlertIf( Buy1, "EMAIL", "Buy Alert in "+FullName()+"
@" +BuyPrice,1);
AlertIf( Sell1, "EMAIL", "Sell Alert in "+FullName()+"
@" +SellPrice,3);
_SECTION_END();
///////////Конец Системы////////////
Buy1 = Buy1[BarCount - 1];
Sell1 = Sell1[BarCount - 1];
Short1 = Short1[BarCount - 1];
Cover1 = Cover1[BarCount - 1];
/// стопы ///
if(pos > 0 AND C[BarCount-1] < AS_READ_PARAM("Quik_Robot", Name(), "price")*(1 - Stop/100))
{
Sell1 = 1;
str = str + " сработал стоп при лонге";
}
else if(pos < 0 AND C[BarCount-1] > AS_READ_PARAM("Quik_Robot", Name(), "price")*(1 + Stop/100))
{
Cover1 = 1;
str = str + " сработал стоп при шорте";
}
/// профит ///
if(pos > 0 AND C[BarCount-1] > AS_READ_PARAM("Quik_Robot", Name(), "price")*(1 + profit/100))
{
Sell1 = 1;
str = str + " сработал стоп при лонге";
}
else if(pos < 0 AND C[BarCount-1] > AS_READ_PARAM("Quik_Robot", Name(), "price")*(1 - profit/100))
{
Cover1 = 1;
str = str + " сработал стоп при шорте";
}
///////////// проверка наличия символа в списке для торговли ////////////////
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", 0);
AS_WRITE_PARAM("Quik_Robot", Name(), "price", 0);
}
else if(pos == 0 AND bs == "S") // шорт
{
AS_WRITE_PARAM("Quik_Robot", Name(), "pos", -1*Lot);
AS_WRITE_PARAM("Quik_Robot", Name(), "price", Close[BarCount - 2]);
}
else if(pos < 0 AND bs == "B") // закрытие шорта
{
AS_WRITE_PARAM("Quik_Robot", Name(), "pos", 0);
AS_WRITE_PARAM("Quik_Robot", Name(), "price", 0);
}
else if(pos == 0 AND bs == "B") // лонг
{
AS_WRITE_PARAM("Quik_Robot", Name(), "pos", Lot);
AS_WRITE_PARAM("Quik_Robot", Name(), "price", Close[BarCount - 2]);
}
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);
}
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);
}
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);
}
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(TimeFrame != Interval()) {
PopupWindow( "Не соответствует временной интервал в настройках АА и в коде",
"ошибка", timeout = 5, left = -1, top = -1 );
}
SetOption( "NoDefaultColumns", 1 );
AddTextColumn(Name(), "Символ", 1.0, colorDefault, colorDefault, 60);
AddColumn( C[BarCount-1], "Последняя цена", 1.2, colorDefault, colorDefault, 100 );
AddColumn( AS_READ_PARAM("Quik_Robot", Name(), "pos"), "Позиция", 1.0, colorDefault,
IIf(AS_READ_PARAM("Quik_Robot", Name(), "pos") > 0, colorGreen,
IIf(AS_READ_PARAM("Quik_Robot", Name(), "pos") < 0, colorRed, colorDefault)), 60);
AddTextColumn(sd, "Сигнал", 1.0, colorDefault, colorDefault, 60);
AddTextColumn(text, "Соединение", 1.2, colorDefault, color, 170);
AddTextColumn(iz, "Исполнение заявки", 1.2, colorDefault, coloriz, 120 );
AddTextColumn(order, "Заявка", 1.2, colorDefault, IIf(StrToNum(order) > 100, colorGreen, colorRed), 90);
|
|
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Ну ты бы хоть лог файл дал.... |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
IzBu
Зарегистрирован: 28.06.2016
Сообщения: 83
|
Стер я его. Дело в том что я запустил счас робота без стопов. А то лог стер. Без стопов четко исполняет сделки. а этот со стопами принудительно.
Где то ошибка в коде. не могли бы проверить. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
|
|
Следующая тема
Предыдущая тема
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете вкладывать файлы Вы не можете скачивать файлы
|
|