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

 
artmedia70:
Размер массива-то нулевой. Не забывайте об ArrayResize(), или сразу задавайте нужный размер массиву
Спасибо, сделал по другому, нашел ArrayMaximum() в индикаторе и передал значение через iCustom в советник :)
 
Всем доброго времени суток! Есть скрипт, который использует вызовы из внешней DLL, которая особым образом считает котировки и создает файлик с нужными коэффициентами, есть ли способ заставить работать скрипт по расписанию? Мне нужно, чтобы он запускался каждый день в определенный час?
 

Здравствуйте,

На картинку показал:

Первое окно индикатор Volume,сверху поставил Money Flow Index(10).

Сделал отделный индикатор,где опят беру Volume,пересчитаваю мувинг с Volume  и попробовал сделат как в первое окно - 25%,50%,75%.

Но так,как сделал не очен хорошо.

Если кто-то сталкивался с такой проблем,пожалуста споделите.

Спосибо

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_minimum 0

#property indicator_width1 2
#property indicator_width2 2
#property indicator_color1 DodgerBlue
#property indicator_color2 Yellow

extern int MAPeriod = 30;
double     volum[],ma[];
//+------------------------------------------------------------------+
int init(){
    int bars_count=WindowBarsPerChart(),volh;
    int bar=WindowFirstVisibleBar();
    volh = Volume[iHighest(Symbol(),0,MODE_VOLUME,bar,0)];
    SetIndexBuffer(0,volum);
    SetIndexBuffer(1,ma);
    SetIndexStyle(0,DRAW_HISTOGRAM);
    SetIndexStyle(1,DRAW_LINE);
    SetLevelValue (0,   volh*1.05); 
    SetLevelValue (1, ((volh*1.05)/100)*75.0); 
    SetLevelValue (2, ((volh*1.05)/100)*50.0);
    SetLevelValue (3, ((volh*1.05)/100)*25.0); 
    return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
/*int start(){
    int limit;
        limit = Bars-IndicatorCounted()-1;
    for(int i=limit;i>=0;i--){
        volum[i] = NormalizeDouble(Volume[i],0);
        ma[i]    = NormalizeDouble(iMAOnArray(volum,0,MAPeriod,0,MODE_SMA,i),0);
       }
   return(0);
  }*/
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[])
  {
    int i=rates_total-prev_calculated-1;
    if(i<0)
       i=0; 
    while(i>=0){
      if(i<rates_total-1)
        volum[i] = NormalizeDouble(Volume[i],0);
        ma[i]    = NormalizeDouble(iMAOnArray(volum,0,MAPeriod,0,MODE_SMA,i),0);
        i--;
       }     
   return(rates_total);
  }
 
tara:
Он о минус втором баре гутарил. И о среднем значении ограничений. Поиздеваться желает, имхенько. Я бы его послал, а ты - как знаешь :) 
Второгодник-семиклассник, который до сих пор ещё не знает, что нет такой страны - Белоруссия, зашел к первоклассникам и кочевряжется. А на любой вопрос только посылает или поучает: мол, учиться надо. Прочитай внимательно над дверью, в какой ветке ты находишься. Я еще только азбуку учу, поэтому не надо сильно раздуваться, все равно не пойму.
 

А  evillive и artmedia70  благодарность огромная. За терпение и потраченное время. Я уверен, что это не только мое мнение о Вас. Все, кто обращается в эту ветку, обращаются за помощью, и получают ее преимущественно от Вас. Спасибо\

 

здравствуйте дорогие профи давненько к вам не обращался

суть в том что есть советник с пересечением  2х мувок с открытием  ордера там заморачиваться не стали 

 void Trade() 

  {   double    ma_fast=ma(Period_,Shift_,Method_MA_,Apply_to_,0),   ma_slow=ma(Period__,Shift__,Method_MA__,Apply_to__,0);

   if(sumBO==0 && ma_fast>ma_slow && (!Use_Distance || (Use_Distance && ND(ma_fast-ma_slow)>Distance*Pnt))) 

     {

      if(sumSO>0 && !ClosePos(OP_SELL)) return;

      if(MO(OP_BUY,GetLot(),GetComment())==-1) return;

      if(!ModifyByTicket(T)) return;

      NumbUp=0; NumbDn=0;

     }

   else

и так далее..

то есть если  есть пересечение дистанция открываем ордер

мне надобно код который бы находил время последнего так сказать пересечечения..

далее от текущего момента до установленного времени в истории бы поискал ордера попадающие под период.. и открывал бы ордер если не обнаружил таковой

для этих целей раздербанил код индикаторов трасировщиков там кажется все понятно

 но вот как засечь время первого бара после пересечения кривых да еще чтоб оно было крайним правым не ясно

чуствую что нуужен оператор фор но сформулировать  не могу 

 
evillive:

Так не делается. Вызывается iCustom для всех 3-х буферов, записывается каждое значение в свою переменную и потом делайте с этими значениями что надо.

Для полос Боллингера, на второй бар, соответственно примеру в справке, отсебятины не надо:

Спасибо.

Но, в виду своей неграмотности, мне приходится постоянно рыться в учебнике, и вот что откопал: пользовательский индикатор - программа..., написанная в соответствии с авторским алгоритмом. А в справочнике говорится, что iCustom возвращает значение указанного пользовательского индикатора. 

Но я не использую никаких пользовательских (т.е. как я понимаю - разработанных мной) индикаторов.

Мне нужно извлечь значения стандартных, если можно их так назвать, индикаторов: Скользящей Средней, Полос Боллингера и Стохастик Осциллятора с заданными мной параметрами. Конечно, я делаю это "методом тыка" - что первым нашел, то и применяю. Но предложенный Вами вариант, мне кажется тоже не подходит. 

Неужели нет решения без использования всяких буферов, массивов, циклов? Я в них как булыжник в море - сразу тону. 

 
sannin:

здравствуйте дорогие профи давненько к вам не обращался

суть в том что есть советник с пересечением  2х мувок с открытием  ордера там заморачиваться не стали 

 void Trade() 

  {   double    ma_fast=ma(Period_,Shift_,Method_MA_,Apply_to_,0),   ma_slow=ma(Period__,Shift__,Method_MA__,Apply_to__,0);

   if(sumBO==0 && ma_fast>ma_slow && (!Use_Distance || (Use_Distance && ND(ma_fast-ma_slow)>Distance*Pnt))) 

     {

      if(sumSO>0 && !ClosePos(OP_SELL)) return;

      if(MO(OP_BUY,GetLot(),GetComment())==-1) return;

      if(!ModifyByTicket(T)) return;

      NumbUp=0; NumbDn=0;

     }

   else

и так далее..

то есть если  есть пересечение дистанция открываем ордер

мне надобно код который бы находил время последнего так сказать пересечечения..

далее от текущего момента до установленного времени в истории бы поискал ордера попадающие под период.. и открывал бы ордер если не обнаружил таковой

для этих целей раздербанил код индикаторов трасировщиков там кажется все понятно

 но вот как засечь время первого бара после пересечения кривых да еще чтоб оно было крайним правым не ясно

чуствую что нуужен оператор фор но сформулировать  не могу 

 

Этот советник не по пересечению работает. Тут критерий такой: если быстрая МА выше медленной на Х пипс и нет открытой позиции - открыть по рынку.

Для поиска пересечения всегда по паре значений надо брать - "быстрая/медленная МА" ДО пересечения и "быстрая/медленная МА" ПОСЛЕ пересечения, чтобы засечь, когда они местами меняются, так сказать. То есть

if(FastMA_2<SlowMA_2 && FastMA_1>SlowMA_1) - быстрая МА пересекла медленную снизу вверх между 1-м и 2-м барами.

В бесконечном цикле искать от нулевого бара и до обнаружения пересечения, это будет Х+1 бар, а вам нужно время бара Х, то есть самый свежий бар после пересечения.

 
rapid_minus:

Спасибо.

Но, в виду своей неграмотности, мне приходится постоянно рыться в учебнике, и вот что откопал: пользовательский индикатор - программа..., написанная в соответствии с авторским алгоритмом. А в справочнике говорится, что iCustom возвращает значение указанного пользовательского индикатора. 

Но я не использую никаких пользовательских (т.е. как я понимаю - разработанных мной) индикаторов.

Мне нужно извлечь значения стандартных, если можно их так назвать, индикаторов: Скользящей Средней, Полос Боллингера и Стохастик Осциллятора с заданными мной параметрами. Конечно, я делаю это "методом тыка" - что первым нашел, то и применяю. Но предложенный Вами вариант, мне кажется тоже не подходит. 

Неужели нет решения без использования всяких буферов, массивов, циклов? Я в них как булыжник в море - сразу тону. 

Верно, при использовании полос Боллингера не надо вызывать iCustom, а надо вызывать iBands, для каждой линии индикатора - отдельно. Как альтернатива без вызова индикатора ("без использования всяких буферов, массивов, циклов")- внедрять в советник алгоритм расчёта этого индикатора и считать нужное значение когда надо (можно считать только нужное значение, например, только нижнюю линию). Но совсем без циклов и массивов всё равно не выйдет.
 
sannin:

здравствуйте дорогие профи давненько к вам не обращался

суть в том что есть советник с пересечением  2х мувок с открытием  ордера там заморачиваться не стали 

 void Trade() 

  {   double    ma_fast=ma(Period_,Shift_,Method_MA_,Apply_to_,0),   ma_slow=ma(Period__,Shift__,Method_MA__,Apply_to__,0);

   if(sumBO==0 && ma_fast>ma_slow && (!Use_Distance || (Use_Distance && ND(ma_fast-ma_slow)>Distance*Pnt))) 

     {

      if(sumSO>0 && !ClosePos(OP_SELL)) return;

      if(MO(OP_BUY,GetLot(),GetComment())==-1) return;

      if(!ModifyByTicket(T)) return;

      NumbUp=0; NumbDn=0;

     }

   else

и так далее..

то есть если  есть пересечение дистанция открываем ордер

мне надобно код который бы находил время последнего так сказать пересечечения..

далее от текущего момента до установленного времени в истории бы поискал ордера попадающие под период.. и открывал бы ордер если не обнаружил таковой

для этих целей раздербанил код индикаторов трасировщиков там кажется все понятно

 но вот как засечь время первого бара после пересечения кривых да еще чтоб оно было крайним правым не ясно

чуствую что нуужен оператор фор но сформулировать  не могу 

 

Вот пример,где показал как замерит сколко бар после пересечения 2х мувок.
datetime TimeStart = 0;
//+------------------------------------------------------------------+
int init(){return(0);}
int deinit(){return(0);}
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
   int f;
   bool     cu1     = false;
   bool     cu2     = false;
   double   ma_1    = iMA(NULL,0,31,0,MODE_SMA,PRICE_OPEN,0);
   double   ma1     = iMA(NULL,0,11,0,MODE_SMA,PRICE_OPEN,0);
   double   ma_2    = iMA(NULL,0,31,0,MODE_SMA,PRICE_OPEN,1);
   double   ma2     = iMA(NULL,0,11,0,MODE_SMA,PRICE_OPEN,1);

   if(ma2<ma_2 && ma1>ma_1)
      TimeStart=Time[0]; 
   if(ma2>ma_2 && ma1<ma_1)
      TimeStart=Time[0];
   if(ma1>ma_1)
      cu1=true;
   if(ma1<ma_1)
      cu2=true;

   if(cu1==true || cu2==true)  
      int b1=iBarShift(Symbol(), PERIOD_H1, TimeStart);      
      int b2=iBarShift(Symbol(), PERIOD_H1, TimeCurrent());

    for(int j=b2;j<=b1;j++){
         f=b1-b2;
      }
       
   return(0);
  }
Причина обращения: