Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 1217

 
Pineapple88:

Boa tarde!

Estou a tentar compreender as arrays e tenho a seguinte questão.

Porquê utilizar oArraySetAsSeries neste exemplo e colocar uma bandeira verdadeira, se naCopyRates a contagem é feita do presente para o passado?

Compreendo que a funçãoArraySetAsSeries é necessária para pesquisar a matriz do presente para o passado.

Quero compreender a finalidade desta função neste exemplo.

Depois de

ArraySetAsSeries(rates,true); 

taxas[0] corresponderão à BARRA DIREITA no gráfico. Esta é a explicação mais simples, sem os termos confusos "presente" e "futuro".

 
Vladimir Karputov:

Depois de

taxas[0] corresponderão à BARRA DIREITA no gráfico. Esta é a explicação mais simples, sem os termos confusos "presente" e "futuro".

Obrigado pela resposta!

Mas se não utilizarmos oArraySetAsSeries, entãoo CopyRates também atribuirá taxas[0] à barra mais à direita no gráfico.

Só estou a tentar compreender para que serve oArraySetAsSeries quando funciona da mesma forma sem ele?

Ou é apenas uma forma aceite de escrever código?

 
Pineapple88:

Obrigado pela resposta!

Mas se não utilizarmos oArraySetAsSeries, entãoo CopyRates também atribuirá taxas[0] à barra mais à direita no gráfico.

Só estou a tentar compreender porque é que oArraySetAsSeries énecessário quando funciona da mesma forma sem ele?

Ou é apenas uma forma aceite de escrever código?

está errado, CopyRates atribui a taxa[0] ao valor mais antigo devido ao tamanho da matriz de taxa[].
 
Anatolii Zainchkovskii:
está errado, CopyRates atribuir taxa[0] ao valor mais antigo devido ao tamanho da matriz de taxa[].

Obrigado!

Agora percebo, estava errado)

 

Boa tarde!

Mais uma vez peço ajuda!

Escrevi um código com a condição "comprar" quando MA(20) cruza MA(50) de baixo para cima

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");
        }
  }

Mas, de facto, executa-se assim

Arquivos anexados:
n2b3h1.png  140 kb
 
Pineapple88:

Boa tarde!

Mais uma vez peço ajuda!

Escrevi um código com a condição "comprar" quando MA(20) cruza MA(50) de baixo para cima

Mas de facto é feito desta forma

Erro grosseiro: Cria-se duas pegas indicadoras em cada tick. A forma correcta de o fazer é

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

passar para o OnInit, adicionar uma verificação da correcção do punho.


Também devem ser feitas matrizes que retirem valores da IMA

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

Muito obrigado pela sua resposta rápida!

Eu compreendo asérie ArraySetAsSeries.

Vou tentar descobrir como mover o indicador para o OnInit, e verificar a pega.

***

 
Pineapple88:

Muito obrigado pela sua resposta rápida!

Eu compreendo asérie ArraySetAsSeries.

Vou tentar descobrir como mover o indicador para o OnInit, e verificar a pega.

***

Tudo está lá desde o início

  • na documentação:iMA
  • MetaEditor - Consultor Especialista [pasta de dados]MQL5Experts\Exemplos\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:

Está tudo aí desde o início.

  • na documentação:iMA
  • em MetaEditor - EA [pasta de dados]MQL5Experts\Exemplos\Moving Average\Moving Average.mq5

Obrigado, irei estudar

 

Fixou-o, tudo parece estar a funcionar!)

Transferi dois indicadores de MA para a função OnInit.

Compreendo que criamos apenas o manípulo indicador na função OnInit e efectuamos todas as outras manipulações com as matrizes na função OnTick e verificamo-lo em cada 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: имя функции, тип возвращаемого значения, состав параметров (если они есть) и их типы должны строго соответствовать описанию функции-обработчика события. Именно по типу возвращаемого значения и по...