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

 
Galim_V:

Ecco come modificare

ci sono molti errori nel codice, in

if(OrderModify(OrderTicket(),OrderOpenPrice(),StopLoss_SELL,0,0,Green))

è meglio normalizzare i prezzi, allora funzioneranno, poi il server darà un errore di "prezzi sbagliati", è auspicabile normalizzareStopLoss_SELL

e molto probabilmente, è necessario controllare se lo StopLoss è uguale a zero - non è auspicabile confrontare i numeri reali per essere uguali, si dovrebbe cercare di confrontare i numeri reali a > o <

 
Jessy111:

Aiutami a risolvere un bug nell'indicatore, non disegna il massimo e il minimo del giorno quando è sull'ultima candela dell'ora.

Ho abbozzato l'indicatore, il tuo codice non ama lavorare con le stringhe, lo scriverei più semplice, ecco un esempio. Anche se se il vostro compito è quello di prendere in considerazione l'offset temporale del server, allora è necessario il contrario.

#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com/ru/users/igorm"
#property version   "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   2
//--- plot line1
#property indicator_label1  "HighDay"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1

#property indicator_label2  "LowDay"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrBlue
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1

static int LastDay=-1,daystart;
static double dhigh,dlow;
//--- indicator buffers
double         H[],L[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,H);
   SetIndexBuffer(1,L);
   IndicatorDigits(_Digits);
   LastDay=-1;
   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,j,limit;
   if(prev_calculated==0)
     {
      limit=rates_total-1;
      LastDay=-1;
      daystart=limit;
      dhigh = high[limit];
      dlow  = low[limit];
// расчет истории      
      for(i=limit; i>=0 && !IsStopped(); i--)
        {
         if(LastDay!=TimeDay(time[i]))
           {
            LastDay=TimeDay(time[i]);
            j=daystart;
            daystart=i;
            while(j>daystart)
              {
               H[j]=dhigh;
               L[j]=dlow;
               j--;
              }
            dhigh = high[i];
            dlow  = low[i];
           }
         dhigh= fmax(dhigh,high[i]);
         dlow =  fmin(dlow,low[i]);
        }
// рисуем текущий день при первом запуске
      i=daystart;
      while(i>=0)
        {
         H[i]=dhigh;
         L[i]=dlow;
         i--;
        }
     }
   else
     {
// рисуем текущий день на каждом тике
      i=0;
      dhigh = high[0];
      dlow  = low[0];
      while(TimeDay(time[0])==TimeDay(time[i]))
        {
         dhigh= fmax(dhigh,high[i]);
         dlow =  fmin(dlow,low[i]);
         i++;
        }
      while(i>=0)
        {
         H[i]=dhigh;
         L[i]=dlow;
         i--;
        }
     }
//---
   return(rates_total);
  }
//+------------------------------------------------------------------+

Anche il mio esempio non è un esempio, l'ho scritto velocemente, penso che non avrei dovuto contare dalla fine della storia all'inizio alla prima esecuzione, ma dalla barra zero alla storia, il codice sarebbe stato più corto e avrebbe potuto calcolare il giorno corrente più velocemente - il ciclo sarebbe stato più breve,

Ma l'ho controllato nel tester, sembra funzionare senza problemi, che sia così, è tardi, ho sonno... Ho fatto un cattivo esempio (((

 
Igor Makanu:

ci sono molti errori nel codice, in

è meglio normalizzare i prezzi, allora funzioneranno, poi il server darà un errore di "prezzi sbagliati", è auspicabile normalizzareStopLoss_SELL

E molto probabilmente, è necessario controllare se lo StopLoss è uguale a zero, e non è auspicabile confrontare i numeri reali per essere uguali, si dovrebbe cercare di confrontare i numeri reali a > o <

Proprio così. Ho appena mostrato un posto nel codice, perché non modifica gli ordini a mercato: la richiesta di uno stop dal mercato darà 0.

 
Igor Makanu:

Ecco un indicatore abbozzato, non mi piace il tuo codice con le stringhe, lo scriverei più semplice, ecco un esempio. Anche se se il vostro compito è quello di prendere in considerazione l'offset temporale del server, allora dovete farlo in modo diverso.

Anche il mio esempio non è un esempio, l'ho scritto velocemente, penso che non avrei dovuto contare dalla fine della storia all'inizio alla prima esecuzione, ma dalla barra zero alla storia, il codice sarebbe stato più corto e avrebbe potuto calcolare il giorno corrente più velocemente - il ciclo sarebbe stato più breve,

Ma l'ho controllato nel tester, sembra funzionare senza problemi, che sia così, è tardi, ho sonno... Cattivo esempio fatto (((

Non è il mio codice, l'ho trovato su Internet, non so scrivere indicatori. :)

Per quello che vale un cattivo esempio, mi è piaciuto molto il tuo indicatore, funziona nello Strategy Tester e sui grafici reali.

Molte grazie per il rapido aiuto!

Posso anche chiederti di rimuovere le linee che disegnano il canale? Le ho segnate con delle frecce rosse nello screenshot.

E se non è troppo disturbo, aggiungete la funzione per disattivare/attivare la formazione delle linee nel giorno corrente. Li ho segnati sullo screenshot con delle frecce blu. https://prnt.sc/kuuj3e

Grazie in anticipo!

Скриншот
Скриншот
  • prnt.sc
Снято с помощью Lightshot
 

Ciao caro!

Per favore, consigliate come eseguire la procedura OnInit();

dopo che le variabili di Expert Advisor sono state cambiate?

Quando si posiziona l'Expert Advisor sul grafico, c'è OnInit(); ma quando le variabili vengono cambiate, non c'è OnInit!?

Come identificare l'evento del cambiamento della variabile di Expert Advisor?

Per favore aiutatemi con un consiglio, o meglio con del codice, come fare?

 
Игорь:

Ciao caro!

Per favore, consigliate come eseguire la procedura OnInit();

dopo che le variabili di Expert Advisor sono state cambiate?

Quando si posiziona l'Expert Advisor sul grafico, c'è OnInit(); ma quando le variabili vengono cambiate, non c'è OnInit!?

Come identificare l'evento del cambiamento della variabile di Expert Advisor?

Per favore aiutatemi con un consiglio, o meglio con del codice, come fare?

#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

input int var1 = 1;
//+------------------------------------------------------------------+
int OnInit()
  {
      Print("Вызов OnInit(), var1=",var1);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
void OnDeinit(const int reason){}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {

  }
//+------------------------------------------------------------------+

Sperimenta questo codice, leggi il messaggio nel log dell'EA (cambia il TF, inserisci la variabile, riavvia il terminale senza chiudere l'EA...)

e la seconda opzione è quella di descrivere una variabile di portata globale con il modificatore static

#property strict

input int var1=1;
static bool FirstRun=true;
//+------------------------------------------------------------------+
int OnInit()
  {
   Print("Вызов OnInit(), var1=",var1);
// раскоментируйте FirstRun=true; если нужно контролировать вызов OnInit()
//   FirstRun=true;     
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
void OnDeinit(const int reason){}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(FirstRun)
     {
      Print("Это первый запуск эксперта");
      FirstRun=false;
     }
  }
//+------------------------------------------------------------------+
 
Igor Makanu:

sperimentare con tale codice, leggere il messaggio nel log di Expert Advisor (cambiare il TF, inserire la variabile, ricaricare il terminale senza chiudere Expert Advisor...)

e la seconda opzione è quella di descrivere una variabile di portata globale con il modificatore static

Nell'ambito globale con il modificatore static????? Questa è una specie di perversione.

 
Alexey Viktorov:

A livello globale con il modificatore statico static????? Questa è una specie di perversione.

Ma dalla mia esperienza, quando le build di MT4 erano spesso aggiornate, è meglio scriverle secondo il classico C++, piuttosto che ascoltare la risposta "scrivi il codice correttamente" quando si comunica con gli sviluppatori



ZS: Mi ricordo perché ho iniziato a scrivere il modificatore statico globalmente, se voglio essere sicuro di non "perdere" il valore della variabile durante l'esecuzione del programma MQL. Prima (circa 5 anni fa) la direttiva #property strict del precompilatore non esisteva e quando si abilitano i file (#include o library - non ricordo più) ho "perso la mia variabile" una volta, poiché i nomi delle variabili coincidevano con il nome della variabile.Sono stato maledetto da MQL ma poi ho trovato questo errore per caso. Ma se scrivessi un modificatore statico il compilatore mostrerebbe un errore di compilazione anche in quel caso.

Il compilatore attuale è MT4, abbastanza pratico e affidabile, e con la direttiva #property strict, forse non ho bisogno di tali precauzioni, ma scrivo statico per abitudine quando non voglio "perdere un valore" di una variabile

ZZZY: questo modificatore non influisce sulla velocità di esecuzione dei programmi MQL, ed è comodo per me aprire il mio codice più tardi, e avendo visto la statica saprò esattamente che questa variabile ha un valore, che è importante non "perdere" durante l'esecuzione del programma

 
Igor Makanu:

Ma dalla mia esperienza, quando le build di MT4 erano spesso aggiornate, è meglio scriverle secondo il classico C++, che ascoltare la risposta "scrivi il codice correttamente" quando si comunica con gli sviluppatori



ZS: Mi ricordo perché ho iniziato a scrivere il modificatore statico globalmente, se voglio essere sicuro di non "perdere" il valore della variabile durante l'esecuzione del programma MQL. Prima (circa 5 anni fa) la direttiva #property strict del precompilatore non esisteva e quando si abilitano i file (#include o library - non ricordo più) ho "perso la mia variabile" una volta, poiché i nomi delle variabili coincidevano con il nome della variabile.Sono stato maledetto da MQL ma poi ho trovato questo errore per caso. Ma se scrivessi un modificatore statico il compilatore mostrerebbe un errore di compilazione anche in quel caso.

Il compilatore attuale è MT4, abbastanza pratico e affidabile, e con la direttiva #property strict, forse non ho bisogno di tali precauzioni, ma scrivo statico per abitudine quando non voglio "perdere un valore" di una variabile

ZZZY: questo modificatore non influisce sulla velocità di esecuzione del programma MQL, ed è conveniente per me aprire il mio codice dopo qualche tempo, e avendo visto la statica saprò esattamente che questa variabile ha un valore, che è importante "non perdere" durante l'esecuzione del programma

Il compilatore genererà un avvertimento se i nomi delle variabili coincidono con quelli del file include. Per me, un avvertimento equivale a un errore e reagisco allo stesso modo. E le variabili di livello globale con un modificatore statico è uguale al burro.

Ma... Se ti piace scrivere così, nessuno può proibirtelo.

 
Alexey Viktorov:

Ma... Ma... se ti piace scrivere in questo modo, nessuno te lo può proibire.

Ho dei dubbi sulla mia unicità in questa materia... Non sono l'unico, cercando nella cartella MQL5 ho trovato tali dichiarazioni con modificatore statico a livello globale in diversi codici sorgente di consegna MT5

Anche nell'articolo "FORESTA DECISIONE CASUALE NEL SOMMARIO" nel codice sorgente ho trovato una dichiarazione a livello globale: static datetime last_time=0;

così ho scritto come vedo in forma di allocare e sarà, io non 100% delle variabili a livello globale che descrive come statico

Dio protegge i bisognosi, disse la suora... ))))

Motivazione: