[Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 4. - pagina 579

 

eh... perché la condizione per il controllo degli ordini aperti non potrebbe essere scritta così:

se OrdiniTotali() > 0

tutto è chiaro e comprensibile... sarebbe...

È un'ora che cerco di capire come scrivere questa condizione...

 
lottamer:

eh... perché la condizione per il controllo degli ordini aperti non potrebbe essere scritta così:

se OrdiniTotali() > 0

tutto è chiaro e comprensibile... sarebbe...

È un'ora che cerco di capire come scrivere questa condizione...


È possibile, ma si attiverà se ci sono ordini aperti o pendenti su qualsiasi simbolo.
 
rigonich:

Perché no? è possibile, ma sarà attivato se ci sono ordini aperti o in sospeso su qualsiasi strumento.


Vorrei che funzionasse - ho una posizione e uno strumento.

Ma non funziona!

Dice che c'è un errore nel codice.

a questo

---------------------------

int start()

{

//----

se OrdiniTotali()>0

PlaySound ("alert.wav");

//----

ritorno(0);

}

-----------------------------

commette 8 errori!!!

 

//---------------------------

int start()

  {

//----

   if (OrdersTotal()>0)

PlaySound ("alert.wav");

//----

  }

 return(0);

 
//-----------------------------

Che ne dite di questo?
 
BeerGod:

Che ne dite di questo?


:)))))))))))))))))))

stupendo! Grazie a voi

 
Desead:


Quindi deinit viene chiamato quando elimino un robot da un grafico - non posso tracciare questa condizione in nessun altro modo..... è probabilmente più facile scrivere uno script separato che cancella tutti i restanti robot in sospeso, non c'è altro modo.

A proposito, un altro pensiero sull'argomento:

Penso di aver risolto il problema della cancellazione degli ordini in sospeso. Determino la quantità di ordini "necessari" (da rimuovere) in una funzione separata, chiamo questa funzione e poi while con condizione (Totale>0), poi il ciclo di rimozione for(int i=Totale-1;i<=0l; i--), di nuovo calcolando"necessario" e contatore di tentativi di rimozione con uscita dawhile quando il livello dato è raggiunto. In questo modo tutto viene cancellato.

Un ciclo infinito può verificarsi qui nel caso in cui uno degli ordini scompaia dopo il momento del conteggio per qualsiasi motivo


Perché non si può fare? Per esempio, create una variabile globale a livello di terminale, assegnatele un valore e controllate l'avvio e cambiate il valore di questa variabile tramite service -->global variables prima che sia spenta.
 
BeerGod:

E quindi?


E posso chiedere, cosa stanno cercando di fare con questo?

for(int i=0; i<OrdersTotal(); i++)

sembra che stiano cercando di contare le posizioni aperte usando il metodo della forza bruta...

 

Buona giornata!!! Non riesco a trovare una bella soluzione alla situazione. Ecco una tipica impostazione dell'ordine. Ma se do zero al mio robot nei parametri, cioè niente stop e takeprofits, non funziona niente.

 if(!srabotka){
           OrderSend (Symbol( ), OP_BUY, lot ,NormalizeDouble(Ask, Digits), 5, NormalizeDouble( Ask- (stop*Point),Digits),   NormalizeDouble( Ask+( 45*Point),Digits), NULL, 450, 0, CLR_NONE);
           int Error=GetLastError();if (Error==0){  
           Sleep(2000); RefreshRates(); 
           OrderSend (Symbol( ), OP_SELL,  lot ,NormalizeDouble(Bid, Digits), 5, NormalizeDouble( Bid+ (stop*Point),Digits), NormalizeDouble( Bid-( 45*Point),Digits), NULL, 450, 0, CLR_NONE); 
           Error=GetLastError();
           if (Error==0){  profit = NormalizeDouble( Ask+( 45*Point),Digits); //tsena=Ask; perenos = false;  
           srabotka= true; }}}
           
           if (Error!=0){ string errorcomment = "Ошибка открытия  ордера OP_BUY"  + " " + Symbol() +  " " + ErrorDescript(Error); 
            Print (errorcomment);}
 

Possiamo anche impostare un if e inserire un ordine con degli zeri per la seconda volta, ma è un po' macchinoso.

 
lottamer:


E posso chiedere cosa stanno cercando di fare qui?

for(int i=0; i<OrdersTotal(); i++)

sembra che stia cercando di contare le posizioni aperte...


Bene, seleziona gli ordini in base a parametri specificati.

ad esempio https://www.mql5.com/ru/forum/131859/page3#434221

Funzione NumberOfPositions().

Questa funzione restituisce il numero di posizioni aperte al momento. Una selezione più precisa delle posizioni contate è specificata da parametri esterni:

  • sy - Nome dello strumento di mercato. Se questo parametro è impostato, la funzione considererà solo le posizioni dello strumento specificato. Il valore predefinito "" significa qualsiasi strumento di mercato. NULL significa lo strumento corrente.
  • op - operazione commerciale, tipo di posizione. Valori validi: OP_BUY, OP_SELL o -1. Il valore predefinito -1 significa qualsiasi posizione.
  • mn - identificatore di posizione, MagicNumber. Il valore predefinito di -1 significa qualsiasi identificatore.
  • //+----------------------------------------------------------------------------+
    //|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
    //+----------------------------------------------------------------------------+
    //|  Версия   : 19.02.2008                                                     |
    //|  Описание : Возвращает количество позиций.                                 |
    //+----------------------------------------------------------------------------+
    //|  Параметры:                                                                |
    //|    sy - наименование инструмента   (""   - любой символ,                   |
    //|                                     NULL - текущий символ)                 |
    //|    op - операция                   (-1   - любая позиция)                  |
    //|    mn - MagicNumber                (-1   - любой магик)                    |
    //+----------------------------------------------------------------------------+
    int NumberOfPositions(string sy="", int op=-1, int mn=-1) {
      int i, k=OrdersTotal(), kp=0;
    
      if (sy=="0") sy=Symbol();
      for (i=0; i<k; i++) {
        if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
          if (OrderSymbol()==sy || sy=="") {
            if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
              if (op<0 || OrderType()==op) {
                if (mn<0 || OrderMagicNumber()==mn) kp++;
              }
            }
          }
        }
      }
      return(kp);
    }

 
lottamer:


E posso chiedere cosa stanno cercando di fare con questo?

for(int i=0; i<OrdersTotal(); i++)

sembra che stiano cercando di contare le posizioni aperte...

...Non cedere ai tuoi sentimenti, ma segui le regole. In questo caso, il ciclo sta provando dei parametri (nella "lista" degli ordini) che coinvolgono una variabile intera i, e il suo valore viene incrementato di 1 ad ogni iterazione. Il numero dell'ordine viene provato. :)))
Motivazione: