Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 1523

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

Como eu, um diletante, que não consigo entender o significado sagrado de todas as classes, e por que OOP é necessário em nosso negócio (comercial) em geral, entendo - as classes são todas escritas (tanto por MQ como por guru) code-libraries, projetadas para "facilitar" a vida dos "não-codificadoresuru".

O problema é, e eu já disse isto, que usar todo este "alívio" não facilita a escrita do código. Porque você sempre tem que checar novamente todos os pedidos que você mesmo envia! Porque praticamente todos insistem em que eu verifique também algumas "transações". Tanto mais que estas "...ações" vêm ao acaso.

Eu dou a ordem - para martelar um prego neste lugar em tal ângulo. É isso aí. Em seguida recebo uma resposta - o prego é martelado. E então recebo um aviso de que:

  • talvez o prego tenha sido do tamanho errado - é preciso verificar.
  • Talvez seja o ângulo errado - é precisoverificar.
  • Talvez esteja martelado no lugar errado - é precisoverificar.

Então por que eu preciso desses artistas (classes)?

Eu posso estar exagerando um pouco, mas o ponto não muda.

E por quê? Porque qualquer dado processado nas classes pode ser alterado para que a classe não suspeite sequer que foi alterado.


Estou vendo.

Concordo, a propósito, que o OOP não facilita a programação.

O OOP facilita a manutenção de grandes projetos, mas tende a tornar mais difícil a criação de projetos pequenos.

O OOP é mais difícil para os iniciantes.

Usar as classes de outras pessoas é, em certa medida, usar caixas pretas.

 
Olá. Você poderia me dizer onde cometi um erro e por que o indicador não mostra setas?
#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:
Olá. Você poderia me dizer onde cometi um erro e por que o indicador não mostra setas?
#property indicator_buffers 2
 
MakarFX:

Eu coloquei a linha que faltava, mas ainda sem flechas!

 
jarikn:

Eu coloquei a linha que faltava, mas ainda sem flechas!

show

 
MakarFX:

show

//+------------------------------------------------------------------+
//|                                                     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:

Eu tenho um desenho...


 
MakarFX:

Eu estou desenhando...


Maldito inferno. ishimoku errado )))) muito obrigado

 
Alexey Viktorov:

Sim, bem... Papelada mínima e máxima dor de cabeça...

O que é exatamente? Talvez eu esteja apenas fazendo algo errado.

 
Andrey Sokolov:

O que é exatamente? Estou fazendo algo errado?

Fórum sobre comércio, sistemas automatizados de comércio e testes estratégicos

OOP para garotos de escola.

Alexey Viktorov, 2019.10.04 16:01

Acho que o mql tem um conjunto muito limitado de problemas a serem resolvidos pelo OOP. A linguagem em si, me parece, não é nada além de OOP em C++ ou o que quer que seja. E este OOP é oferecido na forma de uma biblioteca padrão. E a este OOP é sugerido acrescentar, caso contrário não se pode dizer, outro OOP. E depois outro passo... Disse Warlock, embora zangado, mas benevolente, para minhas tarefas OOP é como uma mesa giratória para cães. E de que serve definir uma tarefa e depois implementá-la usando o OOP, se esta tarefa pode ser resolvida em estilo processual sem nenhum problema.

Por exemplo, pegue .mqh do fxsaber`a para escrever códigos para MT5, bem como para MT4. Talvez alguém precise dele, mas veja quem. Aqueles que não querem ou absolutamente não podem dominar o mql5. Ou tome iCanvas de Nikolay ... Esqueci seu sobrenome. Parece ser uma biblioteca útil, mas não é fácil entendê-la, e não há documentação, mesmo uma pequena descrição. Não é uma reclamação, desculpe Nikolay, é um fato. Assim, quando decidi tentar escrever uma etiqueta gráfica, foi mais fácil escrevê-la sem referência à biblioteca padrão ou à biblioteca do Nikolai.

E então você pode ler todo o tópico.
Razão: