Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 1607

 
Андрей #:

Boa noite!

Caros usuários do fórum, preciso de alguma ajuda. Escrevi um roteiro em MQL4 que desenha uma linha por uma fórmula baseada em três pontos dados em um gráfico. São necessárias 130 linhas, incluindo travessões e espaços. Recentemente decidi portar para a MQL5 e percebi que meu fraco conhecimento de programação não vai me ajudar, pois preciso aprender novamente.

Há um erro no código de divisão zero, conserte-o primeiro

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

Aqui a divisão por "0" porque x1 e x2 é igual a "1", o que resulta em "0".

Fazer uma verificação antes da operação da matriz

 
Manter84 #:

Você é um brincalhão. Mas o problema é real, e há tópicos sobre isso o comando Imprimir imprime duas vezes na aba Especialistas e Allert também vem duas vezes, só que não há resposta, infelizmente, como consertá-lo. E para o futuro, se você não sabe, você pode simplesmente ficar em silêncio e passar, mas ganhar uma classificação de respostas não profissionais é estúpido. Sim, a propósito, suas respostas são realmente muito fracas.

Qualquer que seja a pergunta, qualquer que seja a resposta.
 
Андрей #:

Boa noite!

Caros usuários do fórum, preciso de alguma ajuda. Escrevi um roteiro em MQL4 que desenha uma linha por uma fórmula baseada em três pontos dados em um gráfico. São necessárias 130 linhas, incluindo travessões e espaços. Recentemente decidi portar para a MQL5 e percebi que meu fraco conhecimento em programação não me ajudará, preciso estudar novamente.

Ficarei grato se alguém estiver pronto para portar o roteiro para a MQL5. Eu ficaria muito grato se alguém quisesse converter o roteiro para MQL5.

Se você escreveu o roteiro, por que você precisa dele em seu código?

 //+------------------------------------------------------------------+
 //| 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 #
:
Como a pergunta é, a resposta também é.

Bem, você poderia ter acabado de escrever que mais detalhes são necessários. Eu escrevi o código do indicador mais simples (não poderia ser mais simples), mas ele também gera duas mensagens no comando Imprimir. E se você omitir o Handle, ele dá uma mensagem.

***

Arquivos anexados:
111.png  15 kb
 
Alexey Viktorov #:

Se você escreveu o roteiro, por que no código está

Como minhas habilidades de programação estão no nível de um estudante, peguei algum código de trabalho e fiz regras a partir dele. O que não interferiu, não tocou)
 
Manter84 #:

Bem, você poderia ter acabado de escrever que mais detalhes são necessários. Eu escrevi o código do indicador mais simples (não poderia ser mais simples), mas ele também gera duas mensagens no comando Imprimir. E se você não tiver o Handle, você tem um.

Oh, querido... Só tenho palavras sujas em meu vocabulário. É por isso que é melhor eu ficar em silêncio.

 
Андрей #:
Como minhas habilidades de programação estão no nível de um estudante, tirei dele alguns códigos e regras de trabalho. O que não interferiu, não tocou)

Entendi.

Andrew #:
Se alguém ajudar, eu lhe devo um uísque de qualquer maneira!)

Acho que o uísque de ......... não é mais barato do que 30 dólares. Portanto, é mais fácil criar uma aplicação em um site freelancer e haverá, cerca de 20 pessoas... E esta é sua mensagem que você provoca as pessoas a quebrar as regras. Quem precisa disso? Bem, faça-o de graça, e depois? Afinal, uma garrafa que você não passou, então é um trabalho para o dinheiro contornando o 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();

  }


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

Não há erros, mas a função de tempo não está correta, não houve tempo suficiente)

E é melhor verificar a divisão por zero em 5, antes da operação de divisão Se o divisor for zero, então....

 
Manter84 #:

Sim, a propósito, suas respostas são realmente muito fracas.

Manter84 #:

Aqui está o código do indutor mais simples (não poderia ser mais simples)

Há cinco erros em uma palavra de seis letras...

e eu estou muito fraco para corrigi-lo.

 
Alexey Viktorov #:

Que chatice... As únicas palavras que me restam em meu vocabulário são palavras sujas. Portanto, prefiro não dizer nada.

O que eu já fiz com você? Ou vocês são todos tão agressivos?