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.