Come eseguire l'EA per più coppie? - pagina 3

 

Jacques, apprezzo il tuo continuo interesse per questo thread. Sto ancora debuggando il mio EA per la sua prima valuta, ma ho intenzione di usarlo su più valute se lo trovo adatto. Su questa premessa, ho contemplato una strategia su come implementare questa nozione. Quindi, il mio interesse in questo thread.


In seguito alla vostra richiesta, ho preparato i grafici per altre tre coppie, e così facendo ho scoperto che due delle coppie avevano più di 32.000 tick in un periodo di 24 ore (il limite dei dati grafici in Excel). Di conseguenza, ho dovuto spezzare il grafico in due periodi (1° 12 ore e 2° 12 ore). Per mantenere le cose relativamente coerenti ho rotto tutte e tre le coppie in periodi di 12 ore.


Una cosa da tenere a mente, la scala verticale su questi grafici è proporzionale tra le linee orizzontali, ma la scala orizzontale NON è proporzionale al tempo (cioè non si può assumere che 1/12 dei tick rappresenti un'ora)


Penso che il grande risultato di questi grafici sia che tutte le coppie hanno periodi in un periodo di 24 ore in cui ci sono intervalli significativi tra i tick. Di conseguenza, se si combinano più coppie in un EA, penso che sarebbe saggio impiegare un ciclo "While". Il riferimento di StraightTrader a https://book.mql4.com/special/index intitolato "General Characteristics of Complex Programs" ha una buona discussione di questa tecnica e un grafico nella sezione di apertura di questo articolo.


GBPJPY 44.834 ticks in 24 ore

EURJPY 37.140 ticks in 24 ore

GBPUSD 29.313 tick in 24 ore

EURUSD 22.627 tick in 24 ore













Salute!

 
FXtrader2008:

Di conseguenza, se si combinano più coppie in un EA, penso che sarebbe saggio impiegare un ciclo "While". Il riferimento di StraightTrader a https://book.mql4.com/special/index intitolato "General Characteristics of Complex Programs" ha una buona discussione di questa tecnica e un grafico nella sezione di apertura di questo articolo.

Questo è esattamente il caso. Coppie multiple in un EA -> usa l'approccio while loop invece di iniziare l'attivazione della funzione incomming ticks.


Vorrei essere in opposizione ad una sola coppia di valute per un solo EA.

Il mio approccio a lungo termine è UN EA MULTICURRENCY MULTISTRATEGY. Ho preparato qualche tempo fa lo schema Universal Expert Advisor, che implementa alcune di queste idee.

In seguito, non incluso nel mio post, ho seguito lo sviluppo di questo codice e ho iniziato il progetto di codice Google chiamato Universaltrader. Questo progetto potrebbe soddisfare le vostre aspettative. L'unica cosa che non è stata implementata è l'approccio While cycle (facile da implementare).


Alcuni dei vantaggi di MULTICURRENCY MULTISTRATEGY EA:

  • tutte le strategie insieme
  • possibile sintonizzare/impostare tutte le strategie insieme e anche indipendentemente
  • possibile attivare/disattivare diverse strategie/coppie di valute
  • Sono sicuro che ci sono molti altri vantaggi

svantaggi:

  • possibilità di eseguire il backtest solo su una coppia di valute alla volta - devi eseguire il backtest tante volte quante coppie di valute stai negoziando, con le altre coppie disattivate
  • problema di performance - ho notato un problema di performance solo nel backtest, ma sono sicuro che nel trading reale è anche rilevante - dipende dalla complessità delle strategie implementate e dal loro numero.

Questo progetto ha bisogno di essere migliorato ancora, quindi se qualcuno ha un interesse posso invitarlo in questo progetto di codice Google


Script attuale allegato qui:

 
FXtrader2008 wrote >>

Jacques, apprezzo il tuo continuo interesse per questo thread. Sto ancora debuggando il mio EA per la sua prima valuta, ma ho intenzione di usarlo su più valute se lo trovo adatto. Su questa premessa, ho contemplato una strategia su come implementare questa nozione. Quindi, il mio interesse in questo thread.

In seguito alla vostra richiesta, ho preparato i grafici per altre tre coppie, e così facendo ho scoperto che due delle coppie avevano più di 32.000 tick in un periodo di 24 ore (il limite dei dati grafici in Excel). Di conseguenza, ho dovuto spezzare il grafico in due periodi (1° 12 ore e 2° 12 ore). Per mantenere le cose relativamente coerenti ho rotto tutte e tre le coppie in periodi di 12 ore.

Una cosa da tenere a mente, la scala verticale su questi grafici è proporzionale tra le linee orizzontali, ma la scala orizzontale NON è proporzionale al tempo (cioè non si può assumere che 1/12 dei tick rappresenti un'ora)

Penso che il grande risultato di questi grafici sia che tutte le coppie hanno periodi in un periodo di 24 ore in cui ci sono intervalli significativi tra i tick. Di conseguenza, se si combinano più coppie in un EA, penso che sarebbe saggio impiegare un ciclo "While". Il riferimento di StraightTrader a https://book.mql4.com/special/index intitolato "General Characteristics of Complex Programs" ha una buona discussione di questa tecnica e un grafico nella sezione di apertura di questo articolo.

GBPJPY 44.834 ticks in 24 ore

EURJPY 37.140 ticks in 24 ore

GBPUSD 29.313 tick in 24 ore

EURUSD 22.627 tick in 24 ore

Salute!

Grazie mille per i tuoi grafici.

Optiamo per un ciclo invece di un'attivazione in tick, sarà più scientifico per coloro che hanno bisogno di precisione al minuto e non è un grosso problema da implementare. Un altro vantaggio è che puoi attaccare l'EA a qualsiasi coppia di valute tu voglia (è utile quando disegna l'oggetto sul grafico).

Saluti

 
cloudbreaker wrote >>

E potete recuperare i prezzi di domanda e offerta più recenti per i simboli al di fuori del grafico corrente utilizzando la funzione MarketInfo().

Quindi hai le seguenti opzioni.

- Avere lo stesso EA collegato a molti grafici e operare per il simbolo nativo di ogni grafico (usando le variabili integrate Ask e Bid)

- Avere un EA collegato a un grafico specifico che esegue per tutti i simboli scelti (con la funzione MarketInfo() per i simboli non nativi) - usando solo i tick del simbolo nativo come dispositivo di attivazione

- Avere EA master e slave collegati a diversi grafici dove uno è innescato dall'altro (ad esempio, uno scrive un valore in un file, l'altro legge costantemente il file fino a trovare questi dati e poi negozia)

In questo momento, sto usando la più semplice di queste strategie - ho un EA su tre timeframe di quattro valute, quindi dodici in tutto. Sono tutti impostati per essere eseguiti sul primo tick del timeframe. Tuttavia, sto avendo un problema in quanto MT4 non sempre esegue tutti gli EA. Ho messo una dichiarazione di stampa subito dopo la funzione di avvio solo per vedere cosa stava succedendo, e stava arrivando solo a tre dei quattro EA di H1 per esempio, ma mancava diverse coppie diverse volte, e l'EA era identico tranne che per le impostazioni di ottimizzazione per ogni coppia.

Domanda - MT4 esegue solo un EA alla volta quando più EA sono impostati per essere eseguiti contemporaneamente? L'esecuzione di un EA dipende in qualche modo da quella di un altro (a parte il fatto che il contesto di trading è occupato), o sono completamente indipendenti?

Se è così, potrei usare la seconda opzione, sto solo cercando di mantenere l'EA il più semplice possibile, perché almeno per me, più complessità scrivo, più errori faccio.

 
joetrader:

In questo momento, sto usando la più semplice di queste strategie - ho un EA su tre timeframe di quattro valute, quindi dodici in tutto. Sono tutti impostati per essere eseguiti sul primo tick del timeframe. Tuttavia, sto avendo un problema in quanto MT4 non sempre esegue tutti gli EA. Ho messo una dichiarazione di stampa subito dopo la funzione di avvio solo per vedere cosa stava succedendo, e stava arrivando solo a tre dei quattro EA di H1 per esempio, ma mancava diverse coppie diverse volte, e l'EA era identico tranne che per le impostazioni di ottimizzazione per ogni coppia.

Domanda - MT4 esegue solo un EA alla volta quando più EA sono impostati per essere eseguiti contemporaneamente? L'esecuzione di un EA dipende in qualche modo da quella di un altro (a parte il fatto che il contesto del trade è occupato), o sono completamente indipendenti?

Se è così, potrei usare la seconda opzione, sto solo cercando di mantenere l'EA il più semplice possibile, perché almeno per me, più complessità scrivo, più errori faccio.

Ho più EA in esecuzione sui grafici senza problemi di questo tipo. Per quanto posso dire, funzionano simultaneamente, l'unico momento in cui si accorgono l'uno dell'altro è quando il contesto di trading è usato da uno di loro. Per quanto riguarda l'EA stesso è completamente indipendente - ognuno ha la sua copia di variabili, ecc. Fammi capire bene: stai eseguendo 12 EA collegati a 12 grafici? Forse hai problemi di memoria?

 
gordon wrote >>

Ho più EA in esecuzione sui grafici senza problemi di questo tipo. Per quanto posso dire, funzionano simultaneamente, l'unico momento in cui si accorgono l'uno dell'altro è quando il contesto di trading è usato da uno di loro. Per quanto riguarda l'EA stesso è completamente indipendente - ognuno ha la sua copia di variabili, ecc. Fammi capire bene: stai eseguendo 12 EA collegati a 12 grafici? Forse hai problemi di memoria?

Esatto. 12 EA su 12 grafici. Un computer abbastanza nuovo con 6GB di memoria, quindi non penserei che sia la memoria, ma vale la pena considerare, e non lo escludo. Ma hai risposto alla mia domanda: se gli EA dovrebbero essere in grado di funzionare simultaneamente, allora forse sto facendo qualcosa di sbagliato. Non è la prima volta! Controllerò il codice e studierò ancora un po'. Grazie per il tuo aiuto.

 
State eseguendo i grafici in istanze separate del client MT4? Se stai aprendo tutti i grafici in un'istanza, allora condivideranno un unico contesto di trading e dovrai codificare la logica per condividere quel contesto - se il comportamento dei tuoi EAs significa che più di uno sta probabilmente eseguendo un'operazione di trading allo stesso tempo. CB
 
cloudbreaker wrote >>
Stai eseguendo i grafici in istanze separate del client MT4? Se stai aprendo tutti i grafici in un'istanza, allora condivideranno un unico contesto di trading e dovrai codificare la logica per condividere quel contesto - se il comportamento dei tuoi EAs significa che più di uno è probabile che stia eseguendo un'operazione di trading allo stesso tempo. CB

Sì - li sto eseguendo sullo stesso client MT4. Ma sto usando una delle soluzioni di trade context busy di questo articolo https://www.mql5.com/en/articles/1412 e non ottengo nessun errore di trade context busy.

Non sembra nemmeno arrivare al punto in cui tenta di aprire una posizione. Sembra che non avvii affatto l'EA per alcuni. Dico questo perché ho messo una dichiarazione di stampa all'inizio della mia funzione di avvio.

Ecco la mia funzione di avvio:

void start()
{
//---- fare trading solo per i primi tick della nuova barra
if(Volume[0]>1) return;
Print("Tick Check");

if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
else CheckForClose();
}

Sto facendo trading su CADJPY,EURCHF,GBPUSD, & USDJPY

E ottengo questo:

2010.01.22 8:59:45 [EAName]USDJPY,H1: Tick Check

2010.01.22 8:59:45 [EAName]CADJPY,H1: Tick Check

2010.01.22 8:59:45 [EAName]GBPUSD,H1: Tick Check

2010.01.22 9:59:45 [EAName]EURCHF,H1: Tick Check

2010.01.22 9:59:46 [EAName]GBPUSD,H1: Tick Check

2010.01.22 9:59:46 [EAName]CADJPY,H1: Tick Check

In alcune ore tutti e quattro saranno scambiati, in altre solo tre. Se è un'ora che gli H4 sono scambiati, tre di loro potrebbero essere scambiati, ma di solito non tutti e quattro insieme a tre o quattro degli H1.

Ho creato un workaround in cui aumento il volume a 3 o 4 tick solo per essere sicuro che tutto si scambi, ma sto cercando di capire meglio MetaTrader in modo da poter risolvere il problema alla radice.

Quindi la mia domanda è - dal momento che il mio EA ha solo un tick da eseguire, potrebbe eseguire ogni EA contemporaneamente, e forse questo è il motivo per cui non sono tutti in esecuzione? Ho un ciclo nel mio EA che confronta fino a 1500 dei frattali passati per trovare uno stoploss, quindi questo potrebbe richiedere del tempo.

Di nuovo, potrebbe esserci un problema nel mio codice da qualche parte.

 
Immagino che tu abbia un problema con il tuo codice e questo non ha nulla a che fare con l'argomento degli EA multipli. Devi individuare il problema per quelli che non partono usando i metodi standard Print()/Alert() per vedere cosa non funziona.
 
tigersoft:
Ecco un semplice codice per aprire EURUSD e USDCHF su un grafico. Anche ea è aggiunto su un altro grafico in modo da aprire EURUSD e USDCHF.

//+------------------------------------------------------------------+
//|                                                          jkh.mq4 |
//|                      Copyright © 2009, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2009, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

bool wannaBuy = true;
bool wannaBuy1 = true;
extern double LotSize = 0.01;
extern string symbol1 = "EURUSD";
extern string symbol2 = "USDCHF";
extern int MaxDifference = 6;
extern int Slippage = 3;
extern int Magicnumber1 = 786;
extern int Magicnumber2 = 123;
int sendticket = 3;
string pairs[18];

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
pairs[0] = symbol1;
pairs[1] = symbol2;
wannaBuy = true;
wannaBuy1 = true;

//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
   // Send order for EURUSD & USDCHF
   if (wannaBuy) {   
   int ticket1;
   RefreshRates();
   ticket1 = OrderSend(symbol1, OP_BUY, LotSize, MarketInfo(symbol1,MODE_ASK), Slippage, 0, 0, 0,0,Magicnumber1,0) & OrderSend(symbol2, OP_BUY, LotSize, MarketInfo(symbol2,MODE_ASK), Slippage, 0, 0, 0,0,Magicnumber2,0);
   if (ticket1 <0 )
   {
   Print ("OrderSend failed with error #", GetLastError());
   return(0);
   }
   wannaBuy = false;
   }

//----
   return(0);
  }
//+------------------------------------------------------------------+

non funziona?

per il back testing
ha ottenuto l'errore orderend 4106

nome simbolo sconosciuto per USDCHF per la funzione ordersend

Ordersend funziona per EURUSD se scelgo il simbolo EURUSD per l'impostazione o il grafico EURUSD.

Se cambio con un altro grafico, otterrò un simbolo sconosciuto sia per EURUSD che per USDCHF.

Grazie in anticipo