Oleg77

Пишем советник-грааль!!!
« Ответ #15: 25 Февраля 2008, 01:47:28 »
Вообщем у меня вроде как поднимает(но тестил немного, т.к. долго тестится). Надо я думаю щас целью задаться внедрить каналы в эксп, чтоб их сам просчитывал, а там уж и подбором оптимальных входов, выходов заняться...

Запихать каналы в эксп - это не проблема! Сейчас уже не успею написать, а завтра без проблем - закину код как это можно сделать.
SHI-Channel для примера пойдет?

AndreiFX

Пишем советник-грааль!!!
« Ответ #16: 25 Февраля 2008, 07:06:47 »
Запихать каналы в эксп - это не проблема! Сейчас уже не успею написать, а завтра без проблем - закину код как это можно сделать.
SHI-Channel для примера пойдет?
Ага, отлично!!

Oleg77

Пишем советник-грааль!!!
« Ответ #17: 25 Февраля 2008, 10:55:01 »
Ок, поехали:
Код
задаем внешнюю переменную для индика:
extern int     BarsForFract=48;

инициализация:
//+------------------------------------------------------------------+
//| Expert Initialization Function                                   |
//+------------------------------------------------------------------+
int init()
 {
  ObjectCreate("BaryUp",OBJ_TREND,0,Time[0],0.0,Time[1],0.0);
  ObjectSet("BaryUp",OBJPROP_STYLE,STYLE_SOLID);
  ObjectSet("BaryUp",OBJPROP_COLOR,DodgerBlue);
  ObjectCreate("BaryDown",OBJ_TREND,0,Time[0],0.0,Time[1],0.0);
  ObjectSet("BaryDown",OBJPROP_STYLE,STYLE_SOLID);
  ObjectSet("BaryDown",OBJPROP_COLOR,DodgerBlue);

  return(0);
 }

деинит:
//+------------------------------------------------------------------+
//| Expert Deinitialization Function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
   ObjectDelete("BaryUp");
   ObjectDelete("BaryDown");
   return(0);
  }


Сама процедура:
//+------------------------------------------------------------------+
//| SHI Bary Channel                                                 |
//+------------------------------------------------------------------+
void Bary()
 {
  int      CurrentBar, UpDown, i,B1,B2, BFF;
  double   P1, P2, PP, Step;
  datetime T1, T2;

  if (BarsForFract>0) BFF=BarsForFract; else
  switch (Period())
{
    case 1: BFF=12; break;
    case 5: BFF=48; break;
    case 15: BFF=24; break;
    case 30: BFF=24; break;
    case 60: BFF=12; break;
    case 240: BFF=15; break;
    case 1440: BFF=10; break;
    case 10080: BFF=6; break;
    case 43200: BFF=6; break;
    default:     BFF=2; break;
}

   CurrentBar=2; B1=-1; B2=-1; UpDown=0;
   while ((B1==-1 || B2==-1) && CurrentBar<Bars)
    {
     if (UpDown<1 && CurrentBar==Lowest(NULL,0,MODE_LOW,BFF*2+1,CurrentBar-BFF))
      {
       if (UpDown==0) {UpDown=-1;B1=CurrentBar;P1=Low[B1];} else {B2=CurrentBar;P2=Low[B2];}
      }
     if (UpDown>-1 && CurrentBar==Highest(NULL,0,MODE_HIGH,BFF*2+1,CurrentBar-BFF))
      {
       if (UpDown==0) {UpDown=1;B1=CurrentBar;P1=High[B1];} else {B2=CurrentBar;P2=High[B2];}
      }
     CurrentBar++;
    }

   if (B1==-1 || B2==-1) return(0);
   Step=(P2-P1)/(B2-B1);
   P1=P1-B1*Step; B1=0;

   if (UpDown==1)
    {
     PP=Low[2]-2*Step;
     for (i=3; i<=B2; i++) {if (Low[i]<PP+Step*i) { PP=Low[i]-i*Step; }}
    } else
   { PP=High[2]-2*Step;
      for (i=3; i<=B2; i++) {if (High[i]>PP+Step*i) { PP=High[i]-i*Step;}}
   }

   P2=P1+(Bars-10)*Step;
   T1=Time[B1]; T2=Time[Bars-10];

   txt="BaryUp";
   ObjectSet(txt,OBJPROP_TIME1,T2);
   ObjectSet(txt,OBJPROP_TIME2,T1);
   ObjectSet(txt,OBJPROP_PRICE1,PP+Step*(Bars-10));
   ObjectSet(txt,OBJPROP_PRICE2,PP);
   
   txt="BaryDown";
   ObjectSet(txt,OBJPROP_TIME1,T2);
   ObjectSet(txt,OBJPROP_TIME2,T1);
   ObjectSet(txt,OBJPROP_PRICE1,P2);
   ObjectSet(txt,OBJPROP_PRICE2,P1);

   return(0);
 }




Oleg77

Пишем советник-грааль!!!
« Ответ #18: 25 Февраля 2008, 10:57:08 »
Ну и в теле советника:
/
Код
/+------------------------------------------------------------------+
//| Expert Start Function                                            |
//+------------------------------------------------------------------+
int start()
 {
   Bary();
.........
}

Проверка уровней:
   f = ObjectGetValueByShift("BaryUp", 0);
   s = ObjectGetValueByShift("BaryDown", 0);

   if (f > s) { i_high = "BaryUp"; i_low = "BaryDown"; } else { i_high = "BaryDown"; i_low = "BaryUp"; }
     
   h = ObjectGetValueByShift(i_high, 0);
   l = ObjectGetValueByShift(i_low, 0);

AndreiFX

Пишем советник-грааль!!!
« Ответ #19: 25 Февраля 2008, 14:31:04 »
Олег, пасип за подсказку......
В прицепе эксп со встроенными каналами.

   f = ObjectGetValueByShift("BaryUp", 0);
   s = ObjectGetValueByShift("BaryDown", 0);
   if (f > s) { i_high = "BaryUp"; i_low = "BaryDown"; } else { i_high = "BaryDown"; i_low = "BaryUp"; }
   h = ObjectGetValueByShift(i_high, 0);
   l = ObjectGetValueByShift(i_low, 0);
Это не стал вставлять, оставил возможность самому чертить каналы и чтоб советник по ним торговал.
если extern bool useBarryChanel=true, то рисует каналы барри, если false, то берет информацию от самых крайних линий на графике

_______________________________________________________________________________________________________________
Идейка возникла: у нас ведь есть индики по диверам, но они блин фрактальные, можт переделаем их на поиск дивера по полуфракталам. Один фиг если есть 2 экстремума между которыми наблюдается дивер, этот дивер перерисоваться не должен......пускай фрактал не завершится, а цена дальше пойдет, дивергенция то от этого не пропадет, соответственно более ранние сигналы получим быть может......
кто что думает по этому поводу?

Oleg77

Пишем советник-грааль!!!
« Ответ #20: 25 Февраля 2008, 21:33:34 »
Олег, пасип за подсказку......
В прицепе эксп со встроенными каналами.

   f = ObjectGetValueByShift("BaryUp", 0);
   s = ObjectGetValueByShift("BaryDown", 0);
   if (f > s) { i_high = "BaryUp"; i_low = "BaryDown"; } else { i_high = "BaryDown"; i_low = "BaryUp"; }
   h = ObjectGetValueByShift(i_high, 0);
   l = ObjectGetValueByShift(i_low, 0);
Это не стал вставлять, оставил возможность самому чертить каналы и чтоб советник по ним торговал.
если extern bool useBarryChanel=true, то рисует каналы барри, если false, то берет информацию от самых крайних линий на графике

Ок, просто в таком виде канал Bary использовать нет смысла - он просто рисуется графически и эксперт его не учитывает. Проще в визуальном режиме накинуть сам индикатор на график - эффект будет тот же.

AndreiFX

Пишем советник-грааль!!!
« Ответ #21: 26 Февраля 2008, 05:19:52 »
Ок, просто в таком виде канал Bary использовать нет смысла - он просто рисуется графически и эксперт его не учитывает.
Почему ж.......все вроде учитывает...... вот процедуры, которые определеяют верхнюю и нижнюю линии канала, независимо это канал барри, либо горизонтальные линии, либо сам пользователь их нарисовал. Берут самые крайние линии. Конечно чуть чуть помассивней получилось нежели в твоем варианте :)
Цитировать
double UP_Chanel(int shift)
{
    double verh_kanala = 0;
   
      for (int i = 0; i < ObjectsTotal(); i++)
         {
         if (StringFind(ObjectName(i),"#",0) < 0)
            {
            if (ObjectType(ObjectName(i)) == 1)
               {
               if (verh_kanala < ObjectGet(ObjectName(i),OBJPROP_PRICE1))
                  {
                  verh_kanala = ObjectGet(ObjectName(i),OBJPROP_PRICE1);
                  }
                 }
            if (ObjectType(ObjectName(i)) == 2)
               {
               if (verh_kanala < ObjectGetValueByShift(ObjectName(i),shift))
                  {
                  verh_kanala = ObjectGetValueByShift(ObjectName(i),shift);
                  }
 
              }
            }
         }

return(verh_kanala);}

double DN_Chanel(int shift)

{
    double niz_kanala = 9999;
     
      for (int i = 0; i < ObjectsTotal(); i++)
         {
         if (StringFind(ObjectName(i),"#",0) < 0)
            {
            if (ObjectType(ObjectName(i)) == 1)
               {
                 if ((niz_kanala > ObjectGet(ObjectName(i),OBJPROP_PRICE1)) && (ObjectGet(ObjectName(i),OBJPROP_PRICE1) > 0))
                  {
                  niz_kanala = ObjectGet(ObjectName(i),OBJPROP_PRICE1);
                  }
               }
            if (ObjectType(ObjectName(i)) == 2)
               {
                if ((niz_kanala > ObjectGetValueByShift(ObjectName(i),shift)) && (ObjectGetValueByShift(ObjectName(i),shift) > 0))
                  {
                  niz_kanala = ObjectGetValueByShift(ObjectName(i),shift);
                  }
               }
            }
         }
return(niz_kanala);}

Oleg77

Пишем советник-грааль!!!
« Ответ #22: 26 Февраля 2008, 08:48:03 »
Ок, просто в таком виде канал Bary использовать нет смысла - он просто рисуется графически и эксперт его не учитывает.
Почему ж.......все вроде учитывает...... вот процедуры, которые определеяют верхнюю и нижнюю линии канала, независимо это канал барри, либо горизонтальные линии, либо сам пользователь их нарисовал. Берут самые крайние линии.


Ой, точно, слона-то я и не заметил  ::)

dd$

  • *****
  • 6095
  • 234
    • Просмотр профиля
Пишем советник-грааль!!!
« Ответ #23: 26 Февраля 2008, 23:55:22 »
Ок, просто в таком виде канал Bary использовать нет смысла - он просто рисуется графически и эксперт его не учитывает.
Почему ж.......все вроде учитывает...... вот процедуры, которые определеяют верхнюю и нижнюю линии канала, независимо это канал барри, либо горизонтальные линии, либо сам пользователь их нарисовал. Берут самые крайние линии.


Ой, точно, слона-то я и не заметил  ::)

Отличная работа.. затестил.. Продолжаю думать над вариантами иного поиска направления торговли.. при ручной торговле каналы мне казались более надежным инструментом

Идейка возникла: у нас ведь есть индики по диверам, но они блин фрактальные, можт переделаем их на поиск дивера по полуфракталам. Один фиг если есть 2 экстремума между которыми наблюдается дивер, этот дивер перерисоваться не должен......пускай фрактал не завершится, а цена дальше пойдет, дивергенция то от этого не пропадет, соответственно более ранние сигналы получим быть может......
кто что думает по этому поводу?

У нас же есть индики диверы нефрактальные.. они сигналят как резаные..

 

Отметьте интересные вам фрагменты текста и они станут доступны по уникальной ссылке в адресной строке браузера.