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



Зарегистрирован: 20.04.2015
Сообщения: 383
Откуда: VRN

СообщениеДобавлено: Чт Июл 02, 2015 8:43 pm Ответить с цитатой Вернуться к началу

"i", "x", "y", - я могу заменить на любые символы?

_________________
Нам не дано знать всего.
Посмотреть профиль Отправить личное сообщение Отправить e-mail ICQ Number
MrDzenLi



Зарегистрирован: 20.04.2015
Сообщения: 383
Откуда: VRN

СообщениеДобавлено: Чт Июл 02, 2015 9:03 pm Ответить с цитатой Вернуться к началу

x=100;
do
{
y=x+1;
x--;
} while (x>0);
в данном случае цикл будет выполняться бесконечно?

_________________
Нам не дано знать всего.
Посмотреть профиль Отправить личное сообщение Отправить e-mail ICQ Number
MrDzenLi



Зарегистрирован: 20.04.2015
Сообщения: 383
Откуда: VRN

СообщениеДобавлено: Чт Июл 02, 2015 9:51 pm Ответить с цитатой Вернуться к началу

вот, что нашел

_________________
Нам не дано знать всего.
Посмотреть профиль Отправить личное сообщение Отправить e-mail ICQ Number
000
Site Admin


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

СообщениеДобавлено: Чт Июл 02, 2015 10:36 pm Ответить с цитатой Вернуться к началу

MrDzenLi писал(а):
"i", "x", "y", - я могу заменить на любые символы?

Конечно.

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


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

СообщениеДобавлено: Чт Июл 02, 2015 10:38 pm Ответить с цитатой Вернуться к началу

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

СообщениеДобавлено: Чт Июл 02, 2015 10:42 pm Ответить с цитатой Вернуться к началу

но
y = x+1;
значит, "x" каждый раз будет увеличиваться на единицу?
а
x--;
уменьшает на единицу,
соответственно - цикл бесконечен?

_________________
Нам не дано знать всего.
Посмотреть профиль Отправить личное сообщение Отправить e-mail ICQ Number
Marcello



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

СообщениеДобавлено: Сб Июл 04, 2015 10:24 am Ответить с цитатой Вернуться к началу

Решил написать сюда, т.к. мой вопрос также касается циклов. Возможно, использовать циклы в 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

СообщениеДобавлено: Сб Июл 04, 2015 12:18 pm Ответить с цитатой Вернуться к началу

Продолжаю свой предыдущий пост.

Завел массив "эквити" 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

СообщениеДобавлено: Сб Июл 04, 2015 8:17 pm Ответить с цитатой Вернуться к началу

С SetPositionSize разобрался. Ответ нашел тут http://amisite.ru/phpBB2/viewtopic.php?t=1969#19823 . А вот с Equity пока использую свою "искусственную" EQ, не знаю как сделать через "правильную" Equity.
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

СообщениеДобавлено: Вс Июл 05, 2015 12:36 am Ответить с цитатой Вернуться к началу

Так у тебя ничего не получится.
Получается, что для расчета сайза тебе нужна эквити, а эквити зависит от сайза.
Для решения подобной задачи необходимо воспользоваться
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

СообщениеДобавлено: Чт Июл 09, 2015 11:33 am Ответить с цитатой Вернуться к началу

Глаз не видит, мозг не понимает. В чём тут разница?
Проверяю цикл и не цикл. Результаты разные

Цикл:
Код:
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

СообщениеДобавлено: Пт Июл 10, 2015 1:29 am Ответить с цитатой Вернуться к началу

Ща некогда. Постараюсь в воскресенье разобраться.

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


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

СообщениеДобавлено: Пт Июл 10, 2015 2:01 am Ответить с цитатой Вернуться к началу

Дело вот в чем.
Без цикла выходы ис позиции могут быть по сигналам и по стопу. Когда система вышла из рынка она входить по следующему сигналу.
А в цикле ты используешь выход только по сигналам и пока система в рынке (по сигналам) остальные сигналы фильтруются. Т.е. на самом деле система уже вышла из позы по стопу, но в цикле она продолжает считаться в рынке и сигналы на вход удаляются.

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



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

СообщениеДобавлено: Пт Июл 10, 2015 9:12 am Ответить с цитатой Вернуться к началу

000 писал(а):
Дело вот в чем.
Без цикла выходы ис позиции могут быть по сигналам и по стопу. Когда система вышла из рынка она входить по следующему сигналу.
А в цикле ты используешь выход только по сигналам и пока система в рынке (по сигналам) остальные сигналы фильтруются. Т.е. на самом деле система уже вышла из позы по стопу, но в цикле она продолжает считаться в рынке и сигналы на вход удаляются.

Ого....
Правильно понимаю: У меня есть система уже настроенная, без циклов. Она меня устраивает, но хотел попробовать безубыток.
А с добавлением безубытка с помощью циклов вся система будет давать совсем другие результаты в бэктестере...
И что же делать тогда? Rolling Eyes
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

СообщениеДобавлено: Пт Июл 10, 2015 9:28 am Ответить с цитатой Вернуться к началу

Не использовать функцию ApplyStop(), а все стопы считать и реализовывать в цикле, либо наоборот отказаться от цикла и перенос в безубыток делать функцией ApplyStop() (можно же менять размер стопа пока система в позе). Или трейлинг. В общем похоже на безубыток....

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


 Перейти:   



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


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

File Attachment © by Meik Sievertsen