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

 
ModRed:
Есть индикатор MA. А есть ему подобный HMA. Как его можно вставить в советник? Полностью копировать код? Или есть более укороченный вариант?

изучайте iCustom
 
Mitruha:

Идея очень хорошая,а вы не встречали такие программы здесь,что бы передавали или копировали сделки на другие  терминалы.получилось бы без услуг брокера можно было бы это сделать хорошо?

Такой?
 
ModRed:
Есть индикатор MA. А есть ему подобный HMA. Как его можно вставить в советник? Полностью копировать код? Или есть более укороченный вариант?
Как это делается.
 

Всех приветствую.У меня проблема-"потерял" индикатор.Это какой-то сглаженный CCI,у которого можно было изменять два параметра-период и какой-то множитель.В оригинальном варианте эти параметры были равны соответственно 20 и 2.И,если я всё правильно помню,название этого индикатора состояло из двух слов и второе слово начиналось с английской буквы "С".Вдруг кто знает,помогите!

                                                               

 
alsu:

Но в целом, конечно, можно перегрузить и конструктор и использовать его вместо Init(), в конце концов, это такая же функция. На какой вариант фапать - это личное дело каждого, в вопросах вкуса, как известно, советчиков нет)


А если инициализация не удалась, то в случае использования метода, например, Init(), можно его описать возвращающим значение соответствующего типа и вернуть в случае ошибки соответствующее значение. Вызывающий код, таким образом, узнает о неудавшейся инициализации, и о том, что объект поэтому использовать нельзя. Как вызывающий код узнает о неудавшейся инициализации в случае использования конструктора?

 

Ребзя хелп , как заставить сова не открывать ордер на том же баре что и была позиция открыта ранее по сигналу , а ждал новый бар и снова проверка сигнала , делал типо так - побарно 

добавлял это -

datetime   BARflag  = 0; 
и - 
int start()
{
 datetime now = Time[0];
  if(BARflag >= now) return(0);
   BARflag = now;
 
bergkamp.:

Ребзя хелп , как заставить сова не открывать ордер на том же баре что и была позиция открыта ранее по сигналу , а ждал новый бар и снова проверка сигнала , делал типо так - побарно 

добавлял это -

и - 

Как-то так:

   //---
   if(iBarShift(OrderSymbol(),Period(),OrderOpenTime())==0) {
      // выбранный ордер открыт на нулевом (текущем) баре, значит ещё рано открывать следующий
      }
   else {
      // выбранный ордер открыт не на нулевом (текущем) баре, значит можно открывать следующий
      }
 
artmedia70:

Как-то так:

Спасибо , не усложнит расшифровать прописанные строчки для примера ?--//выбранный ордер открыт на нулевом (текущем) баре, значит ещё рано открывать следующий

                                                                                                                 // выбранный ордер открыт не на нулевом (текущем) баре, значит можно открывать следующий        ...???

 
bergkamp.:

Спасибо , не усложнит расшифровать прописанные строчки для примера ?--//выбранный ордер открыт на нулевом (текущем) баре, значит ещё рано открывать следующий

                                                                                                                 // выбранный ордер открыт не на нулевом (текущем) баре, значит можно открывать следующий        ...???

Вот функция, возвращающая бар открытия последней открытой позиции:

//+------------------------------------------------------------------+
   int BarOpenLastPos(string sy, int timeframe, int op, int mn) {
      datetime t=0;
      int      i, j=-1, k=OrdersTotal()-1;
      for (i=k; i>=0; i--) {
         if (OrderSelect(i, SELECT_BY_POS)) {
            if (OrderSymbol()!=sy)        continue;
            if (OrderType()!=op)          continue;
            if (OrderMagicNumber()!=mn)   continue;
            if (t<OrderOpenTime()) {
               t=OrderOpenTime();
               j=i;
               }
            }
         }
      if (OrderSelect(j, SELECT_BY_POS)) return(iBarShift(sy,timeframe,OrderOpenTime()));
      return(-1);
   }
//+------------------------------------------------------------------+

Если функция возвращает -1, значит нет открытой позиции, данные которой переданы в функцию.

Пример использования:

if(BarOpenLastPos(Symbol(), Period(), OP_BUY, magic)>0) {
   // бар открытия последней открытой позиции Buy на текущем символе, текущем таймфрейме, 
   // с магиком magic больше нулевого --> можно открывать следующую позицию
   }

или

if(BarOpenLastPos(USDCAD, PERIOD_M15, OP_SELL, magic0)<0) {
   // нет позиций Sell на USDCAD с магиком magic0 --> можно открывать позицию на USDCAD
   }
 

Знатоки прошу у Вас помощи...

 

алгоритм test01

 

//+------------------------------------------------------------------+
//test                                                                    
//+------------------------------------------------------------------+

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1  clrGold
#property indicator_color2  clrBlue

#property indicator_level1    0

//--- indicator buffers
double Buf0[];
double Buf1[];

double t1[];
double t2[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   IndicatorBuffers(4);
   SetIndexBuffer(0,Buf0); SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(1,Buf1); SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(2,t1); 
   SetIndexBuffer(3,t2); 
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
   
   {
   int i,counted_bars;
   counted_bars=IndicatorCounted();
   i=Bars-counted_bars-1;
   
int sr=24,n;
double sum,sum2;
double m1,m2;

  
   while(i>=0)
   {
   sum=0;
   sum2=0;
   
   for(n=i; n<=i+sr-1; n++) 
   {
   if(Open[i]>Open[i+1]) m1=sum=sum+Close[i]-Close[n];
   if(Open[i]<Open[i+1]) m2=sum=sum+Close[i]-Close[n];
   
   if(Open[i]>Open[i+1]) t1[i]=sum2=sum2+Close[i]-Close[n];
   if(Open[i]<Open[i+1]) t2[i]=sum2=sum2+Close[i]-Close[n];
   }
     
   Buf0[i]=(m1+m2)/sr;
   Buf1[i]=(t1[i]+t2[i])/sr;
   
   i--;
   }
return(0);
  }
//+------------------------------------------------------------------+

 почему в Buf1 отличные значения от Buf0? по логике вещей они должны быть одинаковы?

 

почему через переменную одни значения, а через буфер (масив данных)--> (масив требуется для дальнешего расчета) другие значения? как через масив сделать также как и через переменные м1 и м2  

Файлы:
test01.mq4  2 kb
Причина обращения: