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

 

perché questo ciclo non finisce quando ... (Ho aggiunto la seconda condizione per i < 2000 quando ho capito che il ciclo è infinito) MQL4

cv * tvp * (double)stop < ml


double tvp  = SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_VALUE_PROFIT),
          vm   = SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN),
          vs   = SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP),
          ml   = AccountEquity() * (risk / 100.0),
          cv   = -1.0;
   
   for(int i = 0; cv * tvp * (double)stop < ml && i < 2000; i++)
     {
      if( (vm + vs * (double)i) * tvp * (double)stop < ml ) { cv = vm + vs * (double)i; Print(i," ",cv,"/",ml); };
     };


 
Alexandr Sokolov:

perché questo ciclo non finisce quando ... (Ho aggiunto la seconda condizione per i < 2000 quando ho capito che il ciclo è infinito)



Il ciclo non terminerà fino a quando

cv * tvp * (double)stop < ml

Per far terminare il ciclo quando questa condizione è soddisfatta, possiamo scrivere quanto segue nel corpo del ciclo

for(int i = 0; i < 2000; i++)
{
  if(cv * tvp * (double)stop < ml)
    break
  ...
}

o

for(int i = 0; cv * tvp * (double)stop >= ml; i++)
{
  if(i >= 2000)
    break;
  ...
}
 
Mihail Matkovskij:

In MQL4 solo in questo modo:

Risultato:


Grazie ancora per il vostro aiuto. Vi sarei molto grato se poteste anche dirmi come fare quanto segue...
Quale funzione o costrutto di linguaggio può essere usato per calcolare il valore dell'indice di un elemento della matrice che aveva l'indice prima dell'ordinamento.

Qui, ho l'array A[] prima dell'ordinamento (la linea superiore) e lo stesso array dopo l'ordinamento. Un elemento con valore 5 prima dell'ordinamento era all'indice 9
, e un elemento con valore 5 dopo l'ordinamento è all'indice 3.

La funzione trova una cella con valore 5 nella matrice ordinata e salva il numero di indice di questa cella nella matrice ordinata in W, che è uguale all'indice 3

ArraySort(А,10,0,MODE_ASCEND);

W = ArrayBsearch( A,5,WHOLE_ARRAY,0,MODE_ASCEND);

DOMANDA: Dopo ArrayBsearch(), come si può memorizzare il valore dell'indice di una cella con valore 5 in una variabile che ha un array non ordinato.

Cioè, salva il valore di 9.
Grazie per il vostro aiuto.

 
 

Ciao a tutti. Chi sa come impostare un valore negativo in un indicatore personalizzato e farlo funzionare, cioè "spostare l'indicatore rispetto al grafico del prezzo".

Esempio: se metti un valore -4 nell'indicatore della media mobile, si sposta rispetto al grafico a sinistra - e funziona.

Ma se metti questo valore nel codice dell'indicatore - allora l'indicatore smette di funzionare. e mostra tutti i valori TF in rosso.

File:
 
ANDREY:

Grazie ancora per il vostro aiuto. Vi sarei molto grato se poteste anche dirmi come fare quanto segue...
Quale funzione o costrutto di linguaggio può essere usato per calcolare il valore dell'indice di un elemento della matrice, che questo elemento aveva prima dell'ordinamento.

Qui, ho l'array A[] prima dell'ordinamento (la linea superiore) e lo stesso array dopo l'ordinamento. Un elemento con valore 5 prima dell'ordinamento era all'indice 9
, e un elemento con valore 5 dopo l'ordinamento è all'indice 3.

La funzione trova una cella con valore 5 nella matrice ordinata e salva il numero di indice di questa cella nella matrice ordinata in W, che è uguale all'indice 3

ArraySort(А,10,0,MODE_ASCEND);

W = ArrayBsearch( A,5,WHOLE_ARRAY,0,MODE_ASCEND);

DOMANDA: Dopo ArrayBsearch(), come si può memorizzare il valore dell'indice di una cella con valore 5 in una variabile che ha un array non ordinato.

Cioè, salva il valore di 9.
Grazie per il tuo aiuto.

ma non ordinare i dati a caso e senza uno scopo globale.

Dal progetto attuale: prendete un array (corto), l'output saranno gli indici degli elementi nel giusto ordine:

void BubleSortIndex5(double &data[5],int &index[5])
{
   for(int i=0;i<5;i++)
      index[i]=i;
   for(int i=0;i<4;i++) {
      for(int j=1;j<5;j++) {
         if (data[index[i]]>data[index[j]]) {
            int tmp=index[i];
            index[i]=index[j];
            index[j]=tmp;
         }
      }
   }
}


per gli array più grandi dobbiamo cambiare l'algoritmo di ordinamento (bubble non va bene per gli array grandi) - cambiatelo.

Il messaggio principale è: non toccare i dati di origine. Operare sia con riferimenti che, ancora meglio, con indici di array. Altrimenti si perdono informazioni che saranno molto necessarie in seguito.

 
ANDREY:

Grazie ancora per il vostro aiuto. Vi sarei molto grato se poteste anche dirmi come fare quanto segue...
Quale funzione o costrutto di linguaggio può essere usato per calcolare il valore dell'indice di un elemento della matrice, che questo elemento aveva prima dell'ordinamento.

Qui, ho l'array A[] prima dell'ordinamento (la linea superiore) e lo stesso array dopo l'ordinamento. Un elemento con valore 5 prima dell'ordinamento era all'indice 9
, e un elemento con valore 5 dopo l'ordinamento è all'indice 3.

Trovo una cella con valore 5 nella matrice ordinata e la funzione salva il numero di indice di questa cella nella matrice ordinata in W, che è uguale all'indice 3

ArraySort(А,10,0,MODE_ASCEND);

W = ArrayBsearch( A,5,WHOLE_ARRAY,0,MODE_ASCEND);

DOMANDA: Dopo ArrayBsearch(), come si può memorizzare il valore dell'indice di una cella con valore 5 in una variabile che ha un array non ordinato.

Questo è per salvare il valore di 9.
Grazie per il vostro aiuto.

Per questo dovete rispondere a due domande:cosa farete se:

1. Ci saranno più valori di 5, in diverse celle della matrice.

2. Non ci sarà nessun valore 5 nell'array.

Perché la funzioneArrayBsearch (per dati ordinati), nel primo caso, darà il primo indice trovato dove il valore della cella è 5, nel secondo caso, darà un elemento vicino al valore 5. Come vorresti trattare un array non ordinato non mi è chiaro.

 
sla100:

Ciao a tutti. Chi sa come impostare un valore negativo in un indicatore personalizzato e farlo funzionare, cioè "spostare l'indicatore rispetto al grafico del prezzo".

Esempio: se metti un valore -4 nell'indicatore della media mobile, si sposta rispetto al grafico a sinistra - e funziona.

Ma se metti questo valore nel codice dell'indicatore, l'indicatore smette di funzionare e mostra valori rossi per tutti i TF.

SetIndexShift.

Lo spostamento è anche specificato in iMA:

iMA

Restituisce il valore dell'indicatore tecnico della media mobile.

doppioiMA(
simbolo stringa,// nome del simbolo
inttimeframe,// timeframe
intma_period,// periodo
intma_shift,// sposta la media
intma_method,// metodo di mediazione
intapplied_price,//tipo di prezzo
intshift// shift
);

Parametri

simbolo

[Nome del simbolo i cui dati saranno usati per calcolare l'indicatore.NULL significa simbolo corrente.

timeframe

[Periodo. Può essere uno dei valori dell'enumerazioneENUM_TIMEFRAMES. 0 significa periodo del grafico corrente.

ma_periodo

[Periodo di mediazione per il calcolo dell'indicatore.

ma_turno

[Spostamento dell'indicatore rispetto al grafico del prezzo.

ma_metodo

[Metodo di mediazione. Può essere uno qualsiasi dei valori dell'enumerazioneENUM_MA_METHOD.

prezzo applicato

[Prezzo applicato. Può essere qualsiasi valore dell'enumerazioneENUM_APPLIED_PRICE.

turno

[Indice del valore ottenuto dal buffer dell'indicatore (spostamento relativo alla barra corrente di un determinato numero di periodi indietro).

Valore restituito

Valoredell'indicatore tecnico Moving Average.

Esempio:

AlligatorJawsBuffer[i]=iMA(NULL,0,13,8,MODE_SMMA,PRICE_MEDIAN,i);

https://docs.mql4.com/ru/indicators/ima

Ecco un esempio già pronto, ma in MQL5: https://www.mql5.com/ru/docs/indicators/ima ,

che può essere facilmente tradotto in MQL4.

SetIndexShift - Пользовательские индикаторы - Справочник MQL4
SetIndexShift - Пользовательские индикаторы - Справочник MQL4
  • docs.mql4.com
При положительном значении изображение линии смещается вправо, при отрицательном - влево. Значение, рассчитанное на текущем баре, рисуется с указанным смещением относительно текущего бара.
 

Non c'è alcuno spostamento nelle impostazioni dell'indicatore. Sono andato nel codice e ho messo shift -4 nel codice e l'indicatore ha smesso di funzionare - mostra che tutti i TF sono rossi. Sono seduto qui a chiedermi perché.

Торговые советники и собственные индикаторы - Алгоритмический трейдинг, торговые роботы - Справка по MetaTrader 5
Торговые советники и собственные индикаторы - Алгоритмический трейдинг, торговые роботы - Справка по MetaTrader 5
  • www.metatrader5.com
Среди программ для автоматического трейдинга можно выделить две большие категории: торговые роботы и индикаторы. Первые предназначены для совершения торговых операций на рынках, а вторые — для анализа котировок и выявления закономерностей в их изменении. При этом индикаторы могут использоваться непосредственно в роботах, образуя полноценную...
 
Mihail Matkovskij:

Per fare questo, dovete rispondere a due domande:cosa farete se

1. Ci saranno diversi valori di 5, in diverse celle della matrice.

2. Il valore 5 non sarà nell'array.

Perché la funzioneArrayBsearch (per dati ordinati), nel primo caso, darà il primo indice trovato dove il valore della cella è 5, nel secondo caso, darà un elemento vicino al valore 5. Come vorresti trattare un array non ordinato non mi è chiaro.

Grazie mille per la vostra risposta rapida. Nel mio caso ogni valore di un elemento dell'array è unico ed esiste in una sola istanza. Cioè, il valore 5, come gli altri valori, non si ripete.

Nel mio caso il valore 5 potrebbe non esistere in un array non ordinato. Significa che alcune celle nell'array non ordinato possono essere vuote.
Ma se il valore 5 non è nell'array non ordinato, allora non posso specificare il valore 5 come secondo parametro nella funzione ArrayBsearch(). Solo i valori che necessariamente esistono nell'array non ordinato entrano in questa funzione.
Grazie per il vostro aiuto

Motivazione: