Индикаторы: iK_tay индикатор-советник - страница 7

 
ikatsko:
urrydan:

Честно говоря, надоедает одна штука: предсказывает рост, покупаем. Затем в начале периода видим некоторый убыток (это пример), и через некоторое время вдруг замечаем что зеленый столбик (предыдущий) уже смотрит вниз (как будто предсказывал падение)

"Предсказание" актуально в течение очень короткого времени: между концом предыдущего бара и началом следующего. И конкретно - в момент прихода первого тика нового бара, так работает советник. А для принятия решения (на следующий бар) вручную можно считать актуальным "предсказание", которое сформировалось и имеется, например, в последние 10 секунд текущего бара. Все остальное время, в том числе и время от начала бара и далее, индикатор пытается "приспособиться" к новым "для него" условиям.

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

 
urrydan:
Но ведь меняется история, и проследить за количеством удачных оперций становиться невозможно

Задача индикатора дать, как он считает, справедливый прогноз в определенное, корректное по отношению к идеологии, время. И всё! Весь остальной внешний вид - только ЕГО (индикатора) внутреннее состояние, которое можно учитывать или нет (см.ниже). См. также мое сообшение от 08.03.09 23:21

 
urrydan:

А можно все это - и в виде советника (ex4)? Заранее благодарен

не могу понять как тут прикрепить файл, иначе сразу так и сделал бы :)

 
RuslanN:

Вот код как обещал, запускать на дневном таймфрейме:

Один коммент по коду. К автору индюка, это тоже каким-то боком относится.

Для того, чтобы получить торговый сигнал нам нужно отловить цену закрытия текущего бара, т.е. показания индикатора на последний его тик (что в коде и отражено, но только для одного таймфрема), но вот этот фрагмент:

 if(Hour()==23){
      if(Minute()>=30){
      CloseAll();
      SLLevel = iCustom(NULL, 0, "iK_tay_v01",10,1,0);
      TPLevel = iCustom(NULL, 0, "iK_tay_v01",10,0,0);
      vector = iCustom(NULL, 0, "iK_tay_v01",10,3,0);
      Comment("Hour ", Hour(), " Minute ", Minute(), " SLLevel ", SLLevel, " TPLevel ", TPLevel, " vector ", vector);
      }

вызывает серьезные опасения в плане того, такой "тяжелый" индикатор вызывается трижды, а в коде автора еще большее количество раз.

Предлагаю несколько другой вариант. 
1. доработать код индикатора следующим образом (все доработки для пяти знаков):

....
#property indicator_separate_window                            // Отображение в отдельном окне
#property indicator_buffers 6                                  //!!!! Количество буферов для отображения 6, а не семь как у автора
#property indicator_color1 DeepPink                            // Цвет первой линии
...
 
extern int Discret=10;                                   // Дискретность подбора: 1 - каждая позиция; 2 - через позицию и т.д.
double Level=100;                                        // !!!! Минимальный уровень SL/TP - это может быть и постоянной величиной
......
       Sum_na_TP[],                                            // Массив - Нарастающей суммы Тейк Профит
       Signal[],                                               //!!!! Вводим дополнительный буфер- Массив сигнальных значений        
       Im_Sum_TP[30],                                          // Массив - промежуточной Нарастающей суммы Тейк Профит
......
int init()
  {
   if (Discret<10) 
     {
     Discret=10;                                                // Не корректно введен дискрет
     Alert ("Дискретность установлена равной 10");
     }
   New_Time=Time[0];                                           // Время текущего бара
   Spread=MarketInfo(Symbol(), MODE_SPREAD)*Point;
   
   IndicatorBuffers(7);
.......   
   SetIndexBuffer(3,Direction); SetIndexEmptyValue(3,0.0);     // !!!!! Назначение массива Направление торговли
                                                               // мне предпочтительнее не Empty а Zero
.............
   SetIndexBuffer(6,Signal); SetIndexEmptyValue(6,0.0);
.............
// и в самом кончике start такой фрагмент
   Fun_Sum_TP(Set_YT,Set_SL[0],Set_TP[0],Algoritm[0]);         // Нарисуем окончательный график
   
   if (Direction[0] !=0)
      {
      if (Direction[0] > 0) Signal[0]=Set_TP[0]/Point*1000000 + Set_SL[0]/Point;
      if (Direction[0] < 0) Signal[0]=-(Set_TP[0]/Point*1000000 + Set_SL[0]/Point);
      }
   return(0);

Из кода советника (его фрагментов) станет понятно для чего это сделано:

   static int prevtime = 0;
   static double Signal; 
   double SL, TP;
   double CP60
.......
в init
CP60=Period()*60*0.8;
......
int start()
  {
   // Получение значений из буфера индикатора в последней фазе формирования бара
   if (TimeCurrent() > (Time[0]+CP60)
      {
      Signal=iCustom(NULL, 0, "_iK_tay_v01M1",Discret,6,0)
      }     
   if(Time[0] != prevtime)
      { 
      Calcul();
      //if (Tral !=0) CalcLevel();
      prevtime = Time[0];
      }
   else return;
.........
void Calcul()
  {
   OpenSell=0; OpenBuy=0; CloseBuy=0; CloseSell=0;
   
   if(Signal > 0) 
      {
      OpenBuy=1; CloseSell=1;
      TP=NormalizeDouble (Signal*Point/1000000, Digits-1);      
      SL=(Signal-TP/Point*1000000)*Point;   
      }
   if(Signal < 0) 
      {
      CloseBuy=1; OpenSell=1;
      TP=NormalizeDouble (MathAbs(Signal)*Point/1000000, Digits-1);      
      SL=(MathAbs(Signal)-TP/Point*1000000)*Point;   
      }   
   return;
  }

Таким образом мы получаем 3 значения индикатора (направление, TP и SL) всего лишь однократным вызовом  индикатора.

Полученными результатами дальше можно распоряжаться как угодно :)




 
rider:
Один коммент по коду. 

>Для того, чтобы получить торговый сигнал нам нужно отловить цену закрытия текущего бара, т.е. показания индикатора на последний его тик

===Индикатор работает по завершенным барам, поэтому там этот вопрос не стоИт. Советнике - после начала бара (на первом же тике), берет к руководству приказы, сформированные индикатором в предыдущем баре (а они сформированы! и зафиксированы!) 


>такой "тяжелый" индикатор вызывается коде автора большое количество раз.

===я так понимаю, что при вызове индикатора последний выполняется ОДИН раз и к тому же он не выполняет функции по выводу информации (графиков) на экран. Поэтому выполняется быстро.

>Предлагаю несколько другой вариант. 
>Set_TP[0]/Point*1000000 + Set_SL[0]/Point;

===Хорошая идея, ранее не встречал, обязательно приму на вооружение.

 
ikatsko:
>Для того, чтобы получить торговый сигнал нам нужно отловить цену закрытия текущего бара, т.е. показания индикатора на последний его тик

===Индикатор работает по завершенным барам, поэтому там этот вопрос не стоИт. Советнике - после начала бара (на первом же тике), берет к руководству приказы, сформированные индикатором в предыдущем баре (а они сформированы! и зафиксированы!) 

В том-то и дело, что не зафиксированы - с приходом первого тика 0-го бара показания в индбуферах сразу изменяются

>такой "тяжелый" индикатор вызывается коде автора большое количество раз.



===я так понимаю, что при вызове индикатора последний выполняется ОДИН раз и к тому же он не выполняет функции по выводу информации (графиков) на экран. Поэтому выполняется быстро.
>Предлагаю несколько другой вариант. 
>Set_TP[0]/Point*1000000 + Set_SL[0]/Point;

===Хорошая идея, ранее не встречал, обязательно приму на вооружение.

Идея не у меня, а в вашем индикаторе...... у меня - это привычка машинный ресурс экономить :).... к сожалению MQL4 не позволяет одним вызовом сразу несколько значений уже рассчитанного индикатора получать, отсюда и ухищрения всякие ((

 

ikatsko писал(а):

А то, что индикатор строит свои значения на основание баров, является плюсом, так как, например, размах в противоположную торговле сторону более, чем заданный СтопЛосс, воспринимается индикатором как проигрыш (Лосс). А на самом деле в течение времени формирования бара этот размах может произойти позже, чем размах на величину ТейкПрофита. И тогда, в реальном времени, Лоса не получится. Т.е. индикатор показывает ХУДШИЙ из случаев, однако такой, который дает прибыль.


Между прочим, то, что индикатор строит свои значения на основание баров, является ровно таким же минусом, так как, например, размах в сторону по торговле  более, чем заданный ТейкПрофит, воспринимается индикатором как выигрыш (Профит). А на самом деле в течение времени формирования бара этот размах может произойти позже, чем размах на величину СтопЛосса. И тогда, в реальном времени, Профита не получится. Т.е. индикатор показывает ЛУЧШИЙ из случаев, однако такой, который дает УБЫТОК.

 
Вы ошибаетесь! :) Индикатор вначале проверяет условие Лосса и только в случае, если такового (Лосса) нет, проверяет условия Профита. То есть, если бар "размахнулся" одновременно и в сторону Профита (больше установленного) и в сторону Лосса (больше установленного), то индикатор считает, что получен Лосс. Хотя возможно Профит в реале приходил раньше, т.е. берется худший вариант.
 

здрасте я играю только на 5м а у меня 5м и 15м не показывает чё далать???????????а так хотелось глянуть чё за птица такая?????????!!!!!!!!!!

 

Просто Браво! +10


Рынок меняеться, и мы должны подстраиваться под рынок, что и делает этот индикатор.


Я еще давно понял что не может система со статическим SL и TP приносить прибыль на всех периодах рынка.


Индикатор еще не изучал, но для себя обязательно замечу его, как тот, на который стоит обратить свое внимание.