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

 
inter78:

Na verdade, eu fiz, mas não gosto do longo tempo de resposta

Não é muito tempo, é um tique... mas em geral, você precisa ler a ajuda. Você não pode aprender MQL "tentando", é baseado em С++, mas está vinculado à plataforma МТ, então você precisa estudar a ajuda.

Você tem manipulação de arquivos e trabalha com variáveis e gráficos globais em seu código ... Há um monte de operações desnecessárias em cada carrapato

Se você quiser uma execução rápida, use OnChartEvent(), ele não é gerado no testador, mas primeiro comece a estudar a ajuda MQL4.

 
Igor Makanu:

A operação não é longa, é tique por tique... mas em geral, comece a ler a ajuda, você não pode aprender MQL por "gut feeling", MQL é baseado em C++, mas está ligado à plataforma MT, você não pode fazê-lo sem ler a ajuda.

Você tem manipulação de arquivos e trabalha com variáveis e gráficos globais em seu código ... Há um monte de operações desnecessárias em cada carrapato

Se você quiser uma execução rápida, use OnChartEvent(), ele não é gerado no testador, mas primeiro comece a estudar a ajuda MQL4.

Provavelmente terei que pedir aos técnicos que o tragam à razão. Não serei capaz de fazê-lo. Este indicador é muito conveniente para trabalhar com um número ilimitado de gráficos abertos. Os botões mostram o lucro atual do símbolo e o número de ordens de compra e venda.
 

Olá a todos.

Encontrei um útil indicador Ind-Fractals na biblioteca de códigos. No entanto, ele desenha fractais em cada barra, em vez de calculá-los corretamente. Quero usar este indicador, mas ele está "quebrado" (( Ajude-me a encontrar um erro, tentei entrar em contato com o autor, mas ele não responde às mensagens. Por conveniência, código duplicado aqui.

#propriedade copyright "Copyright © 2005, MetaQuotes Software Corp.

#link da propriedade "http://www.metaquotes.net"

//----

#janela_do_cartão_indicador de propriedade

#property indicator_buffers 8

#indicador de propriedade_cores1 Vermelho

#indicador de propriedade_color2 Vermelho

#código de propriedade_color3 Azul

#indicador de propriedade_color4 Azul

#indicador de propriedade_color5 Cal

#indicador de propriedade_color6 Cal

#indicador de propriedade_color7 Sienna

#indicador de propriedade_color8 Siena

//---- parâmetros de entrada

bool externo Comm=true;

//---- buffers

duplo ExtMapBuffer1[];

duplo ExtMapBuffer2[];

duplo ExtMapBuffer3[];

duplo ExtMapBuffer4[];

duplo ExtMapBuffer5[];

duplo ExtMapBuffer6[];

duplo ExtMapBuffer7[];

duplo ExtMapBuffer8[];

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

//| Função de inicialização do indicador personalizado |

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

int init()

{

//---- indicadores

SetIndexStyle(0,DRAW_ARROW);//o estilo da linha indicadora

SetIndexArrow(0,217); //prescreve o tipo de seta

SetIndexBuffer(0,ExtMapBuffer1);//bindbuffer indicador com matriz dinâmica unidimensional de tipo duplo. Existem 2 versões da função.

SetIndexEmptyValue(0,0.0);//S Define o valor vazio para a linha indicadora.

SetIndexStyle(1,DRAW_ARROW);

SetIndexArrow(1.218);

SetIndexBuffer(1,ExtMapBuffer2);

SetIndexEmptyValue(1,0.0);

SetIndexStyle(2,DRAW_ARROW);

SetIndexArrow(2.217);

SetIndexBuffer(2,ExtMapBuffer3);

SetIndexEmptyValue(2,0.0);

SetIndexStyle(3,DRAW_ARROW);

SetIndexArrow(3.218);

SetIndexBuffer(3,ExtMapBuffer4);

SetIndexEmptyValue(3,0.0);

SetIndexStyle(4,DRAW_ARROW);

SetIndexArrow(4.217);

SetIndexBuffer(4,ExtMapBuffer5);

SetIndexEmptyValue(4,0.0);

SetIndexStyle(5,DRAW_ARROW);

SetIndexArrow(5.218);

SetIndexBuffer(5,ExtMapBuffer6);

SetIndexEmptyValue(5,0.0);

SetIndexStyle(6,DRAW_ARROW);

SetIndexArrow(6.217);

SetIndexBuffer(6,ExtMapBuffer7);

SetIndexEmptyValue(6,0.0);

SetIndexStyle(7,DRAW_ARROW);

SetIndexArrow(7.218);

SetIndexBuffer(7,ExtMapBuffer8);

SetIndexEmptyValue(7,0.0);

retorno(0); }

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

//| Função de desinicialização do indicador do cliente |

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

int deinit() {return(0); }

//------------------------------------------------------------------

bool Fractal(string F,int Por,int shift) {

if(Período()>Por) retorno(-1);

Por=Por/Período()*2+MathCeil(Por/Período()/2);

if(shift<Per)return(-1);

if(shift>Bars-Per)return(-1);

for(int i=1;i<=Per;i++) {

if(shift+i>=Bars || shift-i<0) return(-1);

if(F==="U") {

if(High[shift+i]>High[shift])return(-1);

if(High[shift-i]>=High[shift])return(-1); }

if(F==="L") {

if(Low[shift+i]<Low[shift])return(-1);

if(Low[shift-i]<=Low[shift])return(-1); } } }

retorno(1); }

//------------------------------------------------------------------

int start()

{

int D1=1440,H4=240,H1=60,M15=15,B;

duplo P;

int counted_bars=IndicatorCounted();// número de barras inalterado após a última chamada do indicador

B=Bars-counted_bars;

if(counted_bars==0) B--;

if(Period()==D1)P=150*Point;// period retorna o período atual do gráfico

if(Period()==H4)P=70*Point;

if(Period()==H1)P=40*Point;

if(Period()==30)P=30*Point;

if(Period()==M15)P=20*Point;

if(Período()==5)P=10*Ponto;

if(Período()==1)P=5*Ponto;

for(int shift=B;shift>0;shift--)

{

if(Fractal("U",M15,shift)==1) ExtMapBuffer1[shift]=High[shift]+P;

senão ExtMapBuffer1[shift]=0;

if(Fractal("L",M15,shift)==1) ExtMapBuffer2[shift]=Low[shift]-P;

senão ExtMapBuffer2[shift]=0;

if(Fractal("U",H1,shift)==1) ExtMapBuffer3[shift]=High[shift]+P;

senão ExtMapBuffer3[shift]=0;

if(Fractal("L",H1,shift)==1) ExtMapBuffer4[shift]=Low[shift]-P;

senão ExtMapBuffer4[shift]=0;

if(Fractal("U",H4,shift)==1) ExtMapBuffer5[shift]=High[shift]+P;

senão ExtMapBuffer5[shift]=0;

if(Fractal("L",H4,shift)==1) ExtMapBuffer6[shift]=Low[shift]-P;

senão ExtMapBuffer6[shift]=0;

if(Fractal("U",D1,shift)==1) ExtMapBuffer7[shift]=High[shift]+P;

senão ExtMapBuffer7[shift]=0;

if(Fractal("L",D1,shift)==1) ExtMapBuffer8[shift]=Low[shift]-P;

senão ExtMapBuffer8[shift]=0;

}

if(Comm) Comentário ("D1 - marrom - H4 - verde - H1 - azul - M15 - vermelho");


retorno(0);

}

MetaQuotes Software Corp.
MetaQuotes Software Corp.
  • www.metaquotes.net
Миллионы трейдеров и сотни брокеров не могут ошибаться — они выбрали MetaTrader 5 для торговли на Форексе и финансовых рынках! Узнать больше
 

Eu fui repreendido aqui por este tipo de código, é a primeira vez que o tenho :-)

O código deve ser inserido em um formulário que se abre com Alt+S.

 
psyman:

Eu fui repreendido aqui por este tipo de código, é a primeira vez que o tenho :-)

Você tem que colar o código em um formulário que se abre em Alt+S.

Você é repreendido? De forma alguma. Escreva o código como você quiser. Mas... se você quiser uma resposta à sua pergunta, tente respeitar aqueles que você está pedindo ajuda. É tão simples quanto isso.

 

Fórum sobre comércio, sistemas automatizados de comércio e testes estratégicos

Qualquer pergunta para iniciantes em MQL4, ajuda e discussão sobre algoritmos e códigos

Artyom Trishkin, 2018.10.18 08:07

Vamos colocar desta forma: crie um modelo de indicador no editor, adicione o número certo de variáveis de entrada e buffers de desenho quando você o criar.

A seguir, vamos analisar o que fazer a partir da tarefa específica.

Eu fiz isso da última vez, apenas mudei o nome da variável e da matriz.

Ao utilizar o iMA, ele funciona apenas em semanas e em daires, onde a vela contém mais de 100 pontos, ele não faz nada em prazos mais baixos. A razão parece ser o arredondamento.




Se for utilizado iMAOnArray, a janela i-ras está vazia em todas as TFs. Não há erros no registro.




//+------------------------------------------------------------------+
//|                                                        _null.mq4 |
//|                        Copyright 2014, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot OC
#property indicator_label1  "O-C"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrSteelBlue
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- indicator buffers
double         ip1Buf[];

input int ip1=100;
double tmp1[];


//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
  
IndicatorBuffers(2);
string s_name1;

s_name1="O-C (" + IntegerToString(ip1) + ")";

IndicatorShortName(s_name1);
SetIndexLabel(0, s_name1);
SetIndexBuffer(1, tmp1);


//--- indicator buffers mapping
   SetIndexBuffer(0,ip1Buf);
   
//---
   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;

      Print("rates_total = ",rates_total);
      for(i=1; i<rates_total-1; i++)
      {
      //Print("i = ",i);
      tmp1[i]=MathMax(open[i],close[i])-MathMin(open[i],close[i]);      
     // tmp1[i]=close[i];      
      //ip1Buf[i]=iMA(NULL,0,1,0,0,tmp1[i],0);
      ip1Buf[i]=iMAOnArray(tmp1,1,1,0,0,0);
      
      }
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+


 
psyman:

Se for utilizado iMAOnArray, a janela i-ra está vazia em todas as TFs. Não há erros no registro.

Você está usando iMAOnArray() com período 1, ou seja, o valor iMAOnArray() será essencialmente o valor da matriz tmp1

Se você quiser fazer o que está calculando, encurte o looppara(i=1; i<10; i++)

e não imprima todos os dados que você deseja calcular, embora possa ser mais fácil não calcular alguma fórmula complexa, mas use iMAOnArray() para construir iMA e iMAOnArray() - ambos iMA e iMAOnArray() são o mesmo cálculo.... Infelizmente, se você puder obter uma resposta a uma pergunta técnica neste fórum, só você deve aprender a calcular e a lidar com as informações.

 
psyman:

Da última vez que fiz isso, apenas mudei o nome da variável e da matriz.

Ao utilizar iMA i-r trabalhou apenas em semanas e dias, onde há mais de 100 pontos em uma vela, ele não desenha nada em TFs inferiores. A razão parece ser o arredondamento.




Se for utilizado iMAOnArray, a janela i-ras está vazia em todas as TFs. Não há erros no registro.





O primeiro ciclo calcula os valores do primeiro tampão;

O segundo ciclo calcula o MA por valores calculados no primeiro ciclo.

Considere o que significa iMAOnArray(). Escreva MA no Array. Como você traduzi-lo? Todos têm um tradutor do Google na ponta de seus dedos. Put-translate-receber: MA em Array.

Isso significa que é uma média móvel baseada em uma matriz preliminarmente calculada e preenchida.

Correspondentemente: o primeiro ciclo - preparação da matriz necessária, e o segundo ciclo - construção de uma média móvel baseada na matriz, preparada no primeiro ciclo.

E o que você faz? Você insere um valor na primeira matriz (os outros valores ainda não foram preparados) e tenta construir o MA sobre este valor.

Eu lhe dei um modelo:

Fórum sobre comércio, sistemas automatizados de comércio e testes estratégicos

Qualquer pergunta, ajuda e discussão sobre algoritmos e códigos para iniciantes da MQL4

Artyom Trishkin, 2018.10.18 09:39

Indicador:

//+------------------------------------------------------------------+
//|                                                       TestMA.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                             https://mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://mql5.com/ru/users/artmedia70"
#property version   "1.00"
#property indicator_chart_window
#ifdef __MQL4__
#property strict
#property indicator_buffers 2
#else 
#property indicator_buffers 3
#property indicator_plots   2
#endif 
//--- plot MAstd
#property indicator_label1  "Calculation MA"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrBlue
#property indicator_style1  STYLE_SOLID
#property indicator_width1  4
//--- plot MAcalc
#property indicator_label2  "Standart MA"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrDarkOrange
#property indicator_style2  STYLE_DOT
#property indicator_width2  2
//--- input parameters
input int      InpPeriod                     =  10;            // Period
input ENUM_MA_METHOD       InpMethod         =  MODE_EMA;      // Method
input ENUM_APPLIED_PRICE   InpAppliedPrice   =  PRICE_CLOSE;   // Applied price  
//--- indicator buffers
double         BufferMAcalc[];
double         BufferMAstd[];
double         BufferPrice[];
//---
int            digits;
int            period_ma;
int            handle_ma;
CAvg           avg();
//--- includes

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
#ifdef __MQL4__
   IndicatorBuffers(3);
#endif 
    period_ma=(InpPeriod<1? 1 : InpPeriod);
   digits=Digits()+1;
//--- indicator buffers mapping
   SetIndexBuffer(0,BufferMAcalc,INDICATOR_DATA);
   SetIndexBuffer(1,BufferMAstd,INDICATOR_DATA);
   SetIndexBuffer(2,BufferPrice,INDICATOR_CALCULATIONS);
//---
   ArraySetAsSeries(BufferMAcalc,true);
   ArraySetAsSeries(BufferMAstd,true);
   ArraySetAsSeries(BufferPrice,true);
//---
#ifdef __MQL5__
   ResetLastError();
   handle_ma=iMA(NULL,PERIOD_CURRENT,period_ma,0,InpMethod,InpAppliedPrice);
   if(handle_ma==INVALID_HANDLE)
     {
      Print("Error creation iMA(",(string)period_ma,"): ",GetLastError());
      return INIT_FAILED;
     }
#endif 
//---
   Comment("\nMA type: ",avg.MethodToString(InpMethod),", price: ",avg.PriceToString(InpAppliedPrice),", period: ",(string)period_ma);
//---
   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[])
  {
//--- Установка массивов буферов как таймсерий
#ifdef __MQL5__
   ArraySetAsSeries(open,true);
   ArraySetAsSeries(high,true);
   ArraySetAsSeries(low,true);
   ArraySetAsSeries(close,true);
#endif 
//--- Проверка количества доступных баров
   if(rates_total<fmax(period_ma,4)) return 0;
//--- Проверка и расчёт количества просчитываемых баров
   int limit=rates_total-prev_calculated;
   if(limit>1)
     {
      limit=rates_total-1;
      ArrayInitialize(BufferMAcalc,EMPTY_VALUE);
      ArrayInitialize(BufferMAstd,EMPTY_VALUE);
      ArrayInitialize(BufferPrice,0);
     }
//--- Подготовка данных
#ifdef __MQL5__
   int count=(limit>1 ? rates_total : 1),copied=0;
   copied=CopyBuffer(handle_ma,0,0,count,BufferMAstd);
   if(copied!=count) return 0;
#endif 
//--- Расчёт индикатора
   for(int i=limit; i>=0 && !IsStopped(); i--)
     {
      #ifdef __MQL4__ BufferMAstd[i]=iMA(NULL,PERIOD_CURRENT,period_ma,0,InpMethod,InpAppliedPrice,i); #endif 
       BufferPrice[i]=avg.AppliedPrice(InpAppliedPrice,NULL,PERIOD_CURRENT,i);
      BufferMAcalc[i]=avg.GetMA(rates_total,InpMethod,period_ma,i,BufferPrice);
     }

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Você pode jogar fora tudo relacionado aos cinco e obter um modelo para quatro. Embora este modelo seja multiplataforma - você pode usá-lo para ambos os terminais - basta definir seus amortecedores e seu número. Neste modelo, há dois desenhos e um cálculo, que podem ser vistos aqui:

//--- indicator buffers mapping
   SetIndexBuffer(0,BufferMAcalc,INDICATOR_DATA);
   SetIndexBuffer(1,BufferMAstd,INDICATOR_DATA);
   SetIndexBuffer(2,BufferPrice,INDICATOR_CALCULATIONS);
//---
 

= também, você usa iMAOnArray() com período 1, ou seja, o valor do iMAOnArray() será essencialmente o valor da matriz tmp1


Eu tentei usar valores diferentes, 1 permanece como a última variante destas experiências.

Por alguma razão, o ip1Buf[4] = 2147483647.0 escreve o mesmo número no buffer i-r em todas as TFs, por exemplo, enquanto os valores da matriz são todos diferentes tmp1[4] = 0,1300000000000097, etc.

Mas mesmo assim deve ser traçada uma linha reta, e não há absolutamente nada na tabela i-r, a escala é marcada de 0 a 0.



 
psyman:

= também, você usa iMAOnArray() com período 1, ou seja, o valor do iMAOnArray() será essencialmente o valor da matriz tmp1


Eu tentei usar valores diferentes, 1 permanece como a última variante destas experiências.

Por alguma razão, o ip1Buf[4] = 2147483647.0 escreve o mesmo número no buffer i-r em todas as TFs, por exemplo, enquanto os valores da matriz são todos diferentes tmp1[4] = 0,1300000000000097, etc.

Mas mesmo neste caso uma linha reta deve ser traçada, e não há absolutamente nada na tabela i-r, a escala é marcada de 0 a 0.



2147483647.0 Bem, comece a usar o motor de busca!https://www.mql5.com/ru/forum/224831

Mais uma vez, acabei de escrever Artem, você mesmo precisa ler, comece com uma simples... Desenhe um preço fechado em um gráfico com um indicador, depois tente complicá-lo, faça o mesmo em um ciclo e no segundo ciclo faça МА cálculo com base no buffer já calculado onde se encontra fechado

2147483647 в буфере
2147483647 в буфере
  • 2018.01.15
  • www.mql5.com
День Добрый! Подскажите, пожалуйста, что это за хрень. Не первый раз сталкиваюсь...
Razão: