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

 
Alexey Viktorov:
Per esempio qui https://docs.mql4.com/ru/basis/preprosessor/compilation
Grazie!
 
trader781:

Nell'esempio attuale, voglio essere in grado di piazzare un numero infinito di ordini con qualsiasi lotto per non superare i suoi limiti.

Naturalmente, conosciamo tutti i limiti, ma voglio farlo in questo modo

Procedo dal fatto che se si specifica un elemento tra parentesi, sarà l'ultimo

Così ho ricevuto questo tipo di schifezze. Mi aspettavo un ordine per ordine... Voglio che il risultato (lotto di un tale ordine *coefficiente) sia aggiunto all'ordine invece del lotto

e la questione del recupero dei dati da lì

Voglio ottenere il seguente risultato come lo vedo io

MyArray[0][0.01]

MyArray[1][0.01]

MyArray[2][0.02]

ecc...

Quindi qual è la vera domanda?

Hai scritto una matrice con i lotti, poi ordinarla per dimensione del lotto, sarà ordinata per i numeri di apertura, perché nel tuo caso, ogni posizione successiva si apre con un lotto più grande

double BPosMass[];
double SPosMass[];

void OnTick()
{
// Заполняем массивы
int b=-1,s=-1; // Объявим переменные с минусом
  for(int i=0; i<OrdersTotal(); i++) {
   if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
    if(OrderSymbol()==Symbol() && (OrderMagicNumber()==Magic || Magic<0)) {
     if(OrderType()==OP_BUY) {
      b++;
       ArrayResize(BPosMass,b+1);
       BPosMass[b]= OrderLot();
     }
     if(OrderType()==OP_SELL) {
      s++;
       ArrayResize(SPosMass,s+1);
       SPosMass[s]= OrderLot();
     }
  }}} // конец записи массив

// Читаем отсортированный массив с лотами
// Buy
  if(b>0) { // Если он не пустой и больше двух элементов - [0], иначе будет ошибка: "Выход за пределы массива"
    ArraySort(BPosMass, WHOLE_ARRAY, 0, MODE_ASCEND); // Отсортируем по размеру лота
    // Работа с полученными данными
    Comment("Самый старый Buy лот: ",    BPosMass[0],
            "\nПоследний Buy лот: ",     BPosMass[b],
            "\nПредпоследний Buy лот: ", BPosMass[b-1]
           );

  } // end Buy

// Sell
  if(s>0) { // Если он не пустой и больше двух элементов - [0], иначе будет ошибка: "Выход за пределы массива"
    ArraySort(SPosMass, WHOLE_ARRAY, 0, MODE_ASCEND); // Отсортируем по размеру лота
    // Работа с полученными данными
    Comment("Самый старый Sell лот: ",    SPosMass[0],
            "\nПоследний Sell лот: ",     SPosMass[s],
            "\nПредпоследний Sell лот: ", SPosMass[s-1]
           );

  } // end Sell
  
// Конец функции OnTick()
}


Poi applicare come segue: contare il numero totale di posizioni, e se meno di tre, allora non accedere all'array, se più, allora leggere l'array e prendere i dati da esso.

L'uscita dell'array non è al momento della scrittura, ma al momento della lettura.

 
Vitaly Muzichenko:


L'uscita dell'array non avviene al momento della scrittura, ma al momento della lettura.

No, al momento di accedere a un indice di array inesistente.
 
Vitalie Postolache:
No. Al momento di accedere a un indice di array inesistente.
Allora, cosa ho scritto?
 
Vitaly Muzichenko:
Quindi cosa ho scritto?

2017.01.1312:51:14.3722017.01.0516:30:00 martin GBPUSD,M5: MyArray[CountOrders][0]0.02
2017.01.1312:51:14.3722017.01.0516:25:00 martin GBPUSD,M5: MyArray[CountOrders][0]0.01

CountOrders costante e il lotto cambia. Non dovrebbe essere così, ma non funziona diversamente

Idealmente, la voceMyArray[CountOrders][OrderLots()]

quindi l'output sarebbeMyArray[0][0.01]MyArray[1][0.01]

ma questo non funzionerà in µl.

e poi in qualche modo estrarlo dalla funzione al flusso
 
trader781:

2017.01.1312:51:14.3722017.01.0516:30:00 martin GBPUSD,M5: MyArray[CountOrders][0]0.02
2017.01.1312:51:14.3722017.01.0516:25:00 martin GBPUSD,M5: MyArray[CountOrders][0]0.01

CountOrders costante e il lotto cambia. Non dovrebbe essere così, ma non funziona diversamente

Idealmente, la voceMyArray[CountOrders][OrderLots()]

quindi l'output sarebbeMyArray[0][0.01]MyArray[1][0.01]

Ma questo non funziona in µl

Le strutture vi aiuteranno. Si crea una struttura con i campi necessari, si dichiara un array di tali strutture, lo si riempie con i dati dell'ordine nel ciclo aprendo il tempo, e poi si cerca in esso tutto ciò di cui si ha bisogno. Controlla i campi della struttura tramite l'indice e li confronta con il valore necessario. L'indice indicherà il numero dell'ordine per il suo tempo di apertura, e tutti i dati necessari su questo ordine specifico saranno mostrati nei campi della struttura.
 
Artyom Trishkin:
Le strutture vi aiuteranno. Si crea una struttura con i campi necessari, si dichiara un array di tali strutture, lo si riempie con i dati dell'ordine nel ciclo di apertura, e poi si cerca tutto ciò di cui si ha bisogno in esso. Controlla i campi della struttura tramite l'indice e li confronta con il valore necessario. L'indice indicherà il numero dell'ordine per il suo tempo di apertura, e tutti i dati necessari su questo ordine specifico saranno dati nei campi della struttura.

Questo è il tipo di merda che abbiamo

struct myorder
{
int    Ticket;
double orderopenprice;
int   ordertype;
double profit;
double stoploss;
double  lot;
};

myorder orders[];

int i;
void CalcOrders()
{
for(i=OrdersTotal()-1; i>=0; i--)
     {
      if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) && (OrderSymbol()==Symbol())
         && (OrderMagicNumber()==Magic) && (OrderType()<2))
         orders[i].Ticket=OrderTicket();
         orders[i].lot=OrderLots();
         orders[i].orderopenprice=OrderOpenPrice();
         orders[i].ordertype=OrderType();
         orders[i].profit=OrderProfit();
         orders[i].stoploss=OrderStopLoss();
     }
}    


Voglio prendere, per esempio, il lotto 5 di un ordine e confrontarlo con il lotto 3

sommare il prezzo di apertura e dividere per il numero di posizioni

per questo tipo di cose avete bisogno di una voce di comando stessa.

 
trader781:

Abbiamo questo genere di cose.

struct myorder
{
int    Ticket;
double orderopenprice;
int   ordertype;
double profit;
double stoploss;
double  lot;
};

myorder orders[];

int i;
void CalcOrders()
{
for(i=OrdersTotal()-1; i>=0; i--)
     {
      if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) && (OrderSymbol()==Symbol())
         && (OrderMagicNumber()==Magic) && (OrderType()<2))
         orders[i].Ticket=OrderTicket();
         orders[i].lot=OrderLots();
         orders[i].orderopenprice=OrderOpenPrice();
         orders[i].ordertype=OrderType();
         orders[i].profit=OrderProfit();
         orders[i].stoploss=OrderStopLoss();
     }
}    


Voglio prendere per esempio il lotto 5 di un ordine e confrontarlo con il lotto 3

sommare il prezzo di apertura e dividere per il numero di posizioni

Ho bisogno di una voce stessa sotto forma di comandi per questo tipo di cose

Poiché l'indice i del ciclo si riferisce a qualsiasi ordine, non solo a quelli di cui avete bisogno, dovreste dichiarare una variabile (per esempio, n=0;) nella funzione che si occuperà della dimensione dell'array. Dopo aver superato i controlli, aumentate il valore di questa variabile all'interno del ciclo, aumentate la dimensione dell'array del valore di questa variabile e riempite i campi della struttura secondo l'indice n-1: ordini[n-1].xxx=XXX;

 

Per favore, ditemi perché la funzione OrdersTotal() scrive -1 quando cerca gli ordini.

Esempio: for (i=OrdersTotal()-1 ;i>=0; i--)

perché non solo OrdersTotal()?

Il conteggio degli ordini in questa funzione parte da 0 o da 1? Cioè, se c'è un ordine, OrdersTotal() è uguale a 0 o 1?

 
Artyom Trishkin:

Poiché l'indice i del ciclo si riferisce a qualsiasi ordine, non solo a quelli di cui avete bisogno, dovreste dichiarare una variabile (per esempio n=0;) nella funzione che sarà responsabile della dimensione dell'array. Dopo aver superato i controlli, aumentate il valore di questa variabile all'interno del ciclo, aumentate la dimensione dell'array del valore di questa variabile e riempite i campi della struttura dall'indice n-1: orders[n-1].xxx=XXX;

Dato che abbiamo un pacchetto di ordini, perché non possiamo semplicemente tirare fuori l'ordine giusto? (quelli necessari) e fare quello che vogliamo fare con loro? per esempio ordinare (i-4)