Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 6. - pagina 473

 
Kutuzov:

Aiuto con gli insetti!

Ho deciso di fare un EA per me stesso sulla base di un esempio dal manuale mql4. Ci sto giocando da una settimana, ma mi dà sempre qualche tipo di errore.

Si prega di controllare cosa può essere sbagliato, forse qualcosa dovrebbe essere cambiato o rimosso oltre alle parentesi.

Errori:

'}' - fine inaspettata del programma expert.mq4 218 3

'{' - parentesi sbilanciate expert.mq4 23 2


Provate a tradurre ciò che è scritto negli errori. Penso che questo sia il modo più semplice per trovare la causa dell'errore

Cosa fa questo all'inizio?

#property  indicator_level1 20 // Задаём верхний уровень                             
#property  indicator_level2 80 // Задаём нижний уровень 

Hai un Expert Advisor, non un indicatore.

 DPeriod,      // "Redline" индикатора StochRSI.mq4 
 DPeriod=Bid;   // Запрашивем значение "Redline"

perché non è impostato come tipo?

  return;      // Выход из start()

dov'è la parentesi di chiusura?

 };

Che tipo di notizia è questa?

Mi mostri dove è scritto nell'esempio?

bool Ans =false,  // Ответ сервера после закрытия
bool Cls_B=false,

perché c'è una virgola alla fine e non un punto e virgola? perché scrivere due volte la stessa cosa?

Se metti una virgola, scrivi così:

bool Ans =false,  // Ответ сервера после закрытия
 Cls_B=false, // Критерий для закрытия Buy
 Cls_S=false, // Критерий для закрытия Sell
 Opn_B=false, // Критерий для открытия Buy
 Opn_S=false; // Критерий для открытия Sell

Che cos'è?

[1]Close

Non ho cercato oltre, mi sono stancato,

Quindi non date la colpa agli errori, sono dovuti alla vostra disattenzione. Devi rileggere la guida e guardare il video per leggere un articolo su come programmare in questo linguaggio.

 
Vladon:

corretto gli errori... Ma durante il test dice "Gliindicatori personalizzati non possono essere testati".

All'inizio ho dubitato del buffer dell'indicatore specificato, ma avendo specificato entrambi a turno, l'errore non è ancora scomparso. Ho di nuovo sbagliato da qualche parte?

File:
expert_2.mq4  9 kb
 
Aiuto del Guru della programmazione). Stavo testando un EA e credo di avercela fatta) appena accendo il tester EA e il mio bot inizia a lavorare il tester si blocca e rimane in posizione per un tempo molto lungo, cosa può esserci nel codice che rallenta il tester?
 
miha91:
Aiuto del Guru della programmazione). Stavo testando un EA e credo di avercela fatta) appena accendo il tester e il mio bot inizia a lavorare il tester si blocca e rimane fermo per un tempo molto lungo, cosa può esserci nel codice che rallenta il tester?
Ho anche qualcosa sotto la vasca da bagno che fruscia! Cosa potrebbe essere?
 
int OnInit()
  {
//--- indicator buffers mapping
 SetIndexBuffer(0,buf1);
SetIndexStyle(0,DRAW_LINE,0,1,Red);



 SetIndexBuffer(1,buf2);
SetIndexStyle(1,DRAW_LINE,0,1,Aqua);


 SetIndexBuffer(2,buf3);
SetIndexStyle(2,DRAW_LINE,0,1,Green);



 SetIndexBuffer(3,buf4);
SetIndexStyle(3,DRAW_LINE,0,1,Yellow);



//---
   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[])
  {
//---



   
   buf1[pos]=iOpen(Symbol(),0,pos);
   buf2[pos]=iHigh(Symbol(),0,pos);
   buf3[pos]=iClose(Symbol(),0,pos);
   buf4[pos]=iLow(Symbol(),0,pos);
   
  
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
dovrebbe disegnare 4 linee, ma disegna solo il primo buffer se mancano gli altri
 

Sto cercando di determinare un punto sulla linea dopo la sua modifica, funziona bene in tutti i periodi, ma a ore 1 e 4 c'è periodicamente un errore di 100-200 punti, come affrontarlo?

matrimonio

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   SetTLine(Red,"LineAlert",Time[15],High[15],0,High[0]+15*Point,0,0,1);
//---
   return(INIT_SUCCEEDED);
  }
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 12.10.2007                                                     |
//|  Описание : Уравнение прямой.                                              |
//|             Вычисляет значение Y для X в точке пересечения с прямой.       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    x1,y1 - координаты первой точки,                                        |
//|    x2,y2 - координаты второй точки,                                        |
//|    x     - значение, для которого вычислить Y                              |
//+----------------------------------------------------------------------------+
double EquationDirect(double x1,double y1,double x2,double y2,double x)
  {
   double tk;
   if(x2==x1) return(y1);
   tk=(y2-y1)/(x2-x1)*(x-x1)+y1;

   return(NormalizeDouble(tk,Digits));
  }
//+----------------------------------------------------------------------------+
//|  Версия   : 12.10.2007                                                     |
//|  Описание : Установка объекта OBJ_TREND трендовая линия                    |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    cl - цвет линии                                                         |
//|    nm - наименование               (  ""  - время открытия текущего бара)  |
//|    t1 - время открытия бара        (  0   - Time[10]                       |
//|    p1 - ценовой уровень            (  0   - Low[10])                       |
//|    t2 - время открытия бара        (  0   - текущий бар)                   |
//|    p2 - ценовой уровень            (  0   - Bid)                           |
//|    ry - луч                        (False - по умолчанию)                  |
//|    st - стиль линии                (  0   - простая линия)                 |
//|    wd - ширина линии               (  1   - по умолчанию)                  |
//+----------------------------------------------------------------------------+
void SetTLine(color cl,string nm="",
              datetime t1=0,double p1=0,datetime t2=0,double p2=0,
              bool ry=False,int st=0,int wd=1)
  {
   if(nm=="") nm=DoubleToStr(Time[0],0);
   if(t1<=0) t1=Time[10];
   if(p1<=0) p1=Low[10];
   if(t2<=0) t2=Time[0];
   if(p2<=0) p2=Bid;
   if(ObjectFind(nm)<0) ObjectCreate(nm,OBJ_TREND,0,0,0,0,0);
   ObjectSet(nm,OBJPROP_TIME1,t1);
   ObjectSet(nm,OBJPROP_PRICE1,p1);
   ObjectSet(nm,OBJPROP_TIME2,t2);
   ObjectSet(nm,OBJPROP_PRICE2,p2);
   ObjectSet(nm,OBJPROP_COLOR,cl);
   ObjectSet(nm,OBJPROP_RAY,ry);
   ObjectSet(nm,OBJPROP_STYLE,st);
   ObjectSet(nm,OBJPROP_WIDTH,wd);
  }
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    cd - код значка                                                         |
//|    cl - цвет значка                                                        |
//|    nm - наименование               ("" - время открытия текущего бара)     |
//|    t1 - время открытия бара        (0  - текущий бар)                      |
//|    p1 - ценовой уровень            (0  - Bid)                              |
//|    sz - размер значка              (0  - по умолчанию)                     |
//+----------------------------------------------------------------------------+
void SetArrow(int cd,color cl,
              string nm="",datetime t1=0,double p1=0,int sz=0)
  {
   if(nm=="") nm=DoubleToStr(Time[0],0);
   if(t1<=0) t1=Time[0];
   if(p1<=0) p1=Bid;
   if(ObjectFind(nm)<0) ObjectCreate(nm,OBJ_ARROW,0,0,0);
   ObjectSet(nm,OBJPROP_TIME1,t1);
   ObjectSet(nm,OBJPROP_PRICE1,p1);
   ObjectSet(nm,OBJPROP_ARROWCODE,cd);
   ObjectSet(nm,OBJPROP_COLOR,cl);
   ObjectSet(nm,OBJPROP_WIDTH,sz);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   int d=0;
   int    X_1,X_2,X3d;
   double Y_1,Y_2,Y3d;
   static int _time_waiting=0;
   static int i;
//---
   X_1=   ObjectGet("LineAlert",OBJPROP_TIME1);
   X_2 = ObjectGet("LineAlert", OBJPROP_TIME2);
   Y_1 = ObjectGet("LineAlert", OBJPROP_PRICE1);
   Y_2 = ObjectGet("LineAlert", OBJPROP_PRICE2);
   SetArrow(6,Orange,"X1",X_1,Y_1,3);
   SetArrow(6,Orange,"X2",X_2,Y_2,3);
   X3d=Time[0];Y3d=EquationDirect(X_1,Y_1,X_2,Y_2,X3d);
   SetArrow(6,Orange,"X",X3d,Y3d,3);
  }
//+------------------------------------------------------------------+
 
beginner:

Sto cercando di determinare un punto sulla linea dopo la sua modifica, in tutti i periodi funziona normalmente, ma a ore 1 e 4 periodicamente c'è un errore di 100-200 punti, come affrontarlo?


Non l'ho provato.

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   SetTLine(Red,"LineAlert",Time[15],High[15],0,High[0]+15*Point,0,0,1);
//---
   return(INIT_SUCCEEDED);
  }
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 12.10.2007                                                     |
//|  Описание : Уравнение прямой.                                              |
//|             Вычисляет значение Y для X в точке пересечения с прямой.       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    x1,y1 - координаты первой точки,                                        |
//|    x2,y2 - координаты второй точки,                                        |
//|    x     - значение, для которого вычислить Y                              |
//+----------------------------------------------------------------------------+
double EquationDirect(double x1,double y1,double x2,double y2,double x)
  {
   double tk;
   if(x2==x1) return(y1);
   tk=(y2-y1)/(x2-x1)*(x-x1)+y1;

   return(NormalizeDouble(tk,Digits));
  }
//+----------------------------------------------------------------------------+
//|  Версия   : 12.10.2007                                                     |
//|  Описание : Установка объекта OBJ_TREND трендовая линия                    |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    cl - цвет линии                                                         |
//|    nm - наименование               (  ""  - время открытия текущего бара)  |
//|    t1 - время открытия бара        (  0   - Time[10]                       |
//|    p1 - ценовой уровень            (  0   - Low[10])                       |
//|    t2 - время открытия бара        (  0   - текущий бар)                   |
//|    p2 - ценовой уровень            (  0   - Bid)                           |
//|    ry - луч                        (False - по умолчанию)                  |
//|    st - стиль линии                (  0   - простая линия)                 |
//|    wd - ширина линии               (  1   - по умолчанию)                  |
//+----------------------------------------------------------------------------+
void SetTLine(color cl,string nm="",
              datetime t1=0,double p1=0,datetime t2=0,double p2=0,
              bool ry=False,int st=0,int wd=1)
  {
   if(nm=="") nm=DoubleToStr(Time[0],0);
   if(t1<=0) t1=Time[10];
   if(p1<=0) p1=Low[10];
   if(t2<=0) t2=Time[0];
   if(p2<=0) p2=Bid;
   if(ObjectFind(nm)<0) ObjectCreate(nm,OBJ_TREND,0,0,0,0,0);
   ObjectSet(nm,OBJPROP_TIME1,t1);
   ObjectSet(nm,OBJPROP_PRICE1,p1);
   ObjectSet(nm,OBJPROP_TIME2,t2);
   ObjectSet(nm,OBJPROP_PRICE2,p2);
   ObjectSet(nm,OBJPROP_COLOR,cl);
   ObjectSet(nm,OBJPROP_RAY,ry);
   ObjectSet(nm,OBJPROP_STYLE,st);
   ObjectSet(nm,OBJPROP_WIDTH,wd);
  }
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    cd - код значка                                                         |
//|    cl - цвет значка                                                        |
//|    nm - наименование               ("" - время открытия текущего бара)     |
//|    t1 - время открытия бара        (0  - текущий бар)                      |
//|    p1 - ценовой уровень            (0  - Bid)                              |
//|    sz - размер значка              (0  - по умолчанию)                     |
//+----------------------------------------------------------------------------+
void SetArrow(int cd,color cl,
              string nm="",datetime t1=0,double p1=0,int sz=0)
  {
   if(nm=="") nm=DoubleToStr(Time[0],0);
   if(t1<=0) t1=Time[0];
   if(p1<=0) p1=Bid;
   if(ObjectFind(nm)<0) ObjectCreate(nm,OBJ_ARROW,0,0,0);
   ObjectSet(nm,OBJPROP_TIME1,t1);
   ObjectSet(nm,OBJPROP_PRICE1,p1);
   ObjectSet(nm,OBJPROP_ARROWCODE,cd);
   ObjectSet(nm,OBJPROP_COLOR,cl);
   ObjectSet(nm,OBJPROP_WIDTH,sz);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   int d=0;
   int    X_1,X_2,X3d;
   double Y_1,Y_2,Y3d;
   static int _time_waiting=0;
   static int i;
//---
   X_1=   ObjectGet("LineAlert",OBJPROP_TIME1);
   X_2 = ObjectGet("LineAlert", OBJPROP_TIME2);
   Y_1 = ObjectGet("LineAlert", OBJPROP_PRICE1);
   Y_2 = ObjectGet("LineAlert", OBJPROP_PRICE2);
   SetArrow(6,Orange,"X1",X_1,Y_1,3);
   SetArrow(6,Orange,"X2",X_2,Y_2,3);
   X3d=Time[0];Y3d=ObjectGetValueByShift("LineAlert", 0);
   SetArrow(6,Orange,"X",X3d,Y3d,3);
  }
//+------------------------------------------------------------------+

Prova, non ho provato.

 

In alternativa, potresti fare così

Y3d = ObjectGetValueByTime("LineAlert",Time[0],2);
  

In termini moderni

 
r772ra:

In alternativa, potresti fare così

Nel linguaggio moderno.


Sembra funzionare, continuerò a guardare.

Grazie!

 
Domanda a persone competenti-problema sorto di recente: sul segnale UPU alla posta ha cessato di venire, prima tutto era normale, ora nel log del terminale scrive durante il test: è stato sant, ma la posta non viene nulla. Ho riavviato l'UPU e anche il terminale, nessun risultato.
Motivazione: