Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 790

 
Forexman77:

Вопрос не снят. Итак, сначала.

Найден максимум, далее по нему строится линия. Проверяется расстояние между этой максимальной линией и текущим минимумом. Если она превышает «Rmax», то ставится стрелка на баре, где найден максимум. Стрелка то ставится, но не там. Для наглядности добавил буфер «BufferLow[i]», который показывает разницу и его данные видны в окне обозревателя.

Вот так всегда. Зимой от Вас снега не дождешься) Сам сделал.

Если кто был мучим столь похожей идеей, то вот код:

#property copyright "Kamil Gazizullin"
#property link      "forexman77@yandex.ru"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
#property indicator_chart_window
#property indicator_buffers 5
#property indicator_color1 Magenta
#property indicator_color2 Aqua
#property indicator_color3 SlateBlue
#property indicator_color4 SlateBlue
#property indicator_color5 clrNONE
//--- input parameters
extern int       Period_=10;
extern double diapazon  =0.003;
//--- buffers
double Max[];
double Min[];
double MaxIndex[];
double MinIndex[];
double rAZNOST[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   IndicatorBuffers(5);
   SetIndexBuffer(0,MaxIndex);
   SetIndexBuffer(1,MinIndex);
   SetIndexStyle(0,DRAW_ARROW);
   SetIndexArrow(0,116);
   SetIndexEmptyValue(1,0.0);
   SetIndexStyle(1,DRAW_ARROW);
   SetIndexArrow(1,116);
   SetIndexEmptyValue(0,0.0);
   SetIndexBuffer(2,Max);
   SetIndexBuffer(3,Min);
   SetIndexBuffer(4,rAZNOST);
   IndicatorDigits(Digits+1);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
    int counted_bars=IndicatorCounted(),limit, i,k,r,p,t,f;
    double minimum,maximum,Dmax,Dmin;
   if(counted_bars>0)
      counted_bars--;  
   limit=Bars-counted_bars;
   for(i=0;i<limit;i++)
   {
      maximum=High[iHighest(NULL,0,MODE_HIGH,Period_,i)];
      minimum=Low[iLowest(NULL,0,MODE_LOW,Period_,i)];
      Max[i]=maximum;
      Min[i]=minimum;
   }
   for(i=0;i<limit;i++)
   {
      k=iHighest(NULL,0,MODE_HIGH,Period_,i);
      t=iLowest(NULL,0,MODE_LOW,Period_,i);
      Dmax=Max[i]-Low[i];
      Dmin=High[i]-Min[i];
      if (Dmax > diapazon){p=k;for(r=p;r>=k;r--)MaxIndex[k]=Max[k];}
      if (Dmin > diapazon){p=t;for(f=p;f>=t;f--)MinIndex[t]=Min[t];}
      if (MaxIndex[i]==Max[i+1])MaxIndex[i]=0;
      if (MinIndex[i]==Min[i+1])MinIndex[i]=0;
      rAZNOST[i]=Max[i]-Min[i];
   }
   return(0);
  }
 
Awwl:

Встроенный Heiken Ashi выглядит откровенной недоделкой (интересно, это только у меня на 745 так?), зато стало понятно, как он устроен. И непонятно, как устроен WmiFor!

В коде Heiken Ashi свеча рисуется из 4-х полосок гистограмм:

Т.е. по мере увеличения номера буфера (от 0 до 3) новые полоски рисуются поверх старых. Причём порядок такой:

LowHigh - HighLow - Open - Close.

А чтобы свечи выглядели как положено, с телом и хвостами, порядок должен быть такой:

max(Open,Close)//толстая цветная линия// - min(Open,Close)//толстая белая// - High//тонкая цветная// - Low//тонкая белая//. 

Компилируем индикатор, ставим его на график и видим все проблемы (см. рис.).

Но у такого способа, как в Heiken Ashi, есть недостаток - под каждой "свечой" получается белый шлейф в цвет фона, который закрывает всё, что ниже. А у WmiFor всё идеально! Недокументированные возможности

 

Первая картинка - Heiken Ashi (вынесен в separate window), вторая картинка - WmiFor, фон сделан светло-зелёным для наглядности.

  

Сравниваем мягкое с круглым? Зачем Хейкен в отдельное окно выносить, если он задуман для окна графика, и там рисуется именно как свечи с тенями и телом? И никакие новые полоски поверх старых не рисуются, если значение буфера меняется, то та же полоса меняет размер, а не рисуется новая поверх неё.

В МТ4 нет метода отрисовки в виде свеч, так что только гистограммой можно, а уж как вы там значения буферов рассчитаете - ваше личное дело. WmiFor, кстати, тоже гистограммой рисует, давайте и его вынесем в отдельное окно и подивимся на его глюки )))

Чтобы свечи в отдельном окне выглядели как свечи с тенями, их надо рисовать относительно 0, как Accelerator. Или рисовать обьектами, как это делается, см. например All_Stars

 

Всем Доброго времени суток!

Мозг припух; в документации ответа не нашел, но может кто сталкивался. Вот такая строчка в советнике (доля положительных сделок): 

Print(OderPluseCount,"/",OderTotal,"=",DoubleToStr((OderPluseCount/OderTotal),2),"=",BestOd," ",2/5*100," ",100*2/5);

Выдает в журнал (например): 

3/6=0.00=0 0 40

При этом если решение от 1: 

3/3=1.00=1 0 40

Переменная BestOd=OderPluseCount/OderTotal типа double, остальные int.

То есть, как только встречается значение меньше 1, то автоматом компилятор превращает его в 0... Последние два выражения из констант вообще удивительные результаты дают - вроде, одно и тоже, а нет )))

Пробовал разные подстановки, - все, что больше 1 имеет корректную дробную часть

 

 
Igor_:

Всем Доброго времени суток!

Мозг припух; в документации ответа не нашел, но может кто сталкивался. Вот такая строчка в советнике (доля положительных сделок): 

Print(OderPluseCount,"/",OderTotal,"=",DoubleToStr((OderPluseCount/OderTotal),2),"=",BestOd," ",2/5*100," ",100*2/5);

Выдает в журнал (например): 

3/6=0.00=0 0 40

При этом если решение от 1: 

3/3=1.00=1 0 40

Переменная BestOd=OderPluseCount/OderTotal типа double, остальные int.

То есть, как только встречается значение меньше 1, то автоматом компилятор превращает его в 0... Последние два выражения из констант вообще удивительные результаты дают - вроде, одно и тоже, а нет )))

Пробовал разные подстановки, - все, что больше 1 имеет корректную дробную часть. 

Попробуй так

DoubleToStr((double)(OderPluseCount/OderTotal),2)

 
AlexeyVik:

Попробуй так

DoubleToStr((double)(OderPluseCount/OderTotal),2)

Не помогает. Но спасибо )
 
Igor_:
Не помогает. Но спасибо )
DoubleToStr((double)(OderPluseCount/(OderTotal*1.0)),2)
 
Vinin:
DoubleToStr((double)(OderPluseCount/(OderTotal*1.0)),2)

Так работает, Спасибо. Похоже на шаманство )))

Честно говоря, я больше переживаю не за отображение, а за правильный расчет BestOd. Пришлось и его править.

Сделал так:

BestOd=(OderPluseCount/(OderTotal*1.0));

Этому есть какое-то объяснение? Ведь если бы не принт, отловить такую ошибку очень сложно. В каких случаях она может вылезти?

 
Igor_:

Так работает, Спасибо. Похоже на шаманство )))

Честно говоря, я больше переживаю не за отображение, а за правильный расчет BestOd. Пришлось и его править.

Сделал так:

BestOd=(OderPluseCount/(OderTotal*1.0));

Этому есть какое-то объяснение? Ведь если бы не принт, отловить такую ошибку очень сложно. В каких случаях она может вылезти?

При любых действиях с целочисленными значениями в результате будет целое. 
 

Сам нашел ответ в справочнике, раздел "Приведение типов". 

Если два значения объединяются бинарным оператором, то перед выполнением операции операнд младшего типа преобразовывается к более старшему типу в соответствии с приоритетом, указанным на схеме: 

Но тип double по этой схеме самый старший. А у меня были оба int. Поэтому и результат целочисленный. Введение константы старшего типа (double, float), преобразовал все int к нему.

Век живи, - век учись, а в документацию заглядывай ))) 

 
Здравствуйте! У меня такой вопрос. 
Как в советнике, который перебирает и модифицирует открытые позиции, сделать так, что бы он при очередном проходе не модифицировал повторно те ордера, которые прошли модификацию. Как то их надо "помазать"
Что то на ум ничего не приходит.
Буду очень признателен.