fatto un 2 EMA cross EA, bisogno di consigli - pagina 4

 
prupru:

Ora ho un problema più grande, il mio broker tende a eseguire parzialmente gli ordini.

Gentile cliente,

La informiamo che il suo ordine è stato aperto parzialmente (2.32 lotti su 15.84) al prezzo 587.318.

Se dovesse avere ulteriori domande su questo problema, non esiti a contattarci.

Cordiali saluti,

Broker.

Ecco cosa dice il supporto:

Vi informiamo che durante i periodi di alta volatilità o bassa liquidità, gli ordini limite possono essere eseguiti parzialmente. Questo significa che la posizione sarà riempita immediatamente in tutto o in parte se il prezzo è soddisfatto. Nel suo caso il suo ordine è stato eseguito parzialmente, ecco perché ha ricevuto la lettera di notifica.

Ho capito come chiudere tutti gli ordini nonostante siano stati chiusi parzialmente, devo solo fare Close all Orders while OrdersTotal() > 0, ma non so ancora cosa fare quando gli ordini si aprono parzialmente.

modifica:

Ho appena realizzato che devo controllare gli ordini Symbol e magicnumber, è un po' più difficile

edit: ecco la funzione close all orders che dovrebbe chiudere gli ordini anche con chiusura parziale


//Close all my Orders
void CloseAllOrders()
{
int notMyOrders = 0;

 while (OrdersTotal()>notMyOrders)
 {
 notMyOrders = 0;
 for(int i = OrdersTotal()-1; i >= 0 ; i--)
   {
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)        break;
   if(OrderMagicNumber()!=MagicNumber || OrderSymbol()!=Symbol()) {notMyOrders++; continue;}
   if(OrderType()<= 1)CloseOrder();
         
   }
 }
return;
}  
riscritto
 
deVries:

riscritto


wow!

Questo è un po' difficile per me, l'ho letto tipo 4 o 5 volte prima di capirlo. Grazie!

e... cosa succede se OrderSelect ritorna falso?

Quanto spesso OrderSelect restituisce false? È possibile?

 
prupru:


wow!

Questo è un po' difficile per me, l'ho letto tipo 4 o 5 volte prima di capirlo. Grazie!

e... cosa succede se OrderSelect restituisce false?

Quanto spesso OrderSelect restituisce false? È possibile?


for(int i = OrdersTotal()-1; i >= 0 ; i--)
   {
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)        break;

i= 0

ritorna dal ciclo

i = -1

if(OrderSelect(-1,SELECT_BY_POS,MODE_TRADES)==falso) break; // ==> fine del controllo delle compravendite interrompiamo il ciclo

prossimo CloseOrder()

//CloseOrder
void CloseOrder()
{double PR=0;
 while(!IsTradeAllowed()) Sleep(10);
 RefreshRates();
 if(OrderType()==OP_BUY)  PR=Bid;
 if(OrderType()==OP_SELL) PR=Ask;
 if(!OrderClose(OrderTicket(),OrderLots(),PR,Slippage,CLR_NONE))
  {
   Print("Close order error: ",GetLastError());
   Print("Type ", OrderType()," PR ",PR, " Ask ", Ask, " Bid ", Bid, " OrderTicket ", OrderTicket(), " OrderLots ", OrderLots());
  }
return;}
//--------------------------- end of close order

quali errori comuni possono essere restituiti da GetLastError()

se la chiusura fallisce potrebbe fallire anche la prossima per un errore come tradecontext troppo occupato o altri errori...

Quindi cosa si può fare per evitare molte di queste situazioni?

 
deVries:


Quindi cosa si può fare per evitare che accadano molte di queste situazioni?

Non lo so ancora. Devo pensarci su.

Ora sono bloccato con un altro problema.

Ho messo il mio EA su un VPS windows 2003 e ora sta restituendo l'errore "terminated by timeout", ma non ho mai visto un tale errore sul mio PC di casa.

E l'errore si presenta non nel momento in cui il mio mentre chiude e apre i cicli di ordini in esecuzione, ma quando l'expert jush controlla l'incrocio e va inattivo.

Voglio dire, il programma controlla l'apertura di una nuova barra, trailingstop = 0 quindi nessuna chiamata alla funzione trailing stop, poi se la nuova barra si è aperta controlla l'incrocio EMA, non c'è nessun incrocio (le volte che ho avuto errori di timeout le linee EMA erano lontane dall'incrocio), quindi il programma ritorna(0)

Non ci sono cicli! Come può essere terminato dal timeout?

 
prupru:

non lo so ancora. Devo pensarci su.

Ora sono bloccato con un altro problema.

Ho messo il mio EA su un VPS windows 2003 e ora sta restituendo l'errore "terminated by timeout", ma non ho mai visto un tale errore sul mio PC di casa.

E l'errore si presenta non nel momento in cui il mio mentre chiude e apre i cicli di ordini in esecuzione, ma quando l'expert jush controlla l'incrocio e va inattivo.

Voglio dire, il programma controlla l'apertura di una nuova barra, trailingstop = 0 quindi nessuna chiamata alla funzione trailing stop, poi se la nuova barra si è aperta controlla l'incrocio EMA, non c'è nessun incrocio (le volte che ho avuto errori di timeout le linee EMA erano lontane dall'incrocio), quindi il programma ritorna(0)

Non ci sono cicli! Come può essere terminato dal timeout?


questo non è un ciclo ??

while(!IsTradeAllowed()) Sleep(10);
 
deVries:


questo non è un ciclo?


Intendo dire che durante il tempo in cui l'EA è stato terminato le linee EMA erano lontane dall'incrocio, quindi la funzione NewOrder non è stata chiamata, quindi il ciclo di cui stai parlando (che è all'interno della funzione NewOrder) non è stato eseguito.

aggiunta condizione IsStopped

while( (!IsTradeAllowed()) && (!IsStopped()) ) Sleep(10);
while ( (LotRemains>0) && (!IsStopped()) )
while ( (OrdersTotal()>0) && (!IsStopped()) ) 
 
forse l'errore di timeout salta fuori perché ho finito le risorse del processore del VPS. Sono passato a un piano più costoso e non li vedo finché non eseguo qualcosa di pesante come windows uodate