Qualquer pergunta de novato, de modo a não desorganizar o fórum. Profissionais, não passem por aqui. Em nenhum lugar sem você - 6. - página 684

 
ModRed:
Existe o indicador MA. E há um indicador HMA semelhante a ele. Como ele pode ser inserido em um EA? Copiar o código completamente? Ou existe uma variante mais curta?

estudo iCustom
 
Mitruha:

A idéia é muito boa, mas você já viu aqui programas que transfeririam ou copiariam negócios para outros terminais, seria possível fazê-lo bem sem os serviços de um corretor?

Um programa desse tipo?
 
ModRed:
Existe o indicador MA. E há um indicador HMA semelhante a ele. Como ele pode ser inserido em um EA? Copiar o código completamente? Ou existe uma variante mais curta?
Como fazer isso.
 

Olá a todos, tenho um problema, "perdi" este indicador, é uma espécie de CCI suavizada, que poderia mudar dois parâmetros, período e um multiplicador. Na versão original, estes parâmetros eram respectivamente 20 e 2. E, se bem me lembro, o nome deste indicador consistia de duas palavras e a segunda palavra começava com a letra inglesa "C".

 
alsu:

Mas em geral, é claro, você pode sobrecarregar o construtor e usá-lo em vez do Init(), afinal de contas, é a mesma função. Que variante para se voltar é um assunto pessoal de todos, em matéria de gosto, como sabemos, não há conselheiros)


E se a inicialização falhar, em caso de uso do método, por exemplo, Init(), pode ser descrita como retornar um valor do tipo correspondente e retornar um valor apropriado em caso de erro. Assim, o código de chamada saberá que a inicialização falhou e que o objeto, portanto, não pode ser utilizado. Como o código de chamada sabe sobre inicialização fracassada quando o construtor é usado?

 

Ajudar os rapazes, como fazer a coruja não abrir um pedido no mesmo bar em que a posição foi aberta por um sinal, e esperar por um novo bar e verificar o sinal novamente, eu o fiz - bar a bar

adicionou isto

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

Ajudar os rapazes, como fazer a coruja não abrir um pedido no mesmo bar em que a posição foi aberta por um sinal, e esperar por um novo bar e verificar o sinal novamente, eu o fiz - bar a bar

adicionou isto

и -

Algo parecido com isto:

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

Algo parecido com isto:

Obrigado , seria fácil decifrar as linhas prescritas para o exemplo ?--// a ordem selecionada está aberta a zero (atual) barra, então é muito cedo para abrir a próxima

// a ordem selecionada não está aberta na barra de zero (atual), o que significa que está OK para abrir a próxima ......???

 
bergkamp.:

Obrigado, seria possível decifrar as linhas prescritas para o exemplo ?--// a ordem selecionada é aberta na barra zero (atual), portanto é muito cedo para abrir a próxima

// a ordem selecionada não está aberta na barra de zero (atual), o que significa que está OK para abrir a próxima ......???

Aqui está a função que devolve a barra para abrir a última posição aberta:

//+------------------------------------------------------------------+
   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);
   }
//+------------------------------------------------------------------+

Se a função retornar -1, então não há nenhuma posição aberta cujos dados tenham sido passados para a função.

Exemplo de uso:

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

ou

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

Connoisseurs, por favor, peçam sua ajuda...

teste de algoritmo01

//+------------------------------------------------------------------+
//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);
  }
//+------------------------------------------------------------------+

por que em Buf1 existem valores diferentes de Buf0? logicamente eles devem ser os mesmos?

por que é possível usar uma variável para um valor, mas um buffer (matriz de dados)--> (uma matriz é necessária para cálculos adicionais) para outro valor? como posso usar uma matriz assim como as variáveis m1 e m2?

Arquivos anexados:
test01.mq4  2 kb