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

 
MrBrooklin #:

O que exatamente você não está entendendo? Como criar uma função de inicialização do EA? Então, tente estudar este artigo para iniciantes.

Saudações, Vladimir.

e o que significa inicializar))))) não está claro para uma pessoa)))))

 
Valeriy Yastremskiy #:

e o que você quer dizer com initialise))))) não está muito claro para a pessoa)))))

Boa noite, Valery! Abrimos o artigo proposto para a pessoa e encontramos primeiro uma breve descrição:

Далее идет функция инициализации советника. Это функция вызывается первой после запуска советника или смены графика и вызывается только один раз.

Этот раздел - лучшее место для проведения проверок, чтобы убедиться в правильности работы нашего советника.

Например, можно проверить, достаточно ли баров на графике для работы нашего советника и т.п.

Также это лучшее место для получения хэндлов технических индикаторов, которые будут использоваться (в нашем случае это индикаторы ADX и Moving Average).

e depois uma mais detalhada:

int OnInit()
  {
//--- Получить хэндл индикатора ADX
   adxHandle=iADX(NULL,0,ADX_Period);
//--- Получить хэндл индикатора Moving Average
   maHandle=iMA(_Symbol,_Period,MA_Period,0,MODE_EMA,PRICE_CLOSE);
//--- Нужно проверить, не были ли возвращены значения Invalid Handle
   if(adxHandle<0 || maHandle<0)
     {
      Alert("Ошибка при создании индикаторов - номер ошибки: ",GetLastError(),"!!");
     }

Em geral, ele deveria pelo menos ler este artigo primeiro. ))

Saudações, Vladimir.

 

Bom dia a todos!

Estou continuando meu estudo autônomo e novamente me deparei com uma confusão. Aqui está o código do script:

//+------------------------------------------------------------------+
//| Input variables                                                  |
//+------------------------------------------------------------------+
input uchar candles = 60;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   MqlRates price_array[];
   double price_low[];
   ArraySetAsSeries(price_low, true);
   ArraySetAsSeries(price_array, true);
   int copy_low = CopyLow(_Symbol, _Period, 0, candles, price_low);
   if(copy_low > 0)
     {
      int candle_low = ArrayMinimum(price_low, 0, candles);
      int Data = CopyRates(_Symbol, _Period, 0, candles, price_array);
      ObjectCreate(0, "UpwardTrendline", OBJ_TREND, 0, price_array[candle_low].time, price_array[candle_low].low,
                   price_array[0].time, price_array[0].low,0);
      ObjectSetInteger(0, "UpwardTrendline", OBJPROP_COLOR, Blue);
      ObjectSetInteger(0, "UpwardTrendline", OBJPROP_STYLE, STYLE_SOLID);
      ObjectSetInteger(0, "UpwardTrendline", OBJPROP_WIDTH, 3);
      ObjectSetInteger(0, "UpwardTrendline", OBJPROP_RAY_RIGHT, true);
     }
  }
//+------------------------------------------------------------------+

O script deveria desenhar uma linha de tendência como um segmento. Para fazer isso, defini o ponto inicial e o segundo ponto para desenhar esse segmento. A documentação também diz que você precisa de dois pontos de ancoragem para criar uma linha de tendência. Acho que fiz tudo como deveria ser feito. No meu entendimento, o segundo ponto também é um ponto extremo, mas, por algum motivo, ele é desenhado não como um segmento, mas como um raio.


Você poderia me dizer onde estou errado?

Atenciosamente, Vladimir.

 

MrBrooklin #:
     

      ObjectSetInteger(0, "UpwardTrendline", OBJPROP_COLOR, Blue);
      ObjectSetInteger(0, "UpwardTrendline", OBJPROP_STYLE, STYLE_SOLID);
      ObjectSetInteger(0, "UpwardTrendline", OBJPROP_WIDTH, 3);
      ObjectSetInteger(0, "UpwardTrendline", OBJPROP_RAY_RIGHT, true);
ObjectSetInteger(0, "UpwardTrendline", OBJPROP_RAY_RIGHT, false);
 
Artyom Trishkin #:

Obrigado, Artyom! Cara, eu não tinha inteligência suficiente para entender algo tão simples e óbvio. Deus o abençoe!

Abraços, Vladimir.

 

Bom dia e bom humor a todos!

É isso aí! "Estou indo, seu telhado!" Esse sou eu. Executo o script:

//+------------------------------------------------------------------+
//|                                              Count_Pos (v.2).mq5 |
//|                                  Copyright 2023, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Calculate positions Buy and Sell                                 |
//+------------------------------------------------------------------+
void Calc_Pos(uint pos_buy,uint pos_sell)
  {
   for(int i=0; i<PositionsTotal(); i++)
     {
      PositionGetSymbol(i);
      if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
         pos_buy++;
      if(
         PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
         pos_sell++;
     }
   Print("pos_buy ",pos_buy);
   Print("pos_sell ",pos_sell);
  }
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   uint count_buy=0, count_sell=0;
   Calc_Pos(count_buy,count_sell);
   Print("По символу ",_Symbol," открыто: ",count_buy," длинных позиций");
   Print("По символу ",_Symbol," открыто: ",count_sell," коротких позиций");
  }
//+------------------------------------------------------------------+

e obtenho isto:

2023.11.22 07:59:29.375 Count_Pos (v.2) (EURUSDrfd,M1)  pos_buy 0
2023.11.22 07:59:29.375 Count_Pos (v.2) (EURUSDrfd,M1)  pos_sell 2
2023.11.22 07:59:29.375 Count_Pos (v.2) (EURUSDrfd,M1)  По символу EURUSDrfd открыто: 0 длинных позиций
2023.11.22 07:59:29.375 Count_Pos (v.2) (EURUSDrfd,M1)  По символу EURUSDrfd открыто: 0 коротких позиций

e deveria haver duas posições vendidas. Você poderia me dizer onde cometi um erro?

Atenciosamente, Vladimir.

 
MrBrooklin #:

Bom dia e bom humor a todos!

É isso aí! "Estou indo, seu telhado!" Esse sou eu. Estou executando o roteiro:

e recebo isto:

e deveria haver duas posições vendidas. Você poderia me dizer onde cometi um erro?

Atenciosamente, Vladimir.

As duas últimas impressões

estão gerando o valor das variáveis

uint count_buy=0, count_sell=0;

que foram inicializadas, mas nada mais foi atribuído a elas.
Ou seja, tudo funciona como está escrito, sem milagres.

 
Alexander Sevastyanov #:

As duas últimas impressões

produzem o valor das variáveis

que foram inicializadas, mas nada mais foi atribuído a elas.
Ou seja, tudo funciona como está escrito, sem milagres.

Olá, Alexander. Foi aí que fiquei perplexo. O que deve ser atribuído? Acho que a função Calc_Pos(count_buy, countsell) deve funcionar, ou estou entendendo errado?

Atenciosamente, Vladimir.

 
MrBrooklin #:

Olá, Alexander. Foi aí que fiquei perplexo. O que deve ser atribuído? Acho que a função Calc_Pos(count_buy, countsell) deve funcionar, ou estou entendendo errado?

Atenciosamente, Vladimir.

1. Você declara e inicializa duas variáveis.

uint count_buy=0, count_sell=0;

2. Você passa seus valores para a função.

Calc_Pos(count_buy,count_sell);

Não está muito claro por que isso é feito.
Em seguida, você gera os valores dessas variáveis. Mas eles não foram alterados em lugar algum,
respectivamente, e zeros são impressos. Tudo funciona como está escrito.

P.S. Tentando entender seu plano: você pode declarar essas duas variáveis como globais.
Por exemplo, assim:

//+------------------------------------------------------------------+
//|                                              Count_Pos (v.2).mq5 |
//|                                  Copyright 2023, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"

   uint pos_buy=0, pos_sell=0;  // это глобальные переменные

//+------------------------------------------------------------------+
//| Calculate positions Buy and Sell                                 |
//+------------------------------------------------------------------+
void Calc_Pos()
  {
   for(int i=0; i<PositionsTotal(); i++)
     {
      PositionGetSymbol(i);
      if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
         pos_buy++;
      if(
         PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
         pos_sell++;
     }
   Print("pos_buy ",pos_buy);
   Print("pos_sell ",pos_sell);
  }
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   Calc_Pos();
   Print("По символу ",_Symbol," открыто: ",pos_buy," длинных позиций");
   Print("По символу ",_Symbol," открыто: ",pos_sell," коротких позиций");
  }
//+------------------------------------------------------------------+
 
Alexander Sevastyanov #:

1. Você declara e inicializa duas variáveis.

2. Você passa seus valores para a função.

Não está muito claro por que isso é feito.
Em seguida, envie os valores dessas variáveis. Mas eles não foram alterados em lugar algum,
respectivamente e são impressos com zeros. Tudo funciona como está escrito.

P.S. Tentando entender seu plano: você pode declarar essas duas variáveis como globais.
Por exemplo, assim:

Muito obrigado, Alexander. Sua correção fez o código funcionar. Para ser sincero, percebi que eu mesmo estava confuso em três pontos. Preciso estudar novamente a passagem de argumentos para uma função. Aparentemente, estou totalmente equivocado aqui.

Saudações, Vladimir.

Razão: