[Arquivo!] Qualquer pergunta de novato, de modo a não desorganizar o fórum. Profissionais, não passem por ela. Não poderia ir a lugar algum sem você - 2. - página 513

 

Dicas profissionais sobre como otimizá-lo para a abertura de preços no auto-optimizador:

https://forum.mql4.com/ru/42125

 
Olá, sou um principiante tentando entender como escrever um EA
aconselhar como escrever "se uma ordem previamente fechada era uma ordem de compra e fechada com um stop loss então vender 0,1 lote com um stop loss 50 take profit 50" por favor)
 

Especialistas! Socorro! Como isso pode ser implementado?


int start() 
{
 bool OPEN=false;

 условие1=х;//вычисление условия1
 условие2=y;//вычисление условия2
 
 if(условие1==х)OPEN=true;
 
 if(условие2==y&&OPEN==true)
 OrderSend;

Precisamos consertar OPEN=true até o
condição2. A condição1 pode mudar durante este tempo.

Obrigado de antemão!

 

tirá-lo para o início

 bool OPEN=false;
 
sergeev:

tirá-lo para o início


Muito obrigado! Como eles dizem, tudo é brilhantemente simples! E eu passei o dia todo rachando meus miolos.
 

Por favor, diga-me o que estou fazendo errado ao calcular o número de primeiras barras ( Quant_Bars ) que correspondem à condição apenas acima ou abaixo do buffer. Isto é, assim que o indicador for traçado ANTES da barra fechada (1), devo contar as barras anteriores com o indicador APAGAR as barras (exceto aquelas que não estão em conformidade com a condição) e vice-versa, na direção oposta de movimento. Minha variante dá valores errados.

Quem sabe como fazer isso?

#property indicator_chart_window     
#property indicator_buffers 1
#property indicator_color1 Green
double step = 0.1;
double max = 0.2;

int n = 1;
double S;
double barA;
double barB;
double Bufer[];
int k,k1;
//---------------------------------
int init()
{
   SetIndexStyle(0, DRAW_ARROW,EMPTY,0,Green); 
   SetIndexArrow(0, 159); 
   SetIndexBuffer(0, Bufer);
   return (0);
}
//---------------------------------
int deinit() 
{
   return (0);
}
//----------------------------------
int start()
{

 k1=k;
 for(int i=Bars-2; i>=0; i--)  
    {
     if(i == Bars-2)
       {
         Bufer[i] = Low[i] - 10.0 * Point;
         n = 1;
         S = step;
         barA = High[i];
         barB = Low[i];
       }
    else
       {
         if(Close[i] > barA)
           {
             barA = Close[i];
               if (n==1 && S <= max - step)
                  { S = S + step; }
             k=1;
           }          
         if(Close[i] < barB)
           {
            barB = Close[i];
              if (n == -1 && S <= max - step)
                 { S = S + step;}
            k=2;
           }
        if (n == 1)
           { Bufer[i] = Bufer[i + 1] + S * (barA - (Bufer[i + 1]));}
       else
           { Bufer[i] = Bufer[i + 1] + S * (barB - (Bufer[i + 1]));}
      
       if ((Bufer[i+1] < Close[i + 1] && Bufer[i] > Close[i]) || (Bufer[i + 1] > Close[i + 1] && Bufer[i] < Close[i]))
          {
           S = step;
             if (n == 1)
                {Bufer[i] = barA;}
             else
                {Bufer[i] = barB;}
           barB = Close[i];
           barA = Close[i];
           n = -1 * n;
          }
       }
   }
    
//--------------------------Подсчитать бары:
   int num1 = 2;  // бар  
   int counted_bars = IndicatorCounted(); 
 //-----СЕЛЛ
if(Bufer[2]<Close[2] && Bufer[1]>Close[1])    
   {
     for( i=num1; i<=Bars; i++ )
        { 
          if(Bufer[i]<Close[i])
                                 
             {int Quant_Bars = Quant_Bars+i;}
          if(Bufer[i]>Close[i] && Bufer[i-1]<Close[i-1]) 
          break;
         }
     Alert("Число баров= ",Quant_Bars, "  counted_bars= ",counted_bars," бары= ", Bars );    
    }
    
 //-----БАЙ  
if(Bufer[2]>Close[2] && Bufer[1]<Close[1])     
   {
     for( i=num1; i<=Bars; i++ )
        { 
          if(Bufer[i]<Close[i])                     
            {Quant_Bars = Quant_Bars+i;}
          if(Bufer[i]>Close[i] && Bufer[i-1]<Close[i-1]) 
          break;
         }
     Alert("Число баров= ",Quant_Bars, "  counted_bars= ",counted_bars," бары= ", Bars );    
    }  

   return (0);
}
 

pergunta,

Por que, quando meu Consultor Especialista drena bem todo o depósito e praticamente todos os negócios estão perdendo, então quando mudo a "polaridade" dos sinais, o depósito não aumenta tão rapidamente, mas já? )))) os pontos são os mesmos, o erro está apenas na direção de abertura da ordem, ou há algo mais?

 
Maxaxa:

pergunta,

Por que, quando meu Consultor Especialista drena bem todo o depósito e praticamente todos os negócios estão perdendo, então quando mudo a "polaridade" dos sinais, o depósito não aumenta tão rapidamente, mas já? )))) os pontos são os mesmos, o erro está apenas na direção de abertura da ordem, ou há algo mais?

Esta é uma filosofia comercial.
 
Maxaxa:


há algo mais
 
Solree:

Boa tarde.

Há 4 pedidos, 2 vendem e 2 compram. Os selos são criados, figurativamente falando, quando o preço sobe e compram quando o preço desce. As vendas são eliminadas quando uma compra é criada e vice-versa. Quando um bilhete é criado, a 1ª venda ou compra é armazenada no poste variável. Todos os 4 têm o mesmo comentário - "Aelit". Portanto, existe um código:

A ordem é selecionada normalmente pelo bilhete, mas muitas vezes a comparação de comentários falha. Por interesse, fiz outro Alerta(OrderComment()); e o registro mostrou "Alerta: Aelit[sl]". O que é [sl]? É porque todos os pedidos têm o mesmo comentário? Então por que foi o mesmo [sl] quando eu fiz um comentário que não coincidiu com os outros para o teste? Se você remover a verificação de comentários, há um erro de ticket no log para OrderModify. A princípio eu pensava que a condição era alcançada antes de qualquer ordem ser criada, mas não, naquele momento a ordem já estava lá, e o bilhete é o mesmo em caso de condição de acionamento e não de acionamento. Como entendemos isso?

Não é um milagre que sua corretora tenha acrescentado a seu comentário - a ordem foi encerrada quando o StopLoss foi alcançado.

Você não organizou corretamente a seleção do pedido no bilhete. Ao fazer tal seleção, antes de tudo, MODE_TRADES é desnecessário - é omitido na função OrderSelect(),

Em segundo lugar, após a seleção bem sucedida da ordem, você não verifica se a ordem é selecionada de acordo com o bilhete - do mercado ou dos fechados.

Para fazer isso, depois que a ordem for selecionada, verifique seu tempo de fechamento e se for igual a zero, então somente então a ordem é de mercado, caso contrário - é selecionada a partir das ordens já fechadas (daí o acréscimo ao seu comentário)

Razão: