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



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

СообщениеДобавлено: Ср Май 02, 2012 2:52 am Ответить с цитатой Вернуться к началу

Безубыток.
Пишу так:

buy=...
sell=...
short=...
cover=...

// начальная величина стоп-лосса
SL = 1000;

// для длинной позиции хочу перенести стоп-лосс в 0, или почти в 0 - на 10 пунктов цены покупки, если цена отходит от цены входа более чем на 2000 пунктов
SL = IIf(SL > 100 AND (H-ValueWhen(Buy, BuyPrice)) > 2000, 10, SL);

// для короткой позиции хочу перенести стоп-лосс в 0, или почти в 0 - на 10 пунктов цены продажи, если цена отходит от цены входа более чем на 2000 пунктов

SL = IIf(SL > 100 AND (ValueWhen(Short, ShortPrice) - L ) > 2000, 10, SL);

ApplyStop(stopTypeLoss, stopModePoint, SL, ExitAtStop = 1);


Перенос в 0 не работает, срабатывает только первоначальный стоп в размере 1000п. В чем ошибка и как ее исправить?




Далее, хочу после прибыльной сделки исполнить только следующие 4 сигнала, а потом пропустить еще 5 сигналов. Сделки совершаются 1 раз в день.
Пишу:
Eq = Equity();
BeginDay = Day() != Ref(Day(), -1);
Cond1 = ValueWhen(BeginDay, Eq, 1) > ValueWhen(BeginDay, Eq, 2);
Cond2 = ValueWhen(BeginDay, Eq, 2) > ValueWhen(BeginDay, Eq, 3);
Cond3 = ValueWhen(BeginDay, Eq, 3) > ValueWhen(BeginDay, Eq, 4);
Cond4 = ValueWhen(BeginDay, Eq, 4) > ValueWhen(BeginDay, Eq, 5);

//Buy = Buy AND (Cond1 OR Cond2 OR Cond3 OR Cond4);
//Short = Short AND (Cond1 OR Cond2 OR Cond3 OR Cond4);

Condition = (Cond1 OR Cond2 OR Cond3 OR Cond4);

Buy=ExRem(Buy,Condition );
Short=ExRem(Short,Condition );

Тоже не работает...
После прибыльной сделки сигналы не пропускаются. А как написать последующее исполнение 5 сигналов - вообще не представляю... Помогите, если можно...
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

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

У функции ApplyStop есть 5ый параметр (volatile = False). Именно он разрешает или запрещает двигать стоп. По умолчанию стоп двигать запрещено. Вероятно поэтому в безубыток и не переносится.

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



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

СообщениеДобавлено: Ср Май 02, 2012 2:44 pm Ответить с цитатой Вернуться к началу

000 писал(а):
У функции ApplyStop есть 5ый параметр (volatile = False). Именно он разрешает или запрещает двигать стоп. По умолчанию стоп двигать запрещено. Вероятно поэтому в безубыток и не переносится.

да, так кажется работает, спасибо.
а по второй части что-нибудь посоветуете?
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

СообщениеДобавлено: Ср Май 02, 2012 2:59 pm Ответить с цитатой Вернуться к началу

По второй части не посоветую. Это надо какой то замороченный цикл писать. Плюс много неясностей.
Исполнять 4 сигнала после прибыльного, а если среди этих сигналов тоже будут прибыльные? и по идее от них тоже надо 4 исполнять. А с другой стороны на эти следующие 4 наедут 5 неисполняемых....

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



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

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

И снова прошу помощи =)
Я так понял ApplyStop и циклы нельзя совмещать?
Как быть с переносом стопа в безубыток. Хочу двинуть первоначальный стоп в безубыток если цена прошла в мою сторону, допустим, пол пути.
Понимаю, что это делается в цикле, но мне так же важен параметр из ApplyStop который даёт задержку в n-баров после срабатывания стопа.

Вот кусок кода:

Код:
BuyPrice = O;
SellPrice = O;
ShortPrice = O;
CoverPrice = O;

if(Name() == "SPFB.RTS")
{
SetPositionSize(2,spsShares);
BuySignal = S_Buy;
SellSignal = S_Sell;
ShortSignal = S_Short;
CoverSignal = S_Cover;

position = 0;
Stop = 0.304;

for(i = 1; i < BarCount; i++)
{
  if(position == 0)
    {
    if(BuySignal[i]) // проверка условия для лонга
      {
        Buy[i] = 1;  // покупка
        position = 1; // длинная позиция
        PriceBuy = BuyPrice[i]; // цена покупки
      }
    else if(ShortSignal[i]) // проверка условия для шорта
      {
        Short[i] = 1; // продажа
        position = -1; // короткая позиция
        PriceShort = ShortPrice[i]; // цена шорта
      }
    }
  else if(position == 1) // в противном случае, если лонг
    {
    if(SellSignal[i]) // условия закрытия лонга
      {
      Sell[i] = 1; // закрытие лонга
      position = 0; // система не в позиции
      }
    if(H[i] >= PriceBuy*1.005) // проверка достижения уровня безубытка
      {
     
      Stop = 0.0001;// перенос стопа в безубыток
      }
    }
  else if(position == -1) // в противном случае если шорт
    {
    if(CoverSignal[i]) // условия закрытия шорта
      {
      Cover[i] = 1; // закрытие шорта
      position = 0; // система не в позиции
      }
    if(L[i] <= PriceShort*-1.005) // проверка достижения уровня безубытка
      {
     
      Stop = 0.0001;// перенос стопа в безубыток
      }   
    }
}
ApplyStop(stopTypeLoss, stopModePercent, Stop, 1, True,15);
}
[/code]
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

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

Подробно не смотрел, но, кажется, ошибка в следующем. У тебя в разных местах графика Stop разный. Сначала он 0.304 потом переносится в безубыток и == 0.0001. После закрытия опять 0.304 и т.д.

Т.е. Stop это массив. Так и пиши в цикле Stop[i] и при этом не забывай переносить значение на следующий бар Stop[i] = Stop[i-1]

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



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

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

Немного другой вопрос...Тоже пытаюсь тестировать перенос в безубыток в цикле и набросал такой код:
Код:

Buy = ...
BuyPrice = ...
s1 = ... (начальный стоп для лонга)
Sell = 0;

Short = ...
ShortPrice = ...
s2 = ...(начальный стоп для шорта)
Cover = 0;

pos = 0;

for( i = 1; i < BarCount; i++)
{
   if( pos == 0)
   {
      if( Buy[i])                                  // покупаем
      {
         pos = 1;
         Pricebuy = BuyPrice[i];
         stop = s1[i];
      }
      if( Short[i])                               // продаем                                           
      {
         pos = -1;
         Priceshort = ShortPrice[i];
         stop = s2[i];
      }
   }
   else if( pos == 1)                                           
   {
      if( L[i] <= Pricebuy - stop)      // закрываем, если дошло до первоначального стопа                         
      {
         Sell[i] = 1;
         SellPrice[i] = Pricebuy - stop;
         pos = 0;
      }
      if( H[i] >= Pricebuy*1.005)      // переносим стоп в безубыток, если цена прошла в мою сторону на 0,5%                           
      {
         stop = Pricebuy;
      }
      if( L[i] <= stop)                     // продаем если падает ниже безубытка                                 
      {
         Sell[i] = 1;
         SellPrice[i] = stop;
         pos = 0;
      }   
      if( H[i] >= Pricebuy*1.01)         // тейк-профит 1%                              
      {
         Sell[i] = 1;
         SellPrice[i] = Pricebuy*1.01;
         pos = 0;
      }
   }
   else if( pos == -1)                          // все то же самое, но для шорта
   {
      if( H[i] >= Priceshort + stop)
      {
         Cover[i] = 1;
         CoverPrice[i] = Priceshort + stop;
         pos = 0;
      }
      if( L[i] <= Priceshort*0.995)
      {
         stop = Priceshort;
      }
      if( H[i] >= stop)
      {
         Cover[i] = 1;
         CoverPrice[i] = stop;
         pos = 0;
      }
      if( L[i] <= Priceshort*0.99)
      {
         Cover[i] = 1;
         CoverPrice[i] = Priceshort*0.99;
         pos = 0;
      }
   }
 
}


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


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

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

Думаю, что дело в расчете
Код:
s2 = ...(начальный стоп для шорта)

может он отрицательный у тебя получается?

Кроме того есть еще косяк.рассмотрим выход из шорта
Код:

   else if( pos == -1)                          // все то же самое, но для шорта
   {
      if( H[i] >= Priceshort + stop)
      {
         Cover[i] = 1;
         CoverPrice[i] = Priceshort + stop;
         pos = 0;
      } // если хай больше стопа то выходим по лосю
      if( L[i] <= Priceshort*0.995)
      {
         stop = Priceshort;
      } // проверяем условия переноса в безубыток. А если мы уже вышли по лосю?
      if( H[i] >= stop)
      {
         Cover[i] = 1;
         CoverPrice[i] = stop;
         pos = 0;
      }
      if( L[i] <= Priceshort*0.99)
      {
         Cover[i] = 1;
         CoverPrice[i] = Priceshort*0.99;
         pos = 0;
      } // проверяем выход по профиту. А вдруг мы уже вышли по лосю? Т.е. если есть условия и для лося и для профита, то мы выйдем по профиту. Правильным считается выходить по худшему сценарию.
   }

Короче надо после первой проверки if поменять на else if

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



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

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

1. Значение стопа точно положительное. А поскольку из-за ошибки выход из шорта во всех сделках происходит на следующей свече после входа, то, думаю, это подтверждаем, что параметр s2 не причем.

2. Изменил как ты советовал - не помогло.

Меня смущает вот что: для лонгов такой код работает без ошибок, а для шортов нет. Вот это странно...
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

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

Ща некогда. Вечером еще посмотрю.

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



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

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

000 писал(а):
Ща некогда. Вечером еще посмотрю.

Спасибо, буду ждатьSmile
Для интереса попробовал вообще исключить часть кода, отвечающее за перенос в б/у и оставил только блок выхода по стопу или по тейк-профиту. Работает. Выходит, что ошибка именно в коде безубытка.
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

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

Короче.
У тебя 2 разные по логике переменные названы одинаково.
Вот тут stop
Код:

      if( Short[i])                               // продаем                                           
      {
         pos = -1;
         Priceshort = ShortPrice[i];
         stop = s2[i];
      }

Далее stop используется в соответствии с логикой системы
и далее вдруг
Код:

      if( H[i] >= Pricebuy*1.005)      // переносим стоп в безубыток, если цена прошла в мою сторону на 0,5%                           
      {
         stop = Pricebuy;
      }

Опять stop. Но по логике это совсем другая переменная. Замени название уровня стопа после переноса в безубыток. Лонга это тоже касается. Просто повезло, что лонг работает нормально.

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



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

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

Если я правильно понял, то ты имеешь в виду что-то такое для лонга:
Код:
 else if( pos == 1)                                           
   {
      if( L[i] <= Pricebuy - stop)                               
      {
         Sell[i] = 1;
         SellPrice[i] = Pricebuy - stop;
         pos = 0;
      }
      if( H[i] >= Pricebuy*1.005)                                 
      {
         stop = Pricebuy;
         stop1 = stop;
      }
      if( L[i] <= stop1)                                                       
      {
         Sell[i] = 1;
         SellPrice[i] = stop1;
         pos = 0;
      }   

И для шорта:
Код:
 else if( pos == -1)                           
   {
      if( H[i] >= Priceshort + stop)
      {
         Cover[i] = 1;
         CoverPrice[i] = Priceshort + stop;
         pos = 0;
      }
      if( L[i] <= Priceshort*0.995)
      {
         stop = Priceshort;
           stop1 = stop;         
      }
      if( H[i] >= stop1)
      {
         Cover[i] = 1;
         CoverPrice[i] = stop1;
         pos = 0;
      }


Попробовал, криво работает. Несколько сделок правильно закрыто, остальные без изменения...
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

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

Не совсем.
Зачем вот это?
stop = Priceshort;


У тебя ранее в цикле
if( H[i] >= Priceshort + stop)

И что это получается?
if( H[i] >= Priceshort + Priceshort) ???

Я сделал так


Код:

Buy = DayOfWeek() == 2 AND Ref(DayOfWeek(), -1) == 1;
BuyPrice = C;
s1 = 1; // (начальный стоп для лонга)
Sell = 0;

Short = DayOfWeek() == 5 AND Ref(DayOfWeek(), -1) == 4;
ShortPrice = C;
s2 = 1; //(начальный стоп для шорта)
Cover = 0;

pos = 0;

for( i = 1; i < BarCount; i++)
{
   if( pos == 0)
   {
      if(Buy[i])                                  // покупаем
      {
         pos = 1;
         Pricebuy = BuyPrice[i];
         stop = s1[i];
      }
      else if( Short[i])                               // продаем                                           
      {
         pos = -1;
         Priceshort = ShortPrice[i];
         stop = s2[i];
      }
   }
   else if( pos == 1)                                           
   {
      if( L[i] <= (Pricebuy - stop))      // закрываем, если дошло до первоначального стопа                         
      {
         Sell[i] = 2;
         SellPrice[i] = Pricebuy - stop;
         pos = 0;
      }
      else if( H[i] >= Pricebuy*1.005)      // переносим стоп в безубыток, если цена прошла в мою сторону на 0,5%                           
      {
         stopL = Pricebuy;
      }
      else if( L[i] <= stopL)                     // продаем если падает ниже безубытка                                 
      {
         Sell[i] = 2;
         SellPrice[i] = stopL;
         pos = 0;
      }   
      else if( H[i] >= Pricebuy*1.01)         // тейк-профит 1%                             
      {
         Sell[i] = 3;
         SellPrice[i] = Pricebuy*1.01;
         pos = 0;
      }
   }
   else if( pos == -1)                          // все то же самое, но для шорта
   {
      if( H[i] >= (Priceshort + stop))
      {
         Cover[i] = 2;
         CoverPrice[i] = Priceshort + stop;
         pos = 0;
      }
      else if( L[i] <= (Priceshort*0.995))
      {
         stopL = Priceshort;
      }
      else if( H[i] >= stopL)
      {
         Cover[i] = 2;
         CoverPrice[i] = stopL;
         pos = 0;
      }
      else if( L[i] <= Priceshort*0.99)
      {
         Cover[i] = 3;
         CoverPrice[i] = Priceshort*0.99;
         pos = 0;
      }
   }
}

Вроде все ОК.


Sell[i] = 2; Sell[i] = 3; и т.п. это вот по какому принципу.
Цитата:

Depending on kind of the stop various values
are written back to sell/cover array to enable you
to distinguish if given signal was generated by regular
rule or by stop.

1 - regular exit
2 - max. loss
3 - profit target
4 - trailing
5 - n-bar stop
6 - ruin stop

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



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

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

Вставил твой код в полном объеме вместо своего, чтобы протестировать...не работает=(
Посмотреть профиль Отправить личное сообщение
Показать сообщения:      
Начать новую тему  Ответить на тему


 Перейти:   



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


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

File Attachment © by Meik Sievertsen