Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 6. - pagina 790

 
Forexman77:

La questione non è stata archiviata. Quindi, prima di tutto.

Viene trovato un massimo, poi viene tracciata una linea rispetto ad esso. Si controlla la distanza tra questa linea di massimo e il minimo attuale. Se supera "Rmax", viene impostata una freccia sulla barra dove si trova il massimo. La freccia è posizionata ma non c'è. Per renderlo chiaro, ho aggiunto il buffer "BufferLow[i]" che mostra la differenza e i suoi dati possono essere visti nella finestra dell'explorer.

È sempre così. Non si può aspettare la neve in inverno) l'ho fatto io stesso.

Se qualcuno fosse tormentato da un'idea simile, ecco il codice:

#property copyright "Kamil Gazizullin"
#property link      "forexman77@yandex.ru"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
#property indicator_chart_window
#property indicator_buffers 5
#property  indicator_color1 Magenta
#property  indicator_color2 Aqua
#property  indicator_color3 SlateBlue
#property  indicator_color4 SlateBlue
#property  indicator_color5 clrNONE
//--- input parameters
extern int       Period_=10;
extern double diapazon  =0.003;
//--- buffers
double Max[];
double Min[];
double MaxIndex[];
double MinIndex[];
double rAZNOST[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   IndicatorBuffers(5);
   SetIndexBuffer(0,MaxIndex);
   SetIndexBuffer(1,MinIndex);
   SetIndexStyle(0,DRAW_ARROW);
   SetIndexArrow(0,116);
   SetIndexEmptyValue(1,0.0);
   SetIndexStyle(1,DRAW_ARROW);
   SetIndexArrow(1,116);
   SetIndexEmptyValue(0,0.0);
   SetIndexBuffer(2,Max);
   SetIndexBuffer(3,Min);
   SetIndexBuffer(4,rAZNOST);
   IndicatorDigits(Digits+1);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
    int counted_bars=IndicatorCounted(),limit, i,k,r,p,t,f;
    double minimum,maximum,Dmax,Dmin;
   if(counted_bars>0)
      counted_bars--;  
   limit=Bars-counted_bars;
   for(i=0;i<limit;i++)
   {
      maximum=High[iHighest(NULL,0,MODE_HIGH,Period_,i)];
      minimum=Low[iLowest(NULL,0,MODE_LOW,Period_,i)];
      Max[i]=maximum;
      Min[i]=minimum;
   }
   for(i=0;i<limit;i++)
   {
      k=iHighest(NULL,0,MODE_HIGH,Period_,i);
      t=iLowest(NULL,0,MODE_LOW,Period_,i);
      Dmax=Max[i]-Low[i];
      Dmin=High[i]-Min[i];
      if (Dmax > diapazon){p=k;for(r=p;r>=k;r--)MaxIndex[k]=Max[k];}
      if (Dmin > diapazon){p=t;for(f=p;f>=t;f--)MinIndex[t]=Min[t];}
      if (MaxIndex[i]==Max[i+1])MaxIndex[i]=0;
      if (MinIndex[i]==Min[i+1])MinIndex[i]=0;
      rAZNOST[i]=Max[i]-Min[i];
   }
   return(0);
  }
 
Awwl:

L'Heiken Ashi integrato sembra un po' sottosviluppato (mi chiedo se sono solo io sul 745?), ma posso capire come funziona. E non è chiaro come sia costruito WmiFor!

Nel codice Heiken Ashi una candela è disegnata da 4 istogrammi di barre:

Cioè, man mano che il numero di buffer aumenta (da 0 a 3), nuove barre vengono disegnate sopra quelle vecchie. L'ordine è il seguente:

LowHigh - HighLow - Open - Close.

L'ordine dei candelabri dovrebbe essere il seguente perché appaiano come dovrebbero essere, con i loro corpi e le loro code:

max(Open,Close)//linea di colore spessa// - min(Open,Close)//bianco spessa// - High//linea di colore spessa// - Low//bianco spessa//.

Compiliamo l'indicatore, mettiamolo sul grafico e vediamo tutti i problemi (vedi immagine).

Ma questo metodo, come Heiken Ashi, ha uno svantaggio - sotto ogni "candela" si ottiene un anello bianco nel colore di fondo che copre tutto ciò che è più basso. Ma con WmiFor tutto è perfetto! Caratteristiche non documentate?

Prima immagine - Heiken Ashi (inserito in una finestra separata), seconda immagine - WmiFor, lo sfondo è in verde chiaro per chiarezza.

Stiamo confrontando un morbido e un rotondo? Perché mettere Haken in una finestra separata se è progettato per una finestra del grafico e disegnato lì come una candela con ombre e corpo? Se il valore del buffer cambia, la stessa barra cambierà la sua dimensione e non ne verrà disegnata una nuova sopra di essa.

MT4 non ha un metodo per disegnare come candele, quindi solo un istogramma è possibile, e come si calcolano i valori del buffer sono affari vostri. WmiFor, tra l'altro, disegna anche l'istogramma. Mettiamolo anche in una finestra separata e fissiamo i suoi difetti )))

Per far sì che i candelieri in una finestra separata sembrino candelieri con ombre, dovrebbero essere disegnati relativamente 0, come l'acceleratore. Oppure puoi disegnarli come oggetti, vedi per esempio All_Stars.

 

Buon pomeriggio a tutti!

Il mio cervello è confuso; non ho trovato una risposta nella documentazione, ma forse qualcuno l'ha incontrato. Ecco la linea nell'Expert Advisor (frazione di trade positivi):

Print(OderPluseCount,"/",OderTotal,"=",DoubleToStr((OderPluseCount/OderTotal),2),"=",BestOd,",2/5*100,",100*2/5);

lo stampa nel diario (per esempio):

3/6=0.00=0 0 40

Allo stesso tempo, se la soluzione è 1:

3/3=1.00=1 0 40

La variabile BestOd=OderPluseCount/OderTotal è di tipo doppio, il resto è int.

Cioè, appena si incontra un valore inferiore a 1, il compilatore lo trasforma automaticamente in 0... Le ultime due espressioni da costanti producono risultati sorprendenti - sembra la stessa cosa, ma non ))))

Ho provato diverse sostituzioni e tutto ciò che è maggiore di 1 ha la parte frazionaria corretta.

 
Igor_:

Buon pomeriggio a tutti!

Il mio cervello è confuso; non ho trovato una risposta nella documentazione, ma forse qualcuno l'ha incontrato. Ecco la linea nell'Expert Advisor (frazione di trade positivi):

Print(OderPluseCount,"/",OderTotal,"=",DoubleToStr((OderPluseCount/OderTotal),2),"=",BestOd,",2/5*100,",100*2/5);

Lo stampa nel diario (per esempio):

3/6=0.00=0 0 40

Allo stesso tempo, se la soluzione è 1:

3/3=1.00=1 0 40

La variabile BestOd=OderPluseCount/OderTotal è di tipo doppio, il resto è int.

Cioè, appena si incontra un valore inferiore a 1, il compilatore lo trasforma automaticamente in 0... Le ultime due espressioni da costanti producono risultati sorprendenti - sembra la stessa cosa, ma non ))))

Ho provato diverse sostituzioni, tutto ciò che è maggiore di 1 ha la parte frazionaria corretta.

Prova questo

DoubleToStr((double)(OderPluseCount/OderTotal),2)

 
AlexeyVik:

Prova questo

DoubleToStr((double)(OderPluseCount/OderTotal),2)

Non aiuta. Ma grazie )
 
Igor_:
Non aiuta. Ma grazie )
DoubleToStr((double)(OderPluseCount/(OderTotal*1.0)),2)
 
Vinin:
DoubleToStr((double)(OderPluseCount/(OderTotal*1.0)),2)

Funziona così, grazie. Sembra che lo sciamanesimo ))))

Onestamente, sono più preoccupato non del display, ma del corretto calcolodi BestOd. Ho dovuto anche correggerlo.

L'ho fatto in questo modo:

BestOd=(OderPluseCount/(OderTotal*1.0));

C'è qualche spiegazione per questo? Dopo tutto, sarebbe molto difficile prendere questo errore se non fosse per la stampa. In quali casi potrebbe verificarsi?

 
Igor_:

Funziona così, grazie. Sembra che lo sciamanesimo ))))

Onestamente, non è il display che mi preoccupa di più, ma il calcolo corretto diBestOd. Ho dovuto anche correggerlo.

L'ho fatto in questo modo:

BestOd=(OderPluseCount/(OderTotal*1.0));

C'è qualche spiegazione per questo? Dopo tutto, sarebbe molto difficile prendere questo errore se non fosse per la stampa. In quali casi può comparire?

In qualsiasi operazione con valori interi il risultato sarà un intero.
 

Ho trovato la risposta da solo nel libro di riferimento, sezione"Conversione dei tipi".

Если два значения объединяются бинарным оператором, то перед выполнением операции операнд младшего типа преобразовывается к более старшему типу в соответствии с приоритетом, указанным на схеме: 

Ma il tipo doppio in questo schema è il più anziano. E ho avuto entrambi gli int. Pertanto, il risultato è intero. Introduzione di una costante di tipo superiore (double, float), convertito tutti gli int ad essa.

Si impara a lungo e si consulta la documentazione)))

 
Salve, ho la seguente domanda.
Come dovrei fare un EA che passa attraverso e modifica le posizioni aperte, in modo che non modifichi ripetutamente gli ordini che sono stati modificati durante il prossimo passaggio. Bisogna "oliarli" in qualche modo.
Non mi viene in mente niente.
Ve ne sarei molto grato.