Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 1523

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

Come io, un dilettante, che non può capire il sacro significato di tutte le classi, e perché OOP è necessario nel nostro (commercio) business in generale, capisco - le classi sono tutte scritte (sia da MQ che dai guru) code-libraries, progettate per "facilitare" la vita ai "non-guru code-writers".

Il problema è, e l'ho già detto, che usare tutto questo "sollievo" non rende più facile scrivere codice. Perché devi sempre ricontrollare tutti gli ordini che mandi tu stesso! Perché praticamente tutti insistono che io controlli anche alcune "transazioni". Tanto più che queste "...azioni" arrivano a caso.

Io do l'ordine - di piantare un chiodo in questo posto con un tale angolo. Questo è tutto. Poi ricevo una risposta - il chiodo è piantato. E poi ricevo un avviso che:

  • forse il chiodo era della misura sbagliata - bisogna controllare.
  • Forse è l'angolo sbagliato - bisognacontrollare.
  • Forse è martellato nel posto sbagliato - bisognacontrollare.

Allora perché ho bisogno di questi interpreti (classi)?

Forse sto esagerando un po', ma il punto non cambia.

E perché? Perché qualsiasi dato elaborato nelle classi può essere cambiato in modo che la classe non sospetti nemmeno che sia stato cambiato.


Capisco.

Sono d'accordo, comunque, che l'OOP non rende la programmazione più facile.

OOP rende più facile mantenere grandi progetti, ma tende a rendere più difficile crearne di piccoli.

OOP è più difficile per i principianti.

Usare le classi di altre persone è, in un certo senso, usare le scatole nere.

 
Salve. Potreste dirmi dove ho sbagliato e perché l'indicatore non mostra le frecce?
#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:
Salve. Potreste dirmi dove ho sbagliato e perché l'indicatore non mostra le frecce?
#property indicator_buffers 2
 
MakarFX:

Ho messo la linea mancante ma ancora niente frecce!

 
jarikn:

Ho messo la linea mancante ma ancora niente frecce!

mostra

 
MakarFX:

mostra

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

Ho un disegno...


 
MakarFX:

Sto disegnando...


Porca puttana. ishimoku sbagliato correre )))) grazie mille

 
Alexey Viktorov:

Sì, beh... Minima scrittura e massimo mal di testa...

Che cos'è esattamente? Forse sto solo facendo qualcosa di sbagliato.

 
Andrey Sokolov:

Che cos'è esattamente? Sto facendo qualcosa di sbagliato?

Forum sul trading, sistemi di trading automatico e test di strategia

OOP per gli scolari.

Alexey Viktorov, 2019.10.04 16:01

Penso che mql abbia un insieme molto limitato di problemi da risolvere con OOP. Il linguaggio stesso, mi sembra, non è altro che OOP in C++ o altro. E questa OOP è offerta sotto forma di una libreria standard. E a questo OOP si suggerisce di inserire, in altre parole, un altro OOP. E poi un altro passo... Giustamente detto Warlock, anche se arrabbiato, ma benevolo, per i miei compiti OOP è come un cane giradischi. E a cosa serve definire un compito e poi implementarlo usando OOP, se questo compito può essere risolto in stile procedurale senza problemi.

Per esempio, prendete .mqh da fxsaber`a per scrivere codici per MT5 così come per MT4. Forse qualcuno può averne bisogno, ma guarda chi. A qualcuno che non vuole o non può assolutamente padroneggiare mql5. Oppure prendete iCanvas da Nikolay... ho dimenticato il suo cognome. Sembra essere una libreria utile, ma non è facile capirla, e non c'è documentazione, nemmeno una minima descrizione. Non è una lamentela, scusa Nikolay, è un fatto. Così, quando ho deciso di provare a scrivere un'etichetta grafica, è stato più facile scriverla senza riferimento alla libreria standard o a quella di Nikolai.

E poi puoi leggere tutto il thread.
Motivazione: