Domande da un "manichino" - pagina 53

 
Non confondete la ricreazione incondizionata e stupida (per ignoranza) di indicatori ad ogni tick con la creazione intelligente (rara e necessaria) di un indicatore. Nel primo caso si ottiene un freno centuplicato e una perdita di risorse, e nel secondo si ottengono prestazioni perfette.
 
Renat:
Non confondete la ricreazione incondizionata e stupida (per ignoranza) di indicatori ad ogni tick con la creazione intelligente (rara e necessaria) di un indicatore. Nel primo caso si ottiene un freno centuplicato e una perdita di risorse, e nel secondo - un lavoro perfetto.

So bene che Karlson ha commesso ignorantemente un errore, e capisco anche la natura di questo errore.

Ma suggerisci uno schema ragionevole per risolvere il suo problema. La persona deve utilizzare il codice scritto nell'indicatore, ma i parametri di questo codice sono determinati dinamicamente prima di ogni accesso ai dati dell'indicatore?

Ho una soluzione, contiene dll, ma tu vuoi usare mql puro, quindi proponi una soluzione in mql.

HZ Ho già menzionato OnCalculate() e i calcoli negli eventi, ma potete passare tre parametri tramite l'evento. Nella mia soluzione, un long dll può passare l'indirizzo di un array con parametri e l'indicatore riceverà i dati a questo indirizzo.

Se hai la soluzione mql, basta puntare il dito.

 
Urain:

So bene che Karlson ha commesso ignorantemente un errore, e capisco anche la natura di questo errore.

Ma suggerisci uno schema ragionevole per risolvere il suo problema. La persona ha bisogno di usare il codice scritto nell'indicatore, ma i parametri di questo codice sono definiti dinamicamente prima di ogni riferimento ai dati dell'indicatore?

Quanti indicatori diversi dovrebbero essere creati in realtà? Probabilmente non più di 10, altrimenti sarà un inutile spreco di risorse.

Dal momento che non ci sono cambiamenti di parametri, è possibile creare una collezione di indicatori, e quello necessario sarà aggiunto ad esso quando necessario. Se ci sono meno di 10 indicatori e hanno un significato chiaro (iniziale, di conferma, di correzione, ecc.), si possono creare variabili nominate di maniglie con i parametri necessari.

 
Urain:

Ma suggerisci uno schema ragionevole per risolvere il suo problema. La persona ha bisogno di usare il codice scritto nell'indicatore, ma i parametri di questo codice sono determinati dinamicamente prima di ogni riferimento ai dati dell'indicatore?

Ci ho pensato un po'. Se i parametri del codice sono determinati dinamicamente prima di ogni accesso ai dati dell'indicatore, perché non includere la procedura di determinazione di questi parametri nel codice dell'indicatore? In altre parole, tutti i calcoli dovrebbero essere implementati nell'indicatore.

O ci sono situazioni in cui tale approccio è impossibile in linea di principio?

 
Potete dirmi perché in un indicatore così semplice la barra zero (la prima da destra) non viene calcolata ovunque tranne che nel grafico settimanale?

#include <MovingAverages.mqh>
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
#property indicator_color1 LightBlue
#property indicator_type1   DRAW_LINE
#property indicator_width1 2

input int PERIOD = 80;
input ENUM_MA_METHOD  method = MODE_SMA;
input ENUM_APPLIED_PRICE PRICE = PRICE_CLOSE;
double Uptrend[];
double ExtRsiArray_TF2[];
double mabuf[];
int handleMA,handleMA2;

int OnInit()
  {
   SetIndexBuffer(0, Uptrend);
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);  
   ArraySetAsSeries(Uptrend,true);
   handleMA=iMA(NULL, 0, PERIOD, 0, method, PRICE);
   handleMA2=iMA(NULL, 0, PERIOD/2, 0, method, PRICE);
   return(0);
  }
  
double WMA(int ai_0,int a_period_4) {
int some;
if(a_period_4==PERIOD)
 if(CopyBuffer(handleMA,0,ai_0,1,ExtRsiArray_TF2)<=0)
  {Alert("Error",GetLastError());
   return(0);
  }
some=PERIOD/2;
if(a_period_4==some)
 if(CopyBuffer(handleMA2,0,ai_0,1,ExtRsiArray_TF2)<=0)
  {Alert("Error",GetLastError());
   return(0);
  }
return (ExtRsiArray_TF2[0]);
}

int OnCalculate (const int rates_total,      
                 const int prev_calculated, 
                 const int begin,          
                 const double& price[] 
   )
  { ArraySetAsSeries(price,true);
    int counted_bars = prev_calculated; 
    if(counted_bars < 0) return(-1); 
    int x = 0; 
    int p = MathSqrt(PERIOD);              
    int e = rates_total - counted_bars + PERIOD + 1; 
    double vect[], trend[]; 
    if(e > rates_total) e = rates_total;    
    ArrayResize(vect, e); 
    ArraySetAsSeries(vect, true);
    ArrayResize(trend, e); 
    ArraySetAsSeries(trend, true);
    ArrayResize(mabuf, e); 
    ArraySetAsSeries(mabuf, true);
    for(x = 0; x < e; x++)        vect[x] = 2*WMA(x, PERIOD/2) - WMA(x, PERIOD);
    if(method==MODE_SMA)
    SimpleMAOnBuffer(e,prev_calculated,PERIOD+1,p,vect,mabuf);

    for(x = 0; x < e-PERIOD; x++) Uptrend[x] = mabuf[x];
    return(rates_total);                
  }
 
Yedelkin:

Ho pensato per un po'. Se i parametri del codice sono determinati dinamicamente prima di ogni accesso ai dati dell'indicatore, perché non includiamo la procedura di determinazione di questi parametri nel codice dell'indicatore? In altre parole, tutti i calcoli dovrebbero essere implementati nell'indicatore.

O ci sono situazioni in cui tale approccio è impossibile in linea di principio?

Ci sono situazioni in cui i parametri sono calcolati da un altro indicatore e restituiti all'Expert Advisor, e l'Expert Advisor decide quale modello utilizzare in base ai neuroni. Non sappiamo in anticipo quale serie di parametri sarà applicata.

 
Expert:
Potete dirmi perché in un indicatore così semplice la barra zero (la prima da destra) non viene calcolata ovunque tranne che nel grafico settimanale?


Oops) ho messo qui:SimpleMAOnBuffer(e,prev_calculated,PERIOD+1,p,vect,mabuf); invece di e - rates_total e tutto funziona)
 
Expert:
Oops) sostituito qui:SimpleMAOnBuffer(e,prev_calculated,PERIOD+1,p,vect,mabuf); invece di e - rates_total e tutto funziona)

Fix bugs uomo con nickname Expert? dovrebbe essere nel tema umorismo.
 

Sto cercando di costruire un Expert Advisor multivaluta. Finora ho deciso per lo schema proposto da Nikolay Kositsin nel suo articolo"Creare un Expert Advisor che fa trading su diversi simboli". Ho affrontato il problema che i risultati sono diversi quando si esegue un test utilizzando diversi simboli ma gli stessi parametri. Ho scorso il forum e ho trovato che molti sono giunti alla conclusione che questo problema può essere risolto usando la funzione OnTimer(). Andrey Khatimlansky lo ha consigliato qui:

Отвяжитесь от тиков конкретного инструмента (OnTick) - это же мультивалютник! Работайте по таймеру или ловите момент образования бара на всех рабочих инструментах, это будет надежнее.

Ho provato a catturare il momento della formazione della barra su tutti gli strumenti, ma non sono riuscito a raggiungere il risultato desiderato.

Per esempio:

Nella funzione che ha lo scopo di rilevare una nuova barra, specifico esplicitamente lo strumento e il timeframe.

bool isNewBar(string Symbol_, ENUM_TIMEFRAMES Timeframe)
{
 // В статической переменной будем помнить время открытия последнего бара
 static datetime last_time = 0;
 // Текущее время
 datetime lastbar_time = (ENUM_SERIES_INFO_INTEGER)SeriesInfoInteger(Symbol_,Timeframe,SERIES_LASTBAR_DATE);

 // Если это первый вызов функции
 if(last_time == 0)
   {
    // Установим время и выйдем 
    last_time = lastbar_time;
    return(false);
   }

 // Если время отличается
 if(last_time != lastbar_time)
   {
    // Запомним время и вернем true
    last_time = lastbar_time;
    return(true);
   }
 // Дошли до этого места - значит бар не новый, вернем false
 return(false);
}

Nella funzione OnTick(), lo schema suggerito da Nikolay Kositsin.

Per esempio:

void OnTick()
{ 
 // Объявление массивов переменных для торговых сигналов  
 static bool UpSignal[2], DnSignal[2];

 // Получение торговых сигналов
 TradeSignalCounter(0, остальные параметры);
 TradeSignalCounter(1, остальные параметры);

 // Совершение торговых операций
 TradePerformer(0, остальные параметры);
 TradePerformer(1, остальные параметры);
}


La funzione isNewBar(Symbol,Timeframe) è chiamata nella funzione in cui viene eseguito il trade, cioè TradePerformer(parametri).

Per esempio:

bool TradePerformer(параметры)
{

...

 if(isNewBar(Symbol_,Timeframe))
   {
    Trailing_Stop(параметры);
   
    Open_Source_Position(параметры);
   }
 return(true);
}


Cioè, viene controllata una nuova barra per ogni simbolo separatamente. Se non c'è una nuova barra, controlliamo il prossimo simbolo. E così succede con ogni zecca. Ma questa variante non funziona.

Si prega di consigliare come implementare correttamente il controllo di una nuova barra in un Expert Advisor multivaluta nello schema dato.
 
Urain:
Dovrebbe essere nel thread dell'umorismo per correggere gli errori fatti da qualcuno chiamato Expert?
In questo forum si possono e si devono correggere gli errori nel codice Expert, indipendentemente dalla razza o dal tempo :)