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



Зарегистрирован: 17.08.2010
Сообщения: 50
Откуда: Созвездие Альдебаран

СообщениеДобавлено: Пт Апр 29, 2016 1:42 pm Ответить с цитатой Вернуться к началу

Добрый день!Я не программист,поэтому не судите строго!Спасибо большое Олегу за чудесного робота,все работает отлично без глюков и сбоев,но вот задался целью немного диверсифицировать свою торговлю и торговать два алгоритма в одном роботе,скажите правильно ли я делаю если просто втыкаю два алгоритма в рубаху робота?!

Код:
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

СообщениеДобавлено: Пт Апр 29, 2016 10:49 pm Ответить с цитатой Вернуться к началу

Нет. Так работать не будет.
Ну во первых у тебя сигналы системы 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
Откуда: Созвездие Альдебаран

СообщениеДобавлено: Вс Май 01, 2016 1:58 pm Ответить с цитатой Вернуться к началу

Спасибо,Олег,буду разбираться!

_________________
Всем удачи!
Посмотреть профиль Отправить личное сообщение
Показать сообщения:      
Начать новую тему  Ответить на тему


 Перейти:   



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


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

File Attachment © by Meik Sievertsen