Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 588

 
lil_lil:

Sto chiudendo 4 posizioni in una volta, come posso contarle come una in fila nella funzione di conteggio delle perdite?

Possono chiudere, a causa dello slittamento, non allo stesso prezzo e l'ora può essere diversa

Prova:

Se il broker permette la controchiusura, dobbiamo aprire un controordine con un volume uguale al volume degli ordini cumulativamente chiusi per fissare il prezzo di chiusura. Dopo di che il prezzo di chiusura è fissato e si possono eseguire tranquillamente 4 operazioni di ordini di contro-chiusura.

 

Potete dirmi come determinare come viene calcolato il margine?

Alcuni broker fanno pagare il margine su ogni posizione. E alcuni broker, solo sulla differenza di volumi su acquisto e vendita. (Cioè se il conto è full lock, allora il margine è zero)


Come determinare il metodo di calcolo del margine in modo programmatico?

 

Salve. Sto cercando un frattale sopra la MA.

Cercando un frattale sopra la MA, memorizzo una barra, poi cerco un frattale da questa barra e se è inferiore al primo che trovo, allora vero

Costantemente falso nei commenti

Comment(f_ma(Symbol(),0,i));
//+----------------------------------------------------------------------------+

bool f_ma(string sy="0",int tf=0,int nf=0) 
  {
   if(sy=="" || sy=="0") sy=Symbol();
   double f=0,MA=0,fr1,fr2;
   int    d=MarketInfo(sy,MODE_DIGITS),s;
   if(d==0) if(StringFind(sy,"JPY")<0) d=4; else d=2;
   int    i,k=iBars(sy,tf),kf,num_bar;

   for(i=nf+2; i<k; i++) 
     {
      f=iFractals(sy,tf,MODE_UPPER,i);
      MA=iMA(NULL,0,35,0,MODE_EMA,PRICE_CLOSE,i);
      if(f!=0) 
        {
        // kf++;
         if(f>MA) {num_bar=i; fr1=NormalizeDouble(f, d);continue;}
         
        }
     }
     //
      for(i=nf+ num_bar; i<k; i++) 
     {
      f=iFractals(sy,tf,MODE_UPPER,i);
      if(f!=0) 
        {
        fr2=NormalizeDouble(f, d);
        if(fr2<fr1) return(true);
        }
     }
     
     
   return(false);
  }
 
Ghabo:

Salve. Sto cercando un frattale sopra la MA.

Cercando un frattale sopra la MA, memorizzo una barra, poi cerco un frattale da questa barra e se è inferiore al primo che trovo, allora vero

Costantemente falso nei commenti

Il problema è in questa linea

         if(f>MA) {num_bar=i; fr1=NormalizeDouble(f, d);continue;}


Se si trova un frattale ed è sopra la MA, dovremmo interrompere il ciclo invece di continuarlo. Dopo aver trovato il primo frattale ce ne sarà un altro e un terzo e così via fino a ...

 
Alexey Viktorov:

Il problema è in questa linea


Se si trova un frattale ed è sopra la MA, dovremmo interrompere il ciclo invece di continuarlo. Dopo aver trovato il primo frattale ce ne sarà un altro e un terzo e così via fino a ...

Grazie. Sostituito da break;Ora è sempre vero. ma la condizioneif(fr2<fr1) non è soddisfatta.
 
Ghabo:
Grazie. Sostituito da break;Ora è sempre vero. ma la condizioneif(fr2<fr1) non è soddisfatta.

Quindi dobbiamo aggiungere questa condizione prima di visualizzare il risultato della funzione. Cosa c'è di così difficile?

 
Alexey Viktorov:

Quindi dovete aggiungere questa condizione prima che la funzione emetta il risultato. Cosa c'è di così difficile?

La funzione non dovrebbe restituire false se la condizione non è soddisfatta?

#property strict
#property indicator_chart_window
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
if(rates_total<100) return(0);
int limit=rates_total-prev_calculated;
if(limit>200)limit=200;
   for(int i=limit; i>0; i--)
     {
     
     
     Comment(f_ma(Symbol(),0,i));
     }
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
  //-------------------
  bool f_ma(string sy="0",int tf=0,int nf=0) 
  {
   if(sy=="" || sy=="0") sy=Symbol();
   double f=0,MA=0,fr1,fr2;
   int    d=MarketInfo(sy,MODE_DIGITS),s;
   if(d==0) if(StringFind(sy,"JPY")<0) d=4; else d=2;
   int    i,k=iBars(sy,tf),kf,num_bar;

   for(i=nf+2; i<k; i++) 
     {
      f=iFractals(sy,tf,MODE_UPPER,i);
      MA=iMA(NULL,0,35,0,MODE_EMA,PRICE_CLOSE,i);
      if(f!=0) 
        {
        // kf++;
         if(f>MA) {num_bar=i; fr1=NormalizeDouble(f, d);break;}
         
        }
     }
     //
      for(i=nf+ num_bar; i<k; i++) 
     {
      f=iFractals(sy,tf,MODE_UPPER,i);
      if(f!=0) 
        {
        fr2=NormalizeDouble(f, d);
        if(fr2<fr1) return(true);
        }
     }
     
     
   return(false);
  }
  
 
Ghabo:

La funzione non dovrebbe restituire false se la condizione non è soddisfatta?

Controlla che iFractals restituisca zero o un valore vuoto.

 
Alexey Viktorov:

Controlla che iFractals restituisca zero o un valore vuoto.

C'è un valore vuoto nella finestra dei dati. Sostituitoif(f!=0) con if(f!=EMPTY_VALUE), nessun cambiamento nel risultato.
 
Ghabo:
C'è un valore vuoto nella finestra dei dati. Sostituitoif(f!=0) con if(f!=EMPTY_VALUE), il risultato è invariato.

1. Ho detto controllare, non sostituire. iFractals restituisce 0 se non c'è nessun frattale. Non lo uso regolarmente e naturalmente non intaso i resti non essiccati della memoria con queste banalità.

2. La funzione, anche se scritta in modo terribile, funziona ancora bene.

3. L'ultimo valore viene visualizzato in Comment. Sostituiscilo con

     Print("************ ", f_ma(Symbol(), 0, 0));
E vedere quante volte si stampa
2018.07.30 21:02:43.656 00 EURUSD.e,H1: ************ true