Um bug na função OrderSend() ? - página 10

 
Roger:
Você não pode fazer isso. Se você não conseguir a condição no primeiro tique, a hora inteira irá para o desperdício.


Na H1 a condição dura 60 minutos, ou seja, até o próximo bar

//+------------------------------------------------------------------+
//|                                                     чернoвик.mq4 |
//|                        Copyright 2012, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+

static datetime LastTime = 0;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----  
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----  
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
   if(NewBar()==true)
       {
        
           int ticket=OrderSend(Symbol(),OP_BUY,1,Ask,3,Bid-250*Point,Ask+250*Point," ",16384,0,Green);
        
       }
  Comment ("LastTime   ",LastTime,"   NewBar   ",NewBar());  
//----
   return(0);
  }
//+------------------------------------------------------------------+
bool NewBar() 
    {
       
       if (iTime(NULL,0,0) != LastTime) 
       {
          LastTime = iTime(NULL,0,0);      
          return (true);
       } 
       else
          return (false);
     
    }

Procure o comentário no testador.

 
pako:


manter apenas uma posição aberta em cada bar

Pako, estou surpreso! Você tem me cutucado com "código albanês" ao longo deste tópico, mas o que você ofereceu? :) A mesma coisa, só de lado! Afinal de contas, você tem a mesma função de uma nova barra, apenas mais primitivamente utilizada. E depois a função de enviar a ordem, contornando todos os sinais, etc., etc. E a solução para o problema não estava aqui! Portanto, você tem o albanês.

Swan:
Taki então
somente se o pedido for aberto na barra atual. ou seja, esta linha na função OpenBuy/Sell move





Cisne, obrigado! Isto é o que precisava ser feito! Se o tempo da nova barra for atribuído na função de abertura de ordem, então sem lacunas. Eu já verifiquei e não consigo superar como tudo funciona bem. Meu consultor especializado trabalha exatamente como deve ser.

Eu ainda tenho uma pergunta. Por que o exemplo anterior não funcionou? O exemplo anterior também teve a condição:

// Проведение торговых операций
   if (signal != SIGNAL_NO)
       if (!Trade(signal))
           return (0);

Pensei que o código dizia assim... se a funçãoTrade(signal) retorna falso, então saia da função... e antes que aúltima variávelBarTime da linha seja atualizada:

lastBarTime = iTime(NULL, 0, 0);

não serão atualizados. Mas, ao que parece, não é bem assim. Posso pedir-lhe que explique este ponto? É muito interessante até mesmo. Estou intrigado.

 
hoz:

Cisne, Obrigado! Isto é o que precisava ser feito! Se o novo tempo de bar é atribuído na função de ordem aberta, então . sem omissões. Eu já verifiquei e não consigo superar como tudo funciona bem. Meu consultor especializado trabalha exatamente como deve ser.

Resta uma pergunta. Por que a última opção não funcionou? Havia uma condição lá também:

Pensei que o código lido assim... se a funçãoTrade(sinal) retorna falso, então saia da função... e antes que aúltima variávelBarTime da linha seja atualizada:

não serão atualizados. Mas, ao que parece, não é bem assim. Posso pedir-lhe que explique este ponto? É muito interessante até mesmo. Fico intrigado.

Sim, mas se
signal == SIGNAL_NO

no primeiro tick de um novo bar no últimoBarTime é atualizado...


talvez sem...

   if (signal != SIGNAL_NO)
funcionará como pretendido... É difícil pelo código, você tem que verificá-lo)
 
hoz:

Pako, estou surpreso! Você tem me cutucado com "código albanês" ao longo deste fio, mas o que você sugeriu? :) A mesma coisa, mas de lado! Afinal de contas, você tem a mesma função de uma nova barra, apenas mais primitivamente utilizada. E depois há a função de enviar uma ordem, contornando todos os sinais, etc., etc. E a solução para o problema não estava aqui! Portanto, vocês são os albaneses.

pako:
Se você não se importa em formular o ToR novamente, por que você precisa controlar um novo bar?


hoz:
Formular e fácil! Ainda não pensei em 1 ponto, mas vou explicar todo o ponto.

Não deve haver nenhuma limitação no número de pedidos. Isto é, as encomendas podem ser abertas em qualquer quantidade. ... não importa quantos temos, mas precisamos apenas de 1 ordem para sermos abertos no bar atual. É isso aí.

Ou seja, um novo bar se abre, de modo que podemos abrir 1 ordem durante este bar, mas não mais que 1 ordem no bar atual. O próximo pedido pode ser aberto somente no próximo bar, não mais cedo.

Isto está claro agora?

Eu escrevi de acordo com os ToR que uma posição é aberta em um novo bar

Eu não vejo mais nada nos ToR.

Boa sorte para você