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

 
Artyom Trishkin #:

A primeira chamada para CopyRates() iniciou a troca de dados históricos (não corra por uma semana e você terá o mesmo novamente, bem, talvez não uma semana, mas algum tempo).
Você só precisa verificar quantos dados há no servidor e comparar a quantidade disponível com o Expert Advisor. Se for menos do que o necessário - deixar a EA até o próximo tick. No próximo tick, verifique novamente. Se a quantidade necessária de histórico não for obtida em uma determinada quantidade de tentativas - então este erro deve ser processado conforme necessário.

Obrigado pela informação!

Se você tiver tempo, por favor, informe como corrigi-lo:

Duas metas opostas são estabelecidas na história N velas atrás: Close[N]+50*Point e Close[N]-50*Point.
Então há uma condição que o preço deve atingir uma das metas (se (Alto[i] >Fech[N]+50*Ponto) ou (se (Baixo[i]<Fech[N]-50*Ponto)
Quando a condição é atingida, a distância de Close[N] a High[i] é escrita em x[alto]=High[i] array.
Depois é lançado aleatoriamente em qualquer um dos gráficos a qualquer momento.

E ao verificar via Print(x[high]), 1-2 de cada dez valores mostram menos de 50! Um tem 12, o outro 49. Embora, é estritamente indicado+50*Point. 8-9 são corretas (mais de 50) e 1-2 são anormais. Não é através do testador, mas com um gráfico real eu coloco um Expert Advisor (sem nenhuma função comercial); ele trabalha com o histórico e exibe resultados incorretos.

Quanto maior for o valor, menos erros ocorrem. Pensei que talvez fosse a propagação que interferisse, mas... O MT4 não parece ter se espalhado pela história

 
Artis98 #:

Olá Prezados usuários do fórum e programadores experientes! Eu preciso de ajuda para completar a EA)). Favor aconselhar como adicionar 2 coisas ao consultor de código:

1. Eis a situação: eu abro um pedido (1º) com TP e SL e um certo lote (provavelmente 0,01). Se este pedido fechar com lucro - frio, nada muda. Mas se este (1º) pedido for fechado no SL, o próximo pedido imediatamente após este (2º) é aberto com um lote 2 vezes maior (0,01*2=0,02). Se esta segunda ordem for fechada no Take Profit, então a próxima ordem (3ª ordem) é aberta com um lote regular, ou seja, 2 vezes maior lote é necessário somente para a próxima ordem (2ª ordem) depois que a anterior (1ª ordem) foi fechada no SL. Se a terceira ordem for fechada em SL pela segunda vez consecutiva, o lote permanecerá aumentado em 2x até que não haja nenhum TP fechado. Espero ter descrito em detalhes a lógica do que precisa ser acrescentado;


2. e a segunda coisa que temos que acrescentar é o movimento SL. agora deixe-me explicar com um exemplo: vamos assumir que temos uma ordem com parâmetros básicos T.p. + 300, S.l. - 500. O preço se move na direção desejada e passa +100 pips a partir do preço de abertura do pedido. Uma vez que o preço atinja +100 a partir do preço de abertura do pedido, SL deve passar da base -500 para +90. Isto é, quando o preço atinge +100 pips do preço de abertura do pedido, transferimos o pedido para o Breakeven ajustando S,L para +90 pips. Depois disso, se o preço se mover mais na direção desejada e passar por mais + 50 pips - S.L. é movido por 50 pips => deve agora estar a + 140 pips do preço de abertura do pedido. Isto é, a S.L. primeiro se move de sua posição base para + 90 pips do preço de abertura do pedido e depois se move se passar por + 50 pips ( - 500 => + 90 => + 140 => + 190 etc.). E assim vai ou até o preço chegar ao T.P. ou quando a tendência se inverte e atinge a S.L.


Espero ter descrito tudo em detalhes, e espero realmente sua ajuda, pois ao acrescentar estes elementos em falta, o Assessor Especialista estará pronto)) Se você tiver alguma dúvida, por favor, pergunte))) Estou colando uma parte do código do Expert Advisor abaixo:

Sobre o primeiro ponto: antes de abrir uma posição, veja como a anterior foi fechada. Se você tomar o SL, então o lote deve ser o dobro. O lote não deve ser aumentado pela metade do lote da posição anterior, mas definido nas configurações ou em algum lugar no código. Então, antes de abrir, você verificará a condição: se a posição anterior foi fechada pelo SL, então abra uma posição com o lote duplo.

Quanto à segunda: Há muito tempo atrás, coloquei uma parada de amostragem nesta linha. Procure por ela. Melhor no meu perfil em mensagens - você o encontrará lá mais rápido do que navegar por mais de 100 páginas aqui. Então, com base no exemplo encontrado, você tentará criar sua própria rede de arrasto.

 
Artyom Trishkin #:

A primeira chamada para CopyRates() iniciou a troca de dados históricos (não corra por uma semana e você terá o mesmo novamente, bem, talvez não uma semana, mas algum tempo).
Você só precisa verificar quantos dados há no servidor e comparar a quantidade disponível com o Expert Advisor. Se for menos do que o necessário - deixar a EA até o próximo tick. No próximo tick, verifique novamente. Se uma quantidade necessária de tentativas não for obtida - o erro é tratado conforme necessário.

Podemos obter o número de barras carregadas de forma programática?

Eu mesmo apenas olho para a data no arquivo de citações para cada TF e tento não ir além delas nos cálculos.

Esta tarefa pode ser desnecessária nesta forma. Seria mais correto obter uma bandeira quando a quantidade correta de barras é carregada, mas pode nunca ser carregada para um ou outro símbolo.

 
Artyom Trishkin #:

Sobre o primeiro ponto: antes de abrir uma posição, veja como a posição anterior fechou. Se por SL, então o lote deve ser o dobro. O lote não deve ser dobrado a partir do lote da posição anterior, mas a partir do conjunto nas configurações ou em algum lugar no código. Então, antes de abrir, você verificará a condição: se a posição anterior foi fechada pelo SL, então abra uma posição com o lote duplo.

Acho que já o mudei no código:

//+------------------------------------------------------------------+
//| Calculate optimal lot size                                       |
//+------------------------------------------------------------------+
 double Lots()  // Расчет объема лота
  {
   int n=0;
   double Lotscount;
   double OL=Lot;
   
   
   if(Lot>0) return(LOT());          // "если во внешней переменной "Lot" стоит число больше 0 => будет фиксированный лот без авт. расчёта" 
   Lotscount=AccountFreeMargin()/10000;  // раcчёт лота - свободная маржа/9000 => 100/9000=0.01 лота 
   Lotscount=MathMin(15,MathMax(0.01,Lotscount));
    if(Lotscount<0.1) Lotscount=NormalizeDouble(Lotscount,2);
    else 
     {
       if(Lotscount<1) Lotscount=NormalizeDouble(Lotscount,1);
      else       Lotscount=NormalizeDouble(Lotscount,0);
     }
     
     for (int j = OrdersHistoryTotal()-1; j >= 0; j--)
   {
      if (OrderSelect(j, SELECT_BY_POS,MODE_HISTORY))
      {
          if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
         {
            if (OrderProfit()<0) 
             {
               if (n==0) OL=NormalizeDouble(OrderLots()*K_Martin,DigitsLot);
               n++; 
               if (OrderProfit()>0) return(Lotscount);
            }
            else
            {
               if (n==0) {Comment("2");return(Lotscount);}
               else {Comment("3");return(OL);}
            }
         }
      }
   }
      return(Lotscount);
 }
//------------------------------------------------------------------
double LOT()
{
   int n=0;
   double OL=Lot;
   for (int j = OrdersHistoryTotal()-1; j >= 0; j--)
   {
      if (OrderSelect(j, SELECT_BY_POS,MODE_HISTORY))
      {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
         {
            if (OrderProfit()<0) 
            {
               if (n==0) OL=NormalizeDouble(OrderLots()*K_Martin,DigitsLot);
               n++; 
               if (OrderProfit()>0) return(Lot);}
            }
            else
            {
               if (n==0) {Comment("2");return(Lot);}
               else {Comment("3");return(OL);}
            }
         }
      }
   }
   return(OL);
}

Ou é errado? Além disso, eu não sei como mudar duas coisas relacionadas ao lote. A primeira é que um pedido com um lote dobrado deve ser aberto somente uma vez e somente em um pedido (o próximo pedido após o pedido com S.L.). E a segunda, que não sei como acrescentar, é para que no caso de dois S.L.'s em fila (duas ordens fechadas em fila por S.L.) a terceira ordem não abra com muito mais 2 (2*2*2), mas apenas uma vez (2*2) como a segunda ordem.

 
Artis98 #:

Acho que já mudei isso no código:

Ou isso é errado? Além disso, eu não sei como mudar duas coisas sobre muita coisa. A primeira é fazer um pedido com lote duplo aberto somente uma vez e somente em um pedido (o próximo pedido após o pedido com S.L.). E a segunda, que não sei como acrescentar, é para que no caso de dois S.L.'s seguidos (duas ordens fechadas com S.L. seguidas) a terceira ordem não abra com muito mais 2 (2*2*2), mas apenas uma vez (2*2) como a segunda ordem.

Você tem DOIS tipos de pedido - pedido número 1 - um pedido com um lote normal, e pedido número 2 - um pedido com um lote maior. Os lotes são incrementados apenas pelo tipo SL #1.

Salvar o tipo de pedido em um "comentário", por exemplo. Ou, melhor ainda, memorize você mesmo. É um bom hábito memorizar tudo sobre seus pedidos.

 
Maxim Kuznetsov #:

você tem DOIS tipos de pedido - pedido número 1 - um pedido com um lote normal, e pedido número 2 - um pedido com um lote aumentado. Os lotes são incrementados apenas pelo tipo SL #1.

Salvar o tipo de pedido em um "comentário", por exemplo. Ou, melhor ainda, memorize você mesmo. É um bom hábito lembrar de tudo sobre suas encomendas.

Não precisamos memorizar nada (especialmente porque a memorização requer mais reconstrução). É suficiente para ele saber como a posição anterior foi fechada. Isso é tudo. Não há necessidade de conhecer nem dois, nem três, nem cem seguidos, nem cem não fechados por uma tampa, mas apenas a última posição. Se fosse fechado por Stop Loss, então o próximo deveria ser fechado com lote duplo. Mas o lote não deve ser dobrado a partir do lote da posição anterior, mas a partir do conjunto no lote normal do programa. Então, se a posição for fechada não no Stop Loss, então a próxima posição deverá ser aberta com o mesmo lote. Se a posição for fechada por Stop Loss, então duplique o lote para a próxima posição. Isso é tudo. Você não precisa saber mais nada.

 
Artyom Trishkin #:

Ele não precisa memorizar nada (especialmente porque a memorização requer recuperação posterior). Só precisa saber como a posição passada se fechou. Isso é tudo. Ele não precisa conhecer dois, ou três, ou cem seguidos, ou não fechados em uma parada, mas apenas a posição passada. Se fosse fechado por Stop Loss, então o próximo deveria ser fechado com lote duplo. Mas o lote não deve ser dobrado a partir do lote da posição anterior, mas a partir do conjunto no lote normal do programa. Então, se a posição for fechada não no Stop Loss, então a próxima posição deverá ser aberta com o mesmo lote. Se a posição for fechada por Stop Loss, então duplique o lote para a próxima posição. Isso é tudo. Você não precisa saber mais nada.

Não diga às pessoas o que devem fazer.

Você tem que lembrar seus dados e trabalhar com eles

 
Artyom Trishkin #:

Tudo o que ele precisa saber é como a posição passada se fechou. Isso é tudo. Você não precisa conhecer dois, três, cem em fila ou não em fila fechados em stopploss, apenas a posição passada. Se a posição foi fechada no stoploss, então a próxima deve ser com o lote duplo. Se a posição foi fechada no stoploss, então abra a próxima com o lote duplo.

Isto é o que eu preciso, essa é na verdade a questão - como escrevê-la no código?

 

Olá!
Alguém pode por favor me dizer como forçar o compilador a compilar para o MT4 e não para o MT5?

Se o arquivo tiver a extensão *.mq4, estou bem, se tiver a extensão *.mqh, então o compilador o aceita como *.mq5 e ocorrem erros.

 
Sergey Zhukov #:

Olá!
Alguém pode por favor me dizer como forçar o compilador a compilar para o MT4 e não para o MT5?

Se o arquivo tem a extensão *.mq4, estou bem, se tem a extensão *.mqh, então o compilador o aceita como *.mq5 e ocorrem erros.

Entregue-nos o arquivo. Isso é algo novo, eu nunca tinha ouvido isso antes.
Razão: