Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 1476

 
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   // здесь инициализируем то, что считаем нужным
   return(INIT_SUCCEEDED);

непонятно как это писать 

 
Лауреат #:

непонятно как это писать 

Что именно, Вам не понятно? Как создать функцию инициализации советника? Тогда попробуйте изучить, вот хотя бы, эту статью для начинающих.

С уважением, Владимир.

 
MrBrooklin #:

Что именно, Вам не понятно? Как создать функцию инициализации советника? Тогда попробуйте изучить, вот хотя бы, эту статью для начинающих.

С уважением, Владимир.

а что значит инициализируем))) вроде как это не понятно челу)))

 
Valeriy Yastremskiy #:

а что значит инициализируем))) вроде как это не понятно челу)))

Добрый вечер, Валерий! Открываем предложенную человеку статью и находим там сначала краткое описание:

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

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

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

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

а затем уже более детальное:

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

В общем, ему нужно для начала, хотя бы, прочитать эту статью. ))

С уважением, Владимир.

 

Всем доброго дня!

Продолжаю самообучение и опять столкнулся с непоняткой. Вот код скрипта:

//+------------------------------------------------------------------+
//| 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);
     }
  }
//+------------------------------------------------------------------+

По задумке скрипт должен был нарисовать трендовую линию в виде отрезка. Для этого задал начальную и вторую точку, чтобы нарисовать этот отрезок. В документации тоже сказано, что для создания трендовой лини нужно две точки привязки. Вроде бы всё сделал, как надо. В моем понимании вторая точка - она же является крайней, но рисуется почему-то не отрезок, а луч.


Подскажите, пжл, в чём заблуждаюсь?

С уважением, Владимир.

 

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 #:

Спасибо, Артём! Блин, не хватило ума, чтобы понять такую простую и явную вещь. Дай бог Вам здоровья!

С уважением, Владимир.

 

Всем доброго утра и хорошего настроения!

Ну, всё!! "Встречай, еду, твоя крыша!" Это про меня. Запускаю скрипт:

//+------------------------------------------------------------------+
//|                                              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," коротких позиций");
  }
//+------------------------------------------------------------------+

и получаю:

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 коротких позиций

а должно быть две коротких позиции. Подскажите, пжл, где начудил?

С уважением, Владимир.

 
MrBrooklin #:

Всем доброго утра и хорошего настроения!

Ну, всё!! "Встречай, еду, твоя крыша!" Это про меня. Запускаю скрипт:

и получаю:

а должно быть две коротких позиции. Подскажите, пжл, где начудил?

С уважением, Владимир.

Последними двумя принтами 

выводится значение переменных 

uint count_buy=0, count_sell=0;

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

 
Alexander Sevastyanov #:

Последними двумя принтами 

выводится значение переменных 

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

Здравствуйте, Александр. Так вот на этом и затупил. А что присвоить нужно? Вроде бы должна отработать функция Calc_Pos(count_buy, countsell) или не правильно понимаю?

С уважением, Владимир.