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

 

Спасибо,уважаемые,за советы.Всё работает,но при установке индикатора он странно рисуется(см.график).Отступ (в барах) от левого края окна графика до вертикальной жёлтой линии всегда ПОСТОЯНЕН при ЛЮБОМ количестве видимых баров в окне и равен восьми барам.Как только эти восемь баров уйдут за левую границу окна,ВСЕ линии графика сразу же появляются и дальше всё идёт нормально.Можно ли это исправить и как?


#property indicator_separate_window
#property indicator_buffers 4
#property indicator_color1 Lime
#property indicator_color2 Red
#property indicator_color3 Aqua
#property indicator_color4 DarkOrange
#property  indicator_width1  2
#property  indicator_width3  2
//--- buffers
double Macd1Buffer[];
double Signal1Buffer[];
double Macd2Buffer[];
double Signal2Buffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,Macd1Buffer);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1,Signal1Buffer);
   SetIndexStyle(2,DRAW_LINE);
   SetIndexBuffer(2,Macd2Buffer);
   SetIndexStyle(3,DRAW_LINE);
   SetIndexBuffer(3,Signal2Buffer);
   
   IndicatorDigits(Digits);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   Comment("");
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {   
      double max1=-0.01,min1=0.01,
             max2=-0.01,min2=0.01,
             max_M1=-0.01,min_M1=0.01,
             max_M2=-0.01,min_M2=0.01,
             max_S1=-0.01,min_S1=0.01,
             max_S2=-0.01,min_S2=0.01;
             
       
 
   int bars_counted=WindowBarsPerChart()-1,
       limit;  
       limit=bars_counted;       


      
//---- macd counted in the 1-st buffer
   for(int i=0; i<limit; i++)
   
   { 
     Macd1Buffer[i]=iMA(NULL,0,6,0,MODE_EMA,PRICE_CLOSE,i)-iMA(NULL,0,12,0,MODE_EMA,PRICE_CLOSE,i);
     Macd2Buffer[i]=iMA(NULL,0,12,0,MODE_EMA,PRICE_CLOSE,i)-iMA(NULL,0,26,0,MODE_EMA,PRICE_CLOSE,i);
      
           max_M1=MathMax(Macd1Buffer[i],max_M1);
           min_M1=MathMin(Macd1Buffer[i],min_M1);
           
           max_M2=MathMax(Macd2Buffer[i],max_M2);
           min_M2=MathMin(Macd2Buffer[i],min_M2);
   }
   
   for( i=0; i<limit; i++)
           
   {
      Signal1Buffer[i]=iMAOnArray(Macd1Buffer,Bars,5,0,MODE_SMA,i);
      Signal2Buffer[i]=iMAOnArray(Macd2Buffer,Bars,9,0,MODE_SMA,i);
      
           
           max_S1=MathMax(Signal1Buffer[i],max_S1);
           min_S1=MathMin(Signal1Buffer[i],min_S1);
           
           max_S2=MathMax(Signal2Buffer[i],max_S2);
           min_S2=MathMin(Signal2Buffer[i],min_S2);         
   }          
           max1=MathMax(max_M1,max_S1);
           min1=MathMin(min_M1,min_S1);
             
           
            
      

//---- done 
   
 
      Comment( "\n"," Баров = ",WindowBarsPerChart()-1,
               "\n"," max_M1 = ",max_M1,
               "\n"," min_M1 = ",min_M1,
               "\n"," max_S1 = ",max_S1,
               "\n"," min_S1 = ",min_S1,
               "\n"," max_M2 = ",max_M2,
               "\n"," min_M2 = ",min_M2,
               "\n"," max_S2 = ",max_S2,
               "\n"," min_S2 = ",min_S2,
               "\n"," max1 = ",max1,
               "\n"," min1 = ",min1,    
               "\n"," max2 = ",max2,
               "\n"," min2 = ",min2);
         
             
         
//----
   return(0);
  }
//+------------------------------------------------------------------+
 
MK07:

Спасибо,уважаемые,за советы.Всё работает,но при установке индикатора он странно рисуется(см.график).Отступ (в барах) от левого края окна графика до вертикальной жёлтой линии всегда ПОСТОЯНЕН при ЛЮБОМ количестве видимых баров в окне и равен восьми барам.Как только эти восемь баров уйдут за левую границу окна,ВСЕ линии графика сразу же появляются и дальше всё идёт нормально.Можно ли это исправить и как?


попробуйте вот так

   int limit;
   int counted_bars=IndicatorCounted();
   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;
 
Эта конструкция кода позволяет при каждом новом тике пересчитывать индикатор только на нулевом и первом (для проверки) барах,а не пересчитывать уже посчитанный индикатор заново.А мне надо построить индикатор по ВСЕМ ВИДИМЫМ в окне барам,а потом найти его max и min именно на этом участке!Помогите решить проблему,указанную в предыдущем моём посте.Есть пример.Но мне не всё в нём понятно.Кто-нибудь может построчно растолковать эти три строчки?
 // обработка видимых баров.
   int bars_count=WindowBarsPerChart();
   int bar=WindowFirstVisibleBar();
   for(int i=0; i<bars_count; i++,bar--)
     {
      // номера баров уменьшаются, так как нумерация идет в обратном порядке.
      // ...
     } 
 
MK07:
Эта конструкция кода позволяет при каждом новом тике пересчитывать индикатор только на нулевом и первом (для проверки) барах,а не пересчитывать уже посчитанный индикатор заново.А мне надо построить индикатор по ВСЕМ ВИДИМЫМ в окне барам,а потом найти его max и min именно на этом участке!Помогите решить проблему,указанную в предыдущем моём посте.Есть пример.Но мне не всё в нём понятно.Кто-нибудь может построчно растолковать эти три строчки?

Не совсем понятно что вам надо, если вам нужно найти MAX и MIN видимых баров индикатора,сначала рисуем индикатор, а потом ищем.

Может лучше WindowPriceMax(), WindowPriceMin() использовать .

 
r772ra:

Stepan2

Работает


всё-таки еть глюк у массивов, но с while

c for работает без проблем

))

 

Добрый день.

Люди, подскажите чем тестировать советники. Потому что встроенный в МТ дает в среднем 50% качества моделирования, а на скринах люди выкладывают больше 90%.

 
jusser:

Добрый день.

Люди, подскажите чем тестировать советники. Потому что встроенный в МТ дает в среднем 50% качества моделирования, а на скринах люди выкладывают больше 90%.


если у вас есть вся минутная история, то будет 90%. 99% достигается при самостоятельном создании тиковой истории fxt. Обычно это делают с помощью котировок дукаскопи. Поищите в гугле скрипты по теме 99% качество тестирования

 
Добрый день, подскажите пожалуйста, есть ли индикатор в МТ4, который показывает открытый интерес? Если нет, то чем нибудь подобным его можно заменить?
 
Добрый день как в коде советника реализовать условие чтобы однотипные ордера выставлялись через 50 пунктов от последного ордера
 
Armen63:
Добрый день как в коде советника реализовать условие чтобы однотипные ордера выставлялись через 50 пунктов от последного ордера
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает расстояние в пунктах между рынком и ближайшей       |
//|             позицей                                                        |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   ("" или NULL - текущий символ)          |
//|    op - торговая операция          (    -1      - любая позиция)           |
//|    mn - MagicNumber                (    -1      - любой магик)             |
//+----------------------------------------------------------------------------+
int DistMarketAndPos(string sy="", int op=-1, int mn=-1) {
  double d, p;
  int i, k=OrdersTotal(), r=1000000;

  if (sy=="" || sy=="0") sy=Symbol();
  p=MarketInfo(sy, MODE_POINT);
  if (p==0) if (StringFind(sy, "JPY")<0) p=0.0001; else p=0.01;
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy) && (op<0 || OrderType()==op)) {
        if (mn<0 || OrderMagicNumber()==mn) {
          if (OrderType()==OP_BUY) {
            d=MathAbs(MarketInfo(sy, MODE_ASK)-OrderOpenPrice())/p;
            if (r>d) r=NormalizeDouble(d, 0);
          }
          if (OrderType()==OP_SELL) {
            d=MathAbs(OrderOpenPrice()-MarketInfo(sy, MODE_BID))/p;
            if (r>d) r=NormalizeDouble(d, 0);
          }
        }
      }
    }
  }
  return(r);
}
Причина обращения: