Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 752

 
Scusate la domanda molto semplice, come faccio a chiudere una posizione aperta? mql4 aveva la funzione OrderClose(), ma come?
 
RogozaIV:
Scusate una domanda molto semplice, come faccio a chiudere una posizione aperta? mql4 ha la funzione OrderClose(), ma come?

In mql5, devi aprire una posizione opposta, che si può vedere chiaramente nella scheda della Storia del terminale. Il modo più semplice è usare la classe CTrade dalla libreria standard.
 
 
Puoi dirmi dove scambiare criptovalute attraverso MT5? Broker, scambi? Ho trovato MT4, ma MT5 non sembra essere disponibile.
 

Signori, per favore, ditemi dov'è l'errore.

Sto preparando un indicatore da chiamare nell'EA.

Voglio inviare un buffer dall'indicatore.

Il risultato è il valore int legato alla barra.

Il compito è quello di passare un array bidimensionale dall'indicatore a un Expert Advisor, non riesco a capire come farlo.

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   2

int per[];

int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,per,INDICATOR_CALCULATIONS); //также пробовал INDICATOR_DATA и INDICATOR_COLOR_INDEX
...

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
{
      for(int b=1; b<Bmax; b++) //отбор по x
        {
         for(int p=1; p<Pmax; p++) // отбор по y
           {
            if(arrayZ[6][p][b]>0||arrayZ[6][p][b]<0)
            {
             per[b]=p;
            }
           }
        }
 }

Così lo chiamo nell'EA

int OnInit()
  {
//--- create timer
   SetIndexBuffer(0,Label1Buffer,INDICATOR_DATA); 
   ResetLastError(); 
   MA_handle=iCustom(NULL,0,"Topqw",0,1); 

   Print("MA_handle = ",MA_handle,"  error = ",GetLastError()); 
...

void OnTick()
//void OnTimer()
  {
//--- 
int copy=CopyBuffer(MA_handle,0,0,1000,Label1Buffer); 
   Print("copy =",copy," ",Label1Buffer[999]);//

 
Top2n:

Signori, per favore, ditemi dov'è l'errore.

Sto preparando un indicatore da chiamare nell'EA.

Voglio inviare un buffer dall'indicatore.

Il risultato è il valore int legato alla barra.

Il compito è quello di passare un array bidimensionale dall'indicatore a un Expert Advisor, non riesco a capire come farlo.

Lo chiamo nell'EA



1. Ricordate che nell'INDICATORE il buffer dell'indicatore di default con indice "0" corrisponde alla barra più a sinistra del grafico.

2. L'Expert Advisor non ha un comando "SetIndexBuffer".

3. iCustom sta creando un indicatore personalizzato, non una richiesta di buffer (quindi, tutto dovrebbe essere scritto esplicitamente, non ",0,1"). Nel tuo caso, puoi usare questa forma

//--- create handle of the indicator Topqw
   ResetLastError();
   handle_Topqw=iCustom(Symbol(),Period(),"Topqw",PRICE_CLOSE);
//--- if the handle is not created 
   if(handle_Topqw==INVALID_HANDLE)
     {
      //--- tell about the failure and output the error code 
      PrintFormat("Failed to create handle of the Topqw indicator for the symbol %s/%s, error code %d",
                  Symbol(),
                  EnumToString(Period()),
                  GetLastError());
      //--- the indicator is stopped early 
      return(INIT_FAILED);
     }

4. CopyBuffer sembra essere scritto correttamente.

5. Una matrice bidimensionale non può essere passata - fai due buffer per l'indicatore di matrice.

 
Vladimir Karputov:


1. Ricordate che nell'INDICATORE, per default, il buffer dell'indicatore con indice "0" corrisponde alla barra più a sinistra del grafico.

2. Non esiste un comando "SetIndexBuffer" nell'EA.

3. iCustom sta creando un indicatore personalizzato, non una richiesta di buffer (quindi tutto dovrebbe essere scritto esplicitamente, non ",0,1"). Nel tuo caso, puoi usare questa forma

4. CopyBuffer sembra essere scritto correttamente.

5. Non puoi passare un array bidimensionale - fai due buffer per l'indicatore dell'array.


Grazie per la correzione, ma non capisco, se imposto esplicitamente di trasferire gli array, come viene formalizzato? Dove devo specificare che ho bisogno di estrarre due array?

MA_handle=iCustom(Symbol(),Period(),"TopFidCounselor",per,bar); per,bar - же массивы, а данные должны быть imput,
в индикаторе записываю в массивы
   SetIndexBuffer(0,per,INDICATOR_CALCULATIONS);
   SetIndexBuffer(1,bar,INDICATOR_CALCULATIONS);

если я сделаю такую запись
int OnCalculate(
...
  {
//--------------------------------------------------------------
  for ( int i = 0; i < rates_total; i ++ ) per[i] = price[i];  -
//--------------------------------------------------------------
ТО СОВЕТНИК РАБОТАЕТ БЕЗ ОШИБКИ
а если такую
//----------------------------------------------------------------
      for(int b=1; b<200; b++) //отбор по х			-
        {							-
         for(int p=1; p<200; p++) // отбор по у			-
           {							-
            if(arrayZ[6][p][b]>0||arrayZ[6][p][b]<0)		-
            {							-
             per[b]=p;						-
             bar[b]=b;						-
            }							-
           }							-
        }							-
//----------------------------------------------------------------
ТО ОШИБКА код 4002

Ho dato un'occhiata aIndicatorCreate(), potresti per favore dirmi come, altrimenti mi ci vorranno settimane per capirlo, e mi rimane così poco per finire il blocco di pensiero. Devo andare presto nella taiga per passare l'estate con le api a bottinare, quindi voglio controllare l'idea prima della partenza, così non mi farò illusioni.
 

Quello che uso nell'indicatoreINDICATOR_CALCULATIONS è corretto?

   SetIndexBuffer(0,per,INDICATOR_CALCULATIONS);
 

L'errore 4002 è risolto.

solo che non è chiaro dove scrivere l'array da estrarre?

   int copy=CopyBuffer(MA_handle,0,0,bars,per); //per?
 
Top2n:

L'errore 4002 è risolto.

solo che non è chiaro dove scrivere l'array da estrarre?


L'arrayper è dichiarato nell'EA, nella procedura in cui si fa la copia. Deve essere un array dinamico (dichiarato come [] - senza dimensionalità).
Motivazione: