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

 
trader781:

Allora per favore rispondi alla mia domanda precedente

1) Scrivere un array di strutture

2) Trasferimento ad altre funzioni

3) Recuperare e confrontare gli elementi di un array di strutture

4) stampare un array di strutture

È importante per me scriverlo sotto forma di codice in modo da capire come deve essere.

Tutto dipende dal compito da svolgere. Dato che i compiti possono essere diversi quanto si vuole, cosa si dovrebbe mostrare?

Bene, lo scrivo, perdo tempo e quello che ho scritto è quadrato. E il foro è triangolare. E dove metto quello quadrato allora?

 
Artyom Trishkin:

Tutto dipende dal compito da svolgere. Dato che i compiti possono essere i più svariati, cosa si dovrebbe mostrare?

Bene, lo scriverò, perderò il mio tempo, ma quello che ho scritto è quadrato. E il foro è triangolare. E dove metto quello quadrato allora?

prendiamo il post 699 e circa

come passarlo ad altre funzioni e confrontare un elemento della struttura con quello precedente

così posso prendere qualsiasi ordine in ordine e produrre tutti i valori nella stampa

La differenza è che non è un numero e ci sono diverse regole di registrazione.

 
trader781:

prendiamo il post 699 e circa

come passare questo ad altre funzioni e confrontare l'elemento della struttura con quello precedente

e quindi posso prendere qualsiasi ordine in ordine e stampare tutti i valori

La differenza è che non è un numero e si applicano regole di scrittura diverse.

Dovete fare un ciclo di tutti gli ordini necessari.

Dopo aver determinato il prossimo ordine necessario, si aumenta la matrice di 1, e si registrano tutti i dati di questo ordine nella sua nuova cella. La cella dell'array stesso è riempita con il tempo di apertura dell 'ordine (se stai cercando ordini chiusi, il tempo di chiusura). Il resto dei dati dovrebbe essere scritto nei campi della struttura.

Dopo la fine del ciclo, ordina l'array in ordine crescente di valori.

Dovresti fare questo prima. Il resto può essere discusso ulteriormente.

 
Vitalie Postolache:

Questo non è un problema che può essere risolto in un solo ciclo.

Grazie.

 
Artyom Trishkin:
//+------------------------------------------------------------------+
//|                                                         test.mq4 |
//|                        Copyright 2014, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
struct myorder
  {
   int               Ticket;
   double            orderopenprice;
   int               ordertype;
   double            profit;
   double            stoploss;
   double            lot;
  };
myorder orders[][5];

int    i;
int    Magic=444;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   CalcOrders();

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

     }
   ArraySort(orders,WHOLE_ARRAY,0,MODE_ASCEND);

  }
//+------------------------------------------------------------------+
File:
test.mq4  3 kb
 
trader781:

Ho messo il tuo codice nel tuo post.

Ora, se si inizia a risolvere il problema

  1. Perché hai reso l'array di strutture un array multidimensionale?
  2. Perché hai cambiato la dimensione dell'array della struttura nella funzione CalcOrders() in"Numero massimo consentito di ordini pendenti"? Se aprite il vostro aiuto (cosa che dovreste fare sempre), vedrete che questo identificatore(ACCOUNT_LIMIT_ORDERS) può restituire zero, il che significa che non c'è limite al numero di ordini pendenti . La dimensione dell'array dovrebbe essere zero prima del ciclo.
  3. Perché non stai aumentando la dimensione dell'array nel ciclo?
 
Artyom Trishkin:

Ho messo il tuo codice nel tuo post.

Ora, se si inizia a risolvere il problema

  1. Perché avete reso un array di strutture un array multidimensionale?
  2. Perché cambiate la dimensione dell'array della struttura nella funzione CalcOrders() in"Numero massimo consentito di ordini pendenti attivi"? Se aprite il vostro aiuto (cosa che dovreste fare sempre), vedrete che questo identificatore(ACCOUNT_LIMIT_ORDERS) può restituire zero, il che significa che non c'è limite al numero di ordini pendenti . La dimensione dell'array dovrebbe essere zero prima del ciclo.
  3. Perché non stai aumentando la dimensione dell'array nel ciclo?

1) ha pensato che il numero di parametro X ordine Y sia più appropriato per il compito dato

2) L'ho uguale a 50 o 100 a seconda del tipo di conto, e nient'altro

3) quindi secount1++; aumenterà ad ogni passaggio, e l'array acquisirà il suo valore

 
trader781:

1) considerato che il numero del parametro X ordine Y è più appropriato per questo compito

2) è uguale a 50 o 100 a seconda del tipo di conto, e nient'altro

3) quindi secount1++; aumenterà ad ogni passaggio, e l'array acquisirà il suo valore

1. a cosa serve allora la struttura?

2. Avete bisogno di questo parametro per un array di posizioni di mercato "cosa è andato e cosa no"... L'array prima del ciclo deve avere una dimensione zero .

3. Proprio così. L'array ha una dimensione zero all'inizio. Con ogni nuovo ordine trovato, l'array diventa di dimensioni uguali al numero di ordini necessari.

 
Artyom Trishkin:

1) A cosa serve allora la struttura?

2. Avete bisogno di questo parametro per l'array di posizioni di mercato "cosa è andato e cosa no". L'array prima del ciclo deve avere una dimensione zero .

3. Proprio così. L'array ha una dimensione zero all'inizio. Con ogni nuovo ordine trovato, l'array diventa di dimensioni uguali al numero di ordini necessari.

1) il compilatore si lamenterà se la seconda dimensione non è messa, "specificare il tipo di classe, parametri sconosciuti" apparirà immediatamente

2) il bot morirà immediatamente al lancio con "errore critico matrice fuori portata".

3) impostareint count1=-1; poi passare attraverso il ciclo. Cosa c'è di sbagliato qui?

 
trader781:

1) il compilatore si lamenterà se la seconda dimensione non è impostata

2) allora il bot morirà immediatamente all'avvio con "errore critico array fuori portata"

3) impostare immediatamenteint count1=-1; Cosa c'è di sbagliato qui?

Ti sta solo dicendo che una delle dimensioni dovrebbe essere rimossa. State dichiarando un array unidimensionale e volete scriverlo in uno bidimensionale. Cosa otterrete come risultato? Otterrete un errore dal compilatore, ovviamente.

2. Dovete riempire correttamente l'array nel ciclo, e non semplicemente dargli una variabile di dimensioni casuali e poi ficcarci dentro della roba di dimensioni casuali.

3. sei tu che imposti la variabile a -1. E l'array deve avere dimensione zero prima del ciclo. Cosa non capisci?

Facciamo un gioco di associazione:

  • Immaginate di avere un palloncino sgonfio (array vuoto) che ha zero volume interno (dimensione dell'array zero). Dentro questo pallone (nell'array) vuoi mettere le monete (gli ordini che vuoi). Qui, ogni moneta, una volta che si decide che è adatta ad essere immagazzinata nel pallone (ogni ordine desiderato trovato), aumenterà il volume interno del pallone (solo la moneta stessa allungherà il pallone, e bisogna farlo da soli - aumentare la dimensione dell'array di 1 e stiparci un ordine).
    Alla fine, quando trovate tutte le monete e le stipate nella palla, questa non si sgonfierà - il suo volume interno è stato allungato dalle monete (alla fine del ciclo di ricerca la dimensione della matrice sarà uguale al numero di ordini necessari trovati, poiché avete aumentato la dimensione della matrice di 1 con ogni ordine necessario trovato).

    Ora immaginate di mettere inizialmente le vostre monete non in una palla, che è di gomma e può cambiare la sua dimensione, ma in un piccolo salvadanaio che ha una dimensione limitata (inizialmente avete impostato la dimensione della matrice e non l'avete aumentata ulteriormente). Cosa succederà? Non tutte le monete entreranno nel salvadanaio. Il pallone sarà.

Ecco un'associazione per voi.