Автор |
Сообщение |
MrDzenLi
Зарегистрирован: 20.04.2015
Сообщения: 383
Откуда: VRN
|
"i", "x", "y", - я могу заменить на любые символы? |
_________________ Нам не дано знать всего. |
|
Посмотреть профиль Отправить личное сообщение Отправить e-mail ICQ Number |
|
MrDzenLi
Зарегистрирован: 20.04.2015
Сообщения: 383
Откуда: VRN
|
x=100;
do
{
y=x+1;
x--;
} while (x>0);
в данном случае цикл будет выполняться бесконечно? |
_________________ Нам не дано знать всего. |
|
Посмотреть профиль Отправить личное сообщение Отправить e-mail ICQ Number |
|
MrDzenLi
Зарегистрирован: 20.04.2015
Сообщения: 383
Откуда: VRN
|
вот, что нашел |
_________________ Нам не дано знать всего. |
|
Посмотреть профиль Отправить личное сообщение Отправить e-mail ICQ Number |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
MrDzenLi писал(а): |
"i", "x", "y", - я могу заменить на любые символы? |
Конечно. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
MrDzenLi писал(а): |
x=100;
do
{
y=x+1;
x--;
} while (x>0);
в данном случае цикл будет выполняться бесконечно? |
Нет.
х = 100.
х-- означает, что х уменьшается на 1. После первого прохода икла х станет 99 потом 98 и т.д пока не станет == 0. Тогда цикл прервется. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
MrDzenLi
Зарегистрирован: 20.04.2015
Сообщения: 383
Откуда: VRN
|
но
y = x+1;
значит, "x" каждый раз будет увеличиваться на единицу?
а
x--;
уменьшает на единицу,
соответственно - цикл бесконечен? |
_________________ Нам не дано знать всего. |
|
Посмотреть профиль Отправить личное сообщение Отправить e-mail ICQ Number |
|
Marcello
Зарегистрирован: 30.05.2015
Сообщения: 69
|
Решил написать сюда, т.к. мой вопрос также касается циклов. Возможно, использовать циклы в AmiBroker не совсем рационально, но лично мне так понятнее.
Написал ф-цию для определения размера позиции
Код: |
function getSize( xPrice, xStop, xPercent ) {
if ( xPercent == 0 ) SZ = 1; // если риск не задан, то 1 лот
else {
pRisk = abs( xPrice - xStop );
pRiskSum = Equity() / 100 * xPercent;
SZ = floor( pRiskSum / pRisk / RoundLotSize );
}
return SZ * RoundLotSize;
} |
Далее в коде использую это так:
Код: |
Risk = Optimize( "Risk", 0, 0, 10, 0.5 ); // определение величины риска в %
|
Код: |
for ( i = ii; i < BarCount; i++ ) {
....
PSize = getSize( C[i], SL[i], Risk ); // вход по закрытию, стоп - определенная цена
if ( PSize > 0 ) { // если размер позиции определен, то задаем его через SetPositionSize
SetPositionSize( PSize, spsShares );
Short[i] = 1;
ShortPrice[i] = C[i];
}
.... |
Если в качестве риска подать 0, то все работает: сделки открываются одним лотом. Если же подать что-то, отличное от нуля, то уже на этапе верификации синтаксиса получаю сообщение:
Цитата: |
Error 6. Condition in IF, WHILE, FOR statements has to be Numeric or Boolean type. You can not use array here, please use [] (array subscript operator) to access array elements |
Выше в коде использую такие опции
Код: |
SetOption("FuturesMode", True );
SetOption( "InitialEquity", 1000000000);
SetOption( "DisableRuinStop", True);
SetOption( "AllowSameBarExit", True);
SetOption( "ActivateStopsImmediately", True);
SetOption( "MinShares", 1);
SetOption( "AllowPositionShrinking", true);
SetOption( "MinPosValue", 0);
SetOption( "MaxOpenPositions", 100);
SetOption( "InterestRate", 0);
SetOption( "PriceBoundChecking", True);
SetOption( "AccountMargin", 100);
SetOption( "ReverseSignalForcesExit", False);
SetTradeDelays(0,0,0,0); |
В чем может быть проблема? |
|
|
Посмотреть профиль Отправить личное сообщение |
|
Marcello
Зарегистрирован: 30.05.2015
Сообщения: 69
|
Продолжаю свой предыдущий пост.
Завел массив "эквити" EQ = 1000000. Функцию определения размера позиции переделал так:
Код: |
function getSize( xPrice, xStop, xPercent, xEQ, x ) {
if ( xPercent == 0 ) SZ = 1;
else {
pRisk = abs( xPrice - xStop );
pRiskSum = xEQ[x] / 100 * xPercent;
SZ = floor( pRiskSum / pRisk / RoundLotSize );
}
return SZ * RoundLotSize;
} |
Размер позиции PSize тоже сделал массивом, чтоб потом отобразить на графике. Определение размера позиции перед открытием:
Код: |
PSize[i] = getSize( C[i], SL[i], Risk, EQ, i ); |
При закрытии лонга делаю пересчет "эквити":
Код: |
for ( i = ii; i < BarCount; i++ ) {
EQ[i] = EQ[i-1];
PSize[i] = PSize[i-1];
Sell[i] = 1;
SellPrice[i] = C[i];
EQ[i] = EQ[i] + ( SellPrice[i] - enterPrice ) * PSize[i]; |
Размер позиции рассчитывается верно, судя по графику PSize, но в тестере в каждой сделке размер позиции равен 295. Точно такое же значение массива PSize на последнем баре. Что я делаю не так? Видимо я как-то не так использую установку размера позиции
Код: |
SetPositionSize( PSize[i], spsShares ); |
|
|
|
Посмотреть профиль Отправить личное сообщение |
|
Marcello
Зарегистрирован: 30.05.2015
Сообщения: 69
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Так у тебя ничего не получится.
Получается, что для расчета сайза тебе нужна эквити, а эквити зависит от сайза.
Для решения подобной задачи необходимо воспользоваться
Custom Backtester Interface.
Почитать можно тут
http://www.amibroker.com/docs/Houston2.pdf
Там есть pos.Sizing based on portfolio equity и rebalansing. Посмотри. Я с этой темой не очень дружу, но если будут вопросы постараюсь ответить. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
Enhema
Зарегистрирован: 25.12.2014
Сообщения: 36
|
Глаз не видит, мозг не понимает. В чём тут разница?
Проверяю цикл и не цикл. Результаты разные
Цикл:
Код: |
BuyPrice = O;
SellPrice = O;
ShortPrice = O;
CoverPrice = O;
starttime = 100000;
stoptime = 234000;
if(Name() == "SPFB.RTS")
{
SetPositionSize(2,spsShares);
BuySignal = Ref(C,-1) > Ref(MA(C,52),-1) AND TimeNum()>=starttime AND TimeNum()<stoptime;
SellSignal = Ref(C,-1) < Ref(MA(C,52),-1) OR TimeNum()>=stoptime;
ShortSignal = Ref(C,-1) < Ref(MA(C,52),-1) AND TimeNum()>=starttime AND TimeNum()<stoptime;
CoverSignal = Ref(C,-1) > Ref(MA(C,52),-1) OR TimeNum()>=stoptime;
/////////////////////////////////////////
position = 0;
for(i = 0; i < BarCount; i++)
{
if(position == 0)
{
if(BuySignal[i]) // проверка условия для лонга
{
Buy[i] = 1 ; // покупка
position = 1; // длинная позиция
}
else if(ShortSignal[i]) // проверка условия для шорта
{
Short[i] = 1; // продажа
position = -1; // короткая позиция
}
}
else if(position == 1) // в противном случае, если лонг
{
if(SellSignal[i]) // условия закрытия лонга
{
Sell[i] = 1; // закрытие лонга
position = 0; // система не в позиции
}
}
else if(position == -1) // в противном случае если шорт
{
if(CoverSignal[i]) // условия закрытия шорта
{
Cover[i] = 1; // закрытие шорта
position = 0; // система не в позиции
}
}
}
////////////////////////////////////////
ApplyStop(stopTypeProfit, stopModePercent, 0.3 ,1, True, 1 );
ApplyStop(stopTypeLoss, stopModePercent, 0.2, 1, True,15);
} |
Без цикла:
Код: |
BuyPrice = O;
SellPrice = O;
ShortPrice = O;
CoverPrice = O;
starttime = 100000;
stoptime = 234000;
if(Name() == "SPFB.RTS")
{
SetPositionSize(2,spsShares);
Buy = Ref(C,-1) > Ref(MA(C,52),-1) AND TimeNum()>=starttime AND TimeNum()<stoptime;
Sell = Ref(C,-1) < Ref(MA(C,52),-1) OR TimeNum()>=stoptime;
Short = Ref(C,-1) < Ref(MA(C,52),-1) AND TimeNum()>=starttime AND TimeNum()<stoptime;
Cover = Ref(C,-1) > Ref(MA(C,52),-1) OR TimeNum()>=stoptime;
ApplyStop(stopTypeProfit, stopModePercent, 0.3 ,1, True, 1 );
ApplyStop(stopTypeLoss, stopModePercent, 0.2, 1, True,15); |
|
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Ща некогда. Постараюсь в воскресенье разобраться. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Дело вот в чем.
Без цикла выходы ис позиции могут быть по сигналам и по стопу. Когда система вышла из рынка она входить по следующему сигналу.
А в цикле ты используешь выход только по сигналам и пока система в рынке (по сигналам) остальные сигналы фильтруются. Т.е. на самом деле система уже вышла из позы по стопу, но в цикле она продолжает считаться в рынке и сигналы на вход удаляются. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
Enhema
Зарегистрирован: 25.12.2014
Сообщения: 36
|
000 писал(а): |
Дело вот в чем.
Без цикла выходы ис позиции могут быть по сигналам и по стопу. Когда система вышла из рынка она входить по следующему сигналу.
А в цикле ты используешь выход только по сигналам и пока система в рынке (по сигналам) остальные сигналы фильтруются. Т.е. на самом деле система уже вышла из позы по стопу, но в цикле она продолжает считаться в рынке и сигналы на вход удаляются. |
Ого....
Правильно понимаю: У меня есть система уже настроенная, без циклов. Она меня устраивает, но хотел попробовать безубыток.
А с добавлением безубытка с помощью циклов вся система будет давать совсем другие результаты в бэктестере...
И что же делать тогда? |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Не использовать функцию ApplyStop(), а все стопы считать и реализовывать в цикле, либо наоборот отказаться от цикла и перенос в безубыток делать функцией ApplyStop() (можно же менять размер стопа пока система в позе). Или трейлинг. В общем похоже на безубыток.... |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
|
|
Следующая тема
Предыдущая тема
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете вкладывать файлы Вы не можете скачивать файлы
|
|