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

 
-Aleks-:

Puoi mostrarmi sulla mia funzione come fare questo? Faccio davvero fatica a capirlo.


Devi decidere quali variabili della funzione ti servono (per il programma principale) e passarle/recuperarle. Se avete bisogno di All, allora dichiarate queste variabili all'inizio del programma e saranno visibili a tutte le funzioni contemporaneamente.
 
-Aleks-:

Non pensare al 'perché', meglio pensare al 'come'.

Te l'ho detto, non si applica a questa funzione...

Tali funzioni sono grandi, di regola, per questo è un peccato chiamarle per l'esecuzione diverse volte per ottenere diversi valori, ma io voglio ottenere tutti i risultati in una volta sola.

Bene, per esempio, voglio ottenere subito il numero di tutti i lotti e il numero di tutti gli ordini suddivisi per tipo di ordine.

#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
double n_Lot_BUY;
double n_Lot_SELL;
int n_Order_BUY;
int n_Order_SELL;

int OnInit()
  {
   return(INIT_SUCCEEDED);
  }
void OnDeinit(const int reason)
  {
  }
void OnTick()
  {
   F();
   Print("Лотов BUY:",n_Lot_BUY,"   Лотов SELL:",n_Lot_SELL,"   Позиций BUY:",n_Order_BUY,"   Позиций SELL:",n_Order_SELL);
  }
//+------------------------------------------------------------------+
void F()
  {
   n_Lot_BUY=0;
   n_Lot_SELL=0;
   n_Order_BUY=0;
   n_Order_SELL=0;
   for(int pos=OrdersTotal()-1;pos>=0;pos--)
     {
      if(!OrderSelect(pos,SELECT_BY_POS,MODE_TRADES)){break;}
      if(OrderType()==0)
        {
         n_Order_BUY++;
         n_Lot_BUY=n_Lot_BUY+OrderLots();
        }
      if(OrderType()==1)
        {
         n_Order_SELL++;
         n_Lot_SELL=n_Lot_SELL+OrderLots();
        }
     }
  }
//+------------------------------------------------------------------+
 
Nikolay Gaylis:

Voglio dire, l'idea è di dichiarare tutte le variabili in anticipo, e poi modificarle attraverso una funzione - capito, grazie per l'opzione. Ma non è sempre conveniente, se uno stesso nome di variabile è usato per lo stesso tipo di variabili... non ci sono altre opzioni?
 

gli stessi tipi possono essere combinati in una struttura e dichiarati come array, come suggerito sopra)

//структура из переменных
struct OrdStruct
   {
   double tp;
   double sl;
   double open;
   double close;
   double lot;
   datetime time_open; 
   datetime time_close;
   };

//массив структур
OrdStruct ORDERS[];


//обращение к переменным
ORDERS[i].sl=OrderStopLoss();
ORDERS[i].tp=OrderTakeProfit();
ORDERS[i].lot=OrderLots();

//или
ORDERS[i]=ORDERS[i+1];

ZeroMemory(ORDERS[i]);
 
Taras Slobodyanik:

Gli stessi tipi possono essere combinati in una struttura e dichiarati come array, come suggerito sopra)

Questo è già difficile da capire... per esempio, non riesco a capire i - a cosa è uguale e, l'array ORDERS[i]= non dovrebbe avere una dimensione?

 
-Aleks-:

Questo è già difficile da capire... per esempio, non riesco a capire i - cosa è uguale e, non dovrebbe essere dimensionato l'array ORDERS[i]=?


Questo è solo un esempio, naturalmente i deve essere specificato e la dimensione dell'array deve essere regolata secondo il numero di ordini...

cioè le variabili sono più o meno le stesse tp / sl / lotto ... ma l'indice dell'array i cambia

 
-Aleks-:

Mi addolora vedere la tua angoscia... Siete su un forum tecnico, usate la logica, per favore.

1. descrivere il problema;

Descrivi le variabili che stai usando;

Descrivete ciò che volete ottenere come output;

Imparate ad esprimere le vostre idee in un linguaggio tecnico su un forum tecnico. Altrimenti, ci vorrà molto tempo per indovinare qui.

 
Taras Slobodyanik:


Questo è per esempio, naturalmente ho bisogno di specificare e impostare la dimensione dell'array a seconda del numero di ordini...

cioè le variabili sono più o meno le stesse tp / sl / lotto ... ma l'indice dell'array i cambia

Sì, ho capito, grazie, dovrei cercare di usarlo in futuro, da qualche parte.... Proprio non capisco, e lavorare con questa struttura come un array? Ordinare ed eseguire altre operazioni standard?

 
Alexey Kozitsyn:

Mi addolora vedere la tua angoscia... Siete su un forum tecnico, usate la logica, per favore.

1 Descrivere il problema;

Descrivi le variabili che stai usando;

Descrivete ciò che volete ottenere come output;

Imparate ad esprimere le vostre idee in un linguaggio tecnico su un forum tecnico. Altrimenti, ci vorrà molto tempo per indovinare qui.

Per favore, scrivi dove non c'è logica nelle mie parole?

Il tormento nel sapere è il piacere nel risolvere.

Non volevo rovesciare il mio problema, quindi l'ho mantenuto semplice - trovo difficile indovinare cosa ha causato la difficoltà di percezione... Scusa se ti ho fatto sentire a disagio con la mia "angoscia".

 
-Aleks-:

Cioè l'idea è di dichiarare tutte le variabili in anticipo, e poi cambiarle attraverso una funzione - capito, grazie per la variante. Ma non è sempre conveniente se uno stesso nome di variabile è usato per lo stesso tipo di variabili... non ci sono altre opzioni?

Leggete attentamente qui e vedrete cosa sta succedendo. Questo descrive la prima opzione, che è stata proposta, il passaggio di parametri per riferimento.

In poche parole, quando una funzione viene chiamata, una variabile può essere passata come parametro

double FirstMethod(int i,int j)

o per riferimento se il nome della variabile è preceduto da un segno &.

double SecondMethod(int &i,int &j)

Nella seconda variante, le variabili passate alla funzione per riferimento saranno cambiate insieme alle variabili che hanno anche nomi diversi. Nel caso speciale queste sono le variabili i e j

Tutto il resto è abbastanza chiaro dal testo di aiuto.

Передача параметров - Функции - Основы языка - Справочник MQL4
Передача параметров - Функции - Основы языка - Справочник MQL4
  • docs.mql4.com
Передача параметров - Функции - Основы языка - Справочник MQL4