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

 
gyfto:

Come posso semplificare questa espressione?

è dall'algoritmo ADX di MetaQuotes. Gli stessi MetaQuotes usano questa espressione:

- come semplificare?


Perché l'opzione più semplice non ti soddisfa?

z=0;
if(y>x && y>0) z=y;
 
Roger:


Perché l'opzione più semplice non è abbastanza buona per te?


Immagino che a volte si debba guardare un problema da un'altra angolazione. Bene, grazie.
 
gyfto:

hoz, su mi chiedevo come accorciare ulteriormente il se. Vedi: se mettiamo una variabile

abbiamo cnt=cnt+step, dove

Ma 1=cnt/cnt, a -cnt=cnt/(-1), l'unica differenza è il denominatore. Ora ricordiamo che x^0=1, x^1=x, cioè possiamo mettere la nostra variabile booleana _if nell'esponente, cioèpasso=cnt/a*(cnt^_if); dove

Ma ±a è presumibilmente 2*_if-1, cioè

Oppure semplifichiamo


Wow, hai semplificato le cose. Non capisco la sua logica.
 
Ho pensato che saremmo scesi a se... :-)))
 
zoritch:
Ho pensato che saremmo scesi a se... :-)))

Ho anche capito che non ho capito niente. Nemmeno quelle icone di incomprensibile... :)
 
hoz:

Le barre di un segno stanno salendo, cioè sono rialziste.

int LastCandlesType(int trend)
{
   int cnt,                            // Счётчик идущих друг за другом свечей с требуемыми признаками

   for (int i=i_AnyBarsToHistory; i>=1; i--)
   {
      if ((Close[i] - Open[i]) >= i_sizeOfSequentialCorrectionBar * pt)     // Если бар соответствует требуемым признакам..
          cnt++;                                                                     // .. прибавим 1 к счётчику

      if (Close[i] < Open[i])                                                        // Если бар, не соответствует основному признаку..
          cnt = 0;                                                                   // .. счётчик обнуляем
      
/*      if (i == 1)
      Print("i = ", i,"; cnt = ", cnt);*/
   }

   if (cnt == 3)                                                                     // Если 5 баров вподряд бычьи..
    return (REQUIRED_SEQUENTIAL_CANDLE_GOT);                                         //..Выходим из функции
}

Come fare in modo che quando un parametro di tendenza viene passato a questa funzione, che sarà responsabile del trasferimento della tendenza principale presunta al momento, il calcolo si basa su questo parametro.

Cioè, se trend == al ribasso, la funzione nel ciclo era come ora, e setrend == al rialzo, l' Open[i ] e il Close[i] erano scambiati nel ciclo, in modo che le condizioni fossero osservate. In questo caso, il prezzo di chiusura della barra sarà inferiore al prezzo di apertura e la differenza sarà meno.

int LastCandlesType(bool trend)//trend равен 1 (бычий) или 0 (медвежий)
   int cnt,                            // Счётчик идущих друг за другом свечей с требуемыми признаками

   for (int i=i_AnyBarsToHistory; i>=1; i--)
   {
      if ((2*trend-1)*(Close[i] - Open[i]) >= i_sizeOfSequentialCorrectionBar * pt)     // Если бар соответствует требуемым признакам..
          cnt++;                                                                     // .. прибавим 1 к счётчику

      if ((2*trend-1)*(Close[i] - Open[i]) < i_sizeOfSequentialCorrectionBar * pt)    // Если бар, не соответствует основному признаку..
          cnt = 0;                                                                   // .. счётчик обнуляем
      
/*      if (i == 1)
      Print("i = ", i,"; cnt = ", cnt);*/
   }

   if (cnt == 3)                                                                     // Если 5 баров вподряд бычьи..
    return (REQUIRED_SEQUENTIAL_CANDLE_GOT);                                         //..Выходим из функции
}

O per semplificare ulteriormente

int LastCandlesType(bool trend)//trend равен 1 (бычий) или 0 (медвежий)
   int cnt,                            // Счётчик идущих друг за другом свечей с требуемыми признаками

   for (int i=i_AnyBarsToHistory; i>=1; i--)
   {
      bool _if=((2*trend-1)*(Close[i] - Open[i])>=i_sizeOfSequentialCorrectionBar * pt); cnt=cnt+cnt/((2*_if-1)*MathPow(cnt, _if));
      
/*      if (i == 1)
      Print("i = ", i,"; cnt = ", cnt);*/
   }

   if (cnt == 3)                                                                     // Если 5 баров вподряд бычьи..
    return (REQUIRED_SEQUENTIAL_CANDLE_GOT);                                         //..Выходим из функции
}

Δ è la differenza, cioèClose[i] - Open[i], ^ è il segno di potenza. const - costante in questa espressione, cioèi_sizeOfSequentialCorrectionBar * pt, notazione matematica standard, non ho inventato nulla. 2*bVar-1 è simile a±1, bVar qui è qualsiasi variabile bool. E l'espressione 2*bVar-1 prende valori non 0 e 1, ma -1 e +1.≥ è MQL4 >=, anche questa è una notazione matematica standard.step è un passo, cioè in cnt++ step è 1, e in cnt=0 step è -cnt. Cos'altro non era chiaro dalle notazioni?

 
Non sono sicuro di come creare i log, ma sono sicuro che li avrò tutti in un giorno. Alcune società di brokeraggio con 5 cifre, questi registri per il giorno crescono a dimensioni terrificanti (1,6 gb), e lo spazio sul vps è limitato. Grazie in anticipo.
 
M2012K:
Come posso suggerire - come fare in modo che MT4 cancelli automaticamente i log liberi (o non crearli affatto)? Devo utilizzare alcune società di intermediazione con 5 cifre, questi registri iniziano a crescere in un giorno (di 1,6 gb), e il posto sul vps è limitato. Grazie in anticipo.

Puoi farlo da solo:

Biblioteca1, biblioteca2.

==============

Anche se l'ultimo file (corrente) viene aperto dal terminale. Non è facile eliminarlo. Ma puoi cancellare il contenuto, che è scritto all'inizio.

La creazione di registri non è disabilitata.

==============

1. Create un collegamento simbolico (library1) alla cartella logs nella cartella files.

2. Elimina tutti i file non necessari usando gli strumenti MQL4.

Aprire il file corrente usando MQL4. Modificatelo come volete.

4. Chiudere il file.

5. Puoi cancellare il link. Non è necessario. Mi tornerà utile più tardi.

==============

Puoi anche creare un file di script (BAT) ed eseguirlo nell'Expert Advisor. Lo script è lo stesso di cui sopra. Solo senza creare un collegamento. Lavorare con i file, naturalmente, usando gli strumenti di Windows.

 
M2012K:

Come posso consigliare di cancellare automaticamente i registri liberi (o di non crearli affatto)?

Perché su alcuni DC con 5 cifre, questi log per un giorno crescono a dimensioni spaventose (da 1,6 gb), e lo spazio sul vps è limitato. Grazie in anticipo.

registra cosa?

Qual è la differenza tra questo e gli errori EA?

 

Ciao, ho bisogno di aiuto per perfezionare il mio robot primitivo. Per cominciare, spiegherò la mia semplice strategia per rendere più chiaro dove è necessario l'aiuto e per quale scopo.

L'essenza di TS:

1. Se il prezzo di apertura è inferiore alla MA e il prezzo di chiusura è superiore, compriamo.

2. Se il prezzo di apertura è superiore alla MA e il prezzo di chiusura è inferiore, dovremmo vendere.

Se il prezzo si è spostato di X% dal prezzo più favorevole, allora chiudiamo l'ordine. Questo è simile a un trailing stop ma invece di pip X% della distanza di apertura dell'ordine e il miglior prezzo. Come è mostrato nell'immagine:

AB - distanza dall'apertura dell'ordine al prezzo più favorevole; BC=X% di AB; C - chiusura dell'ordine.

I punti 1 e 2 li ho scritti nel programma:

extern int period=50;
extern int ma_shift=0;
extern int Magic=666;
extern double lot=0.1;
extern int SL=150;


//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
  int kolpos=0;
  double ma=iMA (NULL,0,period,ma_shift,MODE_SMMA,PRICE_MEDIAN,0);
//----
   for (int pos=0; pos<OrdersTotal(); pos++)
   {
   OrderSelect (pos, SELECT_BY_POS, MODE_TRADES);
   if (OrderSymbol()==Symbol()&&OrderMagicNumber()==Magic)
   kolpos++;
   }
   if (kolpos==0)
   {
 
   if(Open[1]>ma && Close[1]<ma)  
   OrderSend(Symbol(),OP_SELL,lot,Bid,10,Bid+SL*Point,0,NULL,Magic,0,Red);
   if(Open[1]<ma && Close[1]>ma)  
   OrderSend(Symbol(),OP_BUY,lot,Ask,10,Ask-SL*Point,0,NULL,Magic,0,Green);
   
   }
   
   
  
//----
   return(0);
  }

In generale, ho bisogno di aiuto per scrivere una funzione per chiudere gli ordini per il mio TS (punto 3) e adattare il codice esistente alla funzione.

P.S. E so che il TS non è buono.

Motivazione: