Вопросы от начинающих MQL4 MT4 MetaTrader 4 - страница 124

 
Игорь:
Здравствуйте уважаемые !
Подскажите как перекрасить бары не применяя шаблоны в мт4 !?
Или как применить цветовую схему !?
Контекстное меню графика, свойства, цвета   -- так пробовали?
 
Ihor Herasko:

Немного упрощу ответ, чтобы не сбивать с толку. Этот знак (&) указывает, что аргумент функции может изменить свое значение во время выполнения функции и вернется в то место, откуда была вызвана функция, с другим значением. В рассматриваемом случае функция SaveOrder может изменить содержимое массивов g_arrstBuyOrderInfo и g_arrstSellOrderInfo, а также переменных g_nBuyOrdersCnt и g_nSellOrdersCnt.

Спасибо. Становится чуть понятней. Не ясно только, как всё это можно узнать, не обращаясь к форуму. В учебниках таких объяснений я не нашел.

Прошу проконсультировать дальше:

1) Компилятор пишет - 'g_nBuyOrdersCnt' - declaration without type ;  'g_nSellOrdersCnt' - declaration without type . Правильно ли я понимаю, что g_nBuyOrdersCnt и g_nSellOrdersCnt должны быть объявлены на глобальном уровне, чтоб компилятор не ругался?

2) Компилятор: 'for' - expressions are not allowed on a global scope. Тут не понятно.

3) В функции void SaveOrderInfo(OrderInfo &arrstOrderInfo[], int &nOrdersCnt) компилятор пишет: declaration of 'arrstOrderInfo' hides global declaration.    see previous declaration of 'arrstOrderInfo'. Тоже не очень понятно.

4) 'nOrderCnt' - undeclared identifier. А действительно, почему он нигде не задекларирован?

И последнее: так и не понял, откуда берутся .n и .f и что это такое.

 




 
Игорь:

Здравствуйте уважаемые !

Подскажите как перекрасить бары не применяя шаблоны в мт4 !?

Или как применить цветовую схему !?

Если программно, то смотрите функции ChartSetInteger() и ChartGetInteger().

 
novichok2018:

Спасибо. Становится чуть понятней. Не ясно только, как всё это можно узнать, не обращаясь к форуму. В учебниках таких объяснений я не нашел.

Прошу проконсультировать дальше:

1) Компилятор пишет - 'g_nBuyOrdersCnt' - declaration without type ;  'g_nSellOrdersCnt' - declaration without type . Правильно ли я понимаю, что g_nBuyOrdersCnt и g_nSellOrdersCnt должны быть объявлены на глобальном уровне, чтоб компилятор не ругался?

2) Компилятор: 'for' - expressions are not allowed on a global scope. Тут не понятно.

3) В функции void SaveOrderInfo(OrderInfo &arrstOrderInfo[], int &nOrdersCnt) компилятор пишет: declaration of 'arrstOrderInfo' hides global declaration.    see previous declaration of 'arrstOrderInfo'. Тоже не очень понятно.

4) 'nOrderCnt' - undeclared identifier. А действительно, почему он нигде не задекларирован?

Вот, как все это должно быть в коде, если смотреть на него целиком:

#property strict

input       int i_nMagicNumber = 12876;

#define MAX_ORDERS_CNT   int(500)
struct OrderInfo
{
   int      nTicket;
   int      nType;
   double   fOpenPrice;
   double   fSL;
   double   fTP;
   datetime dtOpenTime;
};

int         g_nBuyOrdersCnt, 
            g_nSellOrdersCnt;

OrderInfo   g_arrstBuyOrderInfo[MAX_ORDERS_CNT], 
            g_arrstSellOrderInfo[MAX_ORDERS_CNT];

//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
//| Expert initialization function                                                                                                                                                                    |
//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
int OnInit()
{
   return INIT_SUCCEEDED;
}
//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
//| Expert deinitialization function                                                                                                                                                                  |
//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}
//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
//| Expert tick function                                                                                                                                                                              |
//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
void OnTick()
{
    FindOrders();
}
//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
//| Fills the orders arrays                                                                                                                                                                           |
//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
void FindOrders()
{
   g_nBuyOrdersCnt = 0;
   g_nSellOrdersCnt = 0;
   for (int i = OrdersTotal() - 1; i >= 0; --i)
   {
      if (!OrderSelect(i, SELECT_BY_POS))
         continue;
   
      if (OrderSymbol() != Symbol())   // Если нужны ордера только по текущему символу, к графику которого прикреплен советник
         continue;
   
      if (OrderMagicNumber() != i_nMagicNumber)  // Если имеется входной параметр советника i_nMagicNumber, в котором указан ID ордеров советника
         continue;
   
      if (OrderType() == OP_BUY)
         SaveOrderInfo(g_arrstBuyOrderInfo, g_nBuyOrdersCnt);
      if (OrderType() == OP_SELL)
         SaveOrderInfo(g_arrstSellOrderInfo, g_nSellOrdersCnt);
   }
}
//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
//| Saves one selected order in the specified array                                                                                                                                                   |
//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
void SaveOrderInfo(OrderInfo &arrstOrderInfo[], int &nOrdersCnt)
{
   if (nOrdersCnt >= MAX_ORDERS_CNT)
      return;

   arrstOrderInfo[nOrdersCnt].nTicket = OrderTicket();
   arrstOrderInfo[nOrdersCnt].nType = OrderType();
   arrstOrderInfo[nOrdersCnt].fOpenPrice = OrderOpenPrice();
   arrstOrderInfo[nOrdersCnt].fSL = OrderStopLoss();
   arrstOrderInfo[nOrdersCnt].fTP = OrderTakeProfit();

   ++nOrdersCnt;
}
 
novichok2018:

И последнее: так и не понял, откуда берутся .n и .f и что это такое. 

Оператор "точка" указывает на доступ к члену структуры или класса. В данном случае - структуры. 

Литеры n и f - это способ указания типа данных, которые хранятся в переменной. Ведь при огромном количестве переменных невозможно запомнить тип каждой из них. А если в имени переменной будет указание на ее тип, то необходимость в запоминании отпадает сама собой. n - признак целого числа (от Numeric), f - вещественного (от float - число с плавающей запятой). Такой способ записи имен переменных называется Венгерской нотацией.

 
Ihor Herasko:

Оператор "точка" указывает на доступ к члену структуры или класса. В данном случае - структуры. 

Литеры n и f - это способ указания типа данных, которые хранятся в переменной. Ведь при огромном количестве переменных невозможно запомнить тип каждой из них. А если в имени переменной будет указание на ее тип, то необходимость в запоминании отпадает сама собой. n - признак целого числа (от Numeric), f - вещественного (от float - число с плавающей запятой). Такой способ записи имен переменных называется Венгерской нотацией.

Вон оно как!! Оказывается g_ и g_n  - не просто какое-то сокращение, а префиксы, говорящие, что это глобальная и глобальная целочисленная переменные!! Уф... А я-то всё не мог понять, зачем эти черточки в обозначениях переменных... Ну и как возможно новичку, не разбирающемуся в таких тонкостях, писать код с использованием массивов, структур и пр.? Я думал, что моя простенькая стратегия может быть написана простым языком, без погружения в дебри.

Не могли бы Вы дать ссылку на подробный (расширенный) учебник по мкл4 для изучения параллельно Вашим консультациям?

А не могли бы Вы для сравнения написать вышеизложенный код без использования Венгерской нотации? Вы уверены, что платформа МТ4 её чётко понимает?


И вопрос по коду: для чего здесь continue;?

for (int i = OrdersTotal() - 1; i >= 0; --i)
   {
      if (!OrderSelect(i, SELECT_BY_POS))
         continue;
по идее тогда если ордер не выбран в первой итерации, он не будет выбран и в последующих и цикл будет продолжаться до бесконечности? Потому что количество ордеров не меняется. Не будет ли правильнее break  с сообщением об ошибке?
 
STARIJ:
Контекстное меню графика, свойства, цвета   -- так пробовали?

Спасибо мне програмно надо нашел уже !!!

 
Ihor Herasko:

Если программно, то смотрите функции ChartSetInteger() и ChartGetInteger().

Спасибо нашел уже с вашей помощью!!!

 
novichok2018:

Вон оно как!! Оказывается g_ и g_n  - не просто какое-то сокращение, а префиксы, говорящие, что это глобальная и глобальная целочисленная переменные!! Уф... А я-то всё не мог понять, зачем эти черточки в обозначениях переменных... Ну и как возможно новичку, не разбирающемуся в таких тонкостях, писать код с использованием массивов, структур и пр.? Я думал, что моя простенькая стратегия может быть написана простым языком, без погружения в дебри.

Чтобы сделать какое-то дело, приходится погружаться в тонкости. Другого пути нет. 

Не могли бы Вы дать ссылку на подробный (расширенный) учебник по мкл4 для изучения параллельно Вашим консультациям?

Мне известен только один учебник по MQL4 - Учебник Сергея Ковалева.

А не могли бы Вы для сравнения написать вышеизложенный код без использования Венгерской нотации? Вы уверены, что платформа МТ4 её чётко понимает?

Привыкайте сразу к правильному оформлению кода )) Венгерскую нотацию придумали достаточно опытные программисты.

И вопрос по коду: для чего здесь continue;?

по идее тогда если ордер не выбран в первой итерации, он не будет выбран и в последующих и цикл будет продолжаться до бесконечности? Потому что количество ордеров не меняется. Не будет ли правильнее break  с сообщением об ошибке?

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

Учебник по MQL4
Учебник по MQL4
  • book.mql4.com
В настоящее время персональный компьютер стал незаменимым помощником в жизни каждого человека. Благодаря развитию Интернета и увеличению мощности современных компьютеров открылись новые возможности во многих областях деятельности. Ещё десять лет назад торговля на финансовых рынках была доступна только банкам и узкому кругу специалистов. Сегодня...
 
Ihor Herasko:

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

И выводить сообщение об ошибке не надо? Наверное не мешало бы знать, почему не найден ордер и как этого избежать?

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