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


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

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

Привет!....

Настало время для меня конкретно разобраться с циклами. Как их использовать и проч.

Началось все с решения простой задачи, которая публиковалась здесь http://amisite.ru/phpBB2/viewtopic.php?p=859#859.

Прошу всех сочуствующих помочь (особенно 000).

поехали...

Код:
buy=cond1;
profit=0.01;


здесь все понятно. Если выполнилось условие конд1 мы купим. Профит 100 пипсов. Далее...

Код:
sell=0;

position=0;

profit=0.01;


Вот первые вопросы:

1. sell=0; и profit=0; Это просто обозначение переменной?
2. зачем опять пишем profit=0.01 ?
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

СообщениеДобавлено: Вс Июн 08, 2008 4:48 pm Ответить с цитатой Вернуться к началу

Код:

Buy = cond1;
profit = 0.01;

Sell = 0;

position = 0;
profit = 0.01;

for(i = 1; i<BarCount; i++)
{
   if(! position) // если система не в рынке
   {
      if(Buy[i])
      {
         position = 1; // открыта позиция
         pricebuy = BuyPrice[i]; // запоминаем цену открытия позиции
      }
   }
   else // если система в рынке
   {
      Buy[i] = 0; // убираем лишние покупки
      if(H[i] > pricebuy + profit) // проверка условия выхода
      {
         Sell[i] = 1; // продажа
         position = 0; // система не в рынке
      }
   }
}


Цитата:

Вот первые вопросы:

1. sell=0; и profit=0; Это просто обозначение переменной?
2. зачем опять пишем profit=0.01 ?


1. Да это просто инициализация переменной\массива
2. profit=0.01 пишем потому, что ошиблись и написали его лишний раз Smile

Код:
for(i = 1; i<BarCount; i++)

Последовательно пробегаем по всем барам начиная с крайнего левого и заканчивая последним
На каждом баре проверяем if(! position) // если система не в рынке
Понятнее написать if(position != 1)
position в данном случае не не массив а переменная.
Тогда смотрим нет ли на этом баре сигнала покупки
if(Buy[i])
Если есть, то
position = 1; система теперь находится в лонге
и цена покупки
pricebuy = BuyPrice[i];
На следующем баре (следующий круг цикла) position будет равен 1 и выполнение начнется с
else // если система в рынке
Buy[i] = 0; // убираем лишние покупки
Это если вдруг были еще сигналы на покупку пока система в рынке то они удаляются
if(H[i] > pricebuy + profit) // проверка условия выхода
если условия выхода выполнились, то
Sell[i] = 1; // продажа
position = 0; // система не в рынке


Вроде понятно написал.

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


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

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

Олег, привет...

Спасибо за предыдущийц пост.
Маленько разобрался с циклами. Написал такой код:

Код:
SetOption("AllowPositionShrinking",1);   // Вкл (1) выкл (0)возможность открытия позиции, если денег не хватает
SetOption("InitialEquity",10000);          // Начальный капитал
SetOption("AllowSameBarExit",1);          // Вкл (1) выкл (0) возможность выхода на баре входа
SetOption("ActivateStopsImmediately",1); // Вкл (1) выкл (0) активацию стопа на баре входа
SetOption("FuturesMode",1);               // Вкл (1) выкл (0) режим "Тестирование фьючерсов"
SetOption("ReverseSignalForcesExit",1);   // Вкл (1) выкл (0) вход в противоположную позицию при противп. сигнале
SetOption("PriceBoundChecking",0);       // Вкл (1) выкл (0) проверку соответствия bp/sp/shp/cp диапазону h-l
SetTradeDelays(0,0,0,0);                // Задержка торгов

PositionSize = 100;
MarginDeposit = 1;
RoundLotSize = 100;
PointValue = 100;

m1=               MA(C,22);
m2=               MA(C,65);

Buy =             Ref(m1>m2 AND Ref(m2>m1,-1),-1);;
BuyPrice=         O+0.0003;
Sell=            0;

position=         0;
profit=         0.0100;
loss=            0.0100;

for(i=1;i<BarCount;i++)
{
   if(position!=1)
      {
         if(Buy[i])
            {
               position=   1;
               pricebuy=   BuyPrice[i];
             }
      }
   else
      {
         Buy[i]=0;
         if(H[i]>=pricebuy+profit)
            {   
               Sell[i]=1;
               SellPrice[i]=pricebuy+profit;
               position=0;
            }
         else
            {   
               if(L[i]<=pricebuy-loss)
                  {
                     Sell[i]=1;
                     SellPrice[i]=pricebuy-Loss;
                     position=0;
                  }
            }
      }
}


Этот код уже со стопаком.
Вопрос: вышепредставленный код не отслеживает стопак или профит, если данные ордера сработали на баре входа (см. рис). Можно ли как-нибудь решить этот трабл?

Image
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

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

Вот в этом месте цикла
Код:

   if(position!=1)
      {
         if(Buy[i])
            {
               position=   1;
               pricebuy=   BuyPrice[i];



             }
      }

Сразу вставляй проверку на срабатывание стопа.

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


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

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

Я еще вот так придумал:

Код:
m1=               MA(C,22);
m2=               MA(C,65);

Buy =             m1>m2 AND Ref(m2>m1,-1);
BuyPrice=         Ref(O+0.0003,1);
Sell=            0;

position=         0;
profit=         0.0100;
loss=            0.0100;

for(i=1;i<BarCount;i++)
{
   if(position!=1)
      {
         if(Buy[i])
            {
               position=   1;
               pricebuy=   BuyPrice[i];
             }
      }
   else
      {
         Buy[i]=0;
         if(H[i]>=pricebuy+profit)
            {   
               Sell[i]=1;
               SellPrice[i]=pricebuy+profit;
               position=0;
            }
         else
            {   
               if(L[i]<=pricebuy-loss)
                  {
                     Sell[i]=1;
                     SellPrice[i]=pricebuy-Loss;
                     position=0;
                  }
            }
      }
}
Посмотреть профиль Отправить личное сообщение
ID
Советник


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

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

000 писал(а):
Вот в этом месте цикла
Код:

   if(position!=1)
      {
         if(Buy[i])
            {
               position=   1;
               pricebuy=   BuyPrice[i];



             }
      }

Сразу вставляй проверку на срабатывание стопа.

Олег, а пример проверки можешь привести.
Я уже голову сломал. Не хотит.
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

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

ID писал(а):
Я еще вот так придумал:

Код:
m1=               MA(C,22);
m2=               MA(C,65);

Buy =             m1>m2 AND Ref(m2>m1,-1);
BuyPrice=         Ref(O+0.0003,1);
Sell=            0;

position=         0;
profit=         0.0100;
loss=            0.0100;

for(i=1;i<BarCount;i++)
{
   if(position!=1)
      {
         if(Buy[i])
            {
               position=   1;
               pricebuy=   BuyPrice[i];
             }
      }
// НА ТОМ БАРЕ ГДЕ СРАБОТАЛА ПОКУПКА
// ДАЛЬШЕ ЭТОГО МЕСТА КОД ВЫПОЛНЯТЬСЯ НЕ БУДЕТ
// ПОЭТОМУ ПРОВЕРКУ НА СТОП НА БАРЕ ВХОДА НАДО ДЕЛАТЬ РАНЬШЕ
   else
      {
         Buy[i]=0;
         if(H[i]>=pricebuy+profit)
            {   
               Sell[i]=1;
               SellPrice[i]=pricebuy+profit;
               position=0;
            }
         else
            {   
               if(L[i]<=pricebuy-loss)
                  {
                     Sell[i]=1;
                     SellPrice[i]=pricebuy-Loss;
                     position=0;
                  }
            }
      }
}


Код:

m1=               MA(C,22);
m2=               MA(C,65);

Buy =             m1>m2 AND Ref(m2>m1,-1);
BuyPrice=         Ref(O+0.0003,1);
Sell=            0;

position=         0;
profit=         0.0100;
loss=            0.0100;

for(i=1;i<BarCount;i++)
{
  if(position!=1)
  {
    if(Buy[i])
    {
      position=   1;
      pricebuy=   BuyPrice[i];
     
      if(L[i] <= pricebuy - loss) // сначала проверяем лосс,
// чтобы если есть условия для срабатывания и профита и лосса сработал именно лосс
      {
        Sell[i] = 1;
        SellPrice[i] = pricebuy - loss;
        position = 0;
      }
      else if(H[i] >= pricebuy + profit)
      {
        Sell[i] = 1;
        SellPrice[i] = pricebuy + profit;
        position = 0;
      }
    }
  }
  else
  {
    Buy[i]=0;
    if(L[i] <= pricebuy - loss)
    {
      Sell[i] = 1;
      SellPrice[i] = pricebuy - Loss;
      position = 0;
    }
    else if(H[i] >= pricebuy + profit)
    {
      Sell[i] = 1;
      SellPrice[i] = pricebuy + profit;
      position = 0;
    }
  }
}

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


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

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

Вариант попроще
Код:

m1=               MA(C,22);
m2=               MA(C,65);

Buy =             m1>m2 AND Ref(m2>m1,-1);
BuyPrice=         Ref(O+0.0003,1);
Sell=            0;

position=       0;
profit=         0.0100;
loss=           0.0100;

for(i=1;i<BarCount;i++)
{
  if(position != 1)
  {
    if(Buy[i])
    {
      position = 1;
      pricebuy = BuyPrice[i];
    }
  }
  else
  {
    Buy[i] = 0;
  }
// ЕСЛИ НАПИСАТЬ ТАК, ТО ЦИКЛ БУДЕТ ВЫПОЛНЯТЬСЯ ДАЛШЕ И НА БАРЕ ВХОДА
// СООТВЕТСТВЕННО ПРОВЕРКА НА СТОПЫ БУДЕТ ВЫПОЛНЕНА И НА БАРЕ ВХОДА
  if(position == 1) // проще написать if(positions)
  {
    if(L[i] <= pricebuy - loss)
    {
      Sell[i] = 1;
      SellPrice[i] = pricebuy - loss;
      position = 0;
    }
    else if(H[i] >= pricebuy + profit)
    {
      Sell[i] = 1;
      SellPrice[i] = pricebuy + profit;
      position = 0;
    }
  }
}

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


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

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

Олег, тэнкс
Посмотреть профиль Отправить личное сообщение
Bobi



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

СообщениеДобавлено: Сб Июн 28, 2008 2:24 pm Ответить с цитатой Вернуться к началу

а вот меня вопрос мучает: как код обрабатывается?

Т.е. нужно либо ВСЁ циклом делать или можно вперемешку с встроенными функциями? Ну типа
если я напишу

CondBuy = C>O;
CondSell = C<O;
for (i=1;i<BarCount;i++))
{
if (Buy[i])
Buy[i]=1;
и т.д и т.п.
}
Сколько раз мой цикл пересчитается в этом случае?
Посмотреть профиль Отправить личное сообщение
Bobi



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

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

000 писал(а):

// ЕСЛИ НАПИСАТЬ ТАК, ТО ЦИКЛ БУДЕТ ВЫПОЛНЯТЬСЯ ДАЛШЕ И НА БАРЕ ВХОДА
// СООТВЕТСТВЕННО ПРОВЕРКА НА СТОПЫ БУДЕТ ВЫПОЛНЕНА И НА БАРЕ ВХОДА
[/code]


А будет ли тестер учитывать выход на баре входа заложенный в цикле? У меня никак не хочет пока не включишь Allow same bar exit
Посмотреть профиль Отправить личное сообщение
Bobi



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

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

000 писал(а):
Вариант попроще


по-моему эти строчки ничего не дают, поскольку есть проверка на наличие открытиых позиций , или я не прав:

Код:

else
  {
    Buy[i] = 0;
  }
Посмотреть профиль Отправить личное сообщение
Bobi



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

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

...мда, наверно я один тут такой, а все остальные в это время жарят сосиски и пьют пиво на даче Smile
Посмотреть профиль Отправить личное сообщение
commenced
Советник


Зарегистрирован: 08.04.2008
Сообщения: 643
Откуда: от "Верблюда"

СообщениеДобавлено: Вс Июн 29, 2008 6:27 pm Ответить с цитатой Вернуться к началу

Bobi писал(а):
...мда, наверно я один тут такой, а все остальные в это время жарят сосиски и пьют пиво на даче Smile


Не все, просто чтоб тебе чем то помочь нужно знать сам вопрос, я вот в циклах 0, все жду когда же ликбез пройдет на котором объеснят основы их написания, но похоже тему не правильно назвали. Sad

_________________
Юра
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Bobi



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

СообщениеДобавлено: Пн Июн 30, 2008 11:44 am Ответить с цитатой Вернуться к началу

commenced писал(а):
Bobi писал(а):
...мда, наверно я один тут такой, а все остальные в это время жарят сосиски и пьют пиво на даче Smile


Не все, просто чтоб тебе чем то помочь нужно знать сам вопрос


хм. да вопросов целых три было.
Посмотреть профиль Отправить личное сообщение
Показать сообщения:      
Начать новую тему  Ответить на тему


 Перейти:   



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


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

File Attachment © by Meik Sievertsen