Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 15

 
Vitalie Postolache:
I cicli devono essere contati in ordine inverso, daOrdersTotal()-1 a 0.
Quando si chiude in un ciclo.
 
Vitalie Postolache:
I cicli devono contare all'indietro, daOrdersTotal()-1 a 0.
Queste sono le funzioni di Kim e funzionano senza mancare, il problema è un altro
 
Quindi hai accidentalmente acceso diversi consiglieri sullo stesso simbolo, molte persone l'hanno fatto.
 
Neron_76:
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.

 
Renat Akhtyamov:

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.

Questa limitazione si applica agli ordini aperti e in sospeso. Questo è il secondo caso che ho incontrato in un mese e mezzo; tutti gli altri casi sono corretti.
 
Neron_76:
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:

if(NumberOfPositions(Symb,-1,Magik_number)==0 && NumberOfOrders(Symb,-1,Magik_number)==0 && Delta_Buy<Low[1] && sar>Close[1]) {
  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);
}
 
Vitaly Muzichenko:

Provate in questo modo:

if(NumberOfPositions(Symb,-1,Magik_number)==0 && NumberOfOrders(Symb,-1,Magik_number)==0 && Delta_Buy<Low[1] && sar>Close[1]) {
  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);
}
Ho sostituito le funzioni, funziona bene nel test. Vediamo come sarà nel trading sulla demo. Ma per qualche ragione, mi sembra, nel mio caso, sia queste che queste funzioni svolgono lo stesso compito, cioè rispondere alla domanda se ci sono ordini e posizioni.
 
Neron_76:
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 ripeto la doppia impostazione dell'ordine, allora la funzione"SetOrder" dovrebbe essere riconsiderata, forse dà due richieste, dopo la prima richiesta non c'è uscita dalla funzione, e ha tempo per inviare la seconda.
 
Vitaly Muzichenko:
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 questo è il caso, perché questo non accade sempre, succede qualcosa tra un tick e l'altro? Non sono molto bravo in questo.
 
Neron_76:
Se è così, perché non succede sempre, qualcosa tra un tic e l'altro? Non sono molto bravo in questo.
Tra i tick di un simbolo ci possono essere tick di un altro simbolo. Se l'EA è multivaluta, vede i tick di un altro simbolo. Inoltre, gli eventi del timer - OnTimer() e OnChartEvent() possono verificarsi tra i tick - ho quasi scritto "eventi di eventi"... sarebbe una montatura...