Автор |
Сообщение |
bonzamen
Зарегистрирован: 17.08.2010
Сообщения: 50
Откуда: Созвездие Альдебаран
|
Добрый день!Я не программист,поэтому не судите строго!Спасибо большое Олегу за чудесного робота,все работает отлично без глюков и сбоев,но вот задался целью немного диверсифицировать свою торговлю и торговать два алгоритма в одном роботе,скажите правильно ли я делаю если просто втыкаю два алгоритма в рубаху робота?!
Код: |
Filter = 1;
TimeFrame = 60*5; // таймфрейм в секундах.
Account = "410хххх"; // Номер счета
Client_Code = ""; // Код Клиента
Quik = "C:\\QUIK"; // путь к КвикуC:\Quik
Tickers = "Si"; // торгуемые символы через запятую без пробелов. Для контроля ошибок. Так, как они называются в Ами
/////////////
///////////////
// задаем размер лотов, коды и отступ для разных символов
/////////////
if(Name() == "Si") { //Символ как он называется в Ами
SecCode = "SiM6";// Si <//м><г>, где <м> — месяц исполнения, <г> — год исполнения.
//Обозначения: Z -декабрь , H -март , M -июнь , U -сентябрь.SPBFUT
//Год исполнения указывается одной цифрой.MC0139600000
Class = "SPBFUT";
Lots = 30 ; // КОЛИЧЕСТВО КОНТРАКТОВ !!!
TickS = 1; // Минимальный шаг цены торгуемой бумаги
Otstup = 80; // Заявка будет выставлена хуже текущей цены на Otstup рублей
}
else if(Name() == "Si") { //Символ как он называется в Ами
SecCode = "Si";
Class = "SPBFUT";
Lots = 1;
TickS = 1; // Минимальный шаг цены торгуемой бумаги
Otstup = 20; // Заявка будет выставлена хуже текущей цены на Otstup рублей
}
//////////////Система1///////////////
a1=10;
a2=20;
Buy1= MA(C,a1)>MA(C,a2) ;
Sell1=MA(C,a1)<MA(C,a2) ;
Short1=MA(C,a1)<MA(C,a2) ;
Cover1=MA(C,a1)>MA(C,a2) ;
//////////////Система2///////////////
a3=100;
a4=200;
Buy2= MA(C,a3)>MA(C,a4) ;
Sell2=MA(C,a3)<MA(C,a4) ;
Short2=MA(C,a3)<MA(C,a4) ;
Cover2=MA(C,a3)>MA(C,a4) ;
///////////Конец Системы1////////////
Buy1 = Ref(Buy1, -1);
Sell1 = Ref(Sell1, -1);
Short1 = Ref(Short1, -1);
Cover1 = Ref(Cover1, -1);
///////////Конец Системы2////////////
Buy2 = Ref(Buy1, -1);
Sell2 = Ref(Sell1, -1);
Short2 = Ref(Short1, -1);
Cover2 = Ref(Cover1, -1);
////////////////////////////////////
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_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);
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(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(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);
|
Будет все это работать? И как объем позиции будет делиться пополам или на каждую стратегию будет уходить по 30-ть контрактов,как отслеживаться будут открытые позиции,чувствую,что так не получится и надо еще что-то подкрутить...Если можно подскажите пожалуйста! |
_________________ Всем удачи! |
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Нет. Так работать не будет.
Ну во первых у тебя сигналы системы 2 вообще до отправки сообщений никак не доходят. Они у тебя Buy2, Sell2, Short2, Cover2, а отправляются только сигналы Buy1, Sell1, Short1, Cover1 вот тут
Код: |
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);
} |
Во вотрых ты ошибся тут и присваиваешь сигналы первой системы сигналам второй.
Код: |
Buy2 = Ref(Buy1, -1);
Sell2 = Ref(Sell1, -1);
Short2 = Ref(Short1, -1);
Cover2 = Ref(Cover1, -1); |
Ну и вообще это надо делать не так. Завести 2 блока отправки. Для синалов системы 1 и для сигнаов системы 2 соответственно и отдельно вести позиции каждой системы.
Типа как то так. Не проверял. Возможны ошибки
Код: |
Filter = 1;
TimeFrame = 60*5; // таймфрейм в секундах.
Account = "410хххх"; // Номер счета
Client_Code = ""; // Код Клиента
Quik = "C:\\QUIK"; // путь к КвикуC:\Quik
Tickers = "Si"; // торгуемые символы через запятую без пробелов. Для контроля ошибок. Так, как они называются в Ами
/////////////
///////////////
// задаем размер лотов, коды и отступ для разных символов
/////////////
if(Name() == "Si") { //Символ как он называется в Ами
SecCode = "SiM6"; // Si <//м><г>, где <м> — месяц исполнения, <г> — год исполнения.
//Обозначения: Z -декабрь , H -март , M -июнь , U -сентябрь.SPBFUT
//Год исполнения указывается одной цифрой.MC0139600000
Class = "SPBFUT";
Lots1 = 30; // КОЛИЧЕСТВО КОНТРАКТОВ СИСТЕМЫ 1
Lots2 = 30; // КОЛИЧЕСТВО КОНТРАКТОВ СИСТЕМЫ 2
TickS = 1; // Минимальный шаг цены торгуемой бумаги
Otstup = 80; // Заявка будет выставлена хуже текущей цены на Otstup рублей
}
// ЗАЧЕМ БЫЛО 2 раза Si ????
//else if(Name() == "Si") { //Символ как он называется в Ами
// SecCode = "Si";
// Class = "SPBFUT";
// Lots = 1;
// TickS = 1; // Минимальный шаг цены торгуемой бумаги
// Otstup = 20; // Заявка будет выставлена хуже текущей цены на Otstup рублей
//}
//////////////Система1///////////////
a1=10;
a2=20;
Buy1= MA(C,a1)>MA(C,a2) ;
Sell1=MA(C,a1)<MA(C,a2) ;
Short1=MA(C,a1)<MA(C,a2) ;
Cover1=MA(C,a1)>MA(C,a2) ;
///////////Конец Системы1////////////
Buy1 = Ref(Buy1, -1);
Sell1 = Ref(Sell1, -1);
Short1 = Ref(Short1, -1);
Cover1 = Ref(Cover1, -1);
//////////////Система2///////////////
a3=100;
a4=200;
Buy2= MA(C,a3)>MA(C,a4) ;
Sell2=MA(C,a3)<MA(C,a4) ;
Short2=MA(C,a3)<MA(C,a4) ;
Cover2=MA(C,a3)>MA(C,a4) ;
///////////Конец Системы2////////////
Buy2 = Ref(Buy2, -1);
Sell2 = Ref(Sell2, -1);
Short2 = Ref(Short2, -1);
Cover2 = Ref(Cover2, -1);
////////////////////////////////////
text = iz = sd = order = "";
color = coloriz = colorDefault;
price = 0;
str = Now(0) + " " + Name();
pos1 = AS_READ_PARAM("Quik_Robot", Name(), "pos1");
pos2 = AS_READ_PARAM("Quik_Robot", Name(), "pos2");
///////////// проверка наличия символа в списке для торговли ////////////////
k = 0;
Permit_Ticker = False;
do {
Tick = StrExtract(Tickers, k);
k++;
if(Name() == Tick)
Permit_Ticker = True;
} while(Tick != "");
/////////// Функции ////////////
procedure orders(bs, pr, Lot, sys)
{
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(sys == 1)
{
if(pos1 > 0 AND bs == "S") // закрытие лонга системы 1
AS_WRITE_PARAM("Quik_Robot", Name(), "pos1", 0);
else if(pos1 == 0 AND bs == "S") // шорт системы 1
AS_WRITE_PARAM("Quik_Robot", Name(), "pos1", -1*Lot);
else if(pos1 < 0 AND bs == "B") // закрытие шорта системы 1
AS_WRITE_PARAM("Quik_Robot", Name(), "pos1", 0);
else if(pos1 == 0 AND bs == "B") // лонг системы 1
AS_WRITE_PARAM("Quik_Robot", Name(), "pos1", Lot);
str = str + " позиция на момент исполнения " + pos1;
}
else if(sys == 2)
{
if(pos2 > 0 AND bs == "S") // закрытие лонга системы 2
AS_WRITE_PARAM("Quik_Robot", Name(), "pos2", 0);
else if(pos2 == 0 AND bs == "S") // шорт системы 2
AS_WRITE_PARAM("Quik_Robot", Name(), "pos2", -1*Lot);
else if(pos2 < 0 AND bs == "B") // закрытие шорта системы 1
AS_WRITE_PARAM("Quik_Robot", Name(), "pos2", 0);
else if(pos2 == 0 AND bs == "B") // лонг системы 1
AS_WRITE_PARAM("Quik_Robot", Name(), "pos2", Lot);
str = str + " позиция на момент исполнения " + pos2;
}
}
else {
iz = "не исполнена";
coloriz = colorRed;
str = str + " заяка НЕ исполнена" + " ответ сервера=" + order;
}
}
////////// конец Функций //////////
if (TimeFrame == Interval() AND Permit_Ticker)
{
if(Buy1[BarCount-1] AND pos1 == 0) {
str = str + " Buy";
sd = "Buy";
orders("B", round(C[BarCount-1]) + Otstup, Lots1, 1);
AS_WRITE_FILE("log.quik", str);
}
else if(Sell1[BarCount-1] AND pos1 > 0) {
str = str + " Sell";
sd = "Sell";
orders("S", round(C[BarCount-1]) - Otstup, abs(pos1), 1);
AS_WRITE_FILE("log.quik", str);
}
else if(Short1[BarCount-1] AND pos1 == 0) {
str = str + " Short";
sd = "Short";
orders("S", round(C[BarCount-1]) - Otstup, Lots1, 1);
AS_WRITE_FILE("log.quik", str);
}
else if(Cover1[BarCount-1] AND pos1 < 0) {
str = str + " Cover";
sd = "Cover";
orders("B", round(C[BarCount-1]) + Otstup, abs(pos1), 1);
AS_WRITE_FILE("log.quik", str);
}
if(Buy2[BarCount-1] AND pos2 == 0) {
str = str + " Buy";
sd = "Buy";
orders("B", round(C[BarCount-1]) + Otstup, Lots2, 2);
AS_WRITE_FILE("log.quik", str);
}
else if(Sell2[BarCount-1] AND pos2 > 0) {
str = str + " Sell";
sd = "Sell";
orders("S", round(C[BarCount-1]) - Otstup, abs(pos2), 2);
AS_WRITE_FILE("log.quik", str);
}
else if(Short2[BarCount-1] AND pos2 == 0) {
str = str + " Short";
sd = "Short";
orders("S", round(C[BarCount-1]) - Otstup, Lots2, 2);
AS_WRITE_FILE("log.quik", str);
}
else if(Cover2[BarCount-1] AND pos2 < 0) {
str = str + " Cover";
sd = "Cover";
orders("B", round(C[BarCount-1]) + Otstup, abs(pos2), 2);
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
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
bonzamen
Зарегистрирован: 17.08.2010
Сообщения: 50
Откуда: Созвездие Альдебаран
|
Спасибо,Олег,буду разбираться! |
_________________ Всем удачи! |
|
Посмотреть профиль Отправить личное сообщение |
|
|
|
Следующая тема
Предыдущая тема
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете вкладывать файлы Вы не можете скачивать файлы
|
|