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

 
Roman Sharanov:

Ho anche trovato un grave inconveniente, troppe chiamate a CopyClose()

Potete dirmi come copiare le quotazioni da un array di coppie di valute in un ciclo?

Sembrerebbe un doppio array, ecco perché MQL non lo supporta, come %.

MQL4 sembra funzionare con array dinamici bidimensionali. Potete cambiare la prima dimensione con ArayResize(), e passare la seconda aCopyClose()

O una soluzione universale da parte degli sviluppatori, perché gli array dinamici bidimensionali non funzionano in MQL5, avvolgere un array unidimensionale in una struttura e creare un array di tali strutture.... Se ci prendi la mano, considera che hai quasi creato una classe, ed è più ottimale - una classe con metodi che caricano i dati e li memorizzano nelle proprietà della classe (campi)
 
Igor Makanu:

MQL4 sembra funzionare con array dinamici bidimensionali, usate ArayResize() per cambiare la prima dimensione eCopyClose() per cambiare la seconda.

o una soluzione universale da parte degli sviluppatori, perché gli array dinamici bidimensionali non funzionano in MQL5, avvolgere un array unidimensionale in una struttura e creare un array di tali strutture.... Se ci prendi la mano, considera che hai quasi creato una classe, ed è più ottimale - la classe con il metodo che carica i dati e li memorizza nelle proprietà della classe (campi)

Grazie e proverò

 

Un'altra domanda sull'indicatore, non so cos'altro fare qui

Ho bisogno di stampare la differenza tra la chiusura delle coppie inserite e la media mobile delle stesse.

Non so cos'altro fare.

#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 4
#property indicator_plots 2
#property indicator_type1 DRAW_COLOR_LINE
#property indicator_style1 STYLE_SOLID
#property indicator_type2 DRAW_LINE
#property indicator_style2 STYLE_SOLID
#property indicator_width1 1
#include <MovingAverages.mqh>

input string active_1 = "EURUSD";
input string active_2 = "USDJPY";
input ENUM_TIMEFRAMES timeframe = PERIOD_H1;
input int ma_period = 30;

double firstBuffer[], secondBuffer[], dataBuffer[], maBuffer[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0, dataBuffer, INDICATOR_DATA);
   SetIndexBuffer(1, maBuffer, INDICATOR_DATA);
   SetIndexBuffer(2, firstBuffer, INDICATOR_CALCULATIONS);
   SetIndexBuffer(3, secondBuffer, INDICATOR_CALCULATIONS);
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
  {
//---

   CopyClose(active_1,timeframe,0,rates_total,firstBuffer);
   CopyClose(active_2,timeframe,0,rates_total,secondBuffer);

   int first, bar;
   if(prev_calculated == 0) first = begin; else first = prev_calculated - 1;

   for(bar = first; bar<rates_total; bar++){
      dataBuffer[bar] = firstBuffer[bar]-secondBuffer[bar];
   }

   ExponentialMAOnBuffer(rates_total,prev_calculated,begin,ma_period,dataBuffer,maBuffer);
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
Igor Makanu:

Gli ordini dovrebbero essere enumerati in un ciclo, non ad ogni tick... Per essere più precisi, è arrivato un tick e tutti i vostri ordini nel ciclo sono stati contati: for(j=0;j<OrderTotal;j++)

OrdersTotal() mostra quanti ordini sono aperti (inclusi gli ordini pendenti, inclusi gli ordini su tutti i simboli... in totale... Ecco quanti ordini sono aperti nel terminale - ecco quanti )))).

La numerazione degli ordini è come negli array, da 0 a OrdersTotal()-1 - questo è l'ultimo ordine, e probabilmente hai un numero di biglietto inesistente [OrdersTotal()] o qualche altra informazione nel giornale su ogni tick, che è difficile da indovinare.

Sì, lo voglio - e voglio che passi attraverso tutti gli ordini. La funzione era un po' diversa all'inizio, ma l'ho semplificata il più possibile nella speranza di trovare la causa e sistemarla. Il ritracciamento consecutivo completo avviene solo quando i tick sono rari o dopo che rimuovo l'EA dal grafico e non arrivano nuovi tick.

Ho sempre pensato che se l'EA è entrato nel corpo di una funzione, non dovrebbe reagire ad altri tick finché non esce dal ciclo, ma sembra che non sia così. Come evitare questa situazione?

int test()
{
int totale;
totale = OrdiniTotali();
log("totale = " + totale +"; ");

per (int j = 0; j < totale; j++)
{
log("j = " + j +"; ");
}
ritorno(0);
}

 
Андрей:
Perché abbiamo bisogno di informazioni su tutti gli ordini ogni tick? Non sarebbe meglio introdurre delle restrizioni nella visualizzazione dell'ordine, per esempio ogni nuovo minuto, cinque minuti, ..., ora?

Il problema non è nemmeno che ho bisogno di informazioni per ogni tick, ma che, se ho capito bene, il ciclo non ha il tempo di finire prima che arrivi un nuovo tick e il nuovo tick in qualche modo rompe il conto. Ecco un altro screenshot, in modo da non dover cercare il precedente. Mostra che l'EA ha contato fino a 52 e poi è saltato a 93. Ho avuto difficoltà a credere che questo sia dovuto ai nuovi tick, ma non riesco a trovare nessun'altra ragione, perché con tick rari il conto finisce bene, così come l'ultimo ciclo dopo che l'EA è stato rimosso dal grafico.

Ho già semplificato il codice il più possibile:

int test()
{
int totale;
totale = OrdiniTotali();
log("totale = " + totale +"; ");

per (int j = 0; j < totale; j++)
{
log("j = " + j +"; ");
}
ritorno(0);
}

File:
test.jpg  82 kb
 
Artyom Trishkin:

Come fa a saperlo? Non è così.

Finché tutti i calcoli iniziati con l'arrivo del tick non sono completati, tutti i tick successivi vengono saltati.

Come ho scritto poco sopra, ho la stessa situazione, solo che l'ho già semplificata fino a un certo punto e sono arrivato alla conclusione che non solo non posso fare normalmente alcun calcolo, ma solo passare attraverso gli ordini uno per uno e stampare i loro numeri nel registro.

Anch'io ho sempre creduto che "Finché tutti i calcoli iniziati con l'arrivo di un tick sono stati completati, tutti i tick successivi sono saltati". Vorrei che fosse così, ma non riesco a trovare nessun'altra ragione, a parte le nuove zecche, ancora.

 
Artyom Trishkin:

Nessuno lo dirà senza il codice.

Ecco un codice estremamente semplificato, che ha lo stesso problema - i nuovi tic gettano via l'uscita successiva dei numeri d'ordine.

int test()
{
int total;
total = OrdersTotal();
log("total = " + total +"; ");

for (int j = 0; j < totale; j++)
{
log("j = " + j +"; ");
}
return(0);
}

 
Algotrader18:

Ecco un codice estremamente semplificato che ha lo stesso problema - i nuovi tic gettano via l'uscita sequenziale dei numeri d'ordine.

int test()
{
int totale;
totale = OrdiniTotali();
log("totale = " + totale +"; ");

per (int j = 0; j < totale; j++)
{
log("j = " + j +"; ");
}
ritorno(0);
}

Questo codice compila davvero senza errori? Non ci credo...
 
Roman Sharanov:

Un'altra domanda sull'indicatore, non so cos'altro fare qui

Ho bisogno di stampare la differenza tra la chiusura delle coppie inserite e la media mobile delle stesse.

Alla fine mostra solo la differenza senza MA, qual è il problema?

Questo è forte!

Romano!

Io, per esempio, sono un trader di successo con 20 anni di esperienza.

Non capisco perché hai bisogno di "la differenza tra le chiusure delle coppie inserite euna media mobile di esse".

Inoltre, sapete come costruire una media mobile di queste differenze? - Fantastico!

Puoi semplicemente disegnare la media mobile delle quotazioni? - Anche no?

Allora qual è il problema?

 
Algotrader18:

Ecco un codice estremamente semplificato che ha lo stesso problema - i nuovi ticchettii cancellano l'uscita sequenziale dei numeri d'ordine.

int test()
{
int totale;
totale = OrdiniTotali();
log("totale = " + totale +"; ");

per (int j = 0; j < totale; j++)
{
log("j = " + j +"; ");
}
ritorno(0);
}

questo codice funziona, fatelo per analogia:

int NumberOfOrders(int magic_)
  {
   int i,res=0,k=OrdersTotal(); string sy=Symbol();
   for(i=0; i<k; i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if((OrderMagicNumber()==magic_) && (OrderSymbol()==sy)) res++;
        }
     }
   return(res);
  }
Motivazione: