Problema di ordini multipli - pagina 3

 
luisneves:


Ciao Kronin,

Sì, ho molto da imparare....Ora capisci che quando c'è la necessità di un valore a cui accedere dall'esterno di una funzione che deve essere a Globale.

Questo non è vero e spesso è anche una cattiva idea.

Parte della ragione per rendere parte del tuo codice in una funzione è di essere in grado di riutilizzare quel codice. Se la funzione è codificata duramente per lavorare con specifiche variabili globali può diventare meno flessibile. Dovresti considerare il passaggio di variabili alla User Defined Function . . non usare sempre variabili dichiarate globalmente. Per esempio:

//+--------------------------------------------------------------------------------+
//| ToStr function - calls DoubleToString (double, Digits) and returns the string  |
//+--------------------------------------------------------------------------------+
string ToStr(double ValueToString)
   {
   return (DoubleToStr(ValueToString, Digits));
   }

//+--------------------------------------------------------------------------------+

. . . questo non usa una variabile dichiarata globalmente, usa la variabile passata quando viene chiamato . . .

Print("Bid price is: ", ToStr(Bid) );
 
luisneves:


Ciao Kronin,

Sì, ho molto da imparare....Ora capisco che quando c'è bisogno di un valore per ottenere l'accesso dall'esterno di una funzione che deve essere a globale.

I valori che sono all'esterno sono moltiplicati per 10 perché l'EA deve funzionare anche su broker a 5 cifre. Sto usando questo blocco di codice per ottenere ciò automaticamente, ma ricevo un consiglio da WHRoeder che non è compatibile con i metalli.

Lo spread di coppia potrebbe essere variabile. Ecco perché sto usando il codice per uscire dal livello di stop.

Riguardo a questo problema "Ma ho regolato i tuoi params di input in modo che non tutti gli ordini si aprano più o meno nello stesso momento. Forse devi verificare i params di default".

Per quanto posso vedere (scusate se non lo sono...), OpenDistance mantiene come 2 pip e ReturnDistance è ora con 2 pure. Quello che vedo ora è che l'ordine si apre ma non a 2 pip di differenza. Questo sta funzionando con un tester da una piattaforma di un broker ECN (IC Markets). Questo potrebbe avere qualche importanza?

In effetti gli ordini non si aprono allo stesso tempo ma sembra che Open Distance e ReturnDist non siano presi in considerazione per ottenere la giusta distanza per aprire gli ordini.

Avete nel codice che;

Ho incluso la linea in grassetto per chiamare la funzione OpenOppositeOrder e qui non sono sicuro che questo sia giusto. Dall'altra parte non riesco a vedere dove sia il confronto del tick attuale con l'ultimo tick che è avvenuto 2 pip prima (OpenDistance).

Scusate se inizio ad annoiarvi con i miei problemi.

Cordiali saluti

Luis



Ciao Kronin,

Ho appena prendere più attenzione perché hanno chiesto ciò che lo spread è e solo cercare il Tester che qualcosa è sbagliato. Qui lo spread è 50 (5 cifre) quindi 5 in realtà. Hummm... Riavvio la piattaforma e confermo.

Luis

 
RaptorUK:

Questo non è vero e spesso è anche una cattiva idea.

Una parte della ragione per trasformare parte del vostro codice in una funzione è quella di essere in grado di riutilizzare quel codice. Se la funzione è codificata per lavorare con specifiche variabili globali può diventare meno flessibile. Dovreste considerare il passaggio di variabili alla User Defined Function . . . non usate sempre variabili dichiarate globalmente. Per esempio:

. . . questo non usa una variabile dichiarata globalmente, usa la variabile passata quando viene chiamato . . .


Ciao RaptorUK.

Grazie per il vostro intervento per mantenermi nella giusta direzione...

A proposito, hai sentito qualcosa di simile a quello che ho menzionato riguardo al problema con il Tester, cioè che in questo momento lo spread è 50 mentre venerdì non lo era?

Cordiali saluti

Luis

 
luisneves:


Ciao RaptorUK.

Grazie per il vostro intervento per mantenermi nella giusta direzione...

Cordiali saluti

Luis

Sì, l'idea della funzione non era proprio quella di dichiararli tutti come void.... Ho appena rimosso la dichiarazione nel tuo void MM() per LotSize per permettere all'EA di negoziare di nuovo... - Pensavo che ne avremmo parlato più tardi... :-)

Sul 'non aprire sul punto di livello 2 pips'
Per esempio non ho dati di tick da testare, inoltre lo spread è più di 2 pips (potrei regolarlo, ma a cosa serve, se non ho dati di tick?) Tutto questo rende difficile testare qualcosa con quel chiuso stopps affidabile.


16:21:09 _help_53198_markettorderdecnqv80 input: EquityPercent=1; FixedLotSize=0.01; Multiplier=2; LotDigits=2; StopLoss=50; TakeProfit=20; TrailingStop=2; MinimumProfit=3; Slippage=3; OpenDistance=2; ReturnDist=1; MinStop=1; MagicNumber=8012013; MaxOrders=7;
EURUSD,M1: aprire #1 comprare 0.01 EURUSD a 1.43310 ok
EURUSD,M1: inserito ordine di acquisto iniziale # 1
EURUSD,M1: modificare #1 acquistare 0,01 EURUSD a 1,43310 sl: 1,42810 tp: 1,43510 ok
EURUSD,M1: aprire #2 vendere 0.01 EURUSD a 1.43257 ok
EURUSD,M1: Ordine di vendita opposto piazzato # 2
EURUSD,M1: modificare #2 vendere 0,01 EURUSD a 1,43257 sl: 1,43757 tp: 1,43057 ok
EURUSD,M1: aprire #3 comprare 0,01 EURUSD a 1,43283 ok
EURUSD,M1: Ordine di acquisto opposto piazzato # 3
EURUSD,M1: modificare #3 acquistare 0,01 EURUSD a 1,43283 sl: 1,42783 tp: 1,43483 ok
EURUSD,M1: aprire #4 vendere 0,01 EURUSD a 1,43230 ok
EURUSD,M1: Ordine di vendita opposto piazzato # 4
EURUSD,M1: modificare #4 vendere 0,01 EURUSD a 1,43230 sl: 1,43730 tp: 1,43030 ok
EURUSD,M1: aprire #5 comprare 0,01 EURUSD a 1,43280 ok
EURUSD,M1: Ordine di acquisto opposto piazzato # 5
EURUSD,M1: modificare # 5 acquistare 0,01 EURUSD a 1,43280 sl: 1,42780 tp: 1,43480 ok
EURUSD,M1: aprire #6 vendere 0,01 EURUSD a 1,43200 ok
EURUSD,M1: Ordine di vendita opposto piazzato #6
EURUSD,M1: modificare #6 vendere 0,01 EURUSD a 1,43200 sl: 1,43700 tp: 1,43000 ok
EURUSD,M1: aprire #7 comprare 0,01 EURUSD a 1,43250 ok
EURUSD,M1: Ordine di acquisto opposto piazzato # 7
EURUSD,M1: modificare #7 comprare 0,01 EURUSD a 1,43250 sl: 1,42750 tp: 1,43450 ok
EURUSD,M1: modificare #7 acquistare 0,01 EURUSD a 1,43250 sl: 1,43267 tp: 1,43450 ok
EURUSD,M1: modificare #7 comprare 0,01 EURUSD a 1,43250 sl: 1,43283 tp: 1,43450 ok
EURUSD,M1: modificare #3 comprare 0,01 EURUSD a 1,43283 sl: 1,43300 tp: 1,43483 ok
EURUSD,M1: modificare #5 comprare 0,01 EURUSD a 1,43280 sl: 1,43300 tp: 1,43480 ok
EURUSD,M1: modificare #7 comprare 0,01 EURUSD a 1,43250 sl: 1,43300 tp: 1,43450 ok
Tester: stop loss #3 a 1.43300 (1.43300 / 1.43340)
Tester: stop loss #5 a 1.43300 (1.43300 / 1.43340)
Tester: stop loss #7 a 1.43300 (1.43300 / 1.43340)
EURUSD,M1: LastClosedTicket=7
EURUSD,M1: Ordine con ticketnr: 7 hit SL! Chiudere tutti gli ordini aperti
EURUSD,M1: chiudere #6 vendere 0,01 EURUSD a 1,43200 sl: 1,43700 tp: 1,43000 al prezzo 1,43340
EURUSD,M1: chiudere #4 vendere 0,01 EURUSD a 1,43230 sl: 1,43730 tp: 1,43030 al prezzo 1,43340
EURUSD,M1: chiudere #2 vendere 0,01 EURUSD a 1,43257 sl: 1,43757 tp: 1,43057 al prezzo 1,43340
EURUSD,M1: chiudere #1 comprare 0,01 EURUSD a 1,43310 sl: 1,42810 tp: 1,43510 al prezzo 1,43300

Dal mio punto di vista, fa quello che vuoi. Non ho mai cambiato il tuo calcolo per OpenOpposite o aprire l'ordine iniziale.

 
kronin:

Sì, l'idea con la funzione non era proprio quella di dichiararli tutti come void.... Ho appena rimosso la dichiarazione nel tuo void MM() per LotSize per permettere all'EA di commerciare di nuovo... - Pensavo che ne avremmo parlato più tardi... :-)

Sul 'non aprire sul punto di livello 2 pips'
Per esempio non ho dati di tick da testare, inoltre lo spread è più di 2 pips (potrei regolarlo, ma a cosa serve, se non ho dati di tick?) Tutto questo rende difficile testare qualcosa con quel chiuso stopps affidabile.


16:21:09 _help_53198_markettorderdecnqv80 input: EquityPercent=1; FixedLotSize=0.01; Multiplier=2; LotDigits=2; StopLoss=50; TakeProfit=20; TrailingStop=2; MinimumProfit=3; Slippage=3; OpenDistance=2; ReturnDist=1; MinStop=1; MagicNumber=8012013; MaxOrders=7;
EURUSD,M1: aprire #1 comprare 0.01 EURUSD a 1.43310 ok
EURUSD,M1: inserito ordine di acquisto iniziale # 1
EURUSD,M1: modificare #1 acquistare 0,01 EURUSD a 1,43310 sl: 1,42810 tp: 1,43510 ok
EURUSD,M1: aprire #2 vendere 0.01 EURUSD a 1.43257 ok
EURUSD,M1: Ordine di vendita opposto piazzato # 2
EURUSD,M1: modificare #2 vendere 0,01 EURUSD a 1,43257 sl: 1,43757 tp: 1,43057 ok
EURUSD,M1: aprire #3 comprare 0,01 EURUSD a 1,43283 ok
EURUSD,M1: Ordine di acquisto opposto piazzato # 3
EURUSD,M1: modificare #3 acquistare 0,01 EURUSD a 1,43283 sl: 1,42783 tp: 1,43483 ok
EURUSD,M1: aprire #4 vendere 0,01 EURUSD a 1,43230 ok
EURUSD,M1: Ordine di vendita opposto piazzato # 4
EURUSD,M1: modificare #4 vendere 0,01 EURUSD a 1,43230 sl: 1,43730 tp: 1,43030 ok
EURUSD,M1: aprire #5 comprare 0,01 EURUSD a 1,43280 ok
EURUSD,M1: Ordine di acquisto opposto piazzato # 5
EURUSD,M1: modificare # 5 acquistare 0,01 EURUSD a 1,43280 sl: 1,42780 tp: 1,43480 ok
EURUSD,M1: aprire #6 vendere 0,01 EURUSD a 1,43200 ok
EURUSD,M1: Ordine di vendita opposto piazzato #6
EURUSD,M1: modificare #6 vendere 0,01 EURUSD a 1,43200 sl: 1,43700 tp: 1,43000 ok
EURUSD,M1: aprire #7 comprare 0,01 EURUSD a 1,43250 ok
EURUSD,M1: Ordine di acquisto opposto piazzato # 7
EURUSD,M1: modificare #7 comprare 0,01 EURUSD a 1,43250 sl: 1,42750 tp: 1,43450 ok
EURUSD,M1: modificare #7 comprare 0,01 EURUSD a 1,43250 sl: 1,43267 tp: 1,43450 ok
EURUSD,M1: modificare #7 comprare 0,01 EURUSD a 1,43250 sl: 1,43283 tp: 1,43450 ok
EURUSD,M1: modificare #3 comprare 0,01 EURUSD a 1,43283 sl: 1,43300 tp: 1,43483 ok
EURUSD,M1: modificare #5 comprare 0,01 EURUSD a 1,43280 sl: 1,43300 tp: 1,43480 ok
EURUSD,M1: modificare #7 comprare 0,01 EURUSD a 1,43250 sl: 1,43300 tp: 1,43450 ok
Tester: stop loss #3 a 1.43300 (1.43300 / 1.43340)
Tester: stop loss #5 a 1.43300 (1.43300 / 1.43340)
Tester: stop loss #7 a 1.43300 (1.43300 / 1.43340)
EURUSD,M1: LastClosedTicket=7
EURUSD,M1: Ordine con ticketnr: 7 hit SL! Chiudere tutti gli ordini aperti
EURUSD,M1: chiudere #6 vendere 0,01 EURUSD a 1,43200 sl: 1,43700 tp: 1,43000 al prezzo 1,43340
EURUSD,M1: chiudere #4 vendere 0,01 EURUSD a 1,43230 sl: 1,43730 tp: 1,43030 al prezzo 1,43340
EURUSD,M1: chiudere #2 vendere 0,01 EURUSD a 1,43257 sl: 1,43757 tp: 1,43057 al prezzo 1,43340
EURUSD,M1: chiudere #1 comprare 0,01 EURUSD a 1,43310 sl: 1,42810 tp: 1,43510 al prezzo 1,43300

Dal mio punto di vista, fa quello che vuoi. Non ho mai cambiato il tuo calcolo per OpenOpposite o aprire l'ordine iniziale.


Ciao Kronin,

Sto scaricando un'altra piattaforma da un altro broker e aspetterò di testarla di nuovo e vi farò sapere i risultati.

Grazie ancora

Luis

 

Ciao Kronin,

Ho appena confermato che in Tester lo spread è saltato a 5 pips (50). Quindi oggi in Tester il tuo codice mostra di funzionare bene, ora l'ho messo in un conto demo ECN e vedremo.

Cordiali saluti

Luis

 

Ciao Kronin,

Un problema;

Quando l'EA parte non dovrebbe aspettare che il prezzo si discosti di 2 pip prima di aprire il primo ordine?

Quando il secondo ordine ha la condizione per aprirsi si apre nel posto giusto.

Cordiali saluti

Luis

 
luisneves:

Ciao Kronin,

Un problema;

Quando l'EA parte non dovrebbe aspettare che il prezzo si discosti di 2 pip prima di aprire il primo ordine?

Quando il secondo ordine ha la condizione per aprirsi si apre nel posto giusto.

Cordiali saluti

Luis

Ciao Luis

Beh, probabilmente dovrebbe secondo la strategia, ma ovviamente non lo fa secondo il codice...

if(OpenDistance*pt && BuyAllowed) //<-- this doesn't make any sense.

Quanto sopra è letto come if(2*0.0001 && true). Qualsiasi espressione numerica diversa da 0 viene interpretata come vera. Quindi l'espressione è sempre vera se BuyAllowed è vero.

Mi dispiace, non ho prestato attenzione alla prima apertura di una serie ed essendo solo 2 pips, non ho notato nulla di insolito.

Provate questo:

//global scope
double BuyTrigger,SellTrigger;

//init function
BuyTrigger=Ask+OpenDistance*pt;
SellTrigger=Bid-OpenDistance*pt;

//start function
  OTCurrentTick=OrdersTotal();                   //reinit OrderTotal   <<-- this is already there, place the 4 lines below after this line
  if(OTCurrentTick==0&&OTLastTick>0){
     BuyTrigger=Ask+OpenDistance*pt;
     SellTrigger=Bid-OpenDistance*pt;
  }

if(Ask>BuyTrigger && BuyAllowed)                // <-- use this instead of if(OpenDistance*pt && BuyAllowed)

if(Bid<SellTrigger && SellAllowed)
 

Ciao Kronin,

Mi dispiace annoiarti con i miei limiti nella comprensione del codice, tuttavia non è troppo tardi per imparare e sto cercando il mio massimo per entrare nel codice che hai così gentilmente fornito.

In questo momento sto testando le migliori impostazioni da utilizzare e presenterò il tuo ultimo codice aggiornato.

Grazie in anticipo per continuare a sostenermi in questi problemi (avventure...io mi sono ....)

Luis

 

Ciao Kronin,

La tua modifica funziona. Hai limitato gli ordini massimi, ma è possibile farli chiudere tutti, invece?

Ho provato a farlo con il seguente codice, ma sembra non funzionare.

if(LastClosedTicket>0|| OrdersTotal()>= MaxOrders)

Cordiali saluti

Luis

Motivazione: