Perguntas de Iniciantes MQL4 MT4 MetaTrader 4 - página 224

 
No Expert Advisor, as primeiras linhas em
OnTick()

Após estas linhas, outros códigos serão executados uma vez por vela. No momento de sua formação.

Você chama este indicador da EA, como eu o entendo?

 
Aleksei Stepanenko:
No Expert Advisor, as primeiras linhas em

Após estas linhas, outros códigos serão executados uma vez por vela. No momento de sua formação.

Você está chamando este indicador da EA, como eu o entendo?

Bem, na verdade, eu inseri este indicador em outro indicador que envia o sinal para outro programa. Ou seja, não existe um consultor especializado. Ou seja, deve ser inserido em algum lugar no próprio indicador, mas como?
 
Qual programa abre os negócios? É um conselheiro. Não é?
 
Aleksei Stepanenko:
E que programa abre o negócio? É o Conselheiro Especialista. Não é?

Ah, bem, talvez... Mas então as coisas parecem ficar muito mais complicadas... Não há como encaixá-lo neste código, há? E também não há código no segundo código indicador.

OnTick()
Como diabos isso funciona...:)))))
 
Você pode tentar outra forma, onde você chama este indicador via iCustom, colocar 1 no final desta função em vez de 0 também.
 
A propósito, o indicador ainda desenha muitas setas, mas quando eu recarrego o gráfico, apenas algumas delas permanecem. ( Como se o indicador estivesse se economizando na história, como se eu trocasse bem, mas em tempo real é completamente diferente. :(
 
ElenkaVladi:
A propósito, o indicador ainda desenha muitas setas também,

Sim? Hmm, darei uma olhada mais tarde.

 
Aleksei Stepanenko:
Você pode tentar outra forma, onde você chama este indicador via iCustom, colocar 1 no final desta função em vez de 0 também.

Você quer dizer assim?

if (IndicatorName != "") {
      up = iCustom(NULL, 0, IndicatorName, IndiBufferCall, SignalType);
      dn = iCustom(NULL, 0, IndicatorName, IndiBufferPut, SignalType);
if (IndicatorName != "") {
      up = iCustom(NULL, 1, IndicatorName, IndiBufferCall, SignalType);
      dn = iCustom(NULL, 1, IndicatorName, IndiBufferPut, SignalType);

Assim?

 
Aleksei Stepanenko:

Sim? Hmm, darei uma olhada mais tarde.

Talvez seja essa mensagem. Não deveríamos fazer o que ele diz?

https://www.mql5.com/ru/forum/160587/page223#comment_19618305

De qualquer forma, muito obrigado por ter mexido conosco aqui... :)))

Anexando os arquivos para uma melhor compreensão da situação.

Вопросы от начинающих MQL4 MT4 MetaTrader 4
Вопросы от начинающих MQL4 MT4 MetaTrader 4
  • 2020.11.29
  • www.mql5.com
Если у Вас вопросы по MQL4, MT4, MetaTrader 4, пожалуйста пишите в этой теме. Особенно когда вопросы касаются торговых функций...
Arquivos anexados:
 
ElenkaVladi:

Aqui está o código de trabalho:

//---- indicator settings
#property  indicator_chart_window
#property  indicator_buffers 2
#property  indicator_color1  Blue
#property  indicator_color2  Red
//---- indicator parameters
extern int  period = 4; //12
extern int  shift  = 0; //сдвиг по бару
//---- indicator buffers
double BufferUp[],BufferDn[];
double Ma[],MaOn[];

datetime LastTime=0;
int i, st=5;

int OnInit()
   {
   IndicatorBuffers(2);
//---- drawing settings
   SetIndexStyle(0,DRAW_ARROW,2);
   SetIndexArrow(0,233);
   SetIndexStyle(1,DRAW_ARROW,2);
   SetIndexArrow(1,234);

   SetIndexBuffer(0,BufferUp);//стрелка синяя верх
   SetIndexBuffer(1,BufferDn);//стрелка красная вниз
//---- name for DataWindow and indicator subwindow label
   IndicatorShortName("T3MA-ALARM ("+period+")");
   
   ArraySetAsSeries(Ma,true);
   ArraySetAsSeries(MaOn,true);
//---- initialization done
   if(Digits==3 || Digits==5) st*=10;
   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[])
   {
   if(rates_total<=MathMax(period,shift)) return(0);
   int limit=rates_total-prev_calculated;   
   if(prev_calculated>0) limit++;

   if(LastTime!=time[1])
      {
      LastTime=time[1];
      ArrayCopy(Ma,Ma,rates_total-ArraySize(Ma),0,WHOLE_ARRAY);
      ArrayCopy(MaOn,MaOn,rates_total-ArraySize(MaOn),0,WHOLE_ARRAY);
      }

   for(i=limit; i>=1; i--) Ma[i]=iMA(NULL,0,period,0,MODE_EMA,PRICE_CLOSE,i);
   for(i=limit; i>=1; i--) MaOn[i]=iMAOnArray(Ma,rates_total,period,0,MODE_EMA,i);
      
   for(i=limit; i>=1; i--)
      {
      if(MaOn[i+shift]-MaOn[i+1+shift]<0 && MaOn[i+1+shift]-MaOn[i+2+shift]>0){BufferDn[i+1]=high[i+1]+st*Point;}
      if(MaOn[i+shift]-MaOn[i+1+shift]>0 && MaOn[i+1+shift]-MaOn[i+2+shift]<0){BufferUp[i+1]=low[i+1]-st*Point;}
      }
   return(rates_total);
   }
Note que a seta é desenhada para trás BufferDn[i+1]=... Isto é uma infelicidade.