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

 
Андрей #:

Buona notte!

Cari utenti del forum, ho bisogno di aiuto. Ho scritto uno script in MQL4 che disegna una linea con una formula da tre punti dati su un grafico. Ci vogliono 130 linee, compresi i rientri e gli spazi. Ho recentemente deciso di portarlo a MQL5 e mi sono reso conto che la mia scarsa conoscenza della programmazione non mi aiuterà perché ho bisogno di imparare di nuovo.

C'è un errore nel codice di divisione dello zero, correggilo prima

a1=(y3-(x3*(y2-y1)+x2*y1-x1*y2)/(x2-x1))/(x3*(x3-x1-x2)+x1*x2);

Qui la divisione per "0" perché x1 e x2 è uguale a "1", che risulta in "0".

Fare un controllo prima dell'operazione di matrice

 
Manter84 #:

Sei un burlone. Ma il problema è reale, e ci sono argomenti sul fatto che il comando Print stampa due volte nella scheda Experts e anche Allert viene due volte, solo che non c'è una risposta ahimè come risolvere il problema. E per il futuro, se non si sa, si può solo mantenere il silenzio e passare, ma per guadagnare rating se stessi risposte non professionali è stupido. Sì, a proposito, le sue risposte sono davvero molto deboli.

Qualunque sia la domanda, qualunque sia la risposta.
 
Андрей #:

Buona notte!

Cari utenti del forum, ho bisogno di aiuto. Ho scritto uno script in MQL4 che disegna una linea con una formula basata su tre punti dati su un grafico. Ci vogliono 130 linee, compresi i rientri e gli spazi. Ho recentemente deciso di portarlo a MQL5 e mi sono reso conto che la mia scarsa conoscenza della programmazione non mi aiuterà, ho bisogno di studiare di nuovo.

Sarò grato se qualcuno è pronto a portare lo script a MQL5. Sarei molto grato se qualcuno volesse convertire lo script in MQL5.

Se hai scritto lo script, perché ti serve nel tuo codice?

 //+------------------------------------------------------------------+
 //| Custom indicator initialization function                         |
 //+------------------------------------------------------------------+
 int init()
   {SetIndexBuffer(0,Buffer1);
   SetIndexStyle(0,DRAW_LINE);
 //---- indicators
 //----
    return(0);
   }
 
#property indicator_chart_window
int            FR_handle;
int OnInit()
  {

    FR_handle = iFractals(NULL,PERIOD_CURRENT);
   return(INIT_SUCCEEDED);

  }

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[])
  {
    Print("Проверка 111 "); 
    return(rates_total);
  }
Alexey Viktorov #
:
Come la domanda, così la risposta.

Beh, avresti potuto semplicemente scrivere che sono necessari più dettagli. Ho scritto il codice dell'indicatore più semplice (non potrebbe essere più semplice), ma genera anche due messaggi al comando Print. E se si omette di ottenere Handle, dà un solo messaggio.

***

File:
111.png  15 kb
 
Alexey Viktorov #:

Se hai scritto lo script, perché nel codice è

Dato che le mie capacità di programmazione sono al livello di uno scolaretto, ho preso un pezzo di codice funzionante e ne ho fatto delle regole. Ciò che non ha interferito, non ha toccato)
 
Manter84 #:

Beh, avresti potuto semplicemente scrivere che sono necessari più dettagli. Ho scritto il codice dell'indicatore più semplice (non potrebbe essere più semplice), ma genera anche due messaggi al comando Print. E se non si ottiene Handle, se ne ottiene uno.

Oh, cielo... ho solo parole sgradevoli nel mio vocabolario. Ecco perché è meglio che rimanga in silenzio.

 
Андрей #:
Dato che le mie capacità di programmazione sono al livello di uno scolaretto, ho preso qualche pezzo di codice funzionante e le regole da esso. Ciò che non ha interferito, non ha toccato)

Capito.

Andrew #:
Se qualcuno aiuta, vi devo comunque un whisky!)

Penso che il whisky di ......... non sia più economico di 30 dollari. Pertanto, è più facile creare una domanda su un sito di freelance e ci sarà disposto, circa 20 persone... E questo è il tuo messaggio si provocare le persone a rompere le regole. Chi ne ha bisogno? Beh, fallo gratis, e poi? Dopo tutto, una bottiglia non è passato, quindi è un lavoro per i soldi bypassando freelance.

 
Андрей #:

#property strict
//+------------------------------------------------------------------+
#property indicator_chart_window
 #property indicator_buffers 1
 #property  indicator_color1 clrBlue
 #property  indicator_width1 2
 #property  indicator_style1 0
 
#property indicator_label1  "3T" 
#property indicator_type1   DRAW_LINE 

#property indicator_style1  STYLE_SOLID 


#define Point _Point
#define Period()  _Period
#define Symbol  _Symbol
#define  TimeToStr TimeToStruct



// Позволяет, как в MT4, работать с таймсериями: Open[Pos], High[Pos], Low[Pos], Close[Pos], Time[Pos], Volume[Pos].
// А так же задает привычные MT4-функции: iOpen, iHigh, iLow, iClose, iTime, iVolume.


#define  DEFINE_TIMESERIE(NAME,FUNC,T)                                                                         \
  class CLASS##NAME                                                                                           \
  {                                                                                                           \
  public:                                                                                                     \
    static T Get(const string Symb,const int TimeFrame,const int iShift) \
    {                                                                                                         \
      T tValue[];                                                                                             \
      return((Copy##FUNC((Symb == NULL) ? _Symbol : Symb, _Period, iShift, 1, tValue) > 0) ? tValue[0] : -1); \
    }                                                                                                         \
    T operator[](const int iPos) const                                                                     \
    {                                                                                                         \
      return(CLASS##NAME::Get(_Symbol, _Period, iPos));                                                       \
    }                                                                                                         \
  };                                                                                                          \
  CLASS##NAME  NAME;                                                                                           \
  T i##NAME(const string Symb,const int TimeFrame,const int iShift) \
  {                                                                                                           \
    return(CLASS##NAME::Get(Symb,  TimeFrame, iShift));                                                        \
  }
//+------------------------------------------------------------------+
DEFINE_TIMESERIE(Volume, TickVolume, long)
DEFINE_TIMESERIE(Time, Time, datetime)
DEFINE_TIMESERIE(Open, Open, double)
DEFINE_TIMESERIE(High, High, double)
DEFINE_TIMESERIE(Low, Low, double)
DEFINE_TIMESERIE(Close, Close, double)
//+------------------------------------------------------------------+





 double     Buffer1[];
 //+------------------------------------------------------------------+
 //| Объявляем внешние переменные                                     |
 //+------------------------------------------------------------------+
 datetime point_1;
 datetime point_2;
 datetime point_3;
 datetime LastBarTime;
 string line_name[10];
 int gg=1;
 int x1;
 int x2;
 int x3;
 int xx1; // В эту переменную сохраняется значение номера бара вершины перед прогоном при появлении нового бара.
 int xx2; // Если линии стоят, значит при поялвении нового бара номер бара вершины должен увеличиться на 1.
 int xx3; // Если этого не произошло и xx1=x1 после прогона, значит увеличиваем вручную.
 int max;
 int maxx;
 double y1;
 double y2;
 double y3;
 double y11;
 double y22;
 double y33;
 double x11;
 double x22;
 double x33;
 double y;
 double a1;
 double a2;
 double a3;

bool Deinit = true;
 //+------------------------------------------------------------------+
 //| Custom indicator initialization function                         |
 //+------------------------------------------------------------------+
 

MqlDateTime str;
//--------------------------------------------------------------------
int OnInit()                             // Специальная функция init()
  {
   {SetIndexBuffer(0,Buffer1);
   
 //---- indicators
 //----
    return(0);
   }
  
   return(INIT_SUCCEEDED);                             // Выход из спец. ф-ии init()
  }
//--------------------------------------------------------------------
//int start()                            // Специальная функция start()
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[])

  {
   // Пересчитываем инликатор только при появлении нового бара
   if(LastBarTime == iTime(Symbol, 0, 0))
      return(0);
    LastBarTime = iTime(Symbol, 0, 0);
   
   
 // Присваиваем значения переменных времени


 int obj_total=ObjectsTotal(0,0,-1);

   for(int ii=0;ii<100;ii++)
     {string name = ObjectName(0,0,ii,OBJ_VLINE);
       if(ObjectGetInteger(0, name,OBJPROP_TYPE)!=OBJ_VLINE)
       continue;
       line_name[gg] = ObjectName(0,0,ii,OBJ_VLINE);
       gg=gg+1;
     
     }
    
   
    point_1=ObjectGetTimeByValue(0,line_name[1],0, OBJPROP_TIME);
    point_2=ObjectGetTimeByValue(0,line_name[2],0, OBJPROP_TIME);
    point_3=ObjectGetTimeByValue(0,line_name[3],0, OBJPROP_TIME);
   
 // Запоминаем текущий номер бара вершины

 xx1=x1; 
    
 //Определяем номера баров ключевых точек
   for (int j=0;j<500; j++)
   { if (Time[j]==point_1) x1=j;}
  
  
   // Если после прогона сдвиг по вершине не произошел, значит линий нет, добавляем +1 вручную.
 if (x1==xx1) x1=x1+1;
  
  
 xx2=x2;
  
   for (int k=0;k<500; k++)
   {if (Time[k]==point_2) x2=k;  }
  
 if (x2==xx2) x2=x2+1;
  
 xx3=x3;

   for (int l=0;l<500; l++)
   {if (Time[l]==point_3) x3=l; }
  
 if (x3==xx3) x3=x3+1;

 // Comment ("n1=", j," n2=", k, " n3=", l);
 //Находим "высоту" вершин
   {
   y1=High[x1];
   y2=High[x2];
   y3=High[x3];
   //Comment ("y1=", y1," x1=", x1, " y2=", y2, "x2=", x2," y3=", y3, " x3=", x3);
   //Принимаем первую из них за начало координат
  
 a1=(y3-(x3*(y2-y1)+x2*y1-x1*y2)/(x2-x1))/(x3*(x3-x1-x2)+x1*x2);
 a2=((y2-y1)/(x2-x1))-a1*(x1+x2);
 a3=((x2*y1-x1*y2)/(x2-x1))+a1*x1*x2;

 max=MathMax(x1,x2);
 maxx=MathMax(max,x3);
  
  
   for (int i=maxx; i>=0; i--)
  
   { y=a1*i*i+a2*i+a3;
   Buffer1[i]=y;}
  

    return(0);
   }


//--------------------------------------------------------------------
   return(rates_total);                           // Выход из спец. ф-ии start()
  }
//--------------------------------------------------------------------
void OnDeinit(const int reason)
  {

   if( Deinit == true)                         // Стираем  с графика, если включена функция очистки графика
     {
      int obj_total=ObjectsTotal(0,0,-1);
      PrintFormat("Всего %d объектов",obj_total);
      for(int i=obj_total-1; i>=0; i--)
        {
         string name=ObjectName(0,i,-1,-1);
         //         PrintFormat("Объект %d: %s",i,name);
         ObjectDelete(0,name);
        }
     }
     Comment("");
//--- destroy timer
   EventKillTimer();

  }


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

Non ci sono errori, ma la funzione di temporizzazione non è corretta, non c'era abbastanza tempo)

Ed è meglio verificare la divisione per zero in 5, prima dell'operazione di divisione Se il divisore è zero, allora....

 
Manter84 #:

Sì, a proposito, le sue risposte sono davvero molto deboli.

Manter84 #:

Ecco il codice dell'induttore più semplice (non potrebbe essere più semplice)

Ci sono cinque errori in una parola di sei lettere...

e sono troppo debole per correggerti.

 
Alexey Viktorov #:

Che sfiga... Le uniche parole che mi sono rimaste nel mio vocabolario sono le parole volgari. Quindi preferisco non dire nulla.

Cosa ti ho mai fatto? O siete tutti così aggressivi?

Motivazione: