[ARQUIVO]Qualquer pergunta de novato, para não desorganizar o fórum. Profissionais, não passem por ela. Não posso ir a lugar nenhum sem você - 5. - página 326

 

Não sou adepto de indicadores, mas decidi verificar uma coisa. O Expert Advisor deve comprar ao preço do indicador RSI superior e vender ao preço do indicador inferior, respectivamente. Somente se o preço já estiver acima do limite superior do indicador RSI, então a compra deve estar acima deste limite e abaixo do valor deste limite + algum valor de travessão do limite para cima (no código que especifiquei apenas um número 0,1), para vendas, ao contrário.

Eu o fiz assim:

Parâmetros externos:

extern string ___H1 = " __________ Параметры RSI _________ ";
extern int     i_RSITF = 5,
               i_RSIPeriod = 21,
               i_RSIApplied = PRICE_CLOSE;
extern double  i_RSIToUpLimit = 55,                                     // Верхняя граница RSI
               i_RSIToDnLimit = 45;                                     // Нижняя граница RSI

Código da função que recebe o sinal e o próprio valor RSI:(0,1 aqui é a tolerância de margem para a faixa de compra ou venda)

//+-------------------------------------------------------------------------------------+
//| Получаем RSI с заданными параметрами                                                |
//+-------------------------------------------------------------------------------------+
double GetRSI(int RSIIndex)
{
   return (iRSI(NULL, i_RSITF, i_RSIPeriod, i_RSIApplied, RSIIndex));
}
//+-------------------------------------------------------------------------------------+
//| Получаем общий торговый сигнал                                                      |
//+-------------------------------------------------------------------------------------+
int GetGeneralSignal()
{
   if (FindOrders() > 0)
       return (SIGNAL_NO);

 //  if (GetRSI(PRICE_CLOSE, 0) > GetRSI(PRICE_CLOSE, 1))
   if (GetRSI(0) > i_RSIToUpLimit)
      if (GetRSI(0) < (i_RSIToUpLimit + 0.1))
         return (SIGNAL_BUY);                  // Запускаем функцию открытия покупки
           
   if (GetRSI(0) < i_RSIToDnLimit)
      if (GetRSI(0) > (i_RSIToDnLimit - 0.1))
         return (SIGNAL_SELL);                // Запускаем функцию открытия продаж
   
   return (SIGNAL_NO);
}

Às vezes a EA abre pedidos do mesmo nível, às vezes muito mais alto (para compra) e às vezes muito mais baixo (para venda). Por quê? O algoritmo é elementar.

 
Olá a todos. Eu tenho uma pergunta. Comprei uma copiadora /**/, coisa boa e útil quando se trabalha com várias contas. Mas o problema é que quando você executa qualquer outro programa (vídeo, jogo, apenas mapas) em paralelo, há um ruído crepitante constante saindo dos alto-falantes. É possível eliminar o problema (guizo)? Obrigado de antemão.
 

Estou tentando escrever um indicador simples baseado no RSI (o analógico é RandomIndicatorSignals mq4).

Estou tentando escrever um indicador simples baseado no RSI (para o análogo deste indicador RandomIndicatorSignals.mq4 do artigo MQL4 Language for Dummies). Indicadores personalizados (Parte 1)(https://www.mql5.com/ru/articles/1500).

A idéia é simples, se a RSI desenha uma tampa ou um canal, ela desenha uma seta no gráfico.

Parece estar tudo bem, mas na minha opinião, o buffer de valores RSI para cada vela não está cheio, por causa disso não funciona. Aqui está o código.

//+------------------------------------------------------------------+
//|                                                    RSI+Arrow.mq4 |
//|                                                         _______ |
//|                                                    |
//+------------------------------------------------------------------+
#property copyright "_______"
#property link      "_________"


#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 Crimson
#property indicator_color2 RoyalBlue
//---- input parameters
extern int       barsToProcess=500;
//---- buffers
double ExtMapBuffer1[],
       ExtMapBuffer2[],
       RSIBuffer3[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   IndicatorBuffers(3);
   SetIndexStyle(0,DRAW_ARROW);
   SetIndexArrow(0,236);
   SetIndexBuffer(0,ExtMapBuffer1);
   SetIndexEmptyValue(0,0.0);
   SetIndexStyle(1,DRAW_ARROW);
   SetIndexArrow(1,238);
   SetIndexBuffer(1,ExtMapBuffer2);
   SetIndexEmptyValue(1,0.0);
   SetIndexBuffer (2,RSIBuffer3);
   // для информации о значениях буфера
   SetIndexLabel  (2,"RSIBuffer3");
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {    
   //расчет индикатора на последних барах 
   int limit,i;
   int counted_bars=IndicatorCounted();
   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;
   if(limit>barsToProcess)
   limit=barsToProcess;
   
   //заполняем буфер RSI значениями 
   for(i=0; i<limit; i++)
   if(i>=1)
     {
       RSIBuffer3[i]=iRSI(0,0,8,PRICE_CLOSE,0);
     }       
  //проводим сравнения                        
   for(i=0; i<limit; i++)
   if(i>=1)
        
        {
        if(RSIBuffer3[i+2]-RSIBuffer3[i+1]>0 && RSIBuffer3[i+1]-RSIBuffer3[i]>0) // условия выставления стрелки 

        /* так тоже не работает
        if(RSIBuffer3[i+2]>=RSIBuffer3[i+1] && RSIBuffer3[i+1]<=RSIBuffer3[i])
        */
        
        ExtMapBuffer2[i]=Low[i]-5*Point;
                    
        else
           
        ExtMapBuffer2[i]=0.0;
               
        if(RSIBuffer3[i+2]-RSIBuffer3[i+1]<0 && RSIBuffer3[i+1]-RSIBuffer3[i]<0) // условия выставления стрелки
        
        /* так тоже не работает
        if(RSIBuffer3[i+2]<=RSIBuffer3[i+1] && RSIBuffer3[i+1]>=RSIBuffer3[i])
        */
              
        ExtMapBuffer1[i]=High[i]+5*Point;
           
        else      
           
        ExtMapBuffer1[i]=0.0;           
        }
                   
   return(0);
   }
        
//+------------------------------------------------------------------+      
 
Merincool:

Estou tentando escrever um indicador simples baseado no RSI (o analógico é RandomIndicatorSignals mq4).

Estou tentando escrever um indicador simples baseado no RSI (para o análogo deste indicador RandomIndicatorSignals.mq4 do artigo MQL4 Language for Dummies). Indicadores personalizados (Parte 1)(https://www.mql5.com/ru/articles/1500).

A idéia é simples, se a RSI desenha uma tampa ou um canal, ela desenha uma seta no gráfico.

Parece estar tudo bem, mas na minha opinião, o buffer de valores RSI para cada vela não está cheio, por causa disso não funciona. Aqui está o código.

Você está acessando valores indicadores não calculados em loop.

Mudança

for(i=0; i<limit; i++)

para

for(i=limit-1; i>=0; i--)
 
PapaYozh:

Você está voltando para os valores não calculados do indicador.

Mudança

para


Obrigado, isso me deu uma idéia! Entretanto, eu gostaria de entender o "significado físico " :) como nosso físico costumava dizer

Eu mesmo tenho um problema: 2 "ligeiramente" diferentes, mas essencialmente os mesmos códigos de ação: Eliminar TODAS as ordens pendentes

1) Não funciona corretamente - apenas um pedido é eliminado

void start()

  {

   bool   result;     int    cmd,total,OT;

   total=OrdersTotal();

   for(int i=0; i<total; i++)

     {

      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))

        {

         cmd=OrderType();    OT=OrderTicket();

         if(cmd>1)   // !=OP_BUY && cmd!=OP_SELL)

           {

            result=OrderDelete(OT);

           }

        }

     } //end FOR

  }

2) Funciona bem - apaga todos eles

void start()
{
    string msg="Удалить все отложенные ордера?    ";
//   if (MessageBox(msg,title,MB_YESNO|MB_ICONQUESTION)!=IDYES) return;

   for (int i=OrdersTotal()-1; i>=0; i--)
   {
      if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) if (OrderType()>1) OrderDelete(OrderTicket());
   }
}

Explique: o significado de "neste laço, você acessa os valores não calculados do indicador".

 
PapaYozh:

Você está voltando para os valores não calculados do indicador.

Mudança

para


Por que isso? Para que eu não cometa mais erros no futuro
 
PapaYozh:

Você está voltando para os valores não calculados do indicador.

Mudança

para


ainda não funciona, RSIBuffer3 só mostra o valor RSI na última barra quando pairando sobre uma barra
 
Merincool:

E ainda não funciona, RSIBuffer3 só mostra o valor RSI na última barra quando pairando sobre a barra

Seu 5º parâmetro é 0 - ou seja, a última barra!

fazer assim:

       RSIBuffer3[i]=iRSI(0,0,8,PRICE_CLOSE,i);  

Trecho do documento:

duplo iRSI( símbolo de corda, período int, período int, preço int aplicado_, turno int)
Calcula o índice de força relativa e retorna seu valor.
Parâmetros:
símbolo - Símbolo cujos dados devem ser usados para calcular o indicador. NULL significa o símbolo atual.
cronograma - Cronograma. Pode ser qualquer um dos valores de enumeração de prazos. 0 significa o cronograma atual do gráfico.
período - Número de períodos para cálculo.
preço_aplicado - Preço aplicado. Pode ser qualquer um dos valores de enumeração de preços aplicados.
turno - Índice do valor retirado do buffer de indicadores (deslocamento em relação à barra atual a quantidade indicada de períodos atrás).
 
PapaYozh:

Você está voltando para os valores não calculados do indicador.

Mudança

para


E o que eu também pensei, de acordo com sua lógica a ferramenta deve calcular o RSI a partir do limite e até 0 barra, mas será que faz diferença qual lado deve calcular o RSI a partir do fim ou do início? Ela deve calcular o RSI para cada barra em um determinado intervalo e colocar o valor em um buffer (quero dizer em um array), e depois apenas comparar três valores consecutivos em um array entre si. Ou não é?

 
amurik61:

Seu 5º parâmetro é 0 - ou seja, a última barra!

fazer assim:

Trecho do documento:

duplo iRSI( símbolo de corda, período int, período int, preço int aplicado_, turno int)
Calcula o índice de força relativa e retorna seu valor.
Parâmetros:
símbolo - Símbolo cujos dados devem ser usados para calcular o indicador. NULL significa o símbolo atual.
cronograma - Cronograma. Pode ser qualquer um dos valores de enumeração de prazos. 0 significa o cronograma atual do gráfico.
período - Número de períodos para cálculo.
preço_aplicado - Preço aplicado. Pode ser qualquer um dos valores de enumeração de preços aplicados.
turno - Índice do valor retirado do buffer de indicadores (deslocamento em relação à barra atual o período de tempo dado).

Vou tentar, obrigado