Qualquer pergunta de novato, de modo a não desorganizar o fórum. Profissionais, não passem por aqui. Em nenhum lugar sem você - 6. - página 473

 
Kutuzov:

Ajuda com os bugs!

Decidi fazer um EA para mim com base em um exemplo do manual mql4. Já faz uma semana que estou mexendo nisso, mas isso sempre me dá algum tipo de erro.

Favor verificar o que pode estar errado, talvez algo deva ser mudado ou removido além de parênteses.

Erros:

'}' - fim inesperado do programa expert.mq4 218 3

{' - parênteses desequilibrados expert.mq4 23 2


Tente traduzir o que está escrito nos erros. Acho que esta é a maneira mais fácil de descobrir a causa do erro

O que isto faz no início?

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

Você tem um Conselheiro Especialista, não um indicador.

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

por que não é definido como um tipo?

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

onde está o parêntese de fechamento?

 };

Quais são essas notícias?

Mostre-me onde está escrito no exemplo?

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

por que há uma vírgula no final e não um ponto e vírgula? por que escrever a mesma coisa duas vezes?

Se você colocar uma vírgula, escreva assim:

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

O que é isso?

[1]Close

Eu não olhei mais, fiquei cansado,

Portanto, não culpe os erros. Eles vêm de sua falta de atenção. Você precisa ler a ajuda novamente, e assistir ao vídeo para ler um artigo sobre como programar neste idioma.

 
Vladon:

consertou os erros... Mas durante o teste diz "Os indicadores personalizados não podem ser verificados".

Primeiro duvidei do tampão indicador especificado, mas tendo especificado ambos por sua vez, o erro ainda não desapareceu. Fiz asneira em algum lugar novamente?

Arquivos anexados:
expert_2.mq4  9 kb
 
Programação de ajuda de Guru). Eu estava testando um EA e acho que consegui passar) assim que ligo o EA tester e meu bot começa a trabalhar o testador congela e permanece no lugar por muito tempo, o que pode estar no código que retarda o testador?
 
miha91:
Programação de ajuda de Guru). Eu estava testando um EA e acho que consegui passar) assim que ligo o testador e meu bot começa a trabalhar, o testador congela e permanece no lugar por muito tempo, o que pode estar no código que retarda o testador?
Também tenho algo sob o barulho da banheira! O que poderia ser?
 
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);
  }
deve desenhar 4 linhas, mas só desenha o primeiro tampão se os outros faltarem
 

Estou tentando determinar um ponto na linha após sua modificação, ele funciona bem em todos os períodos, mas à 1 e 4 horas há periodicamente um erro de 100-200 pontos, como lidar com ele?

casamento

//+------------------------------------------------------------------+
//| 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:

Estou tentando determinar um ponto na linha após sua modificação, em todos os períodos normalmente funciona, mas às 1 e 4 horas periodicamente há um erro de 100-200 pontos, como lidar com ele?


Eu não tentei.

//+------------------------------------------------------------------+
//| 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);
  }
//+------------------------------------------------------------------+

Tente, eu não tentei.

 

Alternativamente, você poderia ir assim

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

Em termos modernos

 
r772ra:

Alternativamente, você poderia ir assim

Na linguagem moderna.


Parece que está funcionando, vou continuar observando.

Obrigado!

 
A questão para o problema das pessoas com conhecimento surgiu recentemente: no sinal da UPU para o correio deixou de vir, antes que tudo fosse normal, agora no registro do terminal escreve durante o teste:foi cantado, mas o correio não vem nada. Reiniciei a UPU, o terminal também, sem resultado.