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



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

СообщениеДобавлено: Пт Авг 15, 2014 8:45 am Ответить с цитатой Вернуться к началу

Есть система работающая на большом портфеле эмитентов. При этом в тестировании я указываю максимальный лимит открытых позиций (например только 2 позиции при портфеле в 10 эмитентов).
Тестируется в Амиброкере это все "на ура", а вот как это заставить торговать в таком же ключе???
При торговле Амиброкер тупо отправляет все сигналы на исполнение несмотря на то что уже открыто 2 и более позиций.
Кто-то реализовывал подобное?
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

СообщениеДобавлено: Пт Авг 15, 2014 10:04 pm Ответить с цитатой Вернуться к началу

Ну это надо делать счетчик позиций. В принципе ничего сложного.
Где нибудь в начале кода читаем из файла колько на текущий момент позиций открыто. Типа так
Код:
trade = AS_READ_PARAM("Quik_Robot", "TRADE", "pos");


Затем кода открываем или закрываем позу меняем число trade

Сюда
Код:
   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;
   }


вписываем

Код:
AS_WRITE_PARAM("Quik_Robot", "TRADE", "pos", trade + 1);

или
Код:
AS_WRITE_PARAM("Quik_Robot", "TRADE", "pos", trade - 1);


в итоге получаем
Код:
   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", "TRADE", "pos", trade - 1);
      }
      else if(pos == 0 AND bs == "S") {         // шорт
         AS_WRITE_PARAM("Quik_Robot", Name(), "pos", -1*Lot);
         AS_WRITE_PARAM("Quik_Robot", "TRADE", "pos", trade + 1);
      }
      else if(pos < 0 AND bs == "B") {         // закрытие шорта
         AS_WRITE_PARAM("Quik_Robot", Name(), "pos", 0);
         AS_WRITE_PARAM("Quik_Robot", "TRADE", "pos", trade - 1);
      }
      else if(pos == 0 AND bs == "B") {      // лонг
         AS_WRITE_PARAM("Quik_Robot", Name(), "pos", Lot);
         AS_WRITE_PARAM("Quik_Robot", "TRADE", "pos", trade + 1);
      }
      str = str + "  позиция на момент исполнения " + pos;
   }


Ну и остается только добавить фильтр на сделку в зависимости от числа открытых позиций
Код:

if (TimeFrame == Interval() AND Permit_Ticker)
{
   if(Buy1[BarCount-1] AND pos == 0 AND trade < 2) {
      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 AND trade < 2) {
      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);
   }
}

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



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

СообщениеДобавлено: Пн Авг 18, 2014 7:44 am Ответить с цитатой Вернуться к началу

Олег, благодарю!
Я что-то подобное пытался сделать... но у тебя как-то значительно красивей все получилось )))

Правда возник следующая задачка...
Исходные условия:
сигналы по ВТБ - открытие позиции в 10:00 15 числа и закрытие позиции в 15:00 20 числа
сигналы по Сбер - открытие позиции в 11:00 15 числа и закрытие позиции в 12:00 16 числа
сигналы по Газ - открытие позиции в 15:00 15 числа и закрытие позиции в 15:00 20 числа (при этом условие на открытие держалось до 18 числа постоянно)


Т.к. автомат отрабатывает только сигналы, то он в итоге так и не откроет позу по Газу несмотря на то, что с 12:00 16 числа ДС были свободны.
При этом при тестировании ситуации в тестере, Ами открывает позу по Газу сразу как только закрывает позу по Сберу, т.к. для этого есть условия...

с этим как то можно побороться? (т.е. чтоб робот вел себя как тестер, опять же, и открывал позу по Газу)
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

СообщениеДобавлено: Пн Авг 18, 2014 8:56 am Ответить с цитатой Вернуться к началу

Виктор писал(а):

Т.к. автомат отрабатывает только сигналы, то он в итоге так и не откроет позу по Газу несмотря на то, что с 12:00 16 числа ДС были свободны.
При этом при тестировании ситуации в тестере, Ами открывает позу по Газу сразу как только закрывает позу по Сберу, т.к. для этого есть условия...

с этим как то можно побороться? (т.е. чтоб робот вел себя как тестер, опять же, и открывал позу по Газу)

Почему не откроет? Должен открыть.

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



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

СообщениеДобавлено: Чт Май 11, 2017 12:42 pm Ответить с цитатой Вернуться к началу

I know nothing is always right. Thoughts of people, the truth will come true.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Показать сообщения:      
Начать новую тему  Ответить на тему


 Перейти:   



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


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

File Attachment © by Meik Sievertsen