Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 1523

 
Сергей Таболин:

Как я, дилетант, который уж который год не может понять сакральный смысл всех классов, и вообще на кой нужен ООП в часности в нашем (трейдинг) деле, понимаю - классы, это все написанные (и от MQ, и от гуру) коды-библиотеки, предназначенные для "облегчения" жизни "писателям кодов не-гуру".

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

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

  • возможно, гвоздь оказался не того размера - нужно проверить.
  • возможно, угол не тот - нужно проверить.
  • возможно он вбит не в том месте - нужно проверить.

Так и на кой мне нужны такие исполнители (классы)???

Я, возможно, маленько утрирую, но суть от этого не меняется.

А всё почему? Потому что любые данные, обрабатываемые в классах, можно изменить так, что этот класс о подмене даже не заподозрит.


Понятно.

Я, кстати, согласен, что ООП не делает программирование легче.

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

ООП сложнее для начинающих.

Использование чужих классов это в какой-то степени - использование чёрных ящиков.

 
Здравствуйте. Подскажите пожалуйста где я допустил ошибку, почему индикатор не выводит стрелки?
#property copyright "Copyright 2021, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window


double      Buy[];            // Буфер для покупок
double      Sell[];           // Буфер для продаж


input int tenkan_sen1 = 9;
input int kijun_sen1  = 26;
input int senkou_span_b1 = 52;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- 
//--- indicator buffers mapping
   SetIndexBuffer(0,Buy);
   SetIndexBuffer(1,Sell);  
   // Устанавливаем нулевые значения для индикатора, при которых не будет сигнальных стрелок
   SetIndexEmptyValue (0, 0);
   SetIndexEmptyValue (1, 0);
   //Определяем стиль отображения индикаторных линий - стрелка
   SetIndexStyle (0, DRAW_ARROW);
   SetIndexStyle (1, DRAW_ARROW); 
   // Установим значки "стрелки" для буферов
   SetIndexArrow(0, 234);  //Стрелка "вниз" для продаж
   SetIndexArrow(1, 233);  //Стрелка "вверх" для покупок
   //Устанавливаем текст описания стрелок индикатора для отображения информации в всплывающей подсказке.
   SetIndexLabel(0, "Продаём");
   SetIndexLabel(1, "Покупаем");
   //Определяем разрядность значений индикаторных линий - приравниваем разрядности фин. инструмента
   IndicatorDigits (Digits);
   //Строка с кратким названием индикатора выводится в сплывающей подсказке при наведении указателя мыши на стрелку
   IndicatorShortName ("Мой первый индикатор");
   
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
    int limit=rates_total-prev_calculated-1;
   if(limit<1) return(0);
   for(int i=limit;i>=0;i--)
     {
      // Снимем показания индикатора
      double tenkan_sen = iIchimoku(NULL,0,tenkan_sen1,kijun_sen1,senkou_span_b1,MODE_TENKANSEN,i);
      double kijun_sen = iIchimoku(NULL,0,tenkan_sen1,kijun_sen1,senkou_span_b1,MODE_KIJUNSEN,i);
      double senkou_span_b = iIchimoku(NULL,0,tenkan_sen1,kijun_sen1,senkou_span_b1,MODE_SENKOUSPANA,i);
      double senkou_span_a = iIchimoku(NULL,0,tenkan_sen1,kijun_sen1,senkou_span_b1,MODE_SENKOUSPANB,i);
      double chikou_span = iIchimoku(NULL,0,tenkan_sen1,kijun_sen1,senkou_span_b1,MODE_CHIKOUSPAN,i);
            
      if(tenkan_sen>kijun_sen)
         Buy[i]=high[i];
         
     if(tenkan_sen<kijun_sen)
         Sell[i]=low[i];
     }
   /*input int tenkan_sen = 9;
input int kijun_sen  = 26;
input int senkou_span_b = 52;*/
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
jarikn:
Здравствуйте. Подскажите пожалуйста где я допустил ошибку, почему индикатор не выводит стрелки?
#property indicator_buffers 2
 
MakarFX:

вписал пропущенную строку но все равно стрелок нету!

 
jarikn:

вписал пропущенную строку но все равно стрелок нету!

покажи

 
MakarFX:

покажи

//+------------------------------------------------------------------+
//|                                                     ishimocu.mq4 |
//|                        Copyright 2021, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 2

//--- input parameters
double      Buy[];            // Буфер для покупок
double      Sell[];           // Буфер для продаж


input int tenkan_sen1 = 9;
input int kijun_sen1  = 26;
input int senkou_span_b1 = 52;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- 
//--- indicator buffers mapping
   SetIndexBuffer(0,Buy);
   SetIndexBuffer(1,Sell);  
   // Устанавливаем нулевые значения для индикатора, при которых не будет сигнальных стрелок
   SetIndexEmptyValue (0, 0);
   SetIndexEmptyValue (1, 0);
   //Определяем стиль отображения индикаторных линий - стрелка
   SetIndexStyle (0, DRAW_ARROW);
   SetIndexStyle (1, DRAW_ARROW); 
   // Установим значки "стрелки" для буферов
   SetIndexArrow(0, 234);  //Стрелка "вниз" для продаж
   SetIndexArrow(1, 233);  //Стрелка "вверх" для покупок
   //Устанавливаем текст описания стрелок индикатора для отображения информации в всплывающей подсказке.
   SetIndexLabel(0, "Продаём");
   SetIndexLabel(1, "Покупаем");
   //Определяем разрядность значений индикаторных линий - приравниваем разрядности фин. инструмента
   IndicatorDigits (Digits);
   //Строка с кратким названием индикатора выводится в сплывающей подсказке при наведении указателя мыши на стрелку
   IndicatorShortName ("Мой первый индикатор");
   
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
  
   
 
  
    int limit=rates_total-prev_calculated-1;
   if(limit<1) return(0);
   for(int i=limit;i>=0;i--)
     {
      // Снимем показания индикатора
      double tenkan_sen = iIchimoku(NULL,0,tenkan_sen1,kijun_sen1,senkou_span_b1,MODE_TENKANSEN,i);
      double kijun_sen = iIchimoku(NULL,0,tenkan_sen1,kijun_sen1,senkou_span_b1,MODE_KIJUNSEN,i);
      double senkou_span_b = iIchimoku(NULL,0,tenkan_sen1,kijun_sen1,senkou_span_b1,MODE_SENKOUSPANA,i);
      double senkou_span_a = iIchimoku(NULL,0,tenkan_sen1,kijun_sen1,senkou_span_b1,MODE_SENKOUSPANB,i);
      double chikou_span = iIchimoku(NULL,0,tenkan_sen1,kijun_sen1,senkou_span_b1,MODE_CHIKOUSPAN,i);
            
      if(tenkan_sen>kijun_sen)
         Buy[i]=high[i];
         
     if(tenkan_sen<kijun_sen)
         Sell[i]=low[i];
     }
   /*input int tenkan_sen = 9;
input int kijun_sen  = 26;
input int senkou_span_b = 52;*/
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
jarikn:

У меня рисует...


 
MakarFX:

У меня рисует...


бляяяя. не то ишимоку запускал )))) спасибо большое

 
Alexey Viktorov:

Ну да… Минимум писанины и максимум головной боли…

В чем именно? Может я всего-лишь что-то не так делаю?

 
Andrey Sokolov:

В чем именно? Может я всего-лишь что-то не так делаю?

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

ООП для школьников.

Alexey Viktorov, 2019.10.04 16:01

На мой взгляд, в mql очень узок набор задач которые надо решать посредством ООП. Сам язык, мне кажется, ничто иное как ООП на С++ или ещё чего-то. И в это ООП предлагается ООП в виде стандартной библиотеки. А к этому ООП от ООП предлагается впендюрить, иначе не скажешь, ещё ООП. А потом ещё одну ступень... Правильно сказал Колдун, хоть и злой, но доброжелательный, для моих задач ООП как собаке поворотка. И какой прок от постановки задачи и последующей реализации её посредством ООП если эту задачу без проблем можно решить в процедурном стиле.

Вот к примеру взять .mqh от fxsaber`a для написания кодов для МТ5 так-же как для МТ4. Может кому-то это и надо, но посмотрите кому... Тому кто не хочет или абсолютно не может освоить mql5. Или взять iCanvas у Николая ..., забыл фамилию, ну вы поняли. Вроде-бы полезная библиотека, но в ней разобраться не просто, а никакой документации, хотя-бы маломальского описания нет. Это не претензия, извини Николай, это факт. Так-что когда я решил попробовать написание графической метки, мне оказалось проще написать не обращаясь ни к стандартной библиотеке, ни к библиотеке Николая.

А потом можете всю тему прочесть.
Причина обращения: