[АРХИВ]Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 5. - страница 373

 
sv.:

странно.
проверил, всё показывает.
может сжать по вертикали график нужно, если канал широкий, то при увеличении может не видно.

Что-то нарисовалось после подбора параметров. Только уж очень узкий диапазон подходит под условия советника. Шаг в лево, шаг вправо - пустота. И под определение флета эти условия никак не подходят. У меня флет получается на 100 пипсах по 4-м знакам. И все четко у меня отрисовывается.

//+------------------------------------------------------------------+
//|                                           ind_FletChannel_07.mq4 |
//|                                            Copyright © 2013, sv. |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2013, sv."
#property link      "7009731@mail.ru"
//----
#property indicator_chart_window
#property indicator_buffers 4
#property indicator_color1 Blue
#property indicator_color2 Red
#property indicator_color3 Blue
#property indicator_color4 Red
#property indicator_width1 3
#property indicator_width2 3
#property indicator_width3 3
#property indicator_width4 3
//----
extern int    Distans     = 20;      // Количество баров для определения канала
extern int    Channel     = 1000;     // Размер в пипсах канала
extern int    ZoneUnSence = 80;      // Размер выхода за границы канала, в пипсах
extern int    PauseBar    = 1;       // А это по ходу дела - смещение баров,т.е. где нужно считать.
//----
double Up[];
double Down[];
double UpSupport[];
double DownResistance[];

double pnt;
double high,   low;
double high_1 = 0,
       low_1  = 0;
bool   up_chanel, dn_chanel, FirstChanel;
bool   DrawChannel = false;
int    limit,  History=0;        // 0- все бары
int    n=0, n_up=0, n_dn=0;
int    Bar;

//+------------------------------------------------------------------+
int init() 
  {
//----
 //  pnt=Point;
 //  if(Digits==5 || Digits==3) pnt*=10;
   
 //  IndicatorDigits(Digits);
 //  IndicatorBuffers(4);
//----      
   SetIndexBuffer(0,Up);
   SetIndexStyle(0,DRAW_LINE);
   SetIndexEmptyValue(0,0.0);

   SetIndexBuffer(1,Down);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexEmptyValue(1,0.0);
   
   SetIndexBuffer(2,UpSupport);
   SetIndexStyle(2,DRAW_LINE);
   SetIndexEmptyValue(2,0.0);

   SetIndexBuffer(3,DownResistance);
   SetIndexStyle(3,DRAW_LINE);
   SetIndexEmptyValue(3,0.0);
//----      
   return(0);
  }
//+------------------------------------------------------------------+
int start() 
  { 
   limit = Bars-IndicatorCounted()-1; 
   if(limit > 1)                    limit = Bars-1;
   if(History!=0 && limit>History)  limit = History-1;                   // кол-во пересчетов по истории

   Bar = limit;
   
   // ------------------------------------------------------------------
   for(int i=limit; i>=0; i--) 
     {
      if(i < Bar-PauseBar)
       {
        // если не активна отрисовка канала, ищем канал.
        if(DrawChannel==false)
         {
          // отределяется минимум и максимум на заданном интервале Distans
          double low  = iLow (NULL,0,iLowest (NULL,0,MODE_LOW, Distans,i));
          double high = iHigh(NULL,0,iHighest(NULL,0,MODE_HIGH,Distans,i));
          
          // и если разность между максимумом и минимумом меньше заданной ширины канала Channel
          if( (high-low) < Channel*Point )  DrawChannel=true;
         }  
       }
      // ------------------------------------------------------------------
      if(DrawChannel)
       {  
        // определяются границы канала как максимум и минимум на интервале Distans
        
        // отрисовка первоначального отправного канала
        if(FirstChanel) { Up[i]   = high;   Down[i] = low;  }
        if(up_chanel)   { Up[i]   = high;   UpSupport[i]      = high - Channel*Point; }   // отрисовка канала тренда вверх
        if(dn_chanel)   { Down[i] = low;    DownResistance[i] = low  + Channel*Point; }   // отрисовка канала тренда вниз
        
        // определяются границы отправного первоначального канала
        // ------------------------------------------------------------------
        if( high_1==0 && low_1==0 )    
         {
          FirstChanel=true;  high_1=high;  low_1=low; 
         }
        else                     // если первоначальный отправной канал уже определён и отрисован
         { 
          if(high > high_1)      // если верхняя граница нового канала выше верхней границы предыдущего канала, то это восходящий тренд
           {
            up_chanel=true;      // активируем флаг отрисовки канала тренда вверх
            high_1 = high;       // и перезаписываем значение
            low_1  = low;
           }
        
          if(low < low_1)        // если нижняя граница нового канала ниже нижней границы предыдущего канала, то это нисходящий тренд
           {
            dn_chanel=true;      // активируем флаг отрисовки канала тренда вниз
            high_1=high;         // и перезаписываем значение
            low_1=low;
           }
         }  
        // ------------------------------------------------------------------
        
        if(Up[i]!=0 && UpSupport[i]!=0)        // пока условие выполняется, границы канала не изменяются
         {
          if ((Close[i] > Up[i]        + ZoneUnSence*Point) ||
              (Close[i] < UpSupport[i] - ZoneUnSence*Point))
           {
            // если условие не выполняется, флаг сбрасывается - Т.е. если не в границах канала
            up_chanel=false;
            dn_chanel=false;
            FirstChanel=false; 
            DrawChannel=false;
           }
         } 
        // ------------------------------------------------------------------
        if(Down[i]!=0 && DownResistance[i]!=0)
         {
          if ((Close[i] > DownResistance[i]+ZoneUnSence*Point) ||
              (Close[i] < Down[i]-ZoneUnSence*Point))
           {
            // если условие не выполняется, флаг сбрасывается - Т.е. если не в границах канала
            up_chanel=false;
            dn_chanel=false;
            FirstChanel=false;
            DrawChannel=false;
           }
         }
        if(Up[i]!=0 && Down[i]!=0)
         {
          if ((Close[i] > Up[i]   + ZoneUnSence*Point) ||
              (Close[i] < Down[i] - ZoneUnSence*Point))
           {
            // если условие не выполняется, флаг сбрасывается
            up_chanel=false;
            dn_chanel=false;
            FirstChanel=false; 
            DrawChannel=false;
           }
         }    
        Bar = i; 
       }    
     } 
   // Конец перебора
   // ------------------------------------------------------------------
   return(0);
  }
//+------------------------------------------------------------------+

Я немножко видоизменил - пытался разобраться. Но в таком виде все работает. ТФ использовал Н1. Плохо, что на других ТФ не удалось добиться отрисовки подбором параметров. К примеру, на 5 и 15 минутках. - Можно было бы предположить, что используя эти ТФ можно флета добиться. Но логика совы вероятно страдает - тут нужно Вам ее перебрать, предположительно.   (Если кто в этом плане из более мастеровитых подскажет идеи или на ошибки укажет.)

А с отрисовкой проблем не заметил.

У Вас в этом индикаторе, как и у подавляющего большинства, отрисовывается то, что было когда-то; что для шаблона написания индикатора нормально. Но то, что происходит сейчас (как Вы говорили - на текущем баре) в условия этого индикатора не попадает. Поэтому и проблем на текущем баре нету.

 
Chiripaha:

Что-то нарисовалось после подбора параметров. Только уж очень узкий диапазон подходит под условия советника. Шаг в лево, шаг вправо - пустота. И под определение флета эти условия никак не подходят. У меня флет получается на 100 пипсах по 4-м знакам. И все четко у меня отрисовывается.

Я немножко видоизменил - пытался разобраться. Но в таком виде все работает. ТФ использовал Н1. Плохо, что на других ТФ не удалось добиться отрисовки подбором параметров. К примеру, на 5 и 15 минутках. - Можно было бы предположить, что используя эти ТФ можно флета добиться. Но логика совы вероятно страдает - тут нужно Вам ее перебрать, предположительно.   (Если кто в этом плане из более мастеровитых подскажет идеи или на ошибки укажет.)

А с отрисовкой проблем не заметил.

У Вас в этом индикаторе, как и у подавляющего большинства, отрисовывается то, что было когда-то; что для шаблона написания индикатора нормально. Но то, что происходит сейчас (как Вы говорили - на текущем баре) в условия этого индикатора не попадает. Поэтому и проблем на текущем баре нету.


Параметр PauseBar - это минимальное расстояние  отделяющее один канал от другого, в вашей редакции этот параметр должен быть больше 5, тогда отрисовывается при разных других параметрах.
Но проблема с отрисовкой с приходом новых баров осталась.

 

 
sv.:


Параметр PauseBar - это минимальное расстояние  отделяющее один канал от другого, в вашей редакции этот параметр должен быть больше 5, тогда отрисовывается при разных других параметрах.
Но проблема с отрисовкой с приходом новых баров осталась.

Я пока более точно врубиться не могу - Честно говоря, я никак не пойму логики работы вашего индикатора (хотя суть то я понимаю). Но...

Смотрите -проблема кроется именно в этом блоке:

        if(FirstChanel) { Up[i]   = high;   Down[i] = low;  }                             // отрисовка первоначального отправного канала
        if(up_chanel)   { Up[i]   = high;   UpSupport[i]      = high - Channel*Point; }   // отрисовка канала тренда вверх
        if(dn_chanel)   { Down[i] = low;    DownResistance[i] = low  + Channel*Point; }   // отрисовка канала тренда вниз

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

DrawChannel=false;

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

 
Chiripaha:

Я пока более точно врубиться не могу - Честно говоря, я никак не пойму логики работы вашего индикатора (хотя суть то я понимаю). Но...

Смотрите -проблема кроется именно в этом блоке:

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

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


Понял, значит дело в логике. Буду думать.
Благодарю за помощь.

P.S.
Вы проверьте, у вас то хоть отрисовывается на истории всё нормально с увеличением параметра PauseBar c другим набором остальных параметров, или и с этим проблемы? 

 
как посмотреть и вывести символ расширенной таблицы аскикодов?
 
sv.:


Понял, значит дело в логике. Буду думать.
Благодарю за помощь.

P.S.
Вы проверьте, у вас то хоть отрисовывается на истории всё нормально с увеличением параметра PauseBar c другим набором остальных параметров, или и с этим проблемы? 

Я проверил с увеличением PauseBar и получил как раз эти палки на 1 и 5-ти минутках. Но никак не врублюсь как правильно их объехать. Я понимаю, что нужно записать, вероятно (но не очевидно), если значение

DrawChannel=false;

в

if(dn_chanel)   { Down[i] = low;    DownResistance[i] = low  + Channel*Point; }   // отрисовка канала тренда вниз

значение предыдущих баров - примерно что-то вроде этого:

if(dn_chanel)   { Down[i] = Down[i+1];    DownResistance[i] = DownResistance[i+1]; }   // отрисовка канала тренда вниз
Но при попытках это реализовать - у меня весь индикатор "съезжает" - это потому, что я, не понимая логики, никак не врублюсь куда это вставить и при каких условиях.
 
zfs:
как посмотреть и вывести символ расширенной таблицы аскикодов?

Это называется ANSI.

Скрипт прикрепил.

Файлы:
ansi.mq4  2 kb
 
впервые на форуме, решил задать интересующий меня вопрос - возможно ли сделать такие изменения в терминале, чтобы вставлять свой комментарий (1 и более  раз) на открытой уже позиции? не сразу при открытии комментарий. а когда уже открыл - чтобы появлялся текущий комментарий??
 
Подскажите, пожалуйста, как решить проблему: одинаковый советник висит на нескольких графиках, одновременно появляется сигнал на открытие ордера, например, на двух графиках. Однако нужно, чтоб второй ордер не открывался. В советнике есть проверка на открытый ордер, но это не помогает, т. к. видимо, пока первый советник открывает ордер, второй тоже посылает запрос на открытие. Есть какие-нибудь варианты решения? 
 
Twoberg:
впервые на форуме, решил задать интересующий меня вопрос - возможно ли сделать такие изменения в терминале, чтобы вставлять свой комментарий (1 и более  раз) на открытой уже позиции? не сразу при открытии комментарий. а когда уже открыл - чтобы появлялся текущий комментарий??

 

Нет