Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 371

 

Приветствую всех форумчан.

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

Я знаю, что для смены символа используют внешний параметр

input string   Symb   ="GBPJPY";
но что делать дальше не знаю

Идикатор прилагаю

Файлы:
Fisher.mq4  3 kb
 

Подскажите пожалуйста как обнулить буфер с появлением нового бара, но чтобы предыдущие данные не стирались, а отображались на графике. У меня почему-то не получается обнулить буфер, и с появлением нового бара, на старые накопленные данные накладываются новые. Что я не верно описал в коде? Спасибо за пояснения.

void OnInit()
{
   IndicatorDigits(0);
   SetIndexBuffer(0,Buf_1);
   SetIndexBuffer(1,Buf_2);
   Bid1=Bid;
  
   
}
 
 
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
   datetime Вр=Time[0];   // Время текущего бара
   if(Вр>Время)           // Если новый бар
   {
      Время=Вр;           // Запомнить
      Buf_1[0]=0;         // и обнулить последний элемент буфера
      Buf_2[0]=0;
   }
   
      
   if(Bid > Bid1) 
   {
   V1 = iVolume(NULL, 0, 0);
   V2 = V1 + V2;
   Buf_1[0]= V2;
   }                             
   else 
   {
   V3 = iVolume(NULL, 0, 0);
   V4 = V3 + V4;
   Buf_2[0]= (V4*-1);
   }
   Bid1=Bid;
   
   
  return(rates_total);
}
 
Alekseu Fedotov:

Как то так


Возник вопрос с кодом, оказывается у незакрытой текущей часовой свечи есть время Close, и пока свеча не закроется индикатор отрисовывает закрытие цен того периода на котором стоит индикатор,красным на скрине область  которой не должно быть отрисовки так как часовая свеча не закрыта  , это момент компиляции и далее после компиляции идет отрисовка каждой закрытой свечи, можно конечно решить другим путем через нахождение часовых отрезков но я хотел как проще, раньше писал так 
for(i=limit; i>0; i--)
{
yesterday_weekday = TimeHour(iTime(Symbol(),0,i+1))-TimeHour(iTime(Symbol(),0,i));
if(yesterday_weekday!=0)

Есть иное решение задачки? Спасибо. 

 
MakarFX:  Помогите, пожалуйста, заставить индикатор работать с определенным символом, независимо от того на какой график он установлен.

Надо этот параметр записать в вызовы Higest, Lowest - они устарели, лучше iHigest, iLowest и хваленый пресловутый Фишер тут же согласился на ничью (В.Высоцкий)

 
PokrovMT5:
Возник вопрос с кодом, оказывается у незакрытой текущей часовой свечи есть время Close, и пока свеча не закроется индикатор отрисовывает закрытие цен того периода на котором стоит индикатор,красным на скрине область  которой не должно быть отрисовки так как часовая свеча не закрыта  , это момент компиляции и далее после компиляции идет отрисовка каждой закрытой свечи, можно конечно решить другим путем через нахождение часовых отрезков но я хотел как проще, раньше писал так 

Есть иное решение задачки? Спасибо. 

если правильно вас понял, вы хотите на графике отметить часовой Close ?

// (только для TF меньше часа) для всех свечей внутри часа поставить HourCloseBuff=цена закрытия часа

// предполагается что close индексирован как тайм-серия

for(int back=i+1;back<=limit && TimeHour(time[back]==TimeHour(time[i+1]);back++) {

  HourCloseBuff[back]=close[i+1];

}

 
STARIJ:

Надо этот параметр записать в вызовы Higest, Lowest - они устарели, лучше iHigest, iLowest и хваленый пресловутый Фишер тут же согласился на ничью (В.Высоцкий)

#property  copyright "Copyright © 2005, Yura Prokofiev"
#property  link      "Yura.prokofiev@gmail.com"

#property  indicator_separate_window
#property  indicator_buffers 3
#property  indicator_color1  Black
#property  indicator_color2  Lime
#property  indicator_color3  Red
 
input string   Symb     ="GBPJPY";
extern int     period   =10;

double         ExtBuffer0[];
double         ExtBuffer1[];
double         ExtBuffer2[];


int init()
  {
   
   
   SetIndexStyle(0,DRAW_HISTOGRAM,STYLE_SOLID,2,Red);
   SetIndexStyle(1,DRAW_HISTOGRAM,STYLE_SOLID,2,Lime);
   SetIndexStyle(2,DRAW_HISTOGRAM);
   IndicatorDigits(Digits+1);

   SetIndexBuffer(0,ExtBuffer0);
   SetIndexBuffer(1,ExtBuffer1);
   SetIndexBuffer(2,ExtBuffer2);

   IndicatorShortName("Fisher");
   SetIndexLabel(1,NULL);
   SetIndexLabel(2,NULL);

   return(0);
  }


int start()
  {
   //int     period=10;
   int    limit;
   int    counted_bars=IndicatorCounted();
   double prev,current,old;
   double Value=0,Value1=0,Value2=0,Fish=0,Fish1=0,Fish2=0;
   double price;
   double MinL=0;
   double MaxH=0;  
   

   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;


   for(int i=0; i<limit; i++)
    {  MaxH = High[iHighest(Symb,0,MODE_HIGH,period,i)];
       MinL = Low[iLowest(Symb,0,MODE_LOW,period,i)];
      price = (High[i]+Low[i])/2;
      Value = 0.33*2*((price-MinL)/(MaxH-MinL)-0.5) + 0.67*Value1;     
      Value=MathMin(MathMax(Value,-0.999),0.999); 
      ExtBuffer0[i]=0.5*MathLog((1+Value)/(1-Value))+0.5*Fish1;
      Value1=Value;
      Fish1=ExtBuffer0[i];
      
    }


   bool up=true;
   for(i=limit-2; i>=0; i--)
     {
      current=ExtBuffer0[i];
      prev=ExtBuffer0[i+1];
           
      if (((current<0)&&(prev>0))||(current<0))   up= false;    
      if (((current>0)&&(prev<0))||(current>0))   up= true;
      
      if(!up)
        {
         ExtBuffer2[i]=current;
         ExtBuffer1[i]=0.0;
        }
        
       else
         {
          ExtBuffer1[i]=current;
          ExtBuffer2[i]=0.0;
         }
     }

   return(0);
  }
Я сделал, но это не решает вопрос для
price = (High[i]+Low[i])/2;
High и Low используют текущий символ.
 
Maxim Kuznetsov:

если правильно вас понял, вы хотите на графике отметить часовой Close ?

// (только для TF меньше часа) для всех свечей внутри часа поставить HourCloseBuff=цена закрытия часа

// предполагается что close индексирован как тайм-серия

for(int back=i+1;back<=limit && TimeHour(time[back]==TimeHour(time[i+1]);back++) {

  HourCloseBuff[back]=close[i+1];

}

Максим, добрый день! Спасибо за вариант, мой такой же почти, он тоже рабочий , но мне Alekseu Fedotov  предложил иной я про него и написал , что есть мысль как поправить его? 



for(i=limit; i>=0; i--)
     {
      T = iTime(NULL,0,i); 
      shift=iBarShift(NULL,60,T); 
      C=iClose(NULL,60,shift);
      CC[i]=C;
     }
 

Подскажите пожалуйста как обнулить буфер с появлением нового бара, но чтобы предыдущие данные не стирались, а отображались на графике. У меня почему-то не получается обнулить буфер, и с появлением нового бара, на старые накопленные данные накладываются новые. Что я не верно описал в коде? Спасибо за пояснения.

 datetime Вр=Time[0];   // Время текущего бара
   if(Вр>Время)           // Если новый бар
   {
      Время=Вр;           // Запомнить
      Buf_1[0]=0;         // и обнулить последний элемент буфера
      Buf_2[0]=0;
   }
   
      
   if(Bid > Bid1) 
   {
   V1 = iVolume(NULL, 0, 0);
   V2 = V1 + V2;
   Buf_1[0]= V2;
   }                             
   else 
   {
   V3 = iVolume(NULL, 0, 0);
   V4 = V3 + V4;
   Buf_2[0]= (V4*-1);
   }
   Bid1=Bid;
   
   
  return(rates_total);
 

Никто не может мне помочь?

 

Всем добрейшего! Как переключиться на нужное окно графика?

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

Знаю команду Symbol(), но не знаю как сделать активным окно с заданной валютной парой. Может кто сталкивался с задачей?

Причина обращения: