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

 
TarasBY:

Per quanto riguarda questa linea:

Recentemente, i DT aggiungono spesso prefissi diversi al nome del simbolo (EURUSDm - per esempio) - questi dovrebbero essere presi in considerazione quando ci si riferisce all'ambiente di mercato del simbolo.

P.S. ...E per lo standard "EURUSD" StringSubstr ("EURUSD", 6) non sarà zero ma "".

Grazie mille, Igor! Non sapevo dei DT e della lettera. Può essere un mini conto per la "m".

Sapete dove il JPY ha il coefficiente 82? Per altre valute era 0,625 per GBP, 0,7751937984 per EUR

L'idea è che quando si traducono le valute, il coefficiente sarebbe fluttuante al variare dei tassi. Perché allora prendere delle costanti?
 
Chiripaha:

Nikolai, è molto bello che tu stia imparando a programmare e a creare programmi. Ma il punto è che non hai esattamente chiesto aiuto per un particolare caso oscuro nel programma, ma hai effettivamente delineato il TOR per scrivere il programma.

Quello che avete mostrato, secondo me, è metaforicamente parlando in relazione ai robot, un mucchio di pezzi di ricambio eterogenei. Non è affatto giusto.

Quindi non si può indicare un errore specifico qui, poiché tutto deve essere rifatto in modo completamente diverso. - IMHO, non pretendo di essere più di questo.

Ma questo non è un motivo per arrabbiarsi. Continua a imparare a scrivere. Lì, come si dice, invece di te, naturalmente, può "mangiare" (per fare il lavoro), ma tu stesso non stai diventando ben nutrito da questo (cioè, non imparare). Quindi vai avanti. Se uno cammina l'altro il modo.

Prova a scrivere di nuovo con un approccio diverso al problema. - Per me ha funzionato.


Grazie per la critica. Ditemi, è realistico da implementare?
 
NICK_R:
Grazie per la critica. È realistico farlo?

Certo che lo è. Ma non è esattamente un compito semplice. Non è molto difficile, ma non è nemmeno facile. - È giusto per studiare.
 
Chiripaha:

Grazie mille, Igor! Non sapevo della DC e della lettera. Deve essere un mini-conto - per la lettera "m".

Sapete dove il JPY ha il coefficiente di 82? Le altre valute avevano GBP - 0.625, EUR - 0.7751937984

L'idea è che quando si convertono le valute il coefficiente sarebbe fluttuante al variare dei tassi di cambio. Perché allora prendere delle costanti?

Sergey, quei numeri non significano nulla per me, quindi non ho una risposta a questa domanda.

E i prefissi nella scrittura dei simboli possono avere o meno senso.

 
TarasBY:

Sergey, questi numeri non significano nulla per me, quindi non ho una risposta a questa domanda.

E i prefissi nella scrittura del simbolo possono avere o meno senso.

OK. Grazie!
 

Buon pomeriggio colleghi!

Puoi dirmi per favore come uscire dal ciclo (evidenziato in rosso nel codice)? L'indicatore sta rallentando terribilmente.

#property  indicator_separate_window
#property  indicator_buffers 2
#property  indicator_color1  DarkGray
#property  indicator_color2  PowderBlue
#property  indicator_width1  2

//---- basic fan indicator parameters

extern bool Show_AOLine_2=true;
extern int SlowEMA3=34;
extern int EMA=3;
extern bool Show_Volume=true;
extern double coaf=0.5;
//---- indicator buffers
double AOBuffer3[];
double ExtMapBuffer1[];

    double  price_up_start, price_up_end, AO_up;
    double  price_dn_start, price_dn_end, AO_dn;
    datetime time_up, time_dn, AO_time_up, AO_time_dn;
    double Vol_AO_up, Vol_AO_dn;
    int shift_up, shift_dn, dn_koaf, up_koaf, dn_koaf_round, up_koaf_round;
    
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   //---- drawing settings
   
  string name_ind = "Awesome_super_volumes";
   IndicatorShortName("Awesome_super_volumes");
   
   
//---- AO_fan line 2 (basic)
   if(Show_AOLine_2 ==true){Show_AOLine_2=DRAW_LINE; }
   else 
    {Show_AOLine_2=DRAW_NONE; }
   SetIndexBuffer(0,AOBuffer3);
   SetIndexStyle(0,Show_AOLine_2);
   SetIndexLabel(0,"basic line");   

   SetIndexBuffer(1,ExtMapBuffer1);
   SetIndexStyle(1,DRAW_HISTOGRAM);
   SetIndexLabel(1,"Volume");
   
  //---- 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;

   for(int i=0; i<limit; i++)   // -------------------------------------------- Основной цикл
   {
     
 //---- Awesom + Volumes
     
AOBuffer3[i]=iMA(NULL,0,EMA,0,MODE_SMA,PRICE_MEDIAN,i)-iMA(NULL,0,SlowEMA3,0,MODE_SMA,PRICE_MEDIAN,i);
if (Show_Volume==true)
{
double nSum = Volume[i]*Point*coaf;
   if (AOBuffer3[i]<=0)ExtMapBuffer1[i] = nSum;
   if (AOBuffer3[i]>0)ExtMapBuffer1[i] = -nSum;
double Vol_Arr[];
  if (AOBuffer3[i]<=0)Vol_Arr[i]=Volume[i]*Point*coaf;
  if (AOBuffer3[i]>0)Vol_Arr[i] = -Volume[i]*Point*coaf;
}

//----------------------------- Блок поиска значений -----------------------------------------//
 
 //-- Поиск Low & Time & Min_AO 
  if (AOBuffer3[i] < 0)
  {
 price_up_end = 0; AO_up = 0;  
 price_dn_start = Low[i]; if (price_dn_end == 0) price_dn_end = Low[i]; 
 if (price_dn_start <= price_dn_end) {price_dn_end = price_dn_start; time_dn = Time[i]; shift_dn = iBarShift(NULL, 0, time_dn);}
 if (AOBuffer3[i] <= AO_dn) {AO_dn = AOBuffer3[i]*0.2+AOBuffer3[i]; AO_time_dn = Time[i];}
 dn_koaf=dn_koaf_round;
 up_koaf_round++;
  }   
  
  //-- Поиск High & Time & Max_AO  
  if (AOBuffer3[i] > 0)
   {
  price_dn_end = 0; AO_dn = 0;  
  price_up_start = High[i];
  if (price_up_start >= price_up_end) {price_up_end = price_up_start; time_up = Time[i]; shift_up = iBarShift(NULL, 0, time_up);}
  if (AOBuffer3[i] >= AO_up) {AO_up = AOBuffer3[i]*0.2+AOBuffer3[i]; AO_time_up = Time[i];}
  up_koaf=up_koaf_round;
  dn_koaf_round++;
   }   
 //--------------------------------- Выставляем значения --------------------------------------------//
    
   Vol_AO_up = 0; Vol_AO_dn = 0;
  if (shift_up > shift_dn)
    {
 for (int dn_br = shift_dn; dn_br <= shift_up; dn_br++)            //-------------- Перебор значений внутри основного цикла
          {
    Vol_AO_up += Volume[dn_br]; 
    SetText("Awesome_super_volumes"+up_koaf, DoubleToStr(Vol_AO_up,0), AO_time_dn, AO_dn, Blue);
          }   
  }
 
 if (shift_dn > shift_up)
    {
 for (int up_br = shift_up; up_br <= shift_dn; up_br++)            //-------------- Еще один перебор значений внутри основного цикла
          {
    Vol_AO_dn += Volume[up_br]; 
    SetText("Awesome_super_volumes"+dn_koaf, DoubleToStr(Vol_AO_dn,0), AO_time_up, AO_up, Red);
          }   
    }
 } 
           
//---- done

   return(0);
  }
//+------------------------------------------------------------------+
void SetText(string name, string Vl, datetime t1, double p1, color c)
 {
  ObjectCreate(name,OBJ_TEXT,WindowFind("Awesome_super_volumes"),0,0,0,0);
  ObjectSetText(name, Vl, 6, "Arial Black", c);
  ObjectSet(name, OBJPROP_TIME1 , t1);
  ObjectSet(name, OBJPROP_PRICE1, p1);
  ObjectSet(name, OBJPROP_COLOR, c); 
  }

Grazie!


 
Fox_RM:

Buon pomeriggio colleghi!

Puoi dirmi per favore come uscire dal ciclo (evidenziato in rosso nel codice)? L'indicatore sta rallentando terribilmente.

Grazie!

Tuttavia, vi darò questa idea, forse sciocca. Ma forse ne troverò una più sensata.

Per quanto riguarda il compito hai bisogno per la ricerca finale dei dati su alcune barre, poi sulla prima ricerca scrivi i valori dei dati in qualche array (o buffer - non sono molto bravo).

E dopo il completamento della prima ricerca, prendete i valori necessari da questo array (buffer) per ottenere i dati per la seconda ricerca.

Solo che non sono particolarmente sicuro che questo possa aiutare per la velocità. Ma anche io non so molto sulle cause della frenata. È difficile per me dire qualcosa di più qualificato a questo proposito.

Quali potrebbero essere i pro e i contro. Il meno è che in questo caso si stima la situazione sulla barra non online, ma dopo il fatto, quando i dati sono già un po' inutili. Ma... questo è compensato dal fatto che, di fatto, quando si ricalcolano i vecchi dati, non è più necessario online. E quando i dati attuali arrivano, saranno immediatamente elaborati dalla seconda enumerazione. Quindi non dovrebbe esserci una perdita di rilevanza in questo caso. E in più - risolverà il vostro compito: sbarazzarsi di overshooting in overshooting. : ))

Potrei aver trascurato qualcosa. Prendete la mia idea in modo critico. Bene, e il miglior critico è la pratica. Devi solo scrivere e ricontrollare cosa e come funzionerà. Credo di sì.

 

Non c'è praticamente nessuna differenza, solo un processo leggermente diverso per ottenere i punti di controllo A e B. Ho già provato con gli array.

Poi tra A e B dovrei anche fare un loop attraverso le barre. Non vedo un altro modo, ecco perché lo chiedo.

Forse qualcuno può darmi un suggerimento. Forse c'è qualcosa di sbagliato nella logica della scrittura del codice?

 
Fox_RM:

Non c'è praticamente nessuna differenza, solo un processo leggermente diverso per ottenere i punti di controllo A e B. Ho già provato con gli array.

Poi tra A e B dovrei anche fare un loop attraverso le barre. Non vedo un altro modo, ecco perché lo chiedo.

Forse qualcuno può darmi un suggerimento. Forse c'è qualcosa di sbagliato nella logica della scrittura del codice?

Sì, esattamente - dovremo comunque fare un ciclo con l'overflow. Quindi, non c'è modo di evitarlo. E molto probabilmente la domanda dovrebbe essere posta in modo diverso - Cosa causa la frenata e come liberarsene?
 
Fox_RM:

Buon pomeriggio colleghi!

Puoi dirmi per favore come uscire dal ciclo (evidenziato in rosso nel codice)? L'indicatore sta rallentando terribilmente.

Grazie!

Potete raggruppare l'indicatore in questo posto - sarà una piccola ottimizzazione dell'indicatore:

if (Show_Volume==true)
{
double nSum = Volume[i]*Point*coaf;
   if (AOBuffer3[i]<=0)ExtMapBuffer1[i] = nSum;
   if (AOBuffer3[i]>0)ExtMapBuffer1[i] = -nSum;
double Vol_Arr[];
  if (AOBuffer3[i]<=0)Vol_Arr[i]=Volume[i]*Point*coaf;
  if (AOBuffer3[i]>0)Vol_Arr[i] = -Volume[i]*Point*coaf;
}

come questo:

if (Show_Volume==true)
{
 double nSum = Volume[i]*Point*coaf; double Vol_Arr[];  // Не знаю в этом случае можно через запятую переменные прописывать? - double nSum = Volume[i]*Point*coaf, Vol_Arr[];

 if (AOBuffer3[i]<=0) {ExtMapBuffer1[i] =  nSum; Vol_Arr[i] =  Volume[i]*Point*coaf;}
 if (AOBuffer3[i]>0)  {ExtMapBuffer1[i] = -nSum; Vol_Arr[i] = -Volume[i]*Point*coaf;}
}

Ecco qui:

AO_dn = AOBuffer3[i]*0.2+AOBuffer3[i];
// и тут
AO_up = AOBuffer3[i]*0.2+AOBuffer3[i];

Puoi cambiarlo in:

AO_dn = AOBuffer3[i]*1.2;
     // и
AO_up = AOBuffer3[i]*1.2;

Poi, hai i "Testi" che si accumulano nell'indicatore. Prima di mettere un nuovo testo, devi cancellare quelli vecchi. Questo può davvero rallentare l'indicatore - forse è questa la ragione. Poiché si ottengono tanti di questi testi quanti sono i tick sui parametri selezionati.

Se qualcuno mi dice come meglio implementare questo nel codice - perché io stesso sto chiedendo un aiuto di codifica simile.