Perguntas de Iniciantes MQL4 MT4 MetaTrader 4 - página 143

 
Лауреат:
Como fazer uma função que fecharia uma posição aberta por sua própria ponte após um número especificado de velas ter passado na história do tempo.
int numBars = 5;
void OnTick()
{
     for(int i = OrdersTotal(); i >= 0; i--)
     {
          if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES))continue;
          if( OrderSymbol() != _Symbol)                continue;
          if( OrderMagicNumber() != Magic)             continue;
          if( OrderOpenTime() > Time[numBars-1] )      continue; 
          
          /* work */
     }
}
 
sviter-pro:
Estou experimentando!!! A lógica é específica!!! você pode me ajudar?

O que há de específico nisso?

Olhe para a última posição e abra a posição oposta.

 
Konstantin Nikitin:

Vou dar uma olhada.

 
sviter-pro:

Vou verificar tudo bem.

 

Olá. Por favor, ajude com a função. Em uma única conta, supõe-se que haja vários EAs de negociação. Cada EA não pode abrir mais do que uma operação por dia. Eu preciso de uma função que retorne verdadeiro se a EA já teve uma troca, e falso se não houve troca. A verificação deve ser feita por magia na data atual, como eu a entendo. Se você puder me ajudar, pretendo construir esta função em cada uma das minhas EA, que precisará de tal verificação. Se eu puder ajudar, estou planejando construí-lo em cada um dos meus EAs onde eu precisar de tal verificação.

 
Kolya32:

Olá. Por favor, ajude com a função. Por um lado, é suposto negociar com vários EAs. Cada EA não pode abrir mais do que uma operação por dia. A função deveria retornar verdadeiro se houvesse uma troca, e falso se não houvesse troca. A verificação deve ser feita por magia na data atual, como eu a entendo. Se você puder me ajudar, pretendo construir esta função em cada uma das minhas EA, que precisará de tal verificação. Se eu puder ajudar, estou planejando construí-lo em cada um dos meus EAs onde eu precisar de tal verificação.

Tudo já foi feito antes de nós )) Veja aqui.

 

Parece que eu preciso da função isTradeToDay(). Bem, eu vou experimentar) Obrigado.

Corrigi a função por mim mesmo, comentando int mn=-1 e substituindo o mn por Magic. Depois de executar a EA com esta função no testador, vi uma grande desvantagem: o tempo de teste da EA aumentou POR ANOS! Agora decidi testar o Expert Advisor com este recurso em uma conta de demonstração. Tenho 5 Expert Advisors em minha conta e estou preocupado que as negociações sejam abertas com um atraso...

bool isTradeToDay(string sy="", int op=-1 /*,int mn=-1*/) {
int i, k=OrdersHistoryTotal();

se (sy=="0") sy=Símbolo();
para (i=0; i<k; i++) {
se (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
if (OrderSymbol()==sy ||| sy=="") {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
se (op<0 || OrderType()==op) {
if (Magic<0 || OrderMagicNumber()==Magic) {
se (TimeDay(OrderOpenTime())==Day()
&& TimeMonth(OrderOpenTime())==Month()
&& TimeYear(OrderOpenTime())==Year()) retorno(True);
}
}
}
}
}
}
k=OrdensTotal();
para (i=0; i<k; i++) {
se (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderSymbol()==sy ||| sy=="") {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
se (op<0 || OrderType()==op) {
if (Magic<0 || OrderMagicNumber()==Magic) {
se (TimeDay(OrderOpenTime())==Day()
&& TimeMonth(OrderOpenTime())==Month()
&& TimeYear(OrderOpenTime())==Year()) retorno(True);
}
}
}
}
}
}
retorno(Falso);
}

 

Você precisa marcar o nível de equilíbrio da grade no gráfico.

Lucro em pips:

double current_Prof_Pts = current_Prof_Bux/current_summ_lot/(SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_VALUE)/(SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_SIZE)/_Point)

Posição de equilíbrio para a grade BUY

zero = Bid-current_Prof_Pts*_Point

(Para VENDER, respectivamente: Ask+current_Prof_Pts*_Point)

Resultado: parece ser verdade, mas sempre salta em torno do valor verdadeiro em cerca de 3 pontos.

Você pode me dizer onde está o erro?

 
Kolya32:

Parece que eu preciso da função isTradeToDay(). Bem, eu vou experimentar) Obrigado.

Encontrei uma grande desvantagem: o tempo de teste de um EA aumentou EXATAMENTE CINCO VEZES!

Sim, é claro. A função é escrita de uma forma universal. Se você acessa com cada tic tac, então o loop passa por todo o histórico da conta. E o histórico da conta pode ser bastante profundo (já vi casos em que houve mais de 100.000 pedidos). Para acelerar a execução, não é necessário fazer o loop em toda a história toda vez. É suficiente fazê-lo apenas uma vez no início e lembrar o índice do último pedido processado. Na próxima vez, você precisa passar pelo loop somente para as ordens que têm um índice maior do que o índice armazenado. Depois disso, lembre-se novamente do índice da última encomenda, e assim por diante.

 
Igor Zakharov:

Você precisa marcar o nível de equilíbrio da grade no gráfico.

Lucro em pips:

Posição de equilíbrio para a grade BUY

(Para VENDER, respectivamente: Ask+current_Prof_Pts*_Point)

Resultado: parece ser verdade, mas sempre salta em torno do valor verdadeiro em cerca de 3 pontos.

Por favor, informe, onde está o erro?

A culpa é da propagação flutuante.