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


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

СообщениеДобавлено: Вт Июн 05, 2012 11:09 pm Ответить с цитатой Вернуться к началу

VAE писал(а):
000 писал(а):
Ошибка не в этих строках. Вероятно раньше.

Подскажите как найти ошибку?

Хм. Не знаю. Кидай сюда свой код. Посмотрю.

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



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

СообщениеДобавлено: Вт Июн 05, 2012 11:38 pm Ответить с цитатой Вернуться к началу

000 писал(а):
VAE писал(а):
000 писал(а):
Ошибка не в этих строках. Вероятно раньше.

Подскажите как найти ошибку?

Хм. Не знаю. Кидай сюда свой код. Посмотрю.

Торговля только фьючерсом РТС RIM2.
Filter = 1;
TimeFrame = 60*5; // таймфрейм в секундах.
Account = "SPBFUTXXXXX"; // номер счета.
Client_Code = "SPBFUTXXXXX"; // код клиента.
Quik = "C:\Quik5"; // Путь к квику.
Tickers = "RIM20"; // Символ как он называется в ами
if(Name() == "RIM20") { //Символ как он называется в ами
SecCode = "RIM2";
Class = "SPBFUT";
Lots = 1; // Число торгуемых лотов символа RIM2
TickS = 5; // Минимальный шаг цены контракта
Otstup = 100; // Заявка будет выставлена хуже текущей цены на Otstup пунктов
}
Cond1= Ref(HHV(H,6),-2)-Ref(LLV(L,6),-2)<200; // Пусть, консолидация - это состояния при котором цена была в диапазоне +/- 100 пунктов последние 30 мин.
DayEnd = Ref(Day(),1) != Ref(Day(), 2) OR Day() != Ref(Day(), 1); //Последний бар дня
Buy = Cross( Close, EMA(Close, 157));// Покупка выше скользящей средней
Sell=DayEnd;
SellPrice=C;
Short=Sell = Cross( EMA(Close, 157), Close); // Продажа ниже скользящей средней
ShortPrice=O;
Cover=DayEnd;
CoverPrice=C;
ApplyStop(stopTypeLoss, stopModePercent, 0.2,0.2, True );
ApplyStop(stopTypeProfit, stopModePercent, 1.6,1.6, True );
////////////////////////////////////

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)
{
"order = AS_QUIK_SEND_SYNCNE_WORDER (007)"; // 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);
else if(pos == 0 AND bs == "S") // шорт
AS_WRITE_PARAM("Quik_Robot", Name(), "pos", -1*Lot);
else if(pos < 0 AND bs == "B") // закрытие шорта
AS_WRITE_PARAM("Quik_Robot", Name(), "pos", 0);
else if(pos == 0 AND bs == "B") // лонг
AS_WRITE_PARAM("Quik_Robot", Name(), "pos", Lot);
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);
}
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);
{
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);
}
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);
}
}
"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

СообщениеДобавлено: Ср Июн 06, 2012 12:45 am Ответить с цитатой Вернуться к началу

В общем у тебя в системе полно косяков.
Код:

Cond1= Ref(HHV(H,6),-2)-Ref(LLV(L,6),-2)<200; // Пусть, консолидация - это состояния при котором цена была в диапазоне +/- 100 пунктов последние 30 мин.
DayEnd = Ref(Day(),1) != Ref(Day(), 2) OR Day() != Ref(Day(), 1); //Последний бар дня
Buy = Cross( Close, EMA(Close, 157));// Покупка выше скользящей средней
Sell=DayEnd;
SellPrice=C;
Short=Sell = Cross( EMA(Close, 157), Close); // Продажа ниже скользящей средней
ShortPrice=O;
Cover=DayEnd;
CoverPrice=C;
ApplyStop(stopTypeLoss, stopModePercent, 0.2,0.2, True );
ApplyStop(stopTypeProfit, stopModePercent, 1.6,1.6, True );

Первая строка. Зачем она? у тебя в дальнейшем Cond1 нигде не используется.
Вторая.

Вот такую конструкцию в роботе использовать нельзя
Код:

DayEnd = Ref(Day(),1) != Ref(Day(), 2) OR Day() != Ref(Day(), 1); //Последний бар дня

Робот имеет дело с последним баром и никакого следующего завтрашнего не видит.... Поэтому Ref(Day(), 1) запрещено....

Если надо выход в конце дня, то можно типа
Код:
DayEnd = NimeNum() >= 234500;

Тогда конец дня будет считаться в начале 5 минутной свечи которая начинается в 23:45 Это конечно не совсем конец дня...
Можно так же воспользоваться функцией Now()
Код:
DayEnd = Now(format = 4) > 234700;

Тогда надо следить, чтобы время на компе было правильное.

Код:
SellPrice=C;
ShortPrice=O;
CoverPrice=C;

В роботе вообще не надо.

Зря совсем убрал смещение сигналов при входе по скользящим. Оно необходимо.
Код:
Buy = Ref(Cross( Close, EMA(Close, 157)), -1);
Short = Sell = Ref(Cross( EMA(Close, 157), Close), -1);


И если используешь стопы ApplyStop(), то надо не забывать их активировать.

Для этого напиши в конце Equity(1);


В итоге. Робот и у него вместо
Код:

//////////////Система///////////////

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));

///////////Конец Системы////////////

Buy1 = Ref(Buy1, -1);
Sell1 = Ref(Sell1, -1);
Short1 = Ref(Short1, -1);
Cover1 = Ref(Cover1, -1);

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

Вставляшь
Код:

//////////////Система///////////////
DayEnd = NimeNum() >= 234500;                  //Последний бар дня
Buy = Ref(Cross( Close, EMA(Close, 157)), -1); // Покупка выше скользящей средней
Short = Sell = Cross( EMA(Close, 157), Close); // Продажа ниже скользящей средней

Sell = Sell OR DayEnd; 
 
Cover = DayEnd;

ApplyStop(stopTypeLoss, stopModePercent, 0.2,0.2, True );
ApplyStop(stopTypeProfit, stopModePercent, 1.6,1.6, True );

Equity(1);
////////////////////////////////////

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



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

СообщениеДобавлено: Ср Июн 06, 2012 1:10 am Ответить с цитатой Вернуться к началу

Спасибо большое я твой должник
Посмотреть профиль Отправить личное сообщение
VAE



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

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

Люди подскажите. При проверке выдает ошибку error 30 в этой строке
Tickers == "RIM" ; // Символ как он называется в ами
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

СообщениеДобавлено: Ср Июн 06, 2012 6:03 pm Ответить с цитатой Вернуться к началу

Ну.
Как у тебя в базе Ами символ называется?

Однако даже если у тебя в базе символа RIM нет, ошибку Ами показывать не будет. Вероятно в предыдущей строке косяк....

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



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

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

000 писал(а):
Ну.
Как у тебя в базе Ами символ называется?

Однако даже если у тебя в базе символа RIM нет, ошибку Ами показывать не будет. Вероятно в предыдущей строке косяк....

В ами он так и называется.
Filter = 1;
TimeFrame = 300; // таймфрейм в секундах.
Account = "SPBFUT00"; // номер счета.
Client_Code = "SPBFUT00"; // код клиента.
Quik = "C:\Quik5\";// Путь к квику.
Путь к квику вроде бы верный, номер счета тоже, код клиента беру из в меню "торговля"/"настройка счетов" и нажмите кнопку "добавить все". Торговый счет будет выбираться сам, код клиента нужно выбрать из выпадающего списка.
Посмотреть профиль Отправить личное сообщение
VAE



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

СообщениеДобавлено: Ср Июн 06, 2012 6:23 pm Ответить с цитатой Вернуться к началу

Вот только он почему то сам автоматом не выбирается, там четыре варианта, перепробовал все, но и это не помогает, одна и та же ошибка
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

СообщениеДобавлено: Ср Июн 06, 2012 8:14 pm Ответить с цитатой Вернуться к началу

Путь как раз не верный. В пути надо использовать двойноые бакслеши "C:\\Quik5"

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



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

СообщениеДобавлено: Ср Июн 06, 2012 8:21 pm Ответить с цитатой Вернуться к началу

000 писал(а):
Путь как раз не верный. В пути надо использовать двойноые бакслеши "C:\\Quik5"


Quik = "C:\\Quik5\";// Путь к квику. Олег пишет тоже самое
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

СообщениеДобавлено: Ср Июн 06, 2012 8:33 pm Ответить с цитатой Вернуться к началу

Тфу, блин. А какого у тебя в этой строке
Код:
Tickers == "RIM" ;

бвойное = ??? Тут должно быть одно....
И путь снова неправильный.
Я же написал. Надо так "C:\\Quik5"

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



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

СообщениеДобавлено: Ср Июн 06, 2012 8:41 pm Ответить с цитатой Вернуться к началу

000 писал(а):
Тфу, блин. А какого у тебя в этой строке
Код:
Tickers == "RIM" ;

бвойное = ??? Тут должно быть одно....
И путь снова неправильный.
Я же написал. Надо так "C:\\Quik5"

Он тогда целую кучу ошибок выдает.
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

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

Вот так надо
Код:

Filter = 1;

TimeFrame = 300;  // таймфрейм в секундах.
Account = "SPBFUT00";  // Номер счета
Client_Code = "SPBFUT00";  // Код Клиента
Quik = "C:\\Quik5"; // путь к Квику

Tickers = "RIM";    

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



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

СообщениеДобавлено: Ср Июн 06, 2012 8:57 pm Ответить с цитатой Вернуться к началу

000 писал(а):
Вот так надо
Код:

Filter = 1;

TimeFrame = 300;  // таймфрейм в секундах.
Account = "SPBFUT00";  // Номер счета
Client_Code = "SPBFUT00";  // Код Клиента
Quik = "C:\\Quik5"; // путь к Квику

Tickers = "RIM";    

Ладно буду разбираться. Спасибо большое
Посмотреть профиль Отправить личное сообщение
VAE



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

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

Олежок я понял в чем дело Quik_coonect, он не видит сам quik Вот только почему делаю, все точно как ты сказал??
Посмотреть профиль Отправить личное сообщение
Показать сообщения:      
Начать новую тему  Ответить на тему


 Перейти:   



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


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

File Attachment © by Meik Sievertsen