MetaTrader 4. Build 164. - страница 2

 
Программой пользуюсь давно, ещё с FX Charts и Метаквоты и естественно создались некоторые визуальные привычки. Хорошо бы вернуть старый значок программы на нижнюю линейку Виндов. Он довольно характерен и легко узнаваем, чего не скажешь о новом, довольно безликом.

Мы как раз наоборот убрали не совсем удачные черные чарты, чтобы были несколько билдов назад и поставили полноцветную светлую иконку. Полгода и все привыкнут?
 
2 Renat
Индикатор крайне прост - несколько строк текста. Рисует 3 канала типа OBJ_STDDEVCHANNEL разной длины.

В соседней ветки явно проявилась аналогичная ошибка с кастомным индикаторам после смены таймфреймов - в понедельник найдем и исправим ошибку.
 
Мы как раз наоборот убрали не совсем удачные черные чарты, чтобы были несколько билдов назад и поставили полноцветную светлую иконку. Полгода и все привыкнут?


Дело вкуса конечно, но хорошо бы сохранять какую-то индивидуальность, а то сейчас все лепят такие водянисто-голубоватенькие значки в стиле ХР
 
Подскажите, что не правильно?
#property indicator_chart_window
extern int Length=8;

#property indicator_color1 Plum

double Buffer[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,Buffer);
   
   SetIndexDrawBegin(0,Length-1);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//---- TODO: add your code here
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int  counted_bars=IndicatorCounted();
//---- TODO: add your code here
   double sum=0,LinearRegValue=0,Num1=0,Num2=0,SumBars=0,SumSqrBars=0,SumY=0,Sum1=0,Sum2=0,Slope=0,Intercept=0;
   int i=0,x=0;
      
   if (counted_bars<0) return(-1);
   if (counted_bars>0) counted_bars--;
   int pos=Bars-counted_bars-1;   
  while(pos>=0)
   {
  /*while(pos>=0)
     {
      sum+=Close[pos];
      Buffer[pos]=sum/Length;
	   sum-=Close[pos+Length-1];
 	   pos--;
     }
     Comment("Buffer ",Buffer[pos]);*/
   if (Length==0) 
	LinearRegValue=0;
   
   SumBars=0;
   SumSqrBars=0;
   SumY=0;
   Sum1=0;
   Sum2=0;
   for(i=0;i<=Length-1;i++)
      {
      SumY+=Close[i];
      }
   SumBars=Length*(Length-1)*0.5;
   SumSqrBars=(Length-1)*Length*(2*Length-1)/6;
   for(x=0;x<=Length-1;x++)
      {
      Sum1+=x*Close[x];
      }
   Sum2=SumBars*SumY;
   Num1=Length*Sum1-Sum2;
   Num2=SumBars*SumBars-Length*SumSqrBars;
   
   if (Num2!=0) 
	   Slope=Num1/Num2;
   else 
	   Slope=0;

   Intercept=(SumY-Slope*SumBars)/Length;
   LinearRegValue=Intercept+Slope*(Length-1);
   Buffer[pos]=LinearRegValue;
   pos--;
   }
   
//----
   return(0);
  }
 
Странно работает закладка "Account History" на всех версиях что я видел.

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

Т.е. не запоминает период.
Удобнее было бы иметь возможность типа - Сегодня, Посл. 3 дня, Посл. неделя ...
Т.е. чтобы такой период на автомате начинался от текущей даты.
Иначе каждый раз приходится менять руками.

2. Если выбираеш Custom Period, то даты которые устанавливаются по умолчанию ничего не показывают.
Напр. сейчас - с 11.04.2005 по 12.04.2005
Сделок за сегодня полно, но ни одна не показывается.
Если руками поменять на 10.04.2005 - 12.04.2005 (10 - воскресенье),
то показывает сегодняшние сделки.

Строки в закладке Trade упорядочены непонятным образом.
В течении сессии они упорядочены по времени, если же перезапустить терминал, то переупорядочиваются похоже по парам в алфавитном порядке. И этот порядок никак изменить нельзя (не нашел способа).

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

Про иконку.
Наверное и к новой народ привыкнет,
но старая была более выразительной и запоминающейся.
Новая действительно блеклая и скажем от аутлука не сильно отличается.
 
Чуть измененный индикатор ASC Trend.

Устанавливаем на D1. Рисует метки.
Переключаемся на H4. Рисует правильные метки.

Переключаемся обратно на D1.
Такое меток становится больше чем в начале (и часть явно неправильных).
Такое ощущение, что при смене таймфрейма инициализация/деинициализация выполняются неправильно.

Если переключаться на меньшие таймфреймы и назад,
то меток становится еще больше.

Лог
2005.04.11 16:15:11	ASCTrend EURAUD,Daily: initialized
2005.04.11 16:15:11	ASCTrend EURAUD,Daily: initialized
2005.04.11 16:15:11	ASCTrend EURAUD,H4: deinitialized
2005.04.11 16:15:09	ASCTrend EURAUD,H4: initialized
2005.04.11 16:15:08	ASCTrend EURAUD,H4: initialized
2005.04.11 16:15:08	ASCTrend EURAUD,Daily: deinitialized
..................


(две строки инициализации почему-то)

//+------------------------------------------------------------------+
//|                                               ASC_Trend_1sig.mq4 |
//|                                                        komposter |
//|                                      mailto:komposterius@mail.ru |
//+------------------------------------------------------------------+
#property copyright "komposter"
#property link      "mailto:komposterius@mail.ru"
 
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 Lime
#property indicator_color2 Red
 
extern int RISK = 3;
 
double buf0[]; //ASC_Trend_Up
double buf1[]; //ASC_Trend_Down
 
int init()
{
   IndicatorShortName( "ASC_Trend" );
   IndicatorDigits ( MarketInfo( Symbol(), MODE_DIGITS ) );
 
   SetIndexBuffer( 0 , buf0 );
   SetIndexStyle ( 0 , DRAW_ARROW , EMPTY , 3 );
   SetIndexArrow( 0 , 217);
   SetIndexDrawBegin( 0 , 12 );
   SetIndexLabel( 0 , "ASC_Trend_Up");
 
   SetIndexBuffer( 1 , buf1 );
   SetIndexStyle ( 1 , DRAW_ARROW , EMPTY , 3 );
   SetIndexArrow( 1 , 218);
   SetIndexDrawBegin( 1 , 12 );
   SetIndexLabel( 1 , "ASC_Trend_Down");
 
   return(0);
}
 
int ASC_Trend_Prev = 1;
double ASC_Trend_Up = 0, ASC_Trend_Down = 0;

int start()
{
   int counted_bars=IndicatorCounted();
   if ( Bars <= 100 ) return(-1);
   if ( counted_bars < 0 ) return(-1);
   if ( counted_bars > 0 ) counted_bars -- ;
 
   int limit = Bars - 12;
   if ( counted_bars > 0 ) { limit = Bars - counted_bars - 12; }
 
   double x1 = 67 + RISK, x2 = 33 - RISK;
   for ( int i = limit; i >= 0; i -- )
   {
      double SummRange = 0, AvgRange = 0;
 
      for ( int u = i + 10; u > i; u -- )
         SummRange += High[u] - Low[u]; 
 
      AvgRange = SummRange / 10;
 
      int WprPeriod = 3 + RISK * 2;
 
      for ( u = i + 10; u > i; u -- )
      if ( MathAbs( Open[u] - Close[u+1] ) >= AvgRange * 2 )
      {
         WprPeriod = 3; 
         break; 
      }
 
      for ( u = i + 7; u > i; u -- )
      if ( MathAbs( Close[u+3] - Close[u] ) >= AvgRange * 4.6 )
      {
         WprPeriod = 4; 
         break; 
      }
 
      double WprAbs = 100 + iWPR( Symbol(), 0, WprPeriod, i );
 
      if ( WprAbs > x1 && ASC_Trend_Prev == -1 )
      {
         ASC_Trend_Up = Low[i] - AvgRange * 0.5; 
         ASC_Trend_Prev = 1; 
      }
 
      if ( WprAbs < x2 && ASC_Trend_Prev == 1 )
      { 
         ASC_Trend_Down = High[i] + AvgRange * 0.5; 
         ASC_Trend_Prev = -1; 
      }
      if ( WprAbs > x1) buf0[i] = ASC_Trend_Up;
      if ( WprAbs < x2) buf1[i] = ASC_Trend_Down;
   }
}
 
 
Если перекомпилировать индикатор, то все лишние метки остаются на месте.
Спасает только удаление индикатора и подключение его заново.

2005.04.11 16:29:43	ASCTrend GBPJPY,M30: initialized
2005.04.11 16:29:43	ASCTrend GBPJPY,M30: loaded successfully
2005.04.11 16:29:43	ASCTrend EURAUD,Daily: initialized
2005.04.11 16:29:43	ASCTrend EURAUD,Daily: loaded successfully
2005.04.11 16:29:42	Compiling 'ASCTrend'


Поскольку дубликатов меток как будто не видно (две одинаковых на одном баре),
то похоже что при таких манипуляциях (смена таймфрейма и пр.)
не выполняется очистка/инициализация буферов индикатора (buf0, buf1).

 
Инициализация буферов в init исправляет ситуацию,
но наверное это должен бы терминал делать.

int init()
{
     ..................   

   int i,count;

   count = ArraySize(buf0);
   for(i = 0; i < count; i++) buf0[i] = 0;

   count = ArraySize(buf1);
   for(i = 0; i < count; i++) buf1[i] = 0;
 
   return(0);
}
 
Чуть измененный индикатор ASC Trend

он не изменённый, он оптимизированный (т.е. код=) принцип работы - как в оригинале ;)
 
Может и оптимизорован, не помню уже ...
Но изменения есть, он показывает не одну стрелку,
а много, пока есть сигнал.