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

 
ALXIMIKS:


Ho avuto tempo - ho elaborato un algoritmo per il compito, l'ho descritto (in dettaglio, forse un po' scorretto per alcune persone - le persone sono diverse in termini di redditività).

Sarcasmo? Non lo so, solo per aiutare.

scrivere il codice a qualcuno? ottimizzare di più? (sì, posso, ma ne vale la pena?)

(PS artmedia70, senza offesa, rispetto il tuo atteggiamento e la tua opinione in generale - onestamente, ma l'altro giorno tu stesso hai dato il codice di iCustom-y a dir poco non molto ottimizzato).

Qualcosa del genere dovrebbe funzionare se lo si inserisce nel controllo di una nuova barra.

Il codice sarebbe più ottimale se kilkict=iBars(sy,tf) fosse ristretto dopo un certo numero di frattali, in modo da non passare costantemente attraverso tutte le barre.

Grazie. Ho iniziato a scrivere secondo il tuo algoritmo. Ma con le bandiere, sei vicino come me a Pechino. Grazie ancora.
 
gince:
Grazie. Ho iniziato a scrivere secondo il tuo algoritmo. Ma con le bandiere, sono lontano da Pechino quanto te. Grazie ancora.


https://www.mql5.com/ru/forum/131516/page34

Laggiù - un primo articolo ha condiviso la sua esperienza. Esattamente su questo argomento.

 
tara:


https://www.mql5.com/ru/forum/131516/page34

Laggiù - un primo articolo ha condiviso la sua esperienza. Esattamente su questo argomento.


SPS
 

Quale potrebbe essere il problema?

A volte viene mostrato un errore di divisione per "O" durante un test

double LotsOptimized()
  {
   double lot=Lots;
   double Lot;
   if (isFloatLots == true)          // если флаг true то проводится оптимизация величины лота, иначе лот неизменен
     {  
        int orders=HistoryTotal();  // history orders total
        int losses=0; // number of losses orders without a break
        double loss=0;              
//---- select lot size
        double  lot_min         = MarketInfo( Symbol(), MODE_MINLOT  ); 
        double  lot_max         = MarketInfo( Symbol(), MODE_MAXLOT  ); 
        double  lot_step        = MarketInfo( Symbol(), MODE_LOTSTEP ); 
        double  lotcost         = MarketInfo( Symbol(), MODE_TICKVALUE );       
                
        lot                             = 0.0;
        double  dollarsPerPip   = 0.0;
        
        lot = AccountBalance()*MaxR/100.0;
        dollarsPerPip = lot/SL;
                
        lot = NormalizeDouble( dollarsPerPip/lotcost, 2 );      
        
        lot = NormalizeDouble( lot / lot_step, 0 ) * lot_step;
        
        if ( lot < lot_min ) lot = lot_min;
        if ( lot > lot_max ) lot = lot_max;
        
        if ( AccountFreeMarginCheck( Symbol(), type, lot ) < 10 || GetLastError() == 134 ) 
        { 
                Alert ( "Impossible to open position with lot = ", DoubleToStr( lot, 2 ), ". Not enough money." );
                return(-1);
        }
//---- return lot size
//         if(lot<0.1) lot=0.1;
           
//---- calcuulate number of losses orders without a break
           if(DcF>0)
          {  
        for(int i=orders-1;i>=0;i--)
                  {
                 if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) 
                   { 
                        Print("Ошибка в истории!"); 
                        break;
                   }
                if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) 
                  continue;
                 if(OrderProfit()>0)  break;
                if(OrderProfit()<0) losses++;loss=loss-OrderProfit();
                  }
        if(losses>=losses_orders) {Lot=NormalizeDouble(MathAbs(loss)/FV/MarketInfo(Symbol(),MODE_TICKVALUE)/TakeProfit1,1);
         }
       }
     }  
//---- return lot size
     if (Lot>lot) lot=Lot; 
   
  return(lot);
  }
 
Stells:

Quale potrebbe essere il problema?

A volte l'errore di divisione per "O" viene mostrato durante un test.


Cerca il segno "/" e vedi quali variabili dell'utente prendono parte alla divisione:

SL ;

FV ;

TakeProfit1 .

Alcuni di loro possono essere 0.

 
Stells:

Quale potrebbe essere il problema?

A volte viene mostrato un errore di divisione per "O" durante un test

Fate un test di tipo:

if(!SL==0)
   {
  dollarsPerPip = lot/SL;
   }
E così via.
 
ALXIMIKS:


Grazie ancora. Ho cercato di capire il tuo codice e di scrivere commenti. L'ho fatto per me stesso per capire e forse scriverò qualcosa di simile. Studio e cerco di capire la logica del lavoro degli altri. Allora lo provo io stesso.

Forse puoi trovare il tempo di controllare i miei commenti e correggerli se necessario. Un'altra domanda.

  if (Bufer0!=EMPTY_VALUE) 

Significa che il buffer dell'indicatore non è vuoto o questa variabile significa qualcos'altro? Il buffer dell'indicatore sarebbe

Bufer0[i]

Tutto il codice con commenti.

 int    counted_bars=IndicatorCounted();
//----
   int   a1=0,                               //преведущий фрактал (-1 ->нижний, 1 -> верхний)
         a2,                                 //нынешний фрактал  (-1 ->нижний, 1 -> верхний)
         a3,                                 //сума преведущий + нынешний
         kilkict,
         frac,                               //frac - флаг существования фракталов,
         frac1=0;                            //frac1- счетчик фракталов (+1 или 0 за цикл)
   int i;
   double Bufer0;                            //
   kilkict=iBars(NULL, 0);

   for (i=3; i<kilkict;i++){
      a2=0;frac=0;
      if(iFractals(NULL, 0, MODE_UPPER, i)>0) {            
         if (Bufer0!=EMPTY_VALUE) {          //
            a2+=1;                           //к числу фракталов добовляем 1
            frac=1;                          //флаг - фрактал есть
            frac1++;                         //счечик увеличиваем на 1
         }
      }
      if(iFractals(NULL, 0, MODE_LOWER, i)>0) {            
         if (Bufer0!=EMPTY_VALUE) {          //
            if(a2==0){
               frac1++;                      //счечик увеличиваем на 1 
               frac=1;                       //флаг - фрактал есть
            }
            a2+=-1;                          //к числу фракталов добовляем -1(т. е. уменшаем)
         }
      } 
      if (frac==0){continue;}                // если флага нет (фрактал ненайден)
      if (frac1==1){                         //если счечик равен 1,
         a1=a2; continue;
      }          
      a3=a1+a2;
      if(a3<0)           { a1=a2;continue;}//Два фрактала вниз  подряд найдено// 
      if(a3>0)           { a1=a2; continue;}//Два фрактала вверх подряд найдено //
      if(a3==0 && a1==0) { a1=a2;}// Два фрактала подряд вверх и два фрактала подряд вниз найдено //
   }

 

gince:

if (Bufer0!=EMPTY_VALUE) 

Significa che il buffer degli indicatori non è più vuoto o questa variabile significa qualcos'altro?

Questa linea può essere rimossa, perché iFractals() restituisce zero, non "valore vuoto"(EMPTY_VALUE), come assenza di frattale.

La mia domanda è la seguente: stai cercando di fare un indicatore che cercherà due frattali consecutivi? O stai cercando nel tuo EA i due frattali consecutivi più vicini alla barra corrente? Questa domanda non è di oziosa curiosità perché i metodi di ricerca nell'indicatore e nell'Expert Advisor sono diversi - l'indicatore calcola dalla fine all'inizio - dal passato al presente, e l'Expert Advisor guarda attraverso le barre dal presente al passato. Pertanto, anche le direzioni di ricerca sono diverse per l'Expert Advisor e l'indicatore.

Un'ultima domanda: quale dovrebbe essere il risultato di uscita?

 
artmedia70:

Questa linea può essere rimossa perché iFractals() restituisce zero come nessun frattale, non "valore vuoto" (EMPTY_VALUE).

La mia domanda è la seguente: stai cercando di fare un indicatore che cercherà due frattali consecutivi? O stai cercando nel tuo EA i due frattali consecutivi più vicini alla barra corrente? Questa domanda non è di oziosa curiosità perché i metodi di ricerca nell'indicatore e nell'Expert Advisor sono diversi - l'indicatore calcola dalla fine all'inizio - dal passato al presente, e l'Expert Advisor guarda attraverso le barre dal presente al passato. Di conseguenza, anche le direzioni di ricerca sono diverse nell'Expert Advisor e nell'indicatore.

E l'ultima domanda: quale dovrebbe essere l'output?



I metodi di ricerca nell'indicatore e nell'EA sono diversi - l'indicatore calcola dalla fine all'inizio - dal passato al presente, mentre l'EA guarda attraverso le barre dal presente al passato .

per (i=kilkict;i>0;i--)

Il risultato - i due superiori -> vendono (freccia in basso), i due inferiori -> comprano (freccia in alto). Il segnale apparirà +2 barre a destra del frattale. Questo è quello che vorrei vedere visivamente sulla storia all'inizio. E probabilmente avremo bisogno di un filtro.

 
ALXIMIKS:


...

qualcosa del genere...

...


Ditemi, spiegatemi, come succede che al posto di "questo" scrivono "questo"?

1. Non sai che "it" si scrive con una "e", non con una "f"?

2. Troppo pigro per spostare la mano sulla lettera "e", è più facile premere "e"?

3. non c'è un tasto "e" sulla tastiera? Se no, perché no?

4. È una specie di ponce speciale?

5. Qualche altra ragione sconosciuta. Che cos'è?

Motivazione: