[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 279

 

C'è qualcosa di sbagliato nella mia funzione che restituisce il valore degli elementi dello stesso array. Descriverò tutto in ordine per quanto riguarda questo problema.

Le variabili globali sono:

extern int i_TF = 0;
int g_maPeriod[3] = {6, 25, 150, 250},             // Периоды обрабатываемых МА
    g_singMa[3] = {1,2,3,4};                     // признаки машек, добавляемые к основному мэйджику

// Идентификаторы сигналов
#define SIGNAL_BUY           0                                 // Сигнал на покупку
#define SIGNAL_SELL          1                                 // Сигнал на продажу
#define SIGNAL_NO           -1                                 // Сигнала нет

#define CROSS_UP             0                                 // Признак нахождения быстрой средней
                                                               // ..над медленной
#define CROSS_DN             1                                // Признак нахождения медленной..
                                                               // ..средней над быстрой
#define CROSS_NO            -1                                 // Признак равенства двух средних
int crossDir[3];

Funzioni utilizzate in questo calcolo:

//+-------------------------------------------------------------------------------------+
//| Получение значений МА на двух соседних барах                                        |
//+-------------------------------------------------------------------------------------+
double GetCurAndPrevMA(int maPeriod, double& prevMA)
{
   prevMA = iMA(NULL, i_TF, maPeriod, 0, MODE_EMA, MODE_CLOSE, 1);
   return (iMA(NULL, i_TF, maPeriod, 0, MODE_EMA, MODE_CLOSE, 0));
}
//+-------------------------------------------------------------------------------------+
//| Получение положения машек между собой                                               |
//+-------------------------------------------------------------------------------------+
void GetStateMa(int& crossDir[])
{
   double ema365_1;
   double ema365_0 = GetCurAndPrevMA(365, ema365_1);

   Print("g_maPeriod[0] = ", g_maPeriod[0]);
   Print("g_maPeriod[1] = ", g_maPeriod[1]);
   Print("g_maPeriod[2] = ", g_maPeriod[2]);
   Print("g_maPeriod[3] = ", g_maPeriod[3]);
   
   for (int i=0; i<4; i++)
   {
      double ema1;
      double ema0 = GetCurAndPrevMA(g_maPeriod[i], ema1);

      crossDir[i] = CROSS_NO;

      Print("ema1 < 365_1 ", ema1 ," < ", ema365_1);
      if (ema1 < ema365_1 && ema0 > ema365_0)
      {
         Print("ema1 < 365_1 ", ema1 ," < ", ema365_1);
         crossDir[i] = CROSS_UP;
      }
      if (ema1 > ema365_1 && ema0 < ema365_0)
      {
         Print("ema1 > 365_1 ", ema1 ," > ", ema365_1);
         crossDir[i] = CROSS_DN;
      }
   }
}

Inoltre, stampo il valore degli elementi dell'array restituiti dalla funzioneGetStateMa(int& crossDir[]):

   Print("crossDir[0] = ", crossDir[0]);
   Print("crossDir[1] = ", crossDir[1]);
   Print("crossDir[2] = ", crossDir[2]);
   Print("crossDir[3] = ", crossDir[3]);

Questo è ciò che viene restituito:

2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: crossDir[3] = 0
2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: crossDir[2] = -1
2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: crossDir[1] = -1
2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: crossDir[0] = -1
2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: open #1 buy 0.10 EURUSD at 1.29654 ok
2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: ema1 < 365_1 1.3129 < 1.3225
2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: ema1 < 365_1 1.3017 < 1.3225
2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: ema1 < 365_1 1.2886 < 1.3225
2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: ema1 < 365_1 1.2916 < 1.3225
2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: g_maPeriod[3] = 250
2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: g_maPeriod[2] = 150
2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: g_maPeriod[1] = 25
2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: g_maPeriod[0] = 6

Il valore degli elementi dell'arraycrossDir[] viene restituito diverso, anche se dovrebbero essere tutti con un valore di 1.

Questo può essere visto dal disinserimento delle espressioni che confrontano Mach 4 periodi e 365 periodi. Puoi dirmi perché i valori vengono restituiti in modo errato?

 
Ekburg:


grazie per essere stato specifico, perché il link che mi è stato inviato non menzionava specificamente questi array, e non ho prestato attenzione alla colonna a sinistra perché ero al lavoro.

ma nessuno inghiottirà tutto quello che sputi, tranne te ;)


Come ha imparato, se ha imparato, dai suggerimenti? Solo l'auto-apprendimento attivo e curioso darà i suoi frutti! Ti ho masticato e tu stai "sputando indietro" su un buon consiglio! Prendi una babysitter per pulire il tuo casino!
 
Buonasera a tutti, ho l'indicatore B costruito a partire dall'indicatore A (tramite iCustom) , entrambi gli indicatori sono sul grafico, quando cambio i parametri dell'indicatore A , l'indicatore B non si ricompila automaticamente, deve essere ricompilato forzatamente! Perché l'indicatore B non si ricompila automaticamente?
 
MK07:
Buonasera a tutti, ho l'indicatore B costruito a partire dall'indicatore A (tramite iCustom) . Entrambi gli indicatori sono sul grafico. Quando cambio i parametri dell' indicatore A , l'indicatore B non si ricompila automaticamente, devo ricompilarlo forzatamente. Perché l'indicatore B non si ricompila automaticamente?
Chiamate l'indicatore A (tramite iCustom) con alcune impostazioni specifiche che sono INDIPENDENTI dalle impostazioni dell'indicatore A. Ciò significa che il terminale calcola simultaneamente due copie indipendenti dell'indicatore A. L'indicatore che viene chiamato dall'esterno (da un altro codice) viene calcolato virtualmente dal terminale.
 
TarasBY:
Chiamate l'indicatore A (tramite iCustom) con certe impostazioni, che NON dipendono dalle impostazioni dell'indicatore A. Ciò significa che il terminale calcola simultaneamente due copie indipendenti dell'indicatore A.

Cosa bisogna fare perché il terminale calcoli la seconda variante dell'indicatore A?
 
MK07:
Cosa bisogna fare perché il terminale calcoli la seconda versione dell'indicatore A?
Sii più specifico sul compito.
 
borilunad:

Come hai imparato, se hai imparato, dai suggerimenti? Solo l'auto-apprendimento attivo e curioso darà i suoi frutti! Ti ho masticato e stai sputando un buon consiglio! Prendi una babysitter per pulire il tuo casino!

moderare il tuo ego! Non rimbalzo da quel consiglio, l'ho preso e ti ho ringraziato, ma non lo prendo in quel modo! Ho chiesto e risposto in modo civile!
 

Ciao!

Il valore della variabile Point deve essere usato nell'EA.

Ma è uguale a 0.

Per quanto ho capito, questo è dovuto alle 5 cifre dopo il punto decimale nella citazione.

C'è un modo per determinare questo valore?

Grazie.

 
TarasBY:
Per favore, renda più chiaro il suo compito.

Indicatore A - AO normale (My_AO) - in alto nella foto.

Indicatore B-istogramma(+1/-1) dell'indicatore AO (My_AO) - quello centrale nella figura.

Quando si cambiano i parametri dell'indicatore A (quello in basso nell'immagine), l'indicatore B non cambia anche se si ricompila.

Ho mostrato due indicatori AO (My_AO) allo stesso tempo solo per illustrare cosa succede con gli indicatori, ma in condizioni reali ci dovrebbe essere un solo AO (My_AO).



Il primo codice è l'indicatore A.

Secondo codice - indicatore B.

//---- indicator settings
#property  indicator_separate_window
#property  indicator_buffers 3
#property  indicator_color1  Black
#property  indicator_color2  Green
#property  indicator_color3  Red
#property  indicator_width2  2
#property  indicator_width3  2
#property  indicator_level1 0.0

//---- input parameters
extern int FastPeriod =5;
extern int LowPeriod  =34;
//---- indicator buffers
double     ExtBuffer0[];
double     ExtBuffer1[];
double     ExtBuffer2[];



//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   //---- drawing settings
   SetIndexStyle(0,DRAW_NONE);
   SetIndexStyle(1,DRAW_HISTOGRAM);
   SetIndexStyle(2,DRAW_HISTOGRAM);
   IndicatorDigits(Digits+1);
   SetIndexDrawBegin(0,34);
   SetIndexDrawBegin(1,34);
   SetIndexDrawBegin(2,34);
//---- 3 indicator buffers mapping
   SetIndexBuffer(0,ExtBuffer0);
   SetIndexBuffer(1,ExtBuffer1);
   SetIndexBuffer(2,ExtBuffer2);
//---- name for DataWindow and indicator subwindow label
   IndicatorShortName("My_AO");
   SetIndexLabel(1,NULL);
   SetIndexLabel(2,NULL);
//---- initialization done
   return(0);
  }
//+------------------------------------------------------------------+
//| Awesome Oscillator                                               |
//+------------------------------------------------------------------+
int start()
  {
      
  
   int    limit;
   int    counted_bars=IndicatorCounted();
   double prev,current;
//---- last counted bar will be recounted
   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;
//---- macd
   for(int i=0; i<limit; i++)
      ExtBuffer0[i]=iMA(NULL,0,FastPeriod,0,MODE_SMA,PRICE_MEDIAN,i)-iMA(NULL,0,LowPeriod,0,MODE_SMA,PRICE_MEDIAN,i);
//---- dispatch values between 2 buffers
   bool up=true;
   for(i=limit-1; i>=0; i--)
     {
      current=ExtBuffer0[i];
      prev=ExtBuffer0[i+1];
      if(current>prev) up=true;
      if(current<prev) up=false;
      if(!up)
        {
         ExtBuffer2[i]=current;
         ExtBuffer1[i]=0.0;
        }
      else
        {
         ExtBuffer1[i]=current;
         ExtBuffer2[i]=0.0;
        }
        
       
     }
//---- done
   return(0);
  }
#property indicator_separate_window
#property indicator_minimum -1.5
#property indicator_maximum 1.5
#property indicator_buffers 2
#property indicator_color1 Green
#property indicator_color2 Red
#property  indicator_width1  2
#property  indicator_width2  2
#property indicator_level1 0.0

//--- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_HISTOGRAM);
   SetIndexBuffer(0,ExtMapBuffer1);
   SetIndexStyle(1,DRAW_HISTOGRAM);
   SetIndexBuffer(1,ExtMapBuffer2);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {  
      
       
    double UP,DN;     
  
  
    int counted_bars=IndicatorCounted(),
       limit;  
       
    if(counted_bars>0)
      counted_bars--;
   
      limit=Bars-counted_bars;
//----
   for(int i=0;i<limit;i++)
       
      { 
        UP=iCustom(NULL,0,"My_AO",1,i+1);               
        DN=iCustom(NULL,0,"My_AO",2,i+1);    
             
        
       if(UP>0)       
         {ExtMapBuffer1[i+1]=1;
          ExtMapBuffer2[i+1]=0;
         }
         
       if(UP<0)       
         {ExtMapBuffer1[i+1]=-1;
          ExtMapBuffer2[i+1]=0;
         }  
         
                              
       if(DN>0)            
         {
          ExtMapBuffer1[i+1]=0;
          ExtMapBuffer2[i+1]=1;
         }
              
       if(DN<0)            
         {
          ExtMapBuffer1[i+1]=0;
          ExtMapBuffer2[i+1]=-1;
         }
               
                       
    
    }
//----
   return(0);
 
   }
   
//+------------------------------------------------------------------+    
   
        
        
 
MK07:

Indicatore A - indicatore AO normale (My_AO) - figura superiore.

Indicatore B - istogramma(+1/-1) dell'indicatore AO (My_AO) - centro nella figura.

Se cambiate i parametri dell'indicatore A (in basso nella figura), l'indicatore B non cambia anche se ricompilate.

I due indicatori AO (My_AO) allo stesso tempo ho mostrato solo per illustrare ciò che accade con gli indicatori, ma nella vita reale ci dovrebbe essere un AO (My_AO).

Il primo codice è l'indicatore A.

Il secondo codice è l'indicatore B.

E questo ordine di cose è normale (questi sono i principi del terminale).

Se vuoi cambiare i parametri dell'indicatore A, fai lo scambio di informazioni tra gli indicatori (può essere un file, variabili globali del terminale, RAM): l'indicatore A passa i parametri inizializzabili durante l'inizializzazione e l'indicatore B controlla periodicamente i cambiamenti dell'indicatore A. Quando rileva i cambiamenti, anche l'indicatore B deve essere inizializzato con i nuovi parametri (init() forzato).

Motivazione: