Domande dai principianti MQL4 MT4 MetaTrader 4 - pagina 121

 
Ihor Herasko:

Scrivi almeno un blocco e mostralo. Il prossimo passo è quello di darvi un suggerimento qui.

Sugli array: qui ho dichiarato 4 array a livello globale:

// массивы, в которых будут храниться характеристики ордеров:
int _OrderTicket[],_OrderType[];
double _OrderOpenPrice[];
datetime _OrderOpenTime[];

Li ho poi azzerati nella funzione di apertura delle posizioni:

   // обнуляем массивы
   ArrayInitialize(_OrderTicket,0);
   ArrayInitialize(_OrderType,0);
   ArrayInitialize(_OrderOpenPrice,0);
   ArrayInitialize(_OrderOpenTime,0);

Come faccio a riempirli ora? Nell'esempio con cui sto cercando di farlo, viene applicata una variabile aggiuntiva, ma non capisco come usarla:

// переменная, которая будет хранить количество ордеров, 
// принадлежащих эксперту:
int _ExpertOrdersTotal=0;

Anche se non è molto chiaro perché tutti questi array, quando posso ottenere i valori del biglietto, del tipo di posizione, del prezzo aperto e del tempo aperto con la funzione corrispondente.

 
novichok2018:

Sugli array: qui ho dichiarato 4 array a livello globale:

Li ho poi azzerati nella funzione di apertura delle posizioni:

Come faccio a riempirli ora? L'esempio che sto cercando di usare applica una variabile aggiuntiva, ma non capisco come usarla:

Anche se non è molto chiaro perché tutti questi array, quando posso ottenere i valori del biglietto, del tipo di posizione, del prezzo aperto e del tempo aperto con la funzione corrispondente.

Provate a scrivere da zero, emettendo tutti i dati intermedi usando Alert(. Per esempio

int ord=OrdersTotal();
if ! ord )
{
   Alert("Ордера отсутствуют. Выход");
   return;
} else   Alert("Всего ордеров = ", ord);

// Посмотрев, что получилось, добавляете:
int n;
int Ords[10];
for(n=0; n<ord && n<10; n++)
{
   OrderSelect(...
}

E se prendi l'esempio di qualcuno, prendilo completamente e studialo. Chissà per cosa sta usando gli array l'autore dell'esempio

 
novichok2018:

Sugli array: qui ho dichiarato 4 array a livello globale:

Usa un array di strutture. Sarà molto più facile accedervi. Ecco una variante con un array statico. È più facile da capire. Ma io stesso uso gli array dinamici. Ma il codice diventerà un po' più grande con loro.

#define MAX_ORDERS_CNT   int(500)
struct OrderInfo
{
   int      nTicket;
   int      nType;
   double   fOpenPrice;
   double   fSL;
   double   fTP;
   datetime dtOpenTime;
};

OrderInfo  arrstOrderInfo[MAX_ORDERS_CNT];

Poi li ho azzerati nella funzione di apertura della posizione:

No, non l'hai fatto. Perché vengono dichiarati array dinamici che hanno dimensione zero per impostazione predefinita. Quindi in questo caso queste quattro righe di codice non fanno nulla.

Ora come si fa a riempirli? L'esempio che sto cercando di usare ha una variabile aggiuntiva, ma non capisco come usarla:

Poi - si organizza un ciclo di ordini, in cui ogni "proprio" ordine è memorizzato in un array:

g_nOrderCnt = 0;
for (int i = OrdersTotal() - 1; i >= 0; --i)
{
   if (!OrderSelect(i, SELECT_BY_POS))
      continue;

   if (OrderSymbol() != Symbol())   // Если нужны ордера только по текущему символу, к графику которого прикреплен советник
      continue;

   if (OrderMagicNumber != i_nMagicNumber)  // Если имеется входной параметр советника i_nMagicNumber, в котором указан ID ордеров советника
      continue;

   if (g_nOrderCnt < MAX_ORDERS_CNT)
      continue;

   g_arrstOrderInfo[g_nOrdersCnt].nTicket = OrderTicket();
   g_arrstOrderInfo[g_nOrdersCnt].nType = OrderType();
   g_arrstOrderInfo[g_nOrdersCnt].fOpenPrice = OrderOpenPrice();
   g_arrstOrderInfo[g_nOrdersCnt].fSL = OrderStopLoss();
   g_arrstOrderInfo[g_nOrdersCnt].fTP = OrderTakeProfit();

   ++g_nOrdersCnt;
}

Anche se non sono del tutto sicuro di cosa servano tutti quegli array, quando posso ottenere i valori del biglietto, del tipo di posizione, del prezzo aperto e del tempo aperto usando la funzione corrispondente.

È molto più veloce e conveniente lavorare con gli array, poiché in generale, non tutti gli ordini presenti nel conto devono essere processati da questo particolare EA. E di conseguenza risparmieremo un sacco di sforzi e di denaro.

Inoltre, quello che ho menzionato sopra è un caso generale. L'universalismo non è sempre necessario, naturalmente. Di solito, tali matrici sono create in base ai requisiti di una strategia. Per esempio, possiamo dividere subito gli ordini per tipo: Comprare, Vendere, BuyStop, SellStop, BuyLimit, SellLimit. Allora avremo bisogno di quattro array di questo tipo. Ma più tardi, quando prenderemo decisioni di trading, non dovremo passare di nuovo attraverso l'intera lista di ordini aperti. Abbiamo solo bisogno di conoscere il numero di ordini di un certo tipo e fare riferimento all'array necessario.

C'è un'altra cosa importante da considerare: cambiare l'array di ordini durante l'elaborazione di un tick. Può succedere che una lista di ordini sia stata ricevuta all'entrata di OnTick, e un'altra da qualche parte nel mezzo. Questo porterà ad un errore nel funzionamento del programma che è difficile da catturare. E l'array di ordini che era già formato quando si entra in OnTick non cambierà (a meno che, ovviamente, non lo si cambi durante l'esecuzione del programma).

 
STARIJ:

stringa s=FileReadString(F1); // Leggi la stringa del file di testo
StringSplit(s, "," , a); // Elementi di stringa separati da virgola in un array
datetime T1=StrToTime(a[4]); // Inoltre, la trasformazione ...
int ord=StrToInteger(a[8]);
double Price=StrToDouble(a[12]);

Grazie, proprio quello che volevo.



Poi, ci sono 5 prodotti fatti

Lanciamo un avviso di lettura (qualsiasi)

per esempio il livello "200"

Quando l'allarme scatta, qualcosa apre la posa, qualcosa si cancella, qualcosa fa altre cose. Voglio implementare un meccanismo per dare un segnale in questo modo


P.S.

Ho finito quello che volevo, posso inviarlo per la revisione. Capannoni perfettamente. Ma è vietato postare qui.

 
Ihor Herasko:

Per esempio, è possibile dividere gli ordini per tipo in una volta sola: Comprare, Vendere, BuyStop, SellStop, BuyLimit, SellLimit. Allora avremo bisogno di quattro array di questo tipo. Ma allora non avremo bisogno di passare di nuovo attraverso l'intera lista di ordini aperti quando si prendono decisioni di trading. Abbiamo solo bisogno di conoscere il numero di ordini di un certo tipo e fare riferimento all'array necessario.

Questo è esattamente ciò di cui ho bisogno, o meglio solo perBuy and Sell. La cosa principale per la mia semplice strategia è di non lasciare che le posizioni aperte interferiscano tra loro per vedere le condizioni di chiusura. Forse, possiamo fare a meno degli array? Non li capisco: come crearli, come affrontarli - sono al buio. Forse la mia situazione vi sarà più chiara nello screenshot:

Sembra che tutto nel codice sia semplice e funzioni chiaramente, ma questo è l'unico caso di incomprensione.

 
novichok2018:

Questo è esattamente ciò di cui ho bisogno, o meglio solo perBuy and Sell. Per la mia semplice strategia, la cosa più importante è che le posizioni aperte non interferiscano con le condizioni di chiusura delle altre. Forse possiamo fare a meno degli array? Non li capisco: come crearli, come affrontarli - sono al buio. Forse la mia situazione vi sarà più chiara nello screenshot:

Sembra che tutto nel codice sia semplice e funzioni chiaramente, ma questo è l'unico caso di incomprensione.

Naturalmente, nel più semplice (e di media complessità) è più conveniente senza gli array. E quando si arriva al punto di usare centinaia di ordini, è molto più facile. Per esempio, secondo OrderType() - uno per comprare 0, l'altro per vendere 1. La strategia del tuo trader è buona - puoi guadagnare 1 giorno o perdere mezza giornata. L'unica cosa di cui abbiamo bisogno è come prendere queste frecce. E sono troppo frequenti. Ha senso imparare prima a dare segnali: comprare e vendere
 
LRA:
Naturalmente, nel più semplice (e di media complessità) senza array è più conveniente. Ma quando si arriva al punto di usare centinaia di ordini - allora...

Potrebbe essere la ragione della mia situazione che il log scrive: 2018.01.25 20:22:12 2018_WPR14_AMarkets EURUSD,M5: OrderClose error 138 e si ripete solidamente a

2018.01.26 16:38:12 2018_WPR14_AMarkets EURUSD,M5: Allarme: ordini totali = 3 ? Nella schermata potete vedere che questo periodo cattura due condizioni di chiusura del SELL.

E i segnali per aprire una posizione sono attivati da una combinazione di diversi indicatori e chiusi da un indicatore. E non funzionano così spesso: può essere silenzioso per qualche giorno durante cinque minuti. Per esempio, dal 1° febbraio di quest'anno solo 14 posizioni si sono attivate.


 
novichok2018:

Potrebbe essere la ragione della mia situazione che il log scrive: 2018.01.25 20:22:12 2018_WPR14_AMarkets EURUSD,M5: OrderClose error 138 e si ripete solidamente a

2018.01.26 16:38:12 2018_WPR14_AMarkets EURUSD,M5: Alert: Total orders = 3 ? Nella schermata si può vedere che questo periodo cattura due condizioni di chiusura

Qual è la vostra situazione? Stai dicendo che il terminale sta facendo una voce di registro che sta causando l'errore? e cosa significa 138? sapete dove cercare? Come hai ottenuto questo è un errore molto raro. Quello che vedi nello screenshot è metà della battaglia. Come spiegare questo all'Expert Advisor? Devi scrivere qualche condizione matematica - invece di visualizzare la schermata, l'Expert Advisor opera con i numeri

 
LRA:

Stai dicendo che il terminale fa una voce di registro che causa l'errore? ... Cosa significa 138? Sai dove cercare?

No, sto dicendo che il tester fallisce in questo intervallo di storia, il che impedisce ai segnali di funzionare correttamente. Perché le requote non possono andare avanti per 24 ore.

 
novichok2018:

No, quello che voglio dire è che c'è un'anomalia nel tester a questo punto della storia, che impedisce ai segnali di funzionare correttamente. Perché le requote non possono andare avanti per 24 ore.

Richieste nel tester? È la prima volta che lo sento. Il tester è l'ideale - non ha nemmeno uno slittamento

...qualcosa sta dando un calcio all'indicatore - tendenza al rialzo. Comprerò ... Capito... Anche se non è abbastanza che ho voluto spostare TP in alto - ha già funzionato...

Quindi imposta un EA che se lo fa, allora uscirà, e continuerà al prossimo tick. E provalo sulla demo

Motivazione: