Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 411

 
Leanid Aladzyeu:

Começou o estudo de matrizes .

Escrevi uma função pró-ordem com matrizes , 3 matrizes = 0 compra, 1= venda, 2= total compra e venda de ofícios.

Depois escrevi uma condição para comprar se ( a primeira condição && matriz [0] == 0 )então abrimos uma compra

e à venda se ( a primeira condição && matriz [1]== 0) então abrimos uma posição de Venda.

Mas o testador atira um erro e o teste pára, qual é o problema? ( erro " saída da matriz " )

Isto significa que o índice a que se dirige está fora da disposição da matriz. Por exemplo, se matriz[ 3 ]; pode abordar apenas itens de 0 a 2. Verifique o seu código.

Outra possibilidade é não dividir a matriz (com ArrayResize()), mas tentar aceder a alguns dos seus elementos.

 
código...
void Oher(int Mag,string Symb, int &mas[2])
{
ArrayInitialize( mas,0);

int tip;
int ticket3 =-1;
  for (int pos=OrdersTotal()-1; pos>=0; pos--)
     {
     if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderMagicNumber()==Mag && OrderSymbol()==Symb && OrderTicket()!=ticket3)
          {
          ticket3=OrderTicket();
          tip=OrderType();
          
          switch(tip)
              {
              case 0:mas[0]++; mas [2]++;break;// 0 покупка
              case 1:mas[1]++; mas [2]++;break;// 1 продажа
              }
          }
          continue;
     }

}
Чудо код вставил ) 2 раз получилось за все время что я на сайте)
 
Leanid Aladzyeu:
código...
Tente descobrir você mesmo, o testador deve indicar em que linha e posição da linha ocorreu o erro.
 
Tapochun:
Tente descobrir você mesmo, o testador deve indicar em que linha e posição da linha ocorreu o erro.

o_oops não sabia que o terminal também picava onde estava o erro, a primeira vez que acertei num erro crítico.

   case 1:mas[1]++; mas [2]++;break;// 1 продажа

Cuspiu nele.

 
Fixou-o. era um total de 2 matrizes e eu precisava de 3. na inicialização da matriz e na função o número feito +1. e funcionou)
 

Aconselhar como verificar como funciona o indicador.

A ideia é a seguinte: quando a EA forma uma nova barra chama o indicador, mas o indicador não tem dados neste momento e eu recebo os dados da barra anterior (não teve tempo de calcular).

Como evitar este problema. Além disso, tudo está bem no Testador de Estratégia. Ou fico bem ou nada bem na demonstração!

É isso, não é relevante. Resolvido.

 

Olá, tenho um problema de principiante...

Não consigo que o sistema compare o valor próximo da última barra com os altos e baixos de um determinado período, por exemplo

últimas 20 barras. O que é que estou a fazer mal?

extern int     MAGIC             = 90324752;
extern int     START_HOUR        = 7;
extern int     FINISH_HOUR       = 18;
extern int     TRADE_LIMIT       = 3;
extern int     SMMA_PERIOD       = 100;
extern int     BB_PERIOD         = 50;
extern double  BB_DEV            = 1;
extern double  LOT               = 1;
extern double  StopLoss          = 400;
extern double  TakeProfit        = 2000;

void OnTick()
{
static int    TICKET;

double SMMA                 = iMA (Symbol(),0,SMMA_PERIOD,0,MODE_SMMA,PRICE_CLOSE,0);
double BB_UP                = iBands(Symbol(),0,BB_PERIOD,BB_DEV,0,PRICE_CLOSE,MODE_UPPER,0);       

double HIGHEST              = High[iHighest(Symbol(),0,MODE_HIGH,20,0)];

if(Hour() >= START_HOUR && Hour() <= FINISH_HOUR && TRADE_COUNT < TRADE_LIMIT && POS_OPENED == FALSE && Seconds() >= 55)
if(Minute() == 29 || Minute() == 59)
{     
  if(Close[0] > SMMA && Close[0] > BB_UP && Close[0] >= HIGHEST)

  {
   TICKET = OrderSend(Symbol(),OP_BUY,LOT,Ask,0,Ask-StopLoss*Point,Ask+TakeProfit*Point,NULL,MAGIC,0,Blue);
   if(TICKET < 0)
      {
         Alert("Order Send failed, error # ", GetLastError() );
      } 
  }
}
}


Verificado com Alerta e por alguma razão desconhecida o testador dá o valor máximo do cálculo desde o último tick, mas dá este valor

É o mesmo número de vezes que as carraças, por isso a ordem não abre.


A segunda questão é como fazer a minha EA esperar até que a próxima barra abra (período de 30m)? Quando testo usando pontos de controlo tudo está bem, mas se eu usar carraças,

depois a EA abre no mesmo bar logo a seguir a ter fechado em stop loss.


Também, como posso fechar um negócio, independentemente de ter sido um tick ou não? Por exemplo, num período de 30m quero fechar a encomenda 5 segundos antes do fim do bar (29,55, 59,55)

Com base em todos os dados nesse momento. Nesta fase, o problema é que se um tick não ocorrer em 5 segundos, portanto não

(Em teoria isto é uma treta, mas na realidade o próximo tique pode aparecer em alguns castiçais por alguma razão.

pode acabar por se encontrar em algumas velas por alguma razão.


Obrigado de antemão!
 

Ajuda com os comentários. Em cada bar, são gerados comentários. Em cada tick quero acrescentar mais texto ao comentário existente.

Eu chamo o código:

void UserMarketComment( )

{

   string com=ChartGetString(0,CHART_COMMENT);  // Получаем текст существующего комментария

   string st="Целевой убыток="+DoubleToStr(-inpTargetLoss,2)+" "+AccountCurrency()+"  Текущ";

   if(AccountProfit()<0) st=st+"ий убыток=";

   else st=st+"ая прибыль=";

   st=st+DoubleToStr(AccountProfit(),2)+" "+AccountCurrency()+"  Целевая прибыль="+DoubleToStr(inpTargetProfit,2)+" "+AccountCurrency();

   Comment(com+"",TimeToStr(TimeCurrent(),TIME_SECONDS),"    Spread = ",MarketInfo(Symbol(),MODE_SPREAD),

           "\n ",st);

  }

Adiciona novo comentário e em cada tick numa nova linha e texto desliza para baixo.

Como fazê-lo apagar as últimas linhas antes da saída?

 
ForTorg ZEVs:

Ajuda com os comentários. Em cada bar, são gerados comentários. Em cada tick quero acrescentar mais texto ao comentário existente.

Eu chamo o código:

void UserMarketComment( )

{

   string com=ChartGetString(0,CHART_COMMENT);  // Получаем текст существующего комментария

   string st="Целевой убыток="+DoubleToStr(-inpTargetLoss,2)+" "+AccountCurrency()+"  Текущ";

   if(AccountProfit()<0) st=st+"ий убыток=";

   else st=st+"ая прибыль=";

   st=st+DoubleToStr(AccountProfit(),2)+" "+AccountCurrency()+"  Целевая прибыль="+DoubleToStr(inpTargetProfit,2)+" "+AccountCurrency();

   Comment(com+"",TimeToStr(TimeCurrent(),TIME_SECONDS),"    Spread = ",MarketInfo(Symbol(),MODE_SPREAD),

           "\n ",st);

  }

Adiciona novo comentário e em cada tick numa nova linha e texto desliza para baixo.

Como fazê-lo apagar as últimas linhas antes da saída?

Parece-me que só pode substituir completamente Comentário()

E consequentemente, para alterar uma parte do comentário em cada tick, é necessário alterar completamente o comentário em cada tick.

 
ForTorg ZEVs:

Ajuda com os comentários. Em cada bar, são gerados comentários. Em cada tick quero acrescentar mais texto ao comentário existente.

Eu chamo o código:

void UserMarketComment( )

{

   string com=ChartGetString(0,CHART_COMMENT);  // Получаем текст существующего комментария

   string st="Целевой убыток="+DoubleToStr(-inpTargetLoss,2)+" "+AccountCurrency()+"  Текущ";

   if(AccountProfit()<0) st=st+"ий убыток=";

   else st=st+"ая прибыль=";

   st=st+DoubleToStr(AccountProfit(),2)+" "+AccountCurrency()+"  Целевая прибыль="+DoubleToStr(inpTargetProfit,2)+" "+AccountCurrency();

   Comment(com+"",TimeToStr(TimeCurrent(),TIME_SECONDS),"    Spread = ",MarketInfo(Symbol(),MODE_SPREAD),

           "\n ",st);

  }

Adiciona novo comentário e em cada tick numa nova linha e texto desliza para baixo.

Como fazê-lo apagar as últimas linhas antes da saída?

Portanto, tem um carácter de controlo "\n" no seu comentário - é um carácter de alimentação de linha. Se o remover, não haverá múltiplas linhas.