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

 
Alexey Viktorov:

Non c'è bisogno di ordinare l'array dopo ogni aggiunta di un elemento dell'array. È meglio spostare l'ordinamento

Dal riferimento

Mas[Blizko2] è il valore più piccolo più vicino nell'array

Grazie per la vostra risposta! Potreste dirmi che per determinare il prossimo elemento dell'array, ho usato l'elemento +1 già trovato, ma il tester dà un errore in questo punto.

 double Mas[];                                                                //массив для упорядочивания всех ордеров
  for(int i=0; i<OrdersTotal(); i++)                                           // Цикл перебора ордер
   {
    if(OrderSelect(i,SELECT_BY_POS))                                           // Если есть следующий
     {
       Price=OrderOpenPrice();
       ArrayResize(Mas, i+1);                                                 //задан размер массива
       Mas [i] = Price; 
       ArraySort (Mas,WHOLE_ARRAY,0,MODE_DESCEND);                           // Теперь цены открытия упорядочены по убыванию
     }
   } 
   if(ArraySize(Mas)>1)                                                         //Если массив не пустой
   
         { 
        int Blizko2=ArrayBsearch(Mas,Ask,WHOLE_ARRAY,0,MODE_DESCEND);          //Определен индекс ближайшего большего по значению елемента к текущей цене
        

        Mas[Blizko2+1]= Blizko1;     // В этой строке перед квадратной скобкой выдает ошибку!                           //Определен индекс ближайшего меньшего по значению елемента к текущей цене

        PriceBlizko1=Mas[Blizko1];
        PriceBlizko2 = Mas[Blizko2];                                      // Цена выбранного ордера   

Devo trovare il prossimo elemento. Ovviamente è +1, ma il programma mi dà un errore! Forse c'è un altro modo o forse lo faccio male? Per favore, datemi un suggerimento)

Blizko1 = Mas[Blizko2]+1;

o come questo?

ma poi alla compilazione un avvertimento sulla possibile perdita di dati

 
vikzip:

Con questa costruzione

Blizko1 = Mas[Blizko2]+1;

si aggiunge 1 al valore ottenuto dalla cella dell'indice Blizko2, ed è lì che viene memorizzato il prezzo - un valore doppio. State aggiungendo un 1 intero. Per evitare un avvertimento, è necessario scrivere +1.0

Ma questo non salverà nemmeno il "padre della democrazia russa", perché state aggiungendo 1 non all'indice ma al valore memorizzato nell'array Mas[] dall'indice Blizko2.

Quindi, naturalmente, per ottenere un valore da una cella vicina dell'array, è necessario aggiungere o sottrarre 1 all'indice. Ma qui abbiamo un errore in cui siete inciampati: se l'indice punta alla cella più esterna di una matrice - o 0 o l'ultima, allora sottraendo 1 (a 0) o aggiungendo 1 (all'ultima) si cade fuori dalla matrice - non c'è nessuna cella del genere. Di conseguenza, dovete controllare che Blizko2+1 non sia più di ArraySize(Mas)-1, o che Blizko2-1 non sia meno di zero.

E... ti è stato detto che non hai bisogno di ordinare l'array ad ogni iterazione del ciclo - hai bisogno di freni?

Dovrebbe essere ordinato dopo aver controllato se la dimensione dell'array è maggiore di 1.

E questo disegno non è affatto chiaro:

int Blizko2=ArrayBsearch(Mas,Ask,WHOLE_ARRAY,0,MODE_DESCEND);          //Определен индекс ближайшего большего по значению елемента к текущей цене

Mas[Blizko2+1]= Blizko1; // В этой строке перед квадратной скобкой выдает ошибку! //Определен индекс ближайшего меньшего по значению елемента к текущей цене

        PriceBlizko1=Mas[Blizko1];
        PriceBlizko2 = Mas[Blizko2];                                      // Цена выбранного ордера   

Guarda: in Blizko2 hai l'indice della cella dell'array con il prezzo.
Poi scrivi nell'array - nella sua cella Blizko2+1 il valore contenuto nella variabile Blizko1 (perché????) - dovresti avere dei prezzi lì, ma li stai riempiendo di valori incomprensibili.

Dovete capire cosa state facendo in generale - commentate ogni linea della vostra funzione. Pensieroso.

 
Artyom Trishkin:

Con questa costruzione

si aggiunge 1 al valore ottenuto dalla cella dell'indice Blizko2, ed è lì che viene memorizzato il prezzo - un valore doppio. State aggiungendo un 1 intero. Per evitare un avvertimento, è necessario scrivere +1.0

Ma questo non salverà nemmeno il "padre della democrazia russa", perché state aggiungendo 1 non all'indice ma al valore memorizzato nell'array Mas[] dall'indice Blizko2.

Quindi, naturalmente, per ottenere un valore da una cella vicina dell'array, è necessario aggiungere o sottrarre 1 all'indice. Ma qui abbiamo un errore in cui siete inciampati: se l'indice punta alla cella più esterna di una matrice - o 0 o l'ultimissima, allora sottraendo 1 (a 0) o aggiungendo 1 (all'ultimissima), cadete fuori dalla matrice - non c'è nessuna cella del genere. Di conseguenza, dovete controllare che Blizko2+1 non sia più di ArraySize(Mas)-1, o che Blizko2-1 non sia meno di zero.

E... ti è stato detto che non hai bisogno di ordinare l'array ad ogni iterazione del ciclo - hai bisogno di freni?

Per ordinarlo, dobbiamo controllare se la dimensione dell'array è più di 1.

E questa costruzione non è affatto chiara:

Vedi: in Blizko2 hai l'indice della cella dell'array con il prezzo.
Poi scrivi nell'array - nella sua cella Blizko2+1 il valore contenuto nella variabile Blizko1 (perché????) - dovresti avere dei prezzi lì, ma li stai riempiendo di valori incomprensibili.

Dovete capire cosa state facendo in generale - commentate ogni linea della vostra funzione. Pensieroso.


Grazie per la risposta informativa! Lo scopo per cui voglio creare l'array è quello di determinare i prezzi degli ordini più vicini sotto il prezzo e sopra il prezzo, se ce ne sono. Se sono disponibili e la distanza da loro al prezzo supera la distanza che ho definito, allora apri gli ordini corrispondenti. Ho pensato che sarebbe stato così (ho descritto la logica delle mie azioni qui il più possibile)

//---Создаем массив для учета всех ордеров в терминале
  double Price;                                                               // Цена выбранного ордера
  double Mas[];                                                                //массив для упорядочивания всех ордеров
  for(int i=0; i<OrdersTotal(); i++)                                           // Цикл перебора ордер
   {
    if(OrderSelect(i,SELECT_BY_POS))                                           // Если есть следующий
     {
       Price=OrderOpenPrice();                                                //Цена ордера
       ArrayResize(Mas, i+1);                                                 //задан размер массива
       Mas [i] = Price; 
       ArraySort (Mas,WHOLE_ARRAY,0,MODE_DESCEND);                           // Теперь цены открытия упорядочены по убыванию. Я намеренно сортирую массив, потому что ордера добовляются в него в том порядке в котором появляются в 
                                                                             //терминале и не сортируются по убыванию(Верно ли это мое утверждение??)А мне необходимо позже точно определить ближайший ордер выше и ниже цены

     }
   } 
   if(ArraySize(Mas)>1)                                                         //Если массив не пустой
   
         { 
        int Blizko2=ArrayBsearch(Mas,Ask,WHOLE_ARRAY,0,MODE_DESCEND);          //Определен индекс ближайшего большего по значению елемента к текущей цене
                                                                               //Здесь я справку прочитал и если указано MODE_ASCEND тогда будет найдено ближайшее меньшее значение, но первым я намерен определить ордер выше цены и 
                                                                               // поэтому поставил MODE_DESCEND. Скажите пожалуйста - это верно?? 
         PriceBlizko1 = Mas[Blizko2]+1;                                        //!!!Вот здесь я намереваюсь определить ордер сразу ниже цены и так как я намеренно упорядочил по убыванию уже все ордера в массиве, то по логике после 
                                                                               //определения ближайшего верхнего ордера к цене Blizko2 следующим в массиве будет ордер уже ниже цены(Верно ли мое утверждение??)И вот на этом месте я не 
                                                                               //могу понять: каким же образом это сделать? Ведь мне очевидно что он следующий, но как это записать в код я не могу понять))) Пробовал и в скобках уже 
                                                                               //прибавлять еденицу)) А мне нужно что бы PriceBlizko1 была присвоена цена ордера сразу ниже цены!! Подскажите пожалуйста как определить цену ордера ниже 
                                                                               //цены PriceBlizko2 ??
         PriceBlizko2 = Mas[Blizko2];                                          // Цена выбранного ордера выше цены         

        
 

Sembrerei qualcosa del genere

double levelDown=0;
double levelUp=DBL_MAX;

int totalOrders=OrdersTotal();


   for(int i=0;i<totalOrders;i++)
      {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         {
         double price=OrderOpenPrice();
         
         if (price-Ask>_Point && levelUp-price>_Point)
            levelUp=price;
         
         if (Bid-price>_Point && price-levelDown>_Point)
            levelDown=price;
         }
      }
 
Taras Slobodyanik:

Sembrerei qualcosa del genere


Grazie, cosa significaDBL_MAX nel livello superiore?

 
vikzip:

Grazie! Cosa significaDBL_MAX?

Hai anche un link inserito dal motore intelligente del forum. È più facile cliccarci sopra che aspettare una risposta.

 
Artyom Trishkin:

Hai anche un link inserito dal motore intelligente del forum. È più facile cliccarci sopra che aspettare una risposta.


Grazie! Vorrei avere un tale motore)))

 
vikzip:

Grazie per la risposta informativa! Lo scopo per cui intendo creare l'array è quello di determinare i prezzi degli ordini più vicini sotto il prezzo e sopra il prezzo, se ce ne sono. Se sono disponibili e la distanza da loro al prezzo supera una certa distanza, allora apri gli ordini corrispondenti. Ho pensato che sarebbe stato così (ho descritto la logica delle mie azioni qui il più possibile)

C'è un errore in questo commento di linea.

        int Blizko2=ArrayBsearch(Mas,Ask,WHOLE_ARRAY,0,MODE_DESCEND);          //Определен индекс ближайшего большего по значению елемента к текущей цене


Forum sul trading, sistemi di trading automatico e test di strategie di trading.

Qualsiasi domanda, aiuto e discussione su algoritmi e codici per i principianti di MQL4

Alexey Viktorov, 2017.10.04 09:32


Dall'aiuto

Valore restituito

Restituisce l'indice del primo elemento trovato. Se il valore cercato non viene trovato, restituisce l'indice dell' elemento più piccolo più vicino tra cui si trova il valore cercato.

Mas[Blizko2] è il valore più piccolo più vicino nella matrice.


Resta solo da aggiungere che il riferimento non dice nulla sulla dipendenza dalla direzione di ordinamento dell'array. Quindi, nessuna manipolazione è necessaria dopo ArrayBsearch. Il compito è già fatto.

Artyom ha già spiegato tutto ulteriormente. Controlla l'uguaglianza di un indice a zero e la dimensione di un array per non saltare fuori dai limiti...

 

Come posso fare in modo che il mouse inizi ad essere tracciato solo dopo che il pulsante è stato cliccato? Ma la situazione accade (nell'idea di trasferire uno stop su tutti gli ordini in un punto con un clic del mouse dall'EA) quando clicco il pulsante, uno stop su tutti gli ordini al prezzo in cui il pulsante è stato cliccato inizia ad essere trasferito in una volta sola. Come può questa proprietà if(id==CHARTEVENT_CLICK)

if(ObjectGetInteger(0, "cm STOP ALL",OBJPROP_STATE))

 
Basicprof:

Come posso fare in modo che il mouse inizi ad essere tracciato solo dopo che il pulsante è stato cliccato? Ma la situazione accade (nell'idea di trasferire uno stop su tutti gli ordini in un punto con un clic del mouse dall'EA) quando clicco il pulsante, uno stop su tutti gli ordini al prezzo in cui il pulsante è stato cliccato inizia ad essere trasferito in una volta sola. Come può questa proprietà if(id==CHARTEVENT_CLICK)

if(ObjectGetInteger(0, "cm STOP ALL",OBJPROP_STATE))


if(id==CHARTEVENT_OBJECT_CLICK && sparam == "cm STOP ALL") { // код }
Motivazione: