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

 

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

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

//+------------------------------------------------------------------+
//| 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) или не правильно понимаю?

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

 
MrBrooklin #:

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

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

1. Вы объявляете и инициализируете две переменные. 

uint count_buy=0, count_sell=0;

2. Передаете их значения в функцию.

Calc_Pos(count_buy,count_sell);

Не совсем понятно зачем это делается.
Потом выводите значения этих переменных. Но они негде не изменялись,
соответственно и принтуются нули. Все работает как написано.

П.С. Пытаясь разгадать ваш план: можно объявить эти две переменные глобальными.
Например так:

//+------------------------------------------------------------------+
//|                                              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. Вы объявляете и инициализируете две переменные. 

2. Передаете их значения в функцию.

Не совсем понятно зачем это делается.
Потом выводите значения этих переменных. Но они негде не изменялись,
соответственно и принтуются нули. Все работает как написано.

П.С. Пытаясь разгадать ваш план: можно объявить эти две переменные глобальными.
Например так:

Огромное спасибо, Александр. Ваше исправление заставило работать код. Честно говоря, уже и сам понял, что запутался в трёх соснах. Мне нужно ещё раз изучить передачу аргументов в функцию. Здесь, по всей видимости, у меня полное недопонимание.

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

 
MrBrooklin #:

Огромное спасибо, Александр. Ваше исправление заставило работать код. Честно говоря, уже и сам понял, что запутался в трёх соснах. Мне нужно ещё раз изучить передачу аргументов в функцию. Здесь, по всей видимости, у меня полное недопонимание.

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

Вывод переменных в глобальную область это не передача аргументов в функцию…

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

Поставь & перед именами переменных на входе в функцию и все проблемы будут решены.

 
Alexey Viktorov #:

Вывод переменных в глобальную область это не передача аргументов в функцию…

Поставь & перед именами переменных на входе в функцию и все проблемы будут решены.

Привет, Алексей! Так вот в чём проблема!!! Огромное спасибо тебе, дорогой! Всю голову сломал, всё думал, чего-то ещё не хватает! Оказалось, что мозгов не хватает!!! )) 

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

Причина обращения: