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

 
Никак не могу найти команду которая перерисовывает пользовательский индикатор. Если кто знает то пожалуйста подскажите. Заранее благодарен =)
 
tesla-pip:
Никак не могу найти команду которая перерисовывает пользовательский индикатор. Если кто знает то пожалуйста подскажите. Заранее благодарен =)

Я уже нашёл. Всем спасибо =)
 

Добрый день.

Формулу придумать помогите.

у меня есть шаг доливок ШД=100;

если цена равна 25, то для неё уровень доливки будет УД=100

если цена равна 102, то для неё уровень  доливки будет УД=200

если цена равна 215 то уровень доливки будет УД=300

цена опять упала до 135 уровень доливки будет УД=200  

 
TarasBY:

И такой порядок вещей - нормальный (это принципы работы терминала).

Если хотите, чтобы при изменении параметров индикатора А индикатор Б изменял свои показания, сделайте обмен информацией м\у индикаторами (м.б. файл, глобальные переменные терминала, оперативная память компьютера): индикатор A при инициализации передаёт свои инициализируемые параметры, а индикатор Б периодически проверяет возможные изменения параметров индикатора А. При обнаружении изменений, индикатор Б тоже должен перинициализироваться с новыми параметрами (принудительный запуск init()).

Благодарю Вас за ответ,но я не могу им воспользоваться,т.к. не всё понял и не силён в программировании.Не могли бы Вы внести необходимые изменения в коды моих индикаторов.


   

Первый код-индикатор А.

Второй код- индикатор Б.

//---- indicator settings
#property  indicator_separate_window
#property  indicator_buffers 3
#property  indicator_color1  Black
#property  indicator_color2  Green
#property  indicator_color3  Red
#property  indicator_width2  2
#property  indicator_width3  2
#property  indicator_level1 0.0

//---- input parameters
extern int FastPeriod =5;
extern int LowPeriod  =34;
//---- indicator buffers
double     ExtBuffer0[];
double     ExtBuffer1[];
double     ExtBuffer2[];



//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   //---- drawing settings
   SetIndexStyle(0,DRAW_NONE);
   SetIndexStyle(1,DRAW_HISTOGRAM);
   SetIndexStyle(2,DRAW_HISTOGRAM);
   IndicatorDigits(Digits+1);
   SetIndexDrawBegin(0,34);
   SetIndexDrawBegin(1,34);
   SetIndexDrawBegin(2,34);
//---- 3 indicator buffers mapping
   SetIndexBuffer(0,ExtBuffer0);
   SetIndexBuffer(1,ExtBuffer1);
   SetIndexBuffer(2,ExtBuffer2);
//---- name for DataWindow and indicator subwindow label
   IndicatorShortName("My_AO");
   SetIndexLabel(1,NULL);
   SetIndexLabel(2,NULL);
//---- initialization done
   return(0);
  }
//+------------------------------------------------------------------+
//| Awesome Oscillator                                               |
//+------------------------------------------------------------------+
int start()
  {
      
  
   int    limit;
   int    counted_bars=IndicatorCounted();
   double prev,current;
//---- last counted bar will be recounted
   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;
//---- macd
   for(int i=0; i<limit; i++)
      ExtBuffer0[i]=iMA(NULL,0,FastPeriod,0,MODE_SMA,PRICE_MEDIAN,i)-iMA(NULL,0,LowPeriod,0,MODE_SMA,PRICE_MEDIAN,i);
//---- dispatch values between 2 buffers
   bool up=true;
   for(i=limit-1; i>=0; i--)
     {
      current=ExtBuffer0[i];
      prev=ExtBuffer0[i+1];
      if(current>prev) up=true;
      if(current<prev) up=false;
      if(!up)
        {
         ExtBuffer2[i]=current;
         ExtBuffer1[i]=0.0;
        }
      else
        {
         ExtBuffer1[i]=current;
         ExtBuffer2[i]=0.0;
        }
        
       
     }
//---- done
   return(0);
  }
#property indicator_separate_window
#property indicator_minimum -1.5
#property indicator_maximum 1.5
#property indicator_buffers 2
#property indicator_color1 Green
#property indicator_color2 Red
#property  indicator_width1  2
#property  indicator_width2  2
#property indicator_level1 0.0

//--- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_HISTOGRAM);
   SetIndexBuffer(0,ExtMapBuffer1);
   SetIndexStyle(1,DRAW_HISTOGRAM);
   SetIndexBuffer(1,ExtMapBuffer2);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {  
      
       
    double UP,DN;     
  
  
    int counted_bars=IndicatorCounted(),
       limit;  
       
    if(counted_bars>0)
      counted_bars--;
   
      limit=Bars-counted_bars;
//----
   for(int i=0;i<limit;i++)
       
      { 
        UP=iCustom(NULL,0,"My_AO",1,i+1);               
        DN=iCustom(NULL,0,"My_AO",2,i+1);    
             
        
       if(UP>0)       
         {ExtMapBuffer1[i+1]=1;
          ExtMapBuffer2[i+1]=0;
         }
         
       if(UP<0)       
         {ExtMapBuffer1[i+1]=-1;
          ExtMapBuffer2[i+1]=0;
         }  
         
                              
       if(DN>0)            
         {
          ExtMapBuffer1[i+1]=0;
          ExtMapBuffer2[i+1]=1;
         }
              
       if(DN<0)            
         {
          ExtMapBuffer1[i+1]=0;
          ExtMapBuffer2[i+1]=-1;
         }
               
                       
    
    }
//----
   return(0);
 
   }
   
//+------------------------------------------------------------------+    
   

 

прошлый вопрос решил, новый есть вопрос

у меня на каждом баре уровень доливки пересчитывается.

Как мне запомнить уровень на прошлом баре

и для открытия сделки его использовать 

 
MK07:
Благодарю Вас за ответ,но я не могу им воспользоваться,т.к. не всё понял и не силён в программировании.Не могли бы Вы внести необходимые изменения в коды моих индикаторов.

Вы мне предлагаете сделать за Вас то, что Вам "поиграться". Извините, не интересно.

А, если учитесь программировать, - это Вам интересная задачка. 

 
Доброго времени суток всем. Возникла проблема с индюком "CurrencyPowerMeter", а именно не могу переместить его в другое положение окна терминала. Если есть возможность помочь был бы очень рад.
 
Решил-таки спросить, может подскажите. Пишу индикатор, в индикаторе обрабатываю тики на тиковом таймфрейме (который открывается автономно, вот этот). В буферный массив у меня НЕ КАЖДЫЙ тик обрабатывается, а выборочно (предположим, тик через каждые 60 секунд, но это вовсе не обязательно). Вместо
int    counted_bars=IndicatorCounted();

я так понимаю, следующая конструкция:

extern int sec=60;//объявляем количество секунд
int i;//будет индексом текущей "свечи" (тика)
int i_prev;//будет индексом предыдущей "свечи" (тика), отстоящего от теущего на sec секунд назад
double MyBuffer[];//этот будет на чарте
double MyTemp[];//этот только для подсчётов

int init(){
   IndicatorBuffers(2);
   SetIndexBuffer(0,MyBuffer)
   SetIndexBuffer(1,MyTemp)
   SetIndexDrawBegin(0,14);
   i=Bars-1;
   while(Volume[i]-Volume[Bars-1]<sec) i--;//потому что в Volume[] на тиковом у нас время сервера точностью до секунды (а в Time[] - моделируемое для предоставления тиков на чарте)
   i_prev=Bars-1;//отошли от первого исторического тика на чарте на заданное количество секунд, запомнили его, запомнили первый, уходим в start()
   return(0);
}

int start(){
   double deltaHigh,deltaLow;
   int counted_bars=IndicatorCounted();//честно говоря, не уверен, т.к. считаем мы не все "свечи" (тики)
   if(counted_bars>=i) i=Bars-counted_bars-1;//аналогично
   while(i>=0){//цикл обработчика
      deltaHigh=High[i]-High[i_prev];//к примеру
      deltaLow=Low[i_prev]-Low[i];
      //и дальше код обработчика (формируем предварительный массив MyTemp[]). В конце цикла:
      i_prev=i;//запоминаем теперь текущий индекс как индекс предыдущего тика
      while(Volume[i_prev]-Volume[i]<sec){//и уходим вперёд на заданное количество секунд
         i--;
      }
   }
...

 Теперь вопрос. В чистом М1 варианте дальше стандартное

   if(counted_bars>0) counted_bars--;
   int limit=Bars-counted_bars;//принтовал, при первом обращении limit=Bars-2, при последующих limit=2
   for(i=0; i<=limit; i++){
      MyBuffer[i]=iMAOnArray(MyTemp, 0, 14, 0, MODE_EMA, i);

 Чем заменить limit и counted_bars? Я так понимаю,

int counted_bars=ArraySize(MyTemp)-1;//сразу после цикла while

 (т.к. количество тиков в 60 секунд непостоянно, т.е. просто написать int counted_bars=IndicatorCounted()/_количество_тиков_в_60_секунд_ не получится).

Или я во всём ошибаюсь?

p.s. опережая возможный вопрос, отвечу: я знаю что на форексе sec!=60 неприменимо, а sec=60 бессмысленно, но я и торгую не на форексе.

 
MK07:
Благодарю Вас за ответ,но я не могу им воспользоваться,т.к. не всё понял и не силён в программировании.Не могли бы Вы внести необходимые изменения в коды моих индикаторов.
Извините, у вас машина есть? Если есть, вы же не считаете это роскошью, а только необходимостью? Если нет, вы же не собираетесь так оставлять на всю жизнь? Сейчас век такой, прграммирование знать надо так же, как надо иметь машину. Я вообще просто колхозник, но хоть как, но я делаю, для меня программирование от работы во дворе, например от слесарной работы, ничем не отличается, та же самая работа своими руками (в деревне живу). Болгарка, тачка или MQL4 для меня только инструмент. Может, для городских оно по-другому воспринимается, не знаю. Глобальные переменные в мануале вот, файловые функции стандартные вот, быстрее вот эти, но там через WinAPI. Я ещё вчера хотел ответить, но промолчал.
 

Всем добрый день!

Я учусь пользоваться массивами.

У меня есть массив .Я его инициализировал   строками т.е.  double mass  [3567]={0.85374 , 0.85694 , 0.85974 ,.... };

И программа читала массив и исполняла его.

Сейчас тот же массив я инициализировал в одну колонку

double massi[3567]

{

mass [ 0]    =    0.85374;
mass [ 1]    =    0.85694;
mass [ 2]    =    0.85974;
mass [ 3]    =    0.86174;
mass [ 4]    =    0.86474;
mass [ 5]    =    0.86494;
mass [ 6]    =    0.86504;

mass [ 7]    =    0.86524;

}

Компилятор не выдает ни одной ошибки , но выдает предупреждение.И  программа  не исполняет ни массив ни код в целом.

'{' - expression on global scope not allowed    C:\Program Files\Alpari NZ MT4(2)\experts\include\MASSIV.mqh (4, 2)

Массив как и раньше(когда он был инициализирован строками и работал нормально) объявлен на глобальном уровне.

 #include <MASSIV.mqh> 


 
int start()
{
 double Price=iOpen (Symbol (),0,0);         
 double SL=NormalizeDouble (Price+3000*Point, Digits);         
 double TP=NormalizeDouble (Price-100*Point, Digits);   

 double value =  Bid ;//параметру value функции ArrayBsearch присваивается значение  цены последнего тика
 double ld_Delta = 0.0010;
 int S = ArrayBsearch(  mass,  value, WHOLE_ARRAY,  0, MODE_ASCEND);//функция возвращает индекс значения цены макс. близкой к цене последнего тика 
 

 int last_order_bar = 0;
int ot = OrdersTotal();
...............................(остальной код опустил,но он  не изменился)

В журнале только 2 записи.

2013.04.12 16:14:44    XXX test started

2013.04.12 16:14:36    XXX EURUSD,H1: loaded successfully


ВОПРОС.ПОЧЕМУ ПРОГРАММА НЕ ЧИТАЕТ МАССИВ ИНИЦИАЛИЗИРОВАННЫЙ В ОДИН СТОЛБЕЦ.

Спасибо.