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

 

Por favor, ajude. Não consigo entender o loop for(), o tempo todo após a atualização, por causa do offset(iMA(NULL,PERIOD_M1,1,1,MODE_SMA,PRICE_OPEN,i)) O indicador vermelho!


//+------------------------------------------------------------------+
//|                                                         help.mq4 |
//|                        Copyright 2014, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+

#property copyright   "2005-2014, MetaQuotes Software Corp."
#property link        "http://www.mql4.com"
#property strict
#include <MovingAverages.mqh>
//--- indicator settings
#property  indicator_separate_window
#property  indicator_buffers 2
#property   indicator_color1  clrSilver
#property   indicator_color2  clrRed
#property   indicator_width1  2

//--- indicator parameters
input int SignalSMA=8;            // Signal SMA Period
//--- indicator buffers
double    ExtBuffer[];
double    ExtSignalBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit(void)
  {
   IndicatorDigits(Digits+1);
//--- drawing settings
   SetIndexStyle(0,DRAW_HISTOGRAM);
   SetIndexStyle(1,DRAW_LINE);
//--- indicator buffers mapping
   SetIndexBuffer(0,ExtBuffer);
   SetIndexBuffer(1,ExtSignalBuffer);

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Moving Averages Convergence/Divergence                           |
//+------------------------------------------------------------------+
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,limit;
//--- last counted bar will be recounted
   limit=rates_total-prev_calculated;
   if(prev_calculated>0)
      limit++;
//--- counted in the 1-st buffer
   for(i=0;i<limit;i++)
      ExtBuffer[i]=(
                    iMA(NULL,PERIOD_CURRENT,1,0,MODE_SMA,PRICE_HIGH,i)
                    +iMA(NULL,PERIOD_M1,1,1,MODE_SMA,PRICE_OPEN,i)
                    );
//--- signal line counted in the 2-nd buffer
   SimpleMAOnBuffer(rates_total,prev_calculated,0,SignalSMA,ExtBuffer,ExtSignalBuffer);
//--- done
   return(rates_total);
  }
//+------------------------------------------------------------------+

Muito obrigado de antemão.

 
Alexey Viktorov:

Na minha opinião, a abordagem não é de modo algum lógica. Por que definir o dia da semana? Que diferença faz em que dia é, se a condição deve dizer "não abrir mais do que xxx ordens hoje"?

Parece-me mais lógico contar as ordens abertas hoje e especificar a condição correspondente.

não há data de abertura do pedido no estado.


Se você sabe, por favor escreva como fazer isso)
Não entendo como garantir que em um determinado dia não sejam abertos mais de um n-ésimo número de pedidos durante o dia inteiro.

 
cripple:

Por favor, ajude. Não consigo entender o loop for(), o tempo todo após a atualização, por causa do offset(iMA(NULL,PERIOD_M1,1,1,MODE_SMA,PRICE_OPEN,i)) O indicador vermelho!


Agradeço antecipadamente.

Os MAs têm TFs diferentes. Você precisa encaixar o cronograma mais alto no TF M1, ou seja, contar os MAs duas vezes com números diferentes de carrapatos. Neste caso, um e o mesmo valor do período mais antigo será adicionado aos diferentes valores do mais jovem.

Se você olhar através de i você recebe, por exemplo, 10 velas do período D1 e 10 M1. Logicamente, algo está errado....

Outra coisa, se o indicador estiver definido no M1, provavelmente funcionará sem rebrisings

 
Renat Akhtyamov:

os MAs têm TFs diferentes. você tem que encaixar o tempo mais alto no TF M1, ou seja, contar os MAs duas vezes com números diferentes de carrapatos.

Ao passar por i você está agora tomando por exemplo 10 velas do período D1 e 10 M1. Logicamente, algo está errado....

Sim, você está certo, mas minha mente ainda não é suficiente para entender como fazer M1 contar corretamente
 
cripple:
Sim, você está certo, mas minha mente ainda não é suficiente para descobrir como fazer a M1 contar corretamente

Além disso, será necessário sincronizar M1 com um cronograma maior, pois 1 barra de M5 não corresponderá necessariamente a 5 velas de M1, podendo ser 4 ou 1.

 
cripple:
Sim, você está certo, mas minha mente ainda não é suficiente para entender como fazer M1 contar corretamente

Tente

int  Bars(
   string           symbol_name,     // имя символа
   ENUM_TIMEFRAMES  timeframe,       // период
   datetime         start_time,      // с какой даты
   datetime         stop_time        // по какую дату
   );

tempo da i-ésima barra e colocar o número da barra resultante em vez da i.

 
Você poderia me dizer se você pode usar o teclado para percorrer os pares abertos no terminal mt4?
 
LRA:
Caro novikov433!!! Ensine você a programar, ou escreva um Expert Advisor gratuito ou ambos!! Em troca, ensine-me como as ordens deficitárias são traduzidas em sem perdas. Você pode usar um exemplo simples. Eu dou uma ordem a minha esposa (ordem): compre um balde de batatas de manhã cedo no mercado, e às 10 horas (análise fundamental) o preço sobe - venda. Mas às vezes um caminhão cheio de batatas chega às 10h30 (notícias). E o preço (nas notícias) cai instantaneamente e dura até o final do dia, ou mesmo durante a semana inteira. Eu coloco um Stop Loss - se o preço cai por 10 rublos, eu vendo assim que posso (ao preço de mercado). Como mudar o pedido, para evitar perdas. Se esta variante for interessante - envie-nos seu e-mail.
O problema é que o mercado foi ligeiramente para o lado necessário e depois voltou, então é preciso fechar o negócio no ponto de equilíbrio e abri-lo para o contrário. viciei-me assim que comecei. mais uma vez me convenci de que é uma besteira negociar com as mãos. como entendo porque preciso escrever tantos componentes no meu código?
 
Alexey Viktorov:

Tente

o tempo da i-ésima barra e colocar o número da barra resultante em vez da i.


Você já pensou em algo assim?
//+------------------------------------------------------------------+
//|                                                         help.mq4 |
//|                        Copyright 2014, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+

#property copyright   "2005-2014, MetaQuotes Software Corp."
#property link        "http://www.mql4.com"
#property description "Moving Averages Convergence/Divergence"
#property strict
#include <MovingAverages.mqh>
//--- indicator settings
#property  indicator_separate_window
#property  indicator_buffers 2
#property   indicator_color1  clrSilver
#property   indicator_color2  clrRed
#property   indicator_width1  2

//--- indicator parameters
input int SignalSMA=8;            // Signal SMA Period
//--- indicator buffers
double    ExtBuffer[];
double    ExtSignalBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit(void)
  {
   IndicatorDigits(Digits+1);
//--- drawing settings
   SetIndexStyle(0,DRAW_HISTOGRAM);
   SetIndexStyle(1,DRAW_LINE);
//--- indicator buffers mapping
   SetIndexBuffer(0,ExtBuffer);
   SetIndexBuffer(1,ExtSignalBuffer);

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Moving Averages Convergence/Divergence                           |
//+------------------------------------------------------------------+
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,limit;
//--- last counted bar will be recounted
   limit=rates_total-prev_calculated;
   if(prev_calculated>0)
      limit++;
//--- counted in the 1-st buffer
   for(i=0;i<limit;i++)
     {
      int bars=iBarShift(Symbol(),PERIOD_M1,iTime(Symbol(),PERIOD_CURRENT,i),false);
      ExtBuffer[i]=(
                    iMA(NULL,PERIOD_CURRENT,1,0,MODE_SMA,PRICE_HIGH,i)
                    +iMA(NULL,PERIOD_M1,1,1,MODE_SMA,PRICE_OPEN,bars)
                    );
      Print(bars);
     }
//--- signal line counted in the 2-nd buffer
   SimpleMAOnBuffer(rates_total,prev_calculated,0,SignalSMA,ExtBuffer,ExtSignalBuffer);
//--- done
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
ax00071:
Obrigado por sua atenção )) Eu sou um otário ... ... ao fechar, tive a condição de fechar o negócio às 22:00 de sexta-feira, sem condições adicionais para verificar o tipo de negócio. O negócio em si foi fechado algumas horas antes. Bem, quando chegaram as 22h00, o Consultor Especialista começou a enviar ordens de fechamento de uma ordem que já estava fechada ... .
Dificilmente você deve se chamar uma fábrica. Se você conseguiu localizar, entender e corrigir tal erro, você está se aproximando do nível de um programador!
Razão: