[ARCHIVIO]Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Non posso andare da nessuna parte senza di te - 5. - pagina 326

 

Non sono un fan degli indicatori, ma ho deciso di controllare una cosa. L'Expert Advisor dovrebbe comprare al prezzo dell'indicatore RSI superiore e vendere al prezzo di quello inferiore, rispettivamente. Solo se il prezzo è già sopra il limite superiore dell'indicatore RSI, allora l'acquisto dovrebbe essere sopra questo limite e sotto il valore di questo limite + un certo valore di rientro dal limite verso l'alto (nel codice ho specificato solo un numero 0,1), per le vendite, al contrario.

Ho fatto così:

Parametri esterni:

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

Codice della funzione che riceve il segnale e il valore RSI stesso:(0,1 qui è la tolleranza di margine per la gamma di acquisto o vendita)

//+-------------------------------------------------------------------------------------+
//| Получаем 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);
}

A volte l'EA apre gli ordini dal livello stesso, a volte molto più in alto (per comprare) e a volte molto più in basso (per vendere). Perché? L'algoritmo è elementare.

 
Ciao a tutti. Ho una domanda. Mi sono procurato una copiatrice /**/, cosa buona e comoda quando si lavora con diversi account. Ma il problema è che quando si esegue qualsiasi altro programma (video, gioco, solo mappe) in parallelo, c'è un costante rumore di crepitio che esce dagli altoparlanti. È possibile eliminare il problema (sonaglio)? Grazie in anticipo.
 

Sto cercando di scrivere un semplice indicatore basato su RSI (l'analogo è RandomIndicatorSignals mq4).

Sto cercando di scrivere un semplice indicatore basato su RSI (per l'analogo di questo indicatore RandomIndicatorSignals.mq4 dall'articolo MQL4 Language for Dummies. Indicatori personalizzati (parte 1)(https://www.mql5.com/ru/articles/1500).

L'idea è semplice, se l'RSI traccia un top o un trogolo, disegna una freccia sul grafico.

Sembra essere ok, ma secondo me il buffer dei valori RSI per ogni candela non viene riempito, per questo non funziona. Ecco il codice.

//+------------------------------------------------------------------+
//|                                                    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:

Sto cercando di scrivere un semplice indicatore basato su RSI (l'analogo è RandomIndicatorSignals mq4).

Sto cercando di scrivere un semplice indicatore basato su RSI (per l'analogo di questo indicatore RandomIndicatorSignals.mq4 dall'articolo MQL4 Language for Dummies. Indicatori personalizzati (parte 1)(https://www.mql5.com/ru/articles/1500).

L'idea è semplice, se l'RSI traccia un top o un trogolo, disegna una freccia sul grafico.

Sembra essere ok, ma secondo me il buffer dei valori RSI per ogni candela non viene riempito, per questo non funziona. Ecco il codice.

State accedendo a valori di indicatori non calcolati in loop.

Cambia

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

a

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

State tornando ai valori non calcolati dell'indicatore.

Cambia

a


Grazie, mi ha dato un'idea! Tuttavia, vorrei capire il "significato fisico":) come diceva il nostro fisico

Anch'io ho un problema: 2 codici d'azione "leggermente" diversi, ma essenzialmente uguali: Cancellare tutti gli ordini in sospeso

1) Non funziona correttamente - solo un ordine viene cancellato

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) Funziona bene - li cancella tutti

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());
   }
}

Spiegare: il significato di "in questo ciclo, si accede ai valori non calcolati dell'indicatore".

 
PapaYozh:

State tornando ai valori non calcolati dell'indicatore.

Cambia

a


Puoi fare lo spelling? Perché? Così non faccio più errori in futuro.
 
PapaYozh:

State tornando ai valori non calcolati dell'indicatore.

Cambia

a


ancora non funziona, RSIBuffer3 mostra solo il valore RSI sull'ultima barra quando si passa sopra una barra
 
Merincool:

E ancora non funziona, RSIBuffer3 mostra solo il valore RSI sull'ultima barra quando si passa sopra la barra

Il tuo quinto parametro è 0 - cioè l'ultima barra!

fare in questo modo:

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

Estratto dal documento:

doppio iRSI( simbolo stringa, int timeframe, int periodo, int prezzo applicato, int spostamento)
Calcola l'indice di forza relativa e restituisce il suo valore.
Parametri:
simbolo - Simbolo i cui dati dovrebbero essere utilizzati per calcolare l'indicatore. NULL significa il simbolo corrente.
timeframe - Tempo. Può essere uno qualsiasi dei valori dell'enumerazione Timeframe. 0 significa il timeframe del grafico corrente.
periodo - Numero di periodi per il calcolo.
prezzo applicato - Prezzo applicato. Può essere uno qualsiasi dei valori di enumerazione dei prezzi applicati.
turno - Indice del valore preso dal buffer dell'indicatore (spostamento relativo alla barra corrente di un determinato numero di periodi fa).
 
PapaYozh:

State tornando ai valori non calcolati dell'indicatore.

Cambia

a


E quello che ho anche pensato, secondo la tua logica lo strumento dovrebbe calcolare l'RSI dal limite e alla barra 0, ma fa differenza quale lato dovrebbe calcolare l'RSI dalla fine o dall'inizio? Dovrebbe calcolare l'RSI per ogni barra in un dato intervallo e mettere il valore in un buffer (intendo in un array), e poi semplicemente confrontare tre valori consecutivi in un array con l'altro. O non lo è?

 
amurik61:

Il tuo quinto parametro è 0 - cioè l'ultima barra!

fare in questo modo:

Estratto dal documento:

doppio iRSI( simbolo stringa, int timeframe, int periodo, int prezzo applicato, int spostamento)
Calcola l'indice di forza relativa e restituisce il suo valore.
Parametri:
simbolo - Simbolo i cui dati dovrebbero essere utilizzati per calcolare l'indicatore. NULL significa il simbolo corrente.
timeframe - Tempo. Può essere uno qualsiasi dei valori dell'enumerazione Timeframe. 0 significa il timeframe del grafico corrente.
periodo - Numero di periodi per il calcolo.
prezzo applicato - Prezzo applicato. Può essere uno qualsiasi dei valori di enumerazione dei prezzi applicati.
turno - Indice del valore preso dal buffer dell'indicatore (spostamento relativo alla barra corrente il dato tempo fa).

Farò una prova, grazie
Motivazione: