[AVISO FECHADO!] Qualquer pergunta de novato, para não desorganizar o fórum. Profissionais, não passem por aqui. Não posso ir a lugar algum sem você. - página 1121

 

Bom dia/noite

Estou tentando reverter um comércio usando este método primitivo que não funciona (o cálculo no Expert Advisor é baseado em carrapatos):

if(CalculateCurrentOrders(Symbol())>0 && Close[1]<LowLevel) // determina se houve pedidos de compra && se uma vela fechou abaixo do nível inferior

{

CheckForClose(); // fechar o pedido

OpenSell(); // abrir uma ordem de venda

retornar;

}

Por favor, me informe onde estou indo errado... Eu também ficaria grato pelos vínculos que me permitiriam preencher esta lacuna.

 

dzhini:

Estou tentando reverter o comércio desta forma primitiva, que não funciona (o Conselheiro Especialista calcula por carrapatos):

if(CalculateCurrentOrders(Symbol())> 0 && Close[1]<LowLevel) // verifica se houve pedidos de compra && se uma vela fechou abaixo do nível inferior


nesta função, você provavelmente conta todas as ordens.
 

Como posso determinar quantos minutos há entre o Time1 e o Time2?

datetime Time_1     = D'2011.01.12 13:30';
datetime Time_2     = D'2011.01.05 10:30'; 

минут = Time_1- Time_2
 
sergeev:
esta é provavelmente a função onde você conta todos os pedidos. esta deve ser a Buy

Esta é uma função padrão:

int CalculateCurrentOrders(símbolo de corda)
{
int compra=0,vende=0;
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==falso) break;
if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)
{
if(OrderType()==OP_BUY) compra++;
if(OrderType()==OP_SELL) vende++;
}
}

if(compra>0) return(compra);
senão devolve(-sells);

}

se >0 então é uma ordem de compra, se <0 então é uma ordem de venda ))))

 
Eliza:

Como posso determinar quantos minutos há entre o Time1 e o Time2?

a diferença retorna o número de segundos.

dividir por 60. você recebe o número de minutos.

 
Reverter a transação. Mudou a estrutura do Expert Advisor - removeu as funções. Como fazê-lo fechar e abrir em uma vela sob certas condições.

duplo TP externo = 70; //takeprofit
duplo SL externo = 0; //stoploss
duplo Lote externo = 0,1;

duplo AltoLivre;
duplo BaixoLivre;
int resBuy=0;
int resSell=0;


//+ +
//| função de iniciação de peritos |
//+
+
int init() {
AltoLivre=Alto[1];
BaixoLivre=Baixo[1];
retorno;
}

//+
+ //| função especialista |
//+------------------------------------------------------------------+

void start()
{

if(Bars<100 && IsTradeAllowed()==false) return;


if(resBuy==0 && resSell==0 && CheckBreak()==-1)
{
resSell=OrderSend(Symbol(),OP_SELL,Lot,Bid,2,0,Bid -TP,"",MAGICMA,0,Red);
HighLevel=LowLevel;
LowLevel=Close[1];
return;
}

if(resBuy==0 && resSell==0 && CheckBreak()==-1& CheckBreak()==1)
{
resBuy=OrderSend(Symbol(),OP_BUY,Lot,Ask,2,0,Ask + TP,"",MAGICMA,0,Blue);
LowLevel=HighLevel;
HighLevel=Close[1];
return;
}

if(resBuy!=0 && resSell==0 && Close[1]<LowLevel) //
interessado nesta parte: fechamento e abertura em um bar {
bool closeBuy=OrderClose(resBuy, Lot, Bid, 2, Blue);
// while(!IsTradeAllowed()) Sleep(100);
resSell=OrderSend(Symbol(),OP_SELL,Lot,Bid,2,0,Bid -TP,"",MAGICMA,0,Red);
HighLevel=LowLevel;
LowLevel=Close[1];
return;
}

if(resSell!=0 && resBuy==0 && Close[1]>HighLevel) //------------------------------------- interessado nesta parte: fechamento e abertura em um bar
{
bool closeSell=OrderClose(resSell, Lot, Ask, 0.0002, Red);
// while(!IsTradeAllowed()) Sleep(100);
resBuy=OrderSend(Symbol(),OP_BUY,Lot,Ask,2,0,Ask + TP,"",MAGICMA,0,Blue);
LowLevel=HighLevel;
HighLevel=Close[1];
return;
}

}

// Check Low&Alto intervalo (Func)

double CheckBreak()
{
double candle=Open[1]-Close[1];

if(candle>0 && Low[1]<LowLevel) return(-1);
if(candle<0 && High[1]>HighLevel) return(1);
}
 
sergeev:

A diferença retorna o número de segundos.

divide por 60. dá o número de minutos.

Acabo de receber a data 1971.03.04 12:00, talvez isto precise ser convertido?

extern datetime Time_1     = D'2011.01.12 13:30'; 
extern datetime Time_2     = D'2011.01.05 10:30'; 

bool   Commentari      = true;

int start()
  {

if (Commentari){
 Comment(
         "\n Дата  =  " + TimeToStr((Time_1-Time_2)/60)," минут",
      
         "\n==============================");}
   return(0);
  }
 
Eliza:

Eu só tenho a data, talvez precise ser convertida?

Primeiro de tudo, por que você está multiplicando por 60?

Segundo - se você quiser exibir o número de minutos como uma hora como 00:15,
você não precisa dividir ou multiplicar por 60.

 
sergeev:

Primeiro de tudo, por que você está multiplicando por 60?

Segundo - se você quiser apresentar o número de minutos na tela como uma hora como 00:15,
você não precisa dividir ou multiplicar por 60.

Sim, eu corrigi a divisão, mas o ano sai em 1970.01.01.02:51

Não preciso dele para a tela, só queria encontrar o número de minutos sem datas, para aquele intervalo de tempo....

mesmo sem dividir, ela ainda produz a data, ou devo subtrair a data na qual a função é baseada?

  • data é data e hora, um inteiro não assinado que contém o número de segundos decorridos desde 0 horas de 1 de janeiro de 1970.
  • extern datetime Time_1     = D'2011.01.12 13:30'; 
    extern datetime Time_2     = D'2011.01.05 10:30'; 
    
    datetime me_2     = D'1970.01.01 00:00'; 
    
    bool   Commentari      = true;
    
    int start()
      {
    
    if (Commentari){
     Comment(
             "\n Дата  =  " + TimeToStr(me_2-(Time_1-Time_2))," минут",
          
             "\n==============================");}
       return(0);
      }

  • se eu subtrair a data 1970.01.01 02:51 ele joga fora esse tempo inválido, eu só preciso do número de minutos para sair desse intervalo de tempo, se é por exemplo 25000 minutos nesse intervalo eu preciso desse número 25000 ... algo assim(
  • ou não é possível obter isto no idioma μl?
 

Se você quiser apenas alguns minutos, você não tem absolutamente nenhum motivo para usar o TimeToStr

O tempo é um número int normal.

Ou alternativamente, use o TimeToStr apenas com a bandeira TIME_MINUTE