Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 1217

 
Pineapple88:

Buon pomeriggio!

Sto cercando di capire gli array e ho la seguente domanda.

Perché usareArraySetAsSeries in questo esempio e impostare il flag true, se inCopyRates il conteggio viene fatto dal presente al passato?

Ho capito che la funzioneArraySetAsSeries è necessaria per cercare l'array dal presente al passato.

Voglio capire lo scopo di questa funzione in questo esempio.

Dopo

ArraySetAsSeries(rates,true); 

tassi[0] corrisponderà alla BARRA DESTRA nel grafico. Questa è la spiegazione più semplice, senza i confusi termini "presente" e "futuro".

 
Vladimir Karputov:

Dopo

tassi[0] corrisponderà alla BARRA DESTRA sul grafico. Questa è la spiegazione più semplice, senza i confusi termini "presente" e "futuro".

Grazie per la risposta!

Ma se non usiamoArraySetAsSeries, alloraCopyRates assegnerà anche rates[0] alla barra più a destra del grafico.

Sto solo cercando di capire a cosa serve la funzioneArraySetAsSeries quando funziona lo stesso senza di essa?

O è solo una forma accettata di scrivere codice?

 
Pineapple88:

Grazie per la risposta!

Ma se non usiamoArraySetAsSeries, alloraCopyRates assegnerà anche rates[0] alla barra più a destra del grafico.

Sto solo cercando di capire perché la funzioneArraySetAsSeriesè necessaria quando funziona lo stesso senza di essa?

O è solo una forma accettata di scrivere codice?

ti sbagli, CopyRates assegna rate[0] al valore più vecchio a causa della dimensione dell'array rate[].
 
Anatolii Zainchkovskii:
ti sbagli, CopyRates assegna rate[0] al valore più vecchio a causa della dimensione dell'array rate[].

Grazie!

Ora ho capito, mi sbagliavo)

 

Buon pomeriggio!

Ancora una volta chiedo aiuto!

Ho scritto un codice con la condizione "compra" quando MA(20) incrocia MA(50) dal basso verso l'alto

input int SmallMovingAverage = 20;
input int BigMovingAverage   = 50;


//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {

   double Ask = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
   double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);

   string signal = "";

   double SmallMovingAverageArray[], BigMovingAverageArray[];

   int SmallMovingAverageDefinition = iMA(_Symbol,_Period,SmallMovingAverage,0,MODE_SMA,PRICE_CLOSE);
   int BigMovingAverageDefinition   = iMA(_Symbol,_Period,BigMovingAverage,0,MODE_SMA,PRICE_CLOSE);

   CopyBuffer(SmallMovingAverageDefinition,0,0,3,SmallMovingAverageArray);
   CopyBuffer(BigMovingAverageDefinition,0,0,3,BigMovingAverageArray);

   if(BigMovingAverageArray[1] < SmallMovingAverageArray[1])
   if(BigMovingAverageArray[2] > SmallMovingAverageArray[2])
        {
         Print("buy");
        }
  }

Ma in realtà si esegue così

File:
n2b3h1.png  140 kb
 
Pineapple88:

Buon pomeriggio!

Ancora una volta chiedo aiuto!

Ho scritto un codice con la condizione "compra" quando MA(20) incrocia MA(50) dal basso verso l'alto

Ma in realtà si fa così

Errore grossolano: si creano due maniglie dell'indicatore su ogni tick. Il modo corretto di farlo è

   int SmallMovingAverageDefinition = iMA(_Symbol,_Period,SmallMovingAverage,0,MODE_SMA,PRICE_CLOSE);
   int BigMovingAverageDefinition   = iMA(_Symbol,_Period,BigMovingAverage,0,MODE_SMA,PRICE_CLOSE);

spostare a OnInit, aggiungere un controllo della correttezza dell'handle.


Anche gli array che prendono valori da IMA devono essere fatti

ArraySetAsSeries(SmallMovingAverageArray,true);  
ArraySetAsSeries(BigMovingAverage,true)
Основы тестирования в MetaTrader 5
Основы тестирования в MetaTrader 5
  • www.mql5.com
Идея автоматической торговли привлекательна тем, что торговый робот может без устали работать 24 часа в сутки и семь дней в неделю. Робот не знает усталости, сомнений и страха,  ему не ведомы психологические проблемы. Достаточно четко формализовать торговые правила и реализовать их в виде алгоритмов, и робот готов неустанно трудиться. Но прежде...
 

Grazie mille per la vostra pronta risposta!

Ho capito diArraySetAsSeries.

Cercherò di capire come spostare l'indicatore su OnInit, e controllare la maniglia.

***

 
Pineapple88:

Grazie mille per la tua pronta risposta!

Ho capito diArraySetAsSeries.

Cercherò di capire come spostare l'indicatore su OnInit, e controllare la maniglia.

***

Tutto è lì dall'inizio

  • in documentazione:iMA
  • MetaEditor - Expert Advisor [data folder]MQL5\Experts\Examples\Moving Average\Moving Average.mq5
Документация по MQL5: Технические индикаторы / iMA
Документация по MQL5: Технические индикаторы / iMA
  • www.mql5.com
//|                                                     Demo_iMA.mq5 | //|                        Copyright 2011, MetaQuotes Software Corp. | //|                                             https://www.mql5.com | //| Перечисление способов создания хэндла                            |  Creation             type=Call_iMA;                ...
 
Vladimir Karputov:

È tutto lì dall'inizio.

  • nella documentazione:iMA
  • in MetaEditor - EA [data folder]MQL5\Experts\Examples\Moving Average\Moving Average.mq5

Grazie, studierò

 

Risolto, tutto sembra funzionare)!

Ho trasferito due indicatori MA alla funzione OnInit.

Capisco che creiamo solo l'handle dell'indicatore nella funzione OnInit ed eseguiamo tutte le altre manipolazioni con gli array nella funzione OnTick e lo controlliamo ad ogni tick?

int SmallMovingAverageDefinition = 0;
int BigMovingAverageDefinition   = 0;
input int SmallMovingAverage = 20;
input int BigMovingAverage   = 50;


int OnInit()
  {
//---
   SmallMovingAverageDefinition = iMA(_Symbol,_Period,SmallMovingAverage,0,MODE_SMA,PRICE_CLOSE);
   BigMovingAverageDefinition   = iMA(_Symbol,_Period,BigMovingAverage,0,MODE_SMA,PRICE_CLOSE);

   if(SmallMovingAverageDefinition==INVALID_HANDLE  || BigMovingAverageDefinition==INVALID_HANDLE)
     {
      Print("Ошибка создания хендла");
     }
//---
   return(INIT_SUCCEEDED);
  }


void OnDeinit(const int reason)
  {
//---

  }


void OnTick()
  {

   double Ask = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
   double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);

   string signal = "";

   double SmallMovingAverageArray[], BigMovingAverageArray[];

   ArraySetAsSeries(SmallMovingAverageArray,true);
   ArraySetAsSeries(BigMovingAverageArray, true);

   CopyBuffer(SmallMovingAverageDefinition,0,0,3,SmallMovingAverageArray);
   CopyBuffer(BigMovingAverageDefinition,0,0,3,BigMovingAverageArray);

   if(SmallMovingAverageArray[1] > BigMovingAverageArray[1])
      if(SmallMovingAverageArray[2] < BigMovingAverageArray[2])
        {
         Print("buy");
        }
  }
Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
В языке MQL5 предусмотрена обработка некоторых предопределенных событий. Функции для обработки этих событий должны быть определены в программе MQL5: имя функции, тип возвращаемого значения, состав параметров (если они есть) и их типы должны строго соответствовать описанию функции-обработчика события. Именно по типу возвращаемого значения и по...