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

 
d1w4m3:


Obrigado pela resposta, mas só agora comecei a aprender por algumas semanas, como implementar isto em código, ou me dizer onde ler por favor. Ou de acordo com Igor Kim?

E ainda assim, abrirá uma posição, não de acordo com o sistema, quando apenas iniciar seu trabalho, sua condição não evita este problema.

E se você pensar sobre isso? Por que isso não evita o problema?

Quando ele começa a trabalhar, e se ele não trabalhou antes (em geral na primeira corrida), então ainda não houve sua posição, e a lógica mostrará que a última posição fechada simplesmente ainda não existe. Isto significa que não poderia ter sido fechado em nenhuma parada ou tomada, o que, por sua vez, dá permissão para abrir uma posição no sinal.

Não é?

 
Artyom Trishkin:

E se você pensar sobre isso? Por que isso não evita o problema?

Quando começa a funcionar, e se não funcionou antes (primeira corrida), ainda não houve uma posição, e a lógica mostrará que a última posição fechada simplesmente ainda não existe. Isto significa que não poderia ter sido fechado em nenhuma parada ou tomada, o que, por sua vez, dá permissão para abrir uma posição no sinal.

Não é?


A questão é essa: por um sinal! Mas a condição pode ser cumprida não na barra 2 (assim que o indicador tiver mudado o buffer), mas em qualquer segunda barra (depois disso tudo funciona através do sistema, é claro). O problema está na condição de abrir pedidos, como resolvê-lo, mas na 2ª barra após a mudança do buffer indicador?

nulo OnTick()

{
uptr = NormalizeDouble(iCustom(NULL, 0, "Slope Direction Line", período, método, preço, 0, n), 4);
dntr = NormalizeDuplo(iCustom(NULL, 0, "Slope Direction Line", período, método, preço, 1, n), 4);
if(DN_Trend()==verdadeiro)
{
if(CountSell() == 0 && Bid < dntr && Open[3] < dntr && Close[3] < dntr)
{
bilhete = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "Sloper", Magic, 0, Red);
se (bilhete > 0)
{
SL = NormalizeDouble(Bid + StopLoss*Point, Dígitos);
TP = NormalizeDouble(Bid - TakeProfit*Point, Dígitos);
se (OrderSelect(ticket, SELECT_BY_TICKET))
if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))
Imprimir("Erro de venda");
}

}


 
d1w4m3:


Bem, a questão é que ele se baseia no sinal! Mas a condição pode satisfazer não na 2ª barra (assim que o indicador mudar o tampão), mas em qualquer segunda barra (depois disso tudo funciona com o sistema, é claro). O problema está na condição de abrir pedidos, como resolvê-lo, mas na 2ª barra após a mudança do buffer indicador?

nulo OnTick()

{
uptr = NormalizeDuplo(iCustom(NULL, 0, "Slope Direction Line", período, método, preço, 0, n), 4);
dntr = NormalizeDuplo(iCustom(NULL, 0, "Slope Direction Line", período, método, preço, 1, n), 4);
if(DN_Trend()==verdadeiro)
{
if(CountSell() == 0 && Bid < dntr && Open[3] < dntr && Close[3] < dntr)
{
bilhete = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "Sloper", Magic, 0, Red);
se (bilhete > 0)
{
SL = NormalizeDouble(Bid + StopLoss*Point, Dígitos);
TP = NormalizeDouble(Bid - TakeProfit*Point, Dígitos);
se (OrderSelect(ticket, SELECT_BY_TICKET))
if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))
Imprimir("Erro de venda");
}

}


Insira o código corretamente. Há um botão SRC no menu do editor de mensagens.
Eu não entendi nada de suas explicações.
 
d1w4m3:


Essa é a questão! Mas a condição pode ser cumprida não na barra 2 (assim que o indicador tiver mudado o buffer), mas em qualquer segunda barra (depois disso tudo funciona com o sistema, é claro). O problema está na condição de abrir pedidos, como resolvê-lo, mas na 2ª barra após a mudança do buffer indicador?

void OnTick()
{
  uptr = NormalizeDouble(iCustom(NULL, 0, "Slope Direction Line", period,  method, price, 0, n), 4);
  dntr = NormalizeDouble(iCustom(NULL, 0, "Slope Direction Line", period,  method, price, 1, n), 4); 
  
if(DN_Trend()==true)
{
  if(CountSell() == 0 && Bid < dntr && Open[3] < dntr && Close[3] < dntr)
  { 
   ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "Sloper", Magic, 0, Red);
      if (ticket > 0)
      {
         SL = NormalizeDouble(Bid + StopLoss*Point, Digits);
         TP = NormalizeDouble(Bid - TakeProfit*Point, Digits);
         
         if (OrderSelect(ticket, SELECT_BY_TICKET))
         if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))
           Print("Ошибка на продажу");
      }

  }


1. isto é o que o código pareceria se inserido corretamente. Há uma razão para os desenvolvedores terem surgido...

2. Uma dica sutil: onde estão Abertos[4] e Fechados[4] em relação aos valores indicadores?

 
extern int TakeProfit  = 200;
extern double Lots     = 0.1;
extern int StopLoss    = 52;
extern int Magic       = 1111;
extern int Slippage    = 3;
extern int n           = 3; // На какую свечу открывать ордер
//------------------------------------------------------------------
extern int  LevelWLoss  = 1;      // Уровень безубытка
extern int  LevelProfit = 30;     // Уровень профита
//------------------------------------------------------------------
extern string    Slope  = "Параметры Slope";
extern int       period = 163; 
extern int       method = 3;                         
extern int       price  = 0;    
//------------------------------------------------------------------
double uptr, SL, TP, dntr;
int    ticket, nd;
bool   fm;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
   if (Digits == 3 || Digits == 5)
   {
       TakeProfit  *=10;
       StopLoss    *=10;
       Slippage    *=10;
       LevelWLoss  *=10;
       LevelProfit *=10;
   }
   return(0);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{

}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
  uptr = NormalizeDouble(iCustom(NULL, 0, "Slope Direction Line", period,  method, price, 0, n), 4);
  dntr = NormalizeDouble(iCustom(NULL, 0, "Slope Direction Line", period,  method, price, 1, n), 4); 
  
if(DN_Trend()==true)
{
  if(CountSell() == 0 && Bid < dntr && Open[3] < dntr && Close[3] < dntr)
  { 
   ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "Sloper", Magic, 0, Red);
      if (ticket > 0)
      {
         SL = NormalizeDouble(Bid + StopLoss*Point, Digits);
         TP = NormalizeDouble(Bid - TakeProfit*Point, Digits);
         
         if (OrderSelect(ticket, SELECT_BY_TICKET))
         if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))
           Print("Ошибка на продажу");
      }
  }
}//if(DN_Trend()==true)

if(UP_Trend()==true)
{
   if( CountBuy() == 0  && Ask > uptr && Open[3] > uptr && Close[3] > uptr  )
  {
   ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, "Sloper", Magic, 0, Blue);
      if (ticket>0)
      {
         TP = NormalizeDouble(Ask + TakeProfit*Point, Digits);
         SL = NormalizeDouble(Ask - StopLoss*Point, Digits);
         
         if (OrderSelect(ticket, SELECT_BY_TICKET))
            if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))
               Print("Ошибка на покупку");
       }
    }
}//if(UP_Trend()==true)

      if ( CountSell()>0  && Open[3] > uptr && Close[3] > uptr && UP_Trend()==true)
      {
      for(int i = OrdersTotal() -1; i>=0; i--)
          {
            if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
            {
            if (OrderMagicNumber() == Magic && OrderType() == OP_SELL)
            if(!OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, Black))
            Print("Ошибка");
            }
          }
      }
      if ( CountBuy()>0 && Open[3] < dntr && Close[3] < dntr && DN_Trend()==true)
      {
      for(int i = OrdersTotal() -1; i>=0; i--)
          {
            if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
            {
            if (OrderMagicNumber() == Magic && OrderType() == OP_BUY)
            if(!OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, Black))
            Print("Ошибка");
            }
          }
      }
      //+переход в безубыток+
   for( int i=0; i<OrdersTotal(); i++) 
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) 
        {
        if(OrderSymbol()== Symbol() && OrderMagicNumber()==Magic)
          {
            if(OrderType()==OP_BUY) 
              {
                if(OrderStopLoss()-OrderOpenPrice()<LevelWLoss*Point) 
                 {
                   if(Bid-OrderOpenPrice()>LevelProfit*Point) 
                 {
                  fm=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()+LevelWLoss*Point,OrderTakeProfit(),CLR_NONE);
                 }
              }
            }
           }
         if(OrderType()==OP_SELL) 
           {
            if(OrderStopLoss()==0 || OrderOpenPrice()-OrderStopLoss()<LevelWLoss*Point) 
              {
               if(OrderOpenPrice()-Ask>LevelProfit*Point) 
                 {
                  fm=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()-LevelWLoss*Point,OrderTakeProfit(),CLR_NONE);
                 }
              }
           }
       
        }
     }
     
//------------  комментарии -----------------+     
  if(UP_Trend()) Comment("Восходящий тренд ", uptr);
  if(DN_Trend()) Comment("Нисходящий тренд ", dntr);
 
 }
//+------------------------------------------------------------------+
int CountSell()
{
   int count = 0;
   for (int trade = OrdersTotal()-1; trade>=0; trade--)
   {
        if(OrderSelect(trade, SELECT_BY_POS, MODE_TRADES))
    {
            if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_SELL)
                    count++;   
    }
   }
     return(count);
}
//+------------------------------------------------------------------+
int CountBuy()
{
   int count = 0;
   for (int trade = OrdersTotal()-1; trade>=0; trade--)
   {
        if(OrderSelect(trade, SELECT_BY_POS, MODE_TRADES))
    {
            if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_BUY)
                    count++;   
    }
   }
     return(count);
}
//+------------------------------------------------------------------+
bool UP_Trend()
{
  if(uptr > 0 && uptr != 2147483647.0) return(true);
  return(false);
}
//+------------------------------------------------------------------+
bool DN_Trend()
{
  if(dntr > 0 && dntr != 2147483647.0) return(true);
  return(false);
}
//+------------------------------------------------------------------+
 

Se inserirmos sua condição " Isto significa que ela não poderia ser fechada em nenhuma parada ou tomada, o que, por sua vez, dá permissão para abrir uma posição no sinal. "

E meu sinal é"if(CountSell() == 0 && Bid < dntr && Open[3] < dntr && Close[3] < dntr)". (junto com o deslocamento no indicador n=3),

Acontece que se for colocada imediatamente sobre a carta, ela se abrirá em uma tendência descendente, desde o momento do início na terceira vela, e então, se houver um sinal, ela se abrirá conforme necessário.

 
d1w4m3:

Se inserirmos sua condição " Isto significa que ela não poderia ser fechada em nenhuma parada ou tomada, o que, por sua vez, dá permissão para abrir uma posição no sinal. "

E meu sinal é"if(CountSell() == 0 && Bid < dntr && Open[3] < dntr && Close[3] < dntr)". (junto com o deslocamento no indicador n=3),

Acontece que se for colocada imediatamente na carta, ela se abrirá em uma tendência descendente no momento do início na terceira vela, e então, se houver um sinal, ela se abrirá conforme necessário.

Eu não entendo nada. O que você tem que não entende? Você não pode determinar que a última posição foi fechada na parada ou tomada? Você não consegue encontrar um lugar em seu código onde queira verificar esta condição?

Ou o que você não pode fazer?

Como ela pode abrir na terceira vela? Ou explicar o que significa "ela se abrirá na terceira vela"? O que isso significa, sequer?
 

cada vez que uma ordem abre em algum sinal indicador, como eu armazeno o tipo desse sinal em uma variável?

Há um bug (quando executo o EA), a ordem não abre no início de uma tendência (não de acordo com uma mudança na cor do indicador), porque minha condição não se refere a velas específicas, mas diz que se a tendência é para cima ou para baixo abre no início de 3 velas


 

Boa tarde a todos.

Estou me perguntando como analisar as estatísticas de trabalho no EXCEl

Quem pode me dizer o que pode ser extraído via DDE do mt4 e onde posso obter todas as funções permitidas para a transferência para a excelência

Será muito grato pela ajuda

 
Maxim Shershnev:

Boa tarde a todos.

Estou me perguntando como analisar as estatísticas de trabalho no EXCEl

Quem pode me dizer o que pode ser puxado através do DDE do mt4 e onde posso obter todas as funções permitidas para a transferência para a excelência

Será muito grato pela ajuda

tudo o que você precisa. O formato de registro .csv escreve de forma excelente
Файловые операции - Справочник MQL4
Файловые операции - Справочник MQL4
  • docs.mql4.com
Файловые операции - Справочник MQL4