Автор |
Сообщение |
Alex14
Зарегистрирован: 12.11.2010
Сообщения: 90
|
Решил начать новую тему, хотя речь, в основном, пойдет о системах, использующих доливки.
Система №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
|
Как то так
Код: |
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
|
Такая конструкция, полагаю, должна быть доступна и для доливки шорта, немного подправил, так вроде правильнее
Код: |
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
|
У тебя везде Lot=Lots; Может тогда стоит перед циклом написать да и все...
По моему никакого особого смысла в доливках нет. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
Alex14
Зарегистрирован: 12.11.2010
Сообщения: 90
|
В продолжение разговора, попытался сваять код по системе №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
|
На все хотелки напиши плиз что собственно надо.
Поясняю.
Цитата: |
1. открывает первоначальную позицию только тогда, когда случилось пересечение с нулевой ценой (в примере 1750) |
А как надо?
А то непонятно как усовершенствовать эти несовершенства. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
Alex14
Зарегистрирован: 12.11.2010
Сообщения: 90
|
Думал Equity(1) поможет, но нет, поменялось, но все равно первая сделка с отставанием |
_________________ Деда Мороза не существует!!! |
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Вероятнее всего ты в коде накосячил и он не видит что условие выполняется на первой свечке.
Конечно возможно, что тестер видит условие но совершить сделку ему не дает что то другое, например недостаточный объем торгов на первой свечке.
Посмотреть видит ли код сигнал не сложно. Надо в настройках тестера на закладке reports переключиться на Detailed log и посмотреть есть ли сигнал на этой свечке. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
Alex14
Зарегистрирован: 12.11.2010
Сообщения: 90
|
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
|
Чтобы доливалось не от цены последней доливки а от первоначальной цены надо изменить тут
Код: |
EntryPrice = BuyPrice[i]; // запоминаем цену последней доливки |
Сейчас запоминается цена закрытия бара на последней доливке. Меняем на
Код: |
EntryPrice = EntryPrice - step; // |
для шорта разумеется + |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Цитата: |
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
|
А на вопрос 4. Что я могу сказать. Ну могу конечно сам отливку написать...
|
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
Alex14
Зарегистрирован: 12.11.2010
Сообщения: 90
|
Олег, спасибо за помощь, но один вопрос (не считая отливки) так и остался у меня не решенным. Мне нужно, чтобы величина Lot была переменной, т.е. зависит то того, сколько шагов "проскочила" от последней доливки. Ты писал
Код: |
Lot[i] = Lots*2; // увеличиваем лот в 2 раза |
, но мне нужно, чтобы лот считался как округленное значение, типа так
Код: |
Bdol = floor ((EntryPrice - C[i])/ step); // считаем размер доливки
Lot[i] = Lots * Bdol ; // увеличиваем лот на размер доливки |
но такая конструкция в цикле работает некорректно, пропускает сигналы, или совершает лишние. Я уже начал подумывать, может это невозможно?((( |
_________________ Деда Мороза не существует!!! |
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Вроде должно работать.
Вечером посмотрю и напишу. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
Alex14
Зарегистрирован: 12.11.2010
Сообщения: 90
|
для шорта нужно вот так, просто переменную EntryPrice за циклом то нельзя прописать
Код: |
Sdol = floor ((C[i]- EntryPrice1)/ step); // размер доливки для шорта
Lot[i] = Lots*Sdol; // увеличиваем лот на размер доливки |
Для удобства кину код на почту |
_________________ Деда Мороза не существует!!! |
|
Посмотреть профиль Отправить личное сообщение |
|
|