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

 
Добрый день. Прошу помощи. Уже пару недель безуспешно пытаюсь заставить индикатор круглых уровней заставить (см.код) передавать их для использования в эксперте через iCustom. Прошу помочь поправить код.




#property indicator_chart_window

extern string H                     = " --- Mode_Settings ---";
extern bool   Show_00_50_Levels     = true;
extern bool   Show_20_80_Levels     = true;
extern color  Level_00_Color        = Lime;
extern color  Level_50_Color        = Gray;
extern color  Level_20_Color        = Red;
extern color  Level_80_Color        = Green;

double dXPoint = 1;
double Div = 0;
double i = 0;
double HighPrice = 0;
double LowPrice = 0;
int iDigits;
  
int start() 
{
   HighPrice = MathRound((High[iHighest(NULL, 0, MODE_HIGH, Bars + 300, 2)]+1) * Div);
   LowPrice = MathRound((Low[iLowest(NULL, 0, MODE_LOW, Bars + 300, 2)]-1) * Div);
  
  if(Show_00_50_Levels)
  {
   for (i = LowPrice; i <= HighPrice; i++) 
   {
      if (MathMod(i, 5) == 0.0) {
         if (ObjectFind("RoundPrice " + DoubleToStr(i, 0)) != 0) {
            ObjectCreate("RoundPrice " + DoubleToStr(i, 0), OBJ_HLINE, 0, Time[1], i / Div);
            ObjectSet("RoundPrice " + DoubleToStr(i, 0), OBJPROP_STYLE, STYLE_DOT);
            if(MathMod(i, 10) == 0.0)
            {
            ObjectSet("RoundPrice " + DoubleToStr(i, 0), OBJPROP_COLOR, Level_00_Color);
            }
            else
            {
            ObjectSet("RoundPrice " + DoubleToStr(i, 0), OBJPROP_COLOR, Level_50_Color);
            }
         }
      }
   }
   
  }
  
  if(Show_20_80_Levels)
  {
  
   for (i = LowPrice; i <= HighPrice; i++) 
   {
         
        if (StringSubstr(DoubleToStr(i/Div,iDigits), StringLen(DoubleToStr(i/Div,iDigits))-2, 2)=="20") {
         if (ObjectFind("RoundPrice " + DoubleToStr(i, 0)) != 0) {
            ObjectCreate("RoundPrice " + DoubleToStr(i, 0), OBJ_HLINE, 0, Time[1], i / Div);
            ObjectSet("RoundPrice " + DoubleToStr(i, 0), OBJPROP_STYLE, STYLE_DOT); 
            ObjectSet("RoundPrice " + DoubleToStr(i, 0), OBJPROP_COLOR, Level_20_Color);
            
            }
         }
        
         
         if (StringSubstr(DoubleToStr(i/Div,iDigits), StringLen(DoubleToStr(i/Div,iDigits))-2, 2)=="80") {
         if (ObjectFind("RoundPrice " + DoubleToStr(i, 0)) != 0) {
            ObjectCreate("RoundPrice " + DoubleToStr(i, 0), OBJ_HLINE, 0, Time[1], i / Div);
            ObjectSet("RoundPrice " + DoubleToStr(i, 0), OBJPROP_STYLE, STYLE_DOT);
           
            ObjectSet("RoundPrice " + DoubleToStr(i, 0), OBJPROP_COLOR, Level_80_Color);
            }
         }
         
   }
   
  }
  
   return (0);
}

int init() 
{
   iDigits = Digits;
   if(Digits==5 || Digits==3)dXPoint=10;
   if(Digits==3)  iDigits=2;
   if(Digits==5)  iDigits=4;
   
   Div = 0.1 / (Point*dXPoint);
   return (0);
}

int deinit()
{
   HighPrice = MathRound((High[iHighest(NULL, 0, MODE_HIGH, Bars + 300, 2)]+1) * Div);
   LowPrice = MathRound((Low[iLowest(NULL, 0, MODE_LOW, Bars + 300, 2)]-1) * Div);
   for (i = LowPrice; i <= HighPrice; i++) ObjectDelete("RoundPrice " + DoubleToStr(i, 0));
   return (0);
 
Aleksey Mavrin:
Se dici che sei praticamente a zero nella programmazione, allora perché ti accolli dei compiti così non standard, magari iniziando con quelli semplici? O migliorare la tua conoscenza delle basi? È più facile farlo fare a te, sì.

Non ho scritto: "Fatemi un indicatore". Ho chiesto aiuto. Non sto cercando di padroneggiare completamente mql4. Sto solo controllando le idee. Ne ho già avuto abbastanza di excel).

 
Oleg Bondarev:

Ti avevo avvertito che ero un "hacker")

Ecco come ho fatto.

Ora disegna un grafico in tick, ma ci sono alcune interruzioni di linea.

Lo faccio in 4.

Linee spezzate significa che non ci sono valori in Label1Buffer[ХХХХ].

e il secondo, che ho scritto sopra, un'altra volta - il buffer dell'indicatore (Label1Buffer) è controllato dal terminale, se vedete una nuova barra, i valori si sposteranno tutti automaticamente - eseguite il codice su M1 e osservate

ZS: non un hacker, ma qualcuno che sta cercando di imparare da solo! ))))

 
Igor Makanu:

linee interrotte significa che non ci sono valori nella Label1Buffer[XXX]

e il secondo, che ho scritto sopra, un'altra volta - il buffer dell'indicatore (Label1Buffer) è controllato dal terminale, se appare una nuova barra, allora i valori si sposteranno tutti automaticamente - eseguite il codice su M1 e osservate

ZS: non un hacker, ma qualcuno che sta cercando di imparare da solo! ))))

Label1Buffer[XXX] - significa 3 numeri composti?


 
Oleg Bondarev:

Label1Buffer[XXX] - è un numero a 3 componenti?


No, ho scritto le prime lettere che ricordavo.

che è il numero dell'oggetto.

guarda il tuo codice, hai scritto il tuo codice in modo simile al mio ciclo, dove sposti il buffer dell'indicatore Label1Buffer di un elemento - nota ogni chiamata dell'indicatore (ogni tick)

e dopo aver spostato il contenuto di Label1Buffer, assegnate ilnuovo valore a Label1Buffer[0]

e quali valori saranno negli altri elementi? al primo lancio avranno "valore vuoto" (EMPTY_VALUE), poi li spostate una volta e assegnate un nuovo valore a.... e poi il terminale stesso sposterà TUTTI i valoridi Label1Buffer quando appare una nuova barra


In generale, c'è un leggero spostamento nella vostra conoscenza, ma provate a disegnare semplicemente il prezzo di chiusura della barra con l'indicatore, ecco il codice

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot line1
#property indicator_label1  "line1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters
input int      Input1=10;
//--- indicator buffers
double         line1Buffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,line1Buffer);
   IndicatorDigits(Digits);
   
//---
   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 i,limit;
//--- Первый вызов индикатора или смена таймфрейма или подгрузка данных из истории
   if(prev_calculated==0){
      limit=rates_total-1;
   }else
      limit=rates_total-prev_calculated+1; // или limit=rates_total-prev_calculated ; чтобы не перерисовывать бар №1
//--- Основной цикл расчета
//Print("limit = ",limit);
   for(i=limit; i>=0; i--){
      line1Buffer[i]=close[i];
    }
//---
  return(rates_total);

  }
//+------------------------------------------------------------------+
 
Ho capito. Dovrò pensarci. Grazie!
 

Come registrare i dati in Excel? - MQL5.

Il formato del file Excel è xlsx, ma la funzione FileOpen crea e lavora con file txt e csv.


Dopo aver testato in OnTester ho bisogno di scaricare i dati dai buffer che contengono la storia dei diversi dati al momento dell'apertura di ogni tick e mostrare i dati di tutte le operazioni su un grafico
Come capite i dati saranno molti anche per un solo trade, per non parlare di tutti - quindi l'opzione di "trasferire manualmente" non è adatta


Cosa consigliate?

 
Alexandr Sokolov:

Come importare dati in Excel? - MQL5.

Il formato del file Excel è xlsx e la funzione FileOpen crea e lavora con file txt e csv.


Ho bisogno dopo il test in OnTester di scaricare i dati dai buffer che contengono la storia dei diversi dati al momento in cui la posizione è stata aperta su ogni tick, e poi visualizzare tutti i dati degli scambi su un grafico
Come capite i dati saranno molti anche per un solo trade, per non parlare di tutti - quindi l'opzione di "trasferire manualmente" non è adatta


Cosa consigliate?

Bene, la linea di fondo è semplice - non si può scrivere direttamente su Excel usando MQL5, ma si possono importare dati da un file di testo in Excel sotto la scheda "dati" >>> "da testo".

 
Ciao, ottengo un errore sugli oggetti non riusciti dopo aver completato un test explorer, e ho creato assolutamente tutti gli oggetti, per quanto ho capito, nello stack, cioè senza nuovo. Per favore, spiegate questo problema.
 
Alexandr Sokolov:

Cosa consigliate?

Scrivere in .csv e aprire in Excel