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

 
inter78:

In realtà, l'ho fatto, ma non mi piace il lungo tempo di risposta

Non è molto tempo, è un tick... ma in generale, hai bisogno di leggere la guida. Non puoi imparare MQL "provando", è basato su С++, ma è legato alla piattaforma МТТ, quindi devi studiare la guida.

Avete la gestione dei file e il lavoro con le variabili globali e la grafica nel vostro codice ... Ci sono un sacco di operazioni inutili su ogni tick

Se volete una risposta veloce, usate OnChartEvent(), non è generato nel tester, ma prima iniziate a studiare la guida di MQL4.

 
Igor Makanu:

L'operazione non è lunga, è tick per tick... ma in generale, iniziate a leggere la guida, non potete imparare MQL per "pancia", MQL è basato su C++, ma è legato alla piattaforma MT, non potete farlo senza leggere la guida.

Avete la gestione dei file e il lavoro con le variabili globali e la grafica nel vostro codice ... Ci sono un sacco di operazioni inutili su ogni tick

Se volete un'esecuzione veloce, usate OnChartEvent(), non è generato nel tester, ma prima iniziate a studiare la guida di MQL4.

Probabilmente dovrò chiedere ai tecnici di farlo rinsavire. Non sarò in grado di farlo. Questo indicatore è molto comodo per lavorare con un numero illimitato di grafici aperti. I pulsanti mostrano il profitto attuale del simbolo e il numero di ordini di acquisto e di vendita.
 

Ciao a tutti.

Ho trovato un utile indicatore Ind-Fractals nella libreria del codice. Tuttavia, disegna frattali su ogni barra, invece di calcolarli correttamente. Voglio usare questo indicatore, ma è "rotto" (( Aiutami a trovare un errore, ho provato a contattare l'autore, ma non risponde ai messaggi. Per comodità, codice duplicato qui.

#property copyright "Copyright © 2005, MetaQuotes Software Corp.

#proprietà link "http://www.metaquotes.net"

//----

#proprietà indicator_chart_window

#proprietà indicator_buffers 8

#property indicator_color1 Red

#property indicator_color2 Red

#property indicator_color3 Blue

#property indicator_color4 Blue

#property indicator_color5 Lime

#proprietà indicator_color6 Lime

#property indicator_color7 Sienna

#property indicator_color8 Sienna

//---- parametri di ingresso

extern bool Comm=true;

//---- buffer

doppio ExtMapBuffer1[];

doppio ExtMapBuffer2[];

doppio ExtMapBuffer3[];

doppio ExtMapBuffer4[];

doppio ExtMapBuffer5[];

doppio ExtMapBuffer6[];

doppio ExtMapBuffer7[];

doppio ExtMapBuffer8[];

//+------------------------------------------------------------------+

//| funzione di inizializzazione dell'indicatore personalizzato

//+------------------------------------------------------------------+

int init()

{

//---- indicatori

SetIndexStyle(0,DRAW_ARROW);//lo stile della linea dell'indicatore

SetIndexArrow(0,217); //prescrive il tipo di freccia

SetIndexBuffer(0,ExtMapBuffer1);//legare ilbuffer dell'indicatore con un array dinamico unidimensionale di tipo doppio. Ci sono 2 versioni della funzione.

SetIndexEmptyValue(0,0.0);//Imposta il valore vuoto per la linea dell'indicatore.

SetIndexStyle(1,DRAW_ARROW);

SetIndexArrow(1,218);

SetIndexBuffer(1,ExtMapBuffer2);

SetIndexEmptyValue(1,0.0);

SetIndexStyle(2,DRAW_ARROW);

SetIndexArrow(2,217);

SetIndexBuffer(2,ExtMapBuffer3);

SetIndexEmptyValue(2,0.0);

SetIndexStyle(3,DRAW_ARROW);

SetIndexArrow(3,218);

SetIndexBuffer(3,ExtMapBuffer4);

SetIndexEmptyValue(3,0.0);

SetIndexStyle(4,DRAW_ARROW);

SetIndexArrow(4,217);

SetIndexBuffer(4,ExtMapBuffer5);

SetIndexEmptyValue(4,0.0);

SetIndexStyle(5,DRAW_ARROW);

SetIndexArrow(5,218);

SetIndexBuffer(5,ExtMapBuffer6);

SetIndexEmptyValue(5,0.0);

SetIndexStyle(6,DRAW_ARROW);

SetIndexArrow(6,217);

SetIndexBuffer(6,ExtMapBuffer7);

SetIndexEmptyValue(6,0.0);

SetIndexStyle(7,DRAW_ARROW);

SetIndexArrow(7,218);

SetIndexBuffer(7,ExtMapBuffer8);

SetIndexEmptyValue(7,0.0);

return(0); }

//+------------------------------------------------------------------+

//| funzione di deinizializzazione dell'indicatore Custor

//+------------------------------------------------------------------+

int deinit() {return(0); }

//------------------------------------------------------------------

bool Fractal(stringa F,int Per,int shift) {

se(Periodo()>Per) ritorno(-1);

Per=Per/Periodo()*2+MathCeil(Per/Periodo()/2);

se(shift<Per)ritorno(-1);

se(shift>Bars-Per)return(-1);

for(int i=1;i<=Per;i++) {

if(shift+i>=Bars || shift-i<0) return(-1);

se(F=="U") {

se(Alto[shift+i]>Alto[shift])ritorna(-1);

se(High[shift-i]>=High[shift])return(-1); }

se(F=="L") {

se(Low[shift+i]<Low[shift])ritorna(-1);

if(Low[shift-i]<=Low[shift])return(-1); } } }

return(1); }

//------------------------------------------------------------------

int start()

{

int D1=1440,H4=240,H1=60,M15=15,B;

doppio P;

int counted_bars=IndicatorCounted();// numero di barre invariate dopo l'ultima chiamata dell'indicatore

B=Bars-counted_bars;

if(counted_bars==0) B--;

if(Periodo()==D1)P=150*Punto;// periodo restituisce il periodo corrente del grafico

se(Periodo()==H4)P=70*Punto;

if(Periodo()==H1)P=40*Punto;

if(Period()==30)P=30*Point;

if(Periodo()==M15)P=20*Punto;

if(Periodo()==5)P=10*Punto;

if(Periodo()==1)P=5*Punto;

for(int shift=B;shift>0;shift--)

{

if(Fractal("U",M15,shift)==1) ExtMapBuffer1[shift]=High[shift]+P;

altrimenti ExtMapBuffer1[shift]=0;

if(Fractal("L",M15,shift)==1) ExtMapBuffer2[shift]=Low[shift]-P;

altrimenti ExtMapBuffer2[shift]=0;

if(Fractal("U",H1,shift)==1) ExtMapBuffer3[shift]=High[shift]+P;

altrimenti ExtMapBuffer3[shift]=0;

if(Fractal("L",H1,shift)==1) ExtMapBuffer4[shift]=Low[shift]-P;

altrimenti ExtMapBuffer4[shift]=0;

if(Fractal("U",H4,shift)==1) ExtMapBuffer5[shift]=High[shift]+P;

altrimenti ExtMapBuffer5[shift]=0;

if(Fractal("L",H4,shift)==1) ExtMapBuffer6[shift]=Low[shift]-P;

altrimenti ExtMapBuffer6[shift]=0;

if(Fractal("U",D1,shift)==1) ExtMapBuffer7[shift]=High[shift]+P;

altrimenti ExtMapBuffer7[shift]=0;

if(Fractal("L",D1,shift)==1) ExtMapBuffer8[shift]=Low[shift]-P;

altrimenti ExtMapBuffer8[shift]=0;

}

if(Comm) Comment("D1 - marrone\n H4 - verde\n H1 - blu\nM15 - rosso ");


ritorno(0);

}

MetaQuotes Software Corp.
MetaQuotes Software Corp.
  • www.metaquotes.net
Миллионы трейдеров и сотни брокеров не могут ошибаться — они выбрали MetaTrader 5 для торговли на Форексе и финансовых рынках! Узнать больше
 

Sono stato rimproverato qui per questo tipo di codice, è la prima volta che mi capita :-)

Il codice dovrebbe essere inserito in un modulo che si apre con Alt+S.

 
psyman:

Sono stato rimproverato qui per questo tipo di codice, è la prima volta che mi capita :-)

Devi incollare il codice in un modulo che si apre con Alt+S.

Viene rimproverato? Non in alcun modo. Scrivete il codice come volete. Ma... se vuoi una risposta alla tua domanda, cerca di rispettare coloro a cui stai chiedendo aiuto. È così semplice.

 

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

Qualsiasi domanda per i neofiti su MQL4, aiuto e discussione su algoritmi e codici

Artyom Trishkin, 2018.10.18 08:07

Mettiamola così: create un modello di indicatore nell'editor, aggiungete il giusto numero di variabili di input e buffer di disegno quando lo create.

Successivamente, analizziamo cosa fare dal compito specifico.

L'ho fatto l'ultima volta, ho solo cambiato il nome della variabile e dell'array.

Quando si usa iMA funziona solo su settimane e daires, dove la candela contiene più di 100 punti, non fa nulla su timeframes inferiori. La ragione sembra essere l'arrotondamento.




Se si usa iMAOnArray, la finestra i-ras è vuota in tutti i TF. Non ci sono errori nel registro.




//+------------------------------------------------------------------+
//|                                                        _null.mq4 |
//|                        Copyright 2014, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot OC
#property indicator_label1  "O-C"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrSteelBlue
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- indicator buffers
double         ip1Buf[];

input int ip1=100;
double tmp1[];


//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
  
IndicatorBuffers(2);
string s_name1;

s_name1="O-C (" + IntegerToString(ip1) + ")";

IndicatorShortName(s_name1);
SetIndexLabel(0, s_name1);
SetIndexBuffer(1, tmp1);


//--- indicator buffers mapping
   SetIndexBuffer(0,ip1Buf);
   
//---
   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;

      Print("rates_total = ",rates_total);
      for(i=1; i<rates_total-1; i++)
      {
      //Print("i = ",i);
      tmp1[i]=MathMax(open[i],close[i])-MathMin(open[i],close[i]);      
     // tmp1[i]=close[i];      
      //ip1Buf[i]=iMA(NULL,0,1,0,0,tmp1[i],0);
      ip1Buf[i]=iMAOnArray(tmp1,1,1,0,0,0);
      
      }
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+


 
psyman:

Se si usa iMAOnArray, la finestra i-ra è vuota su tutti i TF. Non ci sono errori nel registro.

State usando iMAOnArray() con periodo 1, cioè il valore di iMAOnArray() sarà essenzialmente il valore dell'array tmp1

Se volete capire cosa state calcolando, accorciate il ciclofor(i=1; i<10; i++)

e staccate tutti i dati che volete calcolare, anche se potrebbe essere più facile non calcolare qualche formula complessa, ma usare iMAOnArray() per costruire iMA e iMAOnArray() - sia iMA che iMAOnArray() sono gli stessi calcoli.... ahimè, se puoi ottenere una risposta a una domanda tecnica su questo forum, solo tu dovresti imparare a calcolare e trattare le informazioni.

 
psyman:

L'ultima volta che l'ho fatto, ho solo cambiato il nome della variabile e dell'array.

Quando si usa iMA i-r ha lavorato solo su settimane e giorni, dove c'è più di 100 punti in una candela, non disegna nulla sui TF inferiori. La ragione sembra essere l'arrotondamento.




Se si usa iMAOnArray, la finestra i-ras è vuota in tutti i TF. Non ci sono errori nel registro.





Il primo ciclo calcola i valori del primo buffer;

Il secondo ciclo calcola il MA in base ai valori calcolati nel primo ciclo.

Considerate cosa significa iMAOnArray(). Scrivere MA su Array. Come si traduce? Tutti hanno un traduttore di Google a portata di mano. Mettere-tradurre-ricevere: MA su Array.

Significa che è una media mobile basata su una matrice calcolata e riempita in modo preliminare.

Corrispondentemente: il primo ciclo - preparazione dell'array necessario, e il secondo ciclo - costruzione di una media mobile basata sull'array preparato nel primo ciclo.

E tu cosa fai? Si inserisce un valore nel primo array (gli altri valori non sono ancora stati preparati) e si cerca di costruire il MA su questo valore.

Ti ho dato un modello:

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

Qualsiasi domanda, aiuto e discussione su algoritmi e codici per i principianti di MQL4

Artyom Trishkin, 2018.10.18 09:39

Indicatore:

//+------------------------------------------------------------------+
//|                                                       TestMA.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                             https://mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://mql5.com/ru/users/artmedia70"
#property version   "1.00"
#property indicator_chart_window
#ifdef __MQL4__
#property strict
#property indicator_buffers 2
#else 
#property indicator_buffers 3
#property indicator_plots   2
#endif 
//--- plot MAstd
#property indicator_label1  "Calculation MA"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrBlue
#property indicator_style1  STYLE_SOLID
#property indicator_width1  4
//--- plot MAcalc
#property indicator_label2  "Standart MA"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrDarkOrange
#property indicator_style2  STYLE_DOT
#property indicator_width2  2
//--- input parameters
input int      InpPeriod                     =  10;            // Period
input ENUM_MA_METHOD       InpMethod         =  MODE_EMA;      // Method
input ENUM_APPLIED_PRICE   InpAppliedPrice   =  PRICE_CLOSE;   // Applied price  
//--- indicator buffers
double         BufferMAcalc[];
double         BufferMAstd[];
double         BufferPrice[];
//---
int            digits;
int            period_ma;
int            handle_ma;
CAvg           avg();
//--- includes

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
#ifdef __MQL4__
   IndicatorBuffers(3);
#endif 
    period_ma=(InpPeriod<1? 1 : InpPeriod);
   digits=Digits()+1;
//--- indicator buffers mapping
   SetIndexBuffer(0,BufferMAcalc,INDICATOR_DATA);
   SetIndexBuffer(1,BufferMAstd,INDICATOR_DATA);
   SetIndexBuffer(2,BufferPrice,INDICATOR_CALCULATIONS);
//---
   ArraySetAsSeries(BufferMAcalc,true);
   ArraySetAsSeries(BufferMAstd,true);
   ArraySetAsSeries(BufferPrice,true);
//---
#ifdef __MQL5__
   ResetLastError();
   handle_ma=iMA(NULL,PERIOD_CURRENT,period_ma,0,InpMethod,InpAppliedPrice);
   if(handle_ma==INVALID_HANDLE)
     {
      Print("Error creation iMA(",(string)period_ma,"): ",GetLastError());
      return INIT_FAILED;
     }
#endif 
//---
   Comment("\nMA type: ",avg.MethodToString(InpMethod),", price: ",avg.PriceToString(InpAppliedPrice),", period: ",(string)period_ma);
//---
   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[])
  {
//--- Установка массивов буферов как таймсерий
#ifdef __MQL5__
   ArraySetAsSeries(open,true);
   ArraySetAsSeries(high,true);
   ArraySetAsSeries(low,true);
   ArraySetAsSeries(close,true);
#endif 
//--- Проверка количества доступных баров
   if(rates_total<fmax(period_ma,4)) return 0;
//--- Проверка и расчёт количества просчитываемых баров
   int limit=rates_total-prev_calculated;
   if(limit>1)
     {
      limit=rates_total-1;
      ArrayInitialize(BufferMAcalc,EMPTY_VALUE);
      ArrayInitialize(BufferMAstd,EMPTY_VALUE);
      ArrayInitialize(BufferPrice,0);
     }
//--- Подготовка данных
#ifdef __MQL5__
   int count=(limit>1 ? rates_total : 1),copied=0;
   copied=CopyBuffer(handle_ma,0,0,count,BufferMAstd);
   if(copied!=count) return 0;
#endif 
//--- Расчёт индикатора
   for(int i=limit; i>=0 && !IsStopped(); i--)
     {
      #ifdef __MQL4__ BufferMAstd[i]=iMA(NULL,PERIOD_CURRENT,period_ma,0,InpMethod,InpAppliedPrice,i); #endif 
       BufferPrice[i]=avg.AppliedPrice(InpAppliedPrice,NULL,PERIOD_CURRENT,i);
      BufferMAcalc[i]=avg.GetMA(rates_total,InpMethod,period_ma,i,BufferPrice);
     }

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Puoi buttare via tutto ciò che riguarda i cinque e ottenere un modello per i quattro. Anche se questo modello è multipiattaforma - puoi usarlo per entrambi i terminali - basta impostare i buffer e il loro numero. In questo modello ci sono due disegni e un calcolo, che possono essere visti qui:

//--- indicator buffers mapping
   SetIndexBuffer(0,BufferMAcalc,INDICATOR_DATA);
   SetIndexBuffer(1,BufferMAstd,INDICATOR_DATA);
   SetIndexBuffer(2,BufferPrice,INDICATOR_CALCULATIONS);
//---
 

=anchevoi usate iMAOnArray() con periodo 1, cioè il valore di iMAOnArray() sarà essenzialmente il valore dell'array tmp1


Ho provato diversi valori da usare, 1 rimane come ultima variante di questi esperimenti.

Per qualche ragione, ip1Buf[4] = 2147483647.0 scrive lo stesso numero nel buffer i-r su tutti i TF, per esempio, mentre i valori dell'array sono tutti diversi tmp1[4] = 0.1300000000000097, ecc.

Ma anche in questo caso si dovrebbe tracciare una linea retta, e non c'è assolutamente nulla sul grafico i-r, la scala è segnata da 0 a 0.



 
psyman:

=anchevoi usate iMAOnArray() con periodo 1, cioè il valore di iMAOnArray() sarà essenzialmente il valore dell'array tmp1


Ho provato diversi valori da usare, 1 rimane come ultima variante di questi esperimenti.

Per qualche ragione, lo stesso numero viene scritto nel buffer i-ras su tutti i TF, per esempio ip1Buf[4] = 2147483647.0, anche se i valori dell'array sono tutti diversi tmp1[4] = 0.1300000000000097, ecc.

Ma anche in questo caso si dovrebbe tracciare una linea retta, e non c'è assolutamente nulla sul grafico i-r, la scala è segnata da 0 a 0.



2147483647.0 Bene iniziare a usare il motore di ricerca!https://www.mql5.com/ru/forum/224831

Ancora una volta, ho appena scritto Artem, devi leggerlo tu stesso, inizia con un semplice... Disegnare un prezzo di chiusura su un grafico con un indicatore, poi provare a renderlo più complicato, fare lo stesso in un ciclo e nel secondo ciclo fare il calcolo МА basato sul buffer già calcolato dove si trova la chiusura

2147483647 в буфере
2147483647 в буфере
  • 2018.01.15
  • www.mql5.com
День Добрый! Подскажите, пожалуйста, что это за хрень. Не первый раз сталкиваюсь...
Motivazione: