Problemi con l'assegnazione di elementi di array 2D

 

Publi

Problemi con l'assegnazione di elementi di array 2D

 

Publi

Risultati da 1 a 3 di 3

Discussione: Problemi con l'assegnazione di elementi di array 2D

  1. #1
    In allegato fa parte di un Expert Advisor a cui sto lavorando per testare una egia di trading, ma sto avendo qualche problema con i limiti di MQL4 quando si tratta di array. Quello che voglio è usare una matrice per memorizzare informazioni riguardanti le posizioni che ho aperto e anche ridefinire i valori di alcuni elementi. Quello che voglio implementare è una serie di tre funzioni che prima ricostruiscono la gamma di ordini aperti. Questo sarebbe fatto dopo ogni apertura o chiusura di posizione. La successiva funzione sequenziale dovrebbe ordinare gli ordini aperti in base ai rispettivi prezzi di apertura. L'ultima funzione sequenziale è quindi ridefinire lo stop loss e prendere i valori di profitto per le negoziazioni aperte. I valori ridefiniti per i valori di stop loss e take profit devono essere basati sul prezzo di apertura del primo ordine. Volevo che l'EA eseguisse lo stop loss e prendesse i valori del profitto in silenzio. Sono consapevole che ci sono dei rischi per creare un EA in questo modo e desidero procedere con questo.





    double OrderStack [7] [9];/matrice di informazioni dell'ordine


    if ((OrderStack [TotalOrders 1] [1] lt; Bid) (TotalOrts lt; 2))/Apre la nuova posizione Sell a un prezzo più favorevole
    {//3
    TicketNum = OrderSend (Symbol (), OP_SELL, LotSize2, Bid, 3,0,0, CommentString, 0,0, Red);/Apri l'ordine.
    if (TicketNumlt; 0)
    {//4
    Stampa (Errore apertura commerciale: Error Code =, GetLastError () ,, Lotsize:, Lots);
    }/3
    altro
    {//4
    if (OrderSelect (TicketNum, SELECT_BY_TICKET))
    {//5
    Stampa (ordine di vendita aperto al prezzo:, OrderOpenPrice ());
    OrderFlagS = 1;/Utilizzato dalla funzione EA principale per i commenti
    Terminale();/Chiama a funzione che crea matrice di dati ordine aperto
    }/4
    }/3
    }/2
    }/1
    }/0

    //------------------------------------------------ --------------------
    //Terminal.mqh
    //------------------------------------------------ ------------------------------ 1 -
    //Ordinare la funzione di contabilità
    //Variabili globali:
    //OrderStack [7] [9]
    //L'ultimo array di ordini conosciuti
    //1 ° indice = numero ordine
    //[] [0] non definito
    //[] [1] ordine prezzo aperto (valore del prezzo in abs)
    //[] [2] StopLoss dell'ordine (valore del prezzo in abs)
    //[] [3] TakeProfit dell'ordine (valore del prezzo in abs)
    //[] [4] numero d'ordine
    //[] [5] volume degli ordini in lotti (valore del prezzo in abs)
    //[] [6] tipo di ordine 0 = B, 1 = S, 2 = BL, 3 = SL, 4 = BS, 5 = SS
    //[] [7] ordina il numero magico
    //[] [8] 0/1 commento disponibile
    //Mas_Tip [6]
    //Matrice della quantità di ordini di tutti i tipi
    //[] tipo di ordine: 0 = B, 1 = S, 2 = BL, 3 = SL, 4 = BS, 5 = SS
    //------------------------------------------------ ------------------------------ 2 -
    doppio terminale ()
    {//1
    int Mas_Tip [6];
    int Qnt = 0;
    int i;

    //Contatore di ordini
    //------------------------------------------------ ------------------------------ 3 -

    ArrayInitialize (OrderStack, 0.0);/azzera la matrice
    ArrayInitialize (Mas_Tip, 0);/azzera la matrice
    //------------------------------------------------ ------------------------------ 4 -
    for (i = 0; i lt; OrdersTotal (); i )/Per ordini di mero e in sospeso
    {//2
    if ((OrderSelect (i, SELECT_BY_POS) == true) (OrderSymbol () == Symbol ()))
    //Se c'è il prossimo ... e la nostra coppia di valute
    {//3
    //------------------------------------------------ --------------------- 5 -
    Qnt ;/Quantità di ordini
    OrderStack [Qnt] [1] = OrderOpenPrice ();/Ordina prezzo aperto
    OrderStack [Qnt] [2] = OrderStopLoss ();/prezzo SL
    OrderStack [Qnt] [3] = OrderTakeProfit ();/prezzo TP
    OrderStack [Qnt] [4] = OrderTicket ();/Numero d'ordine
    OrderStack [Qnt] [5] = OrderLots ();/Quantità di lotti
    Mas_Tip [OrderType ()] ;/Quantità di ordini del tipo
    OrderStack [Qnt] [6] = OrderType ();/Tipo di ordine
    OrderStack [Qnt] [7] = OrderMagicNumber ();/numero magico
    if (OrderComment () ==)
    {//4
    OrderStack [Qnt] [8] = 0;/Se non ci sono commenti
    }/3
    altro
    {//4
    OrderStack [Qnt] [8] = 1;/Se c'è un commento
    }/3
    }/2
    //------------------------------------------------ --------------------- 6 -

    OrderStack [0] [0] = Qnt;/Quantità di ordini

    //------------------------------------------------ ------------------------------ 7 -

    FillStack (OrderStack, Trend_Up);/Chiama a funzione che ordina i dati commerciali aperti in base alla direzione della tendenza e al prezzo di scambio iniziale
    ritorno (0);
    }/1

    }/0
    //------------------------------------------------ ------------------------------ 8 -




    //
    //Funzione ordinamento ordinamento esistente
    //

    double SortStack (doppio OrderStack [7] [9], bool Trend_Up)/Funzione per ordinare l'array di ordini ricostruito in
    //ordine basato sul prezzo di apertura dell'ordine iniziale
    {//1
    int i, TotalOrders;
    TotalOrders = OrderStack [0] [0];

    se (Trend_Up == true)
    {//2
    ArraySort (OrderStack [TotalOrders] [1], TotalOrders, 1, MODE_DECEND);
    }/1
    se (Trend_Up == false)
    {//2
    ArraySort (OrderStack [TotalOrders] [1], TotalOrders, 1, MODE_ASCEND);
    }/1
    FillStack (OrderStack, Trend_Up);/Chiama alla funzione che definisce i parametri commerciali per avversari
    //mero scambia in ordine matrice
    ritorno (0);
    }/0

    //
    //Registra la funzione dei parametri commerciali del mero avverso
    //

    double FillStack (doppio OrderStack [7] [9], bool Trend_Up)/Definisce i parametri commerciali del mero avverso
    //basato sull'ordine iniziale del piercing della banda di Bollinger

    {//1

    doppio prezzo;

    PriceIn = OrderStack [1] [1];
    {//2
    se (Trend_Up == true)
    {//3
    OrderStack [1] [2] = Price In - StopLossVal;/Colonna 2, colonna Immissione della perdita di dati
    OrderStack [1] [3] = Prezzo in 0,0030;/Colonna 3, Colonna Take Profit Entry
    OrderStack [2] [1] = PriceIn - 0.0010;/Colonna 1, prezzo di acquisto medio del prezzo di ribasso
    OrderStack [2] [3] = Prezzo In - 0.0005;/Column 3, Take Profit per Avg Down Market Entry
    }/2
    se (Trend_Up == false)
    {//3
    OrderStack [1] [2] = Price In StopLossVal;/Colonna 2, colonna Immissione della perdita di dati
    OrderStack [1] [3] = Price In - 0.0030;/Colonna 3, Colonna Take Profit Entry
    OrderStack [2] [1] = PriceIn 0.0010;/Colonna 1, prezzo di acquisto medio del prezzo di ribasso
    OrderStack [2] [3] = Prezzo in 0.0005;/Column 3, Take Profit per Avg Down Market Entry
    }/2
    }/1
    ritorno (0);
    }/0




    Il problema che sto avendo con l'implementazione di questo EA è che il compilatore mi dà messaggi di errore su ???l'elemento dell'array non può essere assegnato??? per il codice nella mia funzione FillStack (). Quello che è sconcertante è che sembra che sia esattamente ciò che viene fatto nella funzione Terminal () sopra la mia funzione FillStack (). Ad ogni modo, spero che uno dei programmatori esperti possa darmi una soluzione per questo particolare bug.
    ?? difficile credere che con tutte le somiglianze che MQL4 ha con C , la capacità di assegnare valori ad elementi di array come C non sarebbe presente anche in MQL4. Grazie per l'aiuto.

  2. #2

    Citazione Originariamente Scritto da ;
    OrderStack [0] [0] = Qnt;/Quantità di ordini TotalOrders = OrderStack [0] [0];
    ciao, solo una nota che riservi spazio a nove doppi per informazioni che possono essere contenute in un numero intero, come moo nel testo sopra citato, è tiva gestione dello spazio. studia e impara le funzioni dell'array nel file di aiuto di MetaEditor (Navigator) e ricorda sempre che più dati galleggiano più lentamente nel tuo codicecomputer.

  3. #3
    Questo errore indica una scrittura su un array di sola lettura. Dato che questo post è così vecchio, presumo che abbiate trovato una soluzione e non abbiate postuperato o trovato una soluzione alternativa. Codice inserito double OrderStack # 91; 7 # 93; # 91; 9 # 93; void function (double array # 91; # 93; # 91; # 93 {Alert (dimensione dell'array, ArraySize (array)); allineamento # 91; 0 # 93; # 91; 0 # 93; = EURUSD;/errore non consentito scrivere} Il segreto per leggerescrivere gli array passati alla funzione è nella dichiarazione. Il seguente blocco di codice non effettuerà un errore. Codice inserito double OrderStack # 91; 7 # 93; # 91; 9 # 93; void function (# 91; color = Purple # 93; double # 91;color # 93; # 91; b # 93; # 91; color = Red # 93; # 91;color # 93; # 91;b # 93; array # 91; # 93; # 91; # 93 {Alert (dimensione dell'array, ArraySize (array)); allineamento # 91; 0 # 93; # 91; 0 # 93; = EURUSD;/errore non autorizzato a scrivere} il doppio nella dichiarazione della funzione rimanda la funzione all'array globale (o all'array nel chiamante della funzione). Spero che questo salvi un po 'di tempo per le persone, che potrebbero incontrare le tue pene.

Permessi di Scrittura

  • Tu non puoi inviare nuove discussioni
  • Tu non puoi inviare risposte
  • Tu non puoi inviare allegati
  • Tu non puoi modificare i tuoi messaggi
  •  
Il sito di forexmad utilizza cookie
Il sito di forexmad utilizza cookie, alcuni dei quali già installati. Per avere maggiori informazioni sui nostri cookie ti preghiamo di cliccare qui. Ti preghiamo di cliccare sul bottone a destra per accettare i nostri cookie. Se continui a navigare sul sito di forexmad assumeremo che sei d'accordo ad utilizzarli.