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



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

СообщениеДобавлено: Вт Апр 16, 2013 5:26 pm Ответить с цитатой Вернуться к началу

Решил начать новую тему, хотя речь, в основном, пойдет о системах, использующих доливки.
Система №1 - доливки по тренду для трендовой системы
Система №2 - для инструментов, ходящих в относительно небольшом диапазоне (подробно описана в журнале F&O №11 за 2012 год).
Суть вопросов по системе 1. До этого тестил трендовую систему, напоминающую канал, при этом доливки осуществлялись при повышении канала на ширину диапазона, т.е. при UP>Ref(Up, -1) (вариант типа Ренко), таким образом после Buy система генерировала сигналы на покупку (доливку), до момента переворота
Код:
 for (i = 1; i < BarCount; i++)
    {

    if (Dn[i]>=Up[i-1])
       { 
         Buy[ i ] = 1;
          Pos = Lots;
         
       }       

     if (Dn[i]>=Up[i-1])// AND Volat [i]!=0)
       {
          Buy[ i ] = sigScaleIn;
          Pos = Lots;
       }

    if (Up[i]<=Dn[i-1])
       {
         
         Short[ i ] = 1;
             Pos = Lots;
       }
      if (Up[i]<=Dn[i-1])//AND Volat[i] !=0)//контрактов2 и пробиваем верхнюю линию Вариант 2
       {
          Short[ i ] = sigScaleIn;
          Pos = Lots;
       }
}


Sell = Up<=Ref(DN,-1);//AND Time AND Time1 OR Time2;
Cover =DN>=Ref(Up,-1);//OR Time2;

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


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

СообщениеДобавлено: Вт Апр 16, 2013 11:33 pm Ответить с цитатой Вернуться к началу

Как то так
Код:

Buy = ...;
Sell = ...;
BuyPrice = C;
SellPrice = C;

step = 100; // шаг доливки

pos = EntryPrice = 0;

for( i = 1; i < BarCount; i++ )
{
  if(pos == 0)
  {
    if(Buy[i] == 1)
    {
      pos = 1;
      BuyPrice[i] = ...; // если вход не по цене закрытия
      EntryPrice = BuyPrice[i]; // запоминаем цену входа
    }
  }
  if(pos == 1)
  {
    Buy[i] = 0;
    if(Sell[i] == 1)
    {
      pos = 0;
    }
    else if(H > EntryPrice + step)
    {
      Buy[i] = sigScaleIn;
      BuyPrice[i] = EntryPrice + step; // цена последней доливки
      EntryPrice = BuyPrice[i]; // запоминаем цену последней доливки
    }
  }
}

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



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

СообщениеДобавлено: Ср Апр 17, 2013 12:40 pm Ответить с цитатой Вернуться к началу

Такая конструкция, полагаю, должна быть доступна и для доливки шорта, немного подправил, так вроде правильнее
Код:

pos = EntryPrice = 0;

for( i = 1; i < BarCount; i++ )
{
  if(pos == 0)
  {
    if(Buy[i] == 1)
    {
      pos = 1;
      BuyPrice[i] = C[i]; // если вход не по цене закрытия
      EntryPrice = BuyPrice[i]; // запоминаем цену входа
   Lot=Lots; // определяем размер позы
    }
    if(Short[i] == 1)
    {
      pos = -1;
     ShortPrice[i] = C[i]; // если вход не по цене закрытия
      EntryPrice1 = ShortPrice[i]; // запоминаем цену входа
      Lot=Lots;
    }

  }
  if(pos == 1)
  {
    Buy[i] = 0;
    if(Sell[i] == 1)
    {
      pos = 0;
    }
    else if(H [i] > EntryPrice + step*TickSize) здесь указывать шаг цены * на мин.шаг изменения
    {
      Buy[i] = sigScaleIn;
      BuyPrice[i] =C [i]; // цена последней доливки
      EntryPrice = BuyPrice[i]; // запоминаем цену последней доливки
   Lot=Lots;
    }
  }
if(pos == -1)
  {
    Short[i] = 0;
    if(Cover[i] == 1)
    {
      pos = 0;
    }
    else if(L [i] < EntryPrice1 - step*TickSize)
    {
      Short[i] = sigScaleIn;
      ShortPrice[i] = C [i]; // цена последней доливки
      EntryPrice1 = ShortPrice[i]; // запоминаем цену последней доливки
   Lot=Lots;
    }
  }
}

по второй системе попробую сам, результаты скину, может кому пригодится. Олег, если ты разбирал что то подобное (система 2) из перврго поста, напиши...может и не стоит морочиться, и вообще, хотелось бы узнать у форумчан отношение к различным видам доливок/ отливок/пирамидинга и т.п.
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

СообщениеДобавлено: Ср Апр 17, 2013 3:31 pm Ответить с цитатой Вернуться к началу

У тебя везде Lot=Lots; Может тогда стоит перед циклом написать да и все...

По моему никакого особого смысла в доливках нет.

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



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

СообщениеДобавлено: Ср Апр 24, 2013 7:08 am Ответить с цитатой Вернуться к началу

В продолжение разговора, попытался сваять код по системе №2, затронутой мною выше, выкладываю код, но есть пара вопросов.
Код:
///////////////////////////////////////////////////////////////////////////////
/////////////    Многоуровневый маркет - мейкинг     /////////////////////////

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


//Lots = SetPositionSize(100, 2);
//Lots2 = SetPositionSize(100, 2);
SetBarsRequired( 100000, 0 );
SetTradeDelays(0, 0, 0, 0);

 
NullPrice = 31500 ;// определяем нулевую цену (фикс либо большой МА)
step = 0.16/100 * NullPrice; // шаг доливки в пунктах

pos = EntryPrice = 0;
Lots  = SetPositionSize(1, 4);//определяем размер лота и лота доливки
// прописываем сигналы на вход и выход
Buy = Sell =Short= Cover =0;


Buy = Cover = C < (NullPrice - step); // если отвалились более чем на шаг   
Sell = Short = C > (NullPrice + step) ;//если вернулись к NullPrice или выше

/// с каждым шагом вниз от NullPrice  добавляем позицию (доливка)
// при повышении от последней доливки отливаем - пока не реализовано
//с шортом наоборот

for( i = 1; i < BarCount; i++ )
{
  if(pos == 0) //если не в позиции
  {
    if(Buy[i] == 1) // если сигнал на лонг
    {
      pos = 1; //
      BuyPrice[i] = C[i]; // если вход не по цене закрытия
      EntryPrice = BuyPrice[i]; // запоминаем цену входа, от нее будет следущая доливка
      Lot= Lots * floor ( (NullPrice - C)/ step); // определяем размер позы по формуле
// Lots* на количество шагов step
    }
    if(Short[i] == 1) //если сигнал на шорт
    {
      pos = -1;
     ShortPrice[i] = C[i]; // если вход не по цене закрытия
      EntryPrice1 = ShortPrice[i]; // запоминаем цену шорта и от нее доливаем
      Lot= Lots * floor ( (NullPrice + C[i])/ step);// округляем до полного лота
    }

  }
  if(pos == 1) // если поза в лонге
  {
    Buy[i] = 0;
    if(Sell[i] == 1)
    {
      pos = 0;
    }
    else if(C [i] < EntryPrice - step) //нужно долить, если цена ниже открытия лонга на step!!!
    {
      Buy[i] = sigScaleIn;
      BuyPrice[i] = C [i]; // цена последней доливки
      EntryPrice = BuyPrice[i]; // запоминаем цену последней доливки
      Lot = Lots * floor ( (EntryPrice - C[i])/ step) ;
    }
  }
if(pos == -1)
  {
    Short[i] = 0;
    if(Cover[i] == 1)
    {
      pos = 0;
    }
    else if(C [i] > EntryPrice1 +step )
    {
      Short[i] = sigScaleIn;
      ShortPrice[i] = C [i]; // цена последней доливки
      EntryPrice1 = ShortPrice[i]; // запоминаем цену последней доливки
    Lot= Lots * floor ( ( C[i]-EntryPrice1 )/ step) ;
    }
  }
}

несовершенство данного кода заключается в следующем:
1. открывает первоначальную позицию только тогда, когда случилось пересечение с нулевой ценой (в примере 1750)
2. некорректно считает размер лота для открытия и доливок тупо берет Lots * 1
3. Можно ли как то указать, чтобы "отваливание" цены было не от цены последней сделки, а считалось от NullPrice (а то ставлю допустим 10 р шаг по лукойлу, он покупает когда цена отвалилась больше, чем на 10р, допустим до 1732, а потом доливает, когда еще на 10, но уже от 1732 )
4. ну, и собственно, пока не реализована отливка от позы, помучаюсь, конечно, может подскажешь как лучше
P.S. посмотри в общем, может можно как то более оптимально. Тестил на часовиках, в принципе сносно, но бумажка должна быть достаточно "узкая" или на форексе посмотреть, но это пока для меня не близкая тема(((

_________________
Деда Мороза не существует!!!
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

СообщениеДобавлено: Ср Апр 24, 2013 9:14 am Ответить с цитатой Вернуться к началу

На все хотелки напиши плиз что собственно надо.
Поясняю.
Цитата:
1. открывает первоначальную позицию только тогда, когда случилось пересечение с нулевой ценой (в примере 1750)

А как надо?
А то непонятно как усовершенствовать эти несовершенства.

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



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

СообщениеДобавлено: Ср Апр 24, 2013 9:48 am Ответить с цитатой Вернуться к началу

Думал Equity(1) поможет, но нет, поменялось, но все равно первая сделка с отставанием

_________________
Деда Мороза не существует!!!
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

СообщениеДобавлено: Ср Апр 24, 2013 10:42 am Ответить с цитатой Вернуться к началу

Вероятнее всего ты в коде накосячил и он не видит что условие выполняется на первой свечке.
Конечно возможно, что тестер видит условие но совершить сделку ему не дает что то другое, например недостаточный объем торгов на первой свечке.
Посмотреть видит ли код сигнал не сложно. Надо в настройках тестера на закладке reports переключиться на Detailed log и посмотреть есть ли сигнал на этой свечке.

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



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

СообщениеДобавлено: Ср Апр 24, 2013 10:47 am Ответить с цитатой Вернуться к началу

000 писал(а):

Посмотреть видит ли код сигнал не сложно. Надо в настройках тестера на закладке reports переключиться на Detailed log и посмотреть есть ли сигнал на этой свечке.
я так пробовал, там сигнала нет, затык именно в первой сделке, дальше все исполнения отрабатываются как надо, за исключением тех проблем, что описал выше. При этом когда переношу эти строчки в конец кода, все корректно, только не доливает(((
Код:
Buy = Cover = C < (NullPrice - step); // если отвалились более чем на шаг   
Sell = Short = C > (NullPrice + step) ;//если вернулись к NullPrice или выше
По .п.п 2,3,4 что нибудь скажешь? Код приведен полностью

_________________
Деда Мороза не существует!!!
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

СообщениеДобавлено: Ср Апр 24, 2013 11:08 am Ответить с цитатой Вернуться к началу

Чтобы доливалось не от цены последней доливки а от первоначальной цены надо изменить тут
Код:
EntryPrice = BuyPrice[i]; // запоминаем цену последней доливки

Сейчас запоминается цена закрытия бара на последней доливке. Меняем на
Код:
EntryPrice = EntryPrice - step; //

для шорта разумеется +

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


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

СообщениеДобавлено: Ср Апр 24, 2013 11:13 am Ответить с цитатой Вернуться к началу

Цитата:
2. некорректно считает размер лота для открытия и доливок тупо берет Lots * 1

Правильно. Ты в начале кода задал размер сделки
Код:
Lots  = SetPositionSize(1, 4);//определяем размер лота и лота доливки

Причем не правильно.
Надо было так
Код:
Lots = 1;
SetPositionSize(Lots, 4);

Потом в цикле меняешь Lot не понятно зачем.
Скорее всего ты хотел использовать Lot для регулировки размера, но в таком случае надо
Lot[i] = .....;
И после цикла задать тестеру чтобы он применял эти значения к размеру сделки
SetPositionSize(Lot[i], 4);

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


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

СообщениеДобавлено: Ср Апр 24, 2013 11:16 am Ответить с цитатой Вернуться к началу

А на вопрос 4. Что я могу сказать. Ну могу конечно сам отливку написать...
Laughing Laughing Laughing

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



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

СообщениеДобавлено: Чт Апр 25, 2013 3:24 pm Ответить с цитатой Вернуться к началу

Олег, спасибо за помощь, но один вопрос (не считая отливки) так и остался у меня не решенным. Мне нужно, чтобы величина Lot была переменной, т.е. зависит то того, сколько шагов "проскочила" от последней доливки. Ты писал
Код:
Lot[i] = Lots*2; // увеличиваем лот в 2 раза
, но мне нужно, чтобы лот считался как округленное значение, типа так
Код:
Bdol = floor ((EntryPrice - C[i])/ step); // считаем размер доливки
Lot[i] = Lots * Bdol ; // увеличиваем лот на размер доливки
но такая конструкция в цикле работает некорректно, пропускает сигналы, или совершает лишние. Я уже начал подумывать, может это невозможно?(((

_________________
Деда Мороза не существует!!!
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

СообщениеДобавлено: Чт Апр 25, 2013 3:46 pm Ответить с цитатой Вернуться к началу

Вроде должно работать.
Вечером посмотрю и напишу.

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



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

СообщениеДобавлено: Чт Апр 25, 2013 4:08 pm Ответить с цитатой Вернуться к началу

для шорта нужно вот так, просто переменную EntryPrice за циклом то нельзя прописать
Код:
Sdol = floor ((C[i]- EntryPrice1)/ step); // размер доливки для шорта
Lot[i] = Lots*Sdol; // увеличиваем лот на размер доливки

Для удобства кину код на почту

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


 Перейти:   



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


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

File Attachment © by Meik Sievertsen