Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 15
![MQL5 - Linguaggio delle strategie di trading integrato nel client terminal MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Ti stai perdendo delle opportunità di trading:
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Registrazione
Accedi
Accetti la politica del sito e le condizioni d’uso
Se non hai un account, registrati
I cicli devono essere contati in ordine inverso, daOrdersTotal()-1 a 0.
I cicli devono contare all'indietro, daOrdersTotal()-1 a 0.
Salve, ho installato il mio robot forex sul mio conto demo e sta funzionando per il secondo mese. Oggi apro il terminale e ho due ordini aperti da un segnale, anche se prima ho piazzato un solo ordine. Ho una restrizione sul numero di ordini. Quale può essere la ragione?
A giudicare dal codice, sembra che tu abbia un ordine pendente piuttosto che un ordine a mercato.
La restrizione sul numero di ordini aperti si applica solo agli ordini a mercato.
Ecco perché non c'è nessun errore e quindi nessun problema.
A giudicare dal codice, sembra che tu abbia un ordine pendente piuttosto che un ordine a mercato.
Il limite sul numero di ordini aperti si applica solo agli ordini a mercato.
Quindi non c'è nessun errore e quindi nessun problema.
La restrizione si applica agli ordini aperti e in sospeso. Questa è la seconda volta in un mese e mezzo, tutti gli altri casi sono come dovrebbero essere.
Provate in questo modo:
SetOrder(NULL,OP_BUYSTOP,Lts,sar,sar-SL*Point(),sar+TP*Point(),Magik_number);
return(0);
}
if(NumberOfPositions(Symb,-1,Magik_number)==0 && NumberOfOrders(Symb,-1,Magik_number)==0 && Delta_Sell>High[1] && sar<Close[1]) {
SetOrder(NULL,OP_SELLSTOP,Lts,sar,sar+SL*Point(),sar-TP*Point(),Magik_number);
return(0);
}
//===============================================================================================
//------------------------------- Возвращает количество позиций --------------------------------+
//===============================================================================================
int NumberOfPositions(string sy="", int op=-1, int mn=-1) {
int kp=0;
if(sy=="") sy=Symbol();
for(int i=0; i<OrdersTotal(); i++) {
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
if(OrderType()==OP_BUY || OrderType()==OP_SELL) {
if(mn<0 || OrderMagicNumber()==mn) kp++;
}}}}
return(kp);
}
//===============================================================================================
//------------------------------- Возвращает количество ордеров --------------------------------+
//===============================================================================================
int NumberOfOrders(string sy="", int op=-1, int mn=-1) {
int kp=0;
if(sy=="") sy=Symbol();
for(int i=0; i<OrdersTotal(); i++) {
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
if(OrderType()>1 && OrderType()<6) {
if(mn<0 || OrderMagicNumber()==mn) kp++;
}}}}
return(kp);
}
Provate in questo modo:
SetOrder(NULL,OP_BUYSTOP,Lts,sar,sar-SL*Point(),sar+TP*Point(),Magik_number);
return(0);
}
if(NumberOfPositions(Symb,-1,Magik_number)==0 && NumberOfOrders(Symb,-1,Magik_number)==0 && Delta_Sell>High[1] && sar<Close[1]) {
SetOrder(NULL,OP_SELLSTOP,Lts,sar,sar+SL*Point(),sar-TP*Point(),Magik_number);
return(0);
}
//===============================================================================================
//------------------------------- Возвращает количество позиций --------------------------------+
//===============================================================================================
int NumberOfPositions(string sy="", int op=-1, int mn=-1) {
int kp=0;
if(sy=="") sy=Symbol();
for(int i=0; i<OrdersTotal(); i++) {
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
if(OrderType()==OP_BUY || OrderType()==OP_SELL) {
if(mn<0 || OrderMagicNumber()==mn) kp++;
}}}}
return(kp);
}
//===============================================================================================
//------------------------------- Возвращает количество ордеров --------------------------------+
//===============================================================================================
int NumberOfOrders(string sy="", int op=-1, int mn=-1) {
int kp=0;
if(sy=="") sy=Symbol();
for(int i=0; i<OrdersTotal(); i++) {
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
if(OrderType()>1 && OrderType()<6) {
if(mn<0 || OrderMagicNumber()==mn) kp++;
}}}}
return(kp);
}
Le funzioni sono state sostituite, funziona bene nel test. Vediamo come sarà nel trading sulla demo. Ma per qualche ragione mi sembra che nel mio caso entrambe le funzioni eseguano lo stesso compito, cioè rispondono alla domanda se ci sono ordini e posizioni.
Se la doppia impostazione dell'ordine si verifica di nuovo, allora la funzione"SetOrder" dovrebbe essere rivista, forse dà due richieste, dopo la prima richiesta non c'è uscita dalla funzione, e riesce a inviare la seconda.
Se è così, perché non succede sempre, qualcosa tra un tic e l'altro? Non sono molto bravo in questo.