EA mescola ordini BUY e SELL - pagina 3

 
WHRoeder:

int OrderType = OrderType() non va bene, uno potrebbe nascondere l'altro (le dichiarazioni locali nascondono i globali senza errori).

int orderType = OrderType()

Il codice originale è . . . .

int orderType;
   for(cnt = total-1; cnt >= 0; cnt--)
   {
      while (!OrderSelect(cnt, SELECT_BY_POS)) {Sleep(500);}
      orderType = OrderType();

. . . che è effettivamente lo stesso di quello che stai suggerendo?

Penso che dvarrin stia dicendo che il suo problema risiede nel numero del biglietto.

 

no, non lo è.

Iltipo di ordine dichiarato all'esterno del ciclo trasferirà effettivamente il valore di orderType al prossimo ciclo e anche se si verifica un errore, quel valore entrerà nella condizione successiva.

Se dichiarate all'interno del ciclo con l'impostazione immediata del valore di OrderType() non ci sarà spazio per tale errore.

(forse non è il problema di OPs, ma può impedire che altri accadano) cosa c'è da non provare?

Anche mezzo secondo a riposo è un po' esagerato. Mentre il ciclo dovrebbe andare bene con 10 millisecondi di sleep timer senza alcun impatto sul vostro carico di cpu (beh quasi :P)

 
forexCoder:

no, non lo è.

Il tipo di ordine dichiarato all'esterno del ciclo trasferirà effettivamente il valore di orderType al prossimo ciclo e anche se si verifica un errore, quel valore entrerà nella condizione successiva.

Se dichiarate all'interno del ciclo con l'impostazione immediata del valore di OrderType() non ci sarà spazio per tale errore.

(forse non è il problema di OPs, ma può impedire che altri accadano) cosa c'è da non provare?

Anche mezzo secondo a riposo è un po' esagerato. Mentre il ciclo dovrebbe andare bene con 10 millisecondi di sleep timer senza alcun impatto sul vostro carico di cpu (beh, quasi :P)


Sospetto che il problema sia l'uso di "ask manual confirmation" durante il forward testing dell'EA, ma non capisco cosa succede esattamente.

Tutto quello che so è che non c'è modo per una variabile chiamata OrderType di interferire con un metodo con lo stesso nome e anche la posizione della dichiarazione non ha nulla a che fare con il mio problema.

Il problema è che OrderTicket(), OrderStoploss(), ... non danno i dati per lo stesso ordine dopo aver usato OrderSelect().

Se uso variabili locali e le imposto dopo la chiamata a OrderSelect() funziona, ma se uso direttamente OrderTicket() o OrderStoploss() dà valori sbagliati.


Perché nel mio codice OrderStopLoss() restituisce lo stoploss di un altro ordine all'interno della stessa iterazione del ciclo "for"?

 

Ecco il codice completo dell'EA:

Il problema è nel primo ciclo "for" del metodo updateFbOrders().

Per testarlo, aggiungo gli indicatori alligatore e frattale su un grafico e trovo un grafico dove l'ultimo frattale in alto è sopra le linee dell'alligatore e l'ultimo frattale in basso è sotto le linee dell'alligatore.

Poi dovrebbe creare ordini di acquisto e di vendita in sospeso. Se c'è stato un breakout di uno dei frattali, aprirà un ordine immediato.

Poi modificherà lo stoploss di ogni ordine ogni volta che i frattali cambiano, ma imposta lo stoploss per l'ordine sbagliato.

Controlla le finestre di avviso e cerca un messaggio come questo: Count: 1 Stoploss 1.41008000 per ordine di acquisto: 46454014 orderType: 5, e se controllate l'ordine 46454014, vedrete che in realtà è un ordine di vendita, e continuerà a modificare gli ordini anche se lo stoploss non cambia, questo perché prende il livello di stoploss sbagliato.
 

Questo è stupido. Non stai incollando tutto il codice.

Avete un

areBuyOrdersInProfitAt

che non vediamo all'interno, per favore incollala. È ormai altamente probabile che tu abbia fatto un errore da qualche altra parte. Stai usando la funzione OrderSelect da qualche altra parte?

Inoltre, dove imposti le tue variabili longSL e shortSL? Per favore incolla anche quella parte di codice.

EDIT: l'hai incollato mentre stavo scrivendo, guardando ora il nuovo post.

 
forexCoder:

Questo è stupido. Non stai incollando tutto il codice.

Avete un

areBuyOrdersInProfitAt

che non vediamo all'interno, per favore incollala. È ormai altamente probabile che tu abbia fatto un errore da qualche altra parte. Stai usando la funzione OrderSelect da qualche altra parte?

Inoltre, dove imposti le tue variabili longSL e shortSL? Per favore incolla anche quella parte di codice.

EDIT: l'hai incollato mentre stavo scrivendo, guardando ora il nuovo post.

Ciao forexCoder

Ho aggiunto l'EA al post precedente.


Ma penso che tu abbia indicato il problema: sto usando OrderSelect() nel metodo "areBuyOrdersInProfitAt". :-)))))))))))

 

Sì, come pensavo.

La areBuyOrdersInProfitAt contiene un'altra funzione OrderSelect e sovrascrive ciò che sta facendo quella nello snippet originale. Quando questa funzione areBuyOrdersInProfitAt ritorna, l'OrderSelect è cambiato, e così il biglietto. In questo caso dovresti sempre ottenere l'ultimo ordine nella tua lista qui.

 

Una volta che iniziate a usare OrderSelect in un ciclo for, passando attraverso tutti gli ordini, non potete creare un altro OrderSelect for loop al suo interno, perché quando il secondo ritorna, userete il ticket dell'ultimo ordine nel vostro trade pool.

Hai un codice piuttosto lungo, quindi non ho molta voglia di correggerlo (sry:P), ma ora hai un indicatore nella giusta direzione.

 
dvarrin:

Ma penso che tu abbia indicato il problema: sto usando OrderSelect() nel metodo "areBuyOrdersInProfitAt". :-)))))))))))

Mi fa piacere sapere che sei sulla buona strada per trovare una soluzione :-)
 
RaptorUK:
Mi fa piacere sentire che siete sulla buona strada per trovare una soluzione :-)
Grazie mille a tutti. È stato davvero un errore stupido che ho fatto :-((