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

 
Babu Bonappan:

OrderOpenPrice, como eu o entendo, me dá exatamente o que eu preciso. Mas somente se a moeda de depósito for USD e o par negociado for EUR/USD. Neste caso, é como se a OrderOpenPrice armazenasse a taxa de câmbio da moeda base para a moeda de depósito no momento da abertura do pedido sabendo qual é a moeda que você pode facilmente calcular o depósito.

Mas se pelo menos uma dessas condições não for preenchida, como podemos obter o valor do depósito para um pedido individual? Onde podemos encontrar a taxa da moeda base de uma cotação em relação à moeda do depósito no momento de sua abertura?

Sim, temos o tempo de abertura do pedido para o segundo mais próximo. Mas o que podemos conseguir? No máximo - os parâmetros da vela de minuto do símbolo requerido. Mas nunca o valor exato da taxa utilizada para o cálculo do depósito. Mas a função AccountMargin consegue isso de alguma forma! Eu gostaria muito de entender como isso é feito exatamente.

Você precisa de três fórmulas para calcular a margem.

Dependendo da moeda de seu depósito, você calculará a margem para qualquer par de moedas.

É possível que haja um erro no cálculo. Mas será muito menor do que aquela que aparecerá ao arredondar o resultado do cálculo para um centésimo de uma unidade da moeda base do depósito, ou seja, se for um dólar, então quero dizer centavos.

PS

AccountMargin é o valor atual, ou seja, o último valor

 

E se eu conseguir o valor exato da margem no momento da abertura da ordem usandoMarketInfo(OrderSymbol(),MODE_MARGINREQUIRED)*Lot- terá sempre duas casas decimais, certo? Então eu o multiplicarei por 100 e o salvarei como MagicNumber desta ordem. E se necessário, vou tirá-lo de lá e dividi-lo por 100,0.

Isto será correto?

 
Babu Bonappan:

E se eu conseguir o valor exato da margem no momento da abertura da ordem usandoMarketInfo(OrderSymbol(),MODE_MARGINREQUIRED)*Lot- terá sempre duas casas decimais, certo? Então eu o multiplicarei por 100 e o salvarei como MagicNumber desta ordem. E se necessário, vou tirá-lo de lá e dividi-lo por 100,0.

Isto será correto?

Mais uma vez, não é para isso que o MagicNumber serve. Seria melhor escrevê-lo em um arquivo de registro e depois lê-lo.

Tudo depende do propósito de tal cálculo e do número de pedidos para os quais o programa foi projetado.

Parece-me que cálculos tão precisos são necessários apenas para um corretor ou uma empresa de corretagem.

Deste ponto de vista, a solução ideal seria o corte de madeira.

 
Vitaly Muzichenko:

Por que você está mentindo sobre o número de sinais? Não induza as pessoas em erro.

Ha.

Você nunca ouviu falar de uma conta de alta precisão?

 

Adiado:

escrevi um simples Expert Advisor usando um indicador externo, há um problema.

O fechamento de meio lote não funciona corretamente e a ordem é modificada a cada tick.

Aqui está o bloco de modificação para comprar

se (CountBuy()>0) //Esta função conta o número de ordens de compra
{ for (int i = OrderTotal() -1; i>=0; i--)
{ se (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{ if (OrderMagicNumber()==Magic && OrderType()==OP_BUY && (Ask-OrderOpenPrice())*10000>MinMove) //se o preço tiver passado o movimento necessário do indicador
SL=NormalizeDouble(Ask-(MinMove*10)*Ponto,Dígitos); //herei mudar de Stop para Breakeven
if(!OrderClose(Ticket,Lots/2,Ask,Slippage,Black)) //I tentar fechar a metade do lote
Imprimir ("Erro de fechamento da metade do lote para comprar");
if(!OrderModify(Ticket,OrderOpenPrice(),SL,TP,0)) //herei mover a parte restante para Breakeven
Imprimir ("Erro de modificação para atingir o ponto de equilíbrio na compra");

} } }


 
Vladimir Karputov:

Repostado:

Vasiliy Danilov, 2016.12.02 07:18

Para começar, tente usar NormalizeDouble(OrderLot()/2,2) em vez de Lots/2

E cole o código no correio através do botão "SRC" para torná-lo legível

 
Você pode me dar algumas dicas sobre como lidar com esta questão? Quaseescrevi um simples Expert Advisor usando um indicador externo, mas tive um engate.

Se o bloco tem OrederClose - metade do lote é fechado imediatamente e a OrderModify não funciona mais.

Se removermos OrederClose, OrderModify modifica a ordem para cada carrapato

Aqui está o bloco de modificação para comprar

   if (CountBuy()>0) //В этой функции считается кол-во ордеров на покупку
   { for (int i = OrdersTotal() -1; i>=0; i--)
     { if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {  if (OrderMagicNumber()==Magic && OrderType()==OP_BUY && (Ask-OrderOpenPrice())*10000>MinMove) //Если цена прошла необходимое движение из индикатора
      SL=NormalizeDouble(Ask-(MinMove*10)*Point,Digits); //Тут меняю стоп на безубыток
       if(!OrderClose(Ticket,Lots/2,Ask,Slippage,Black)) //Пытаюсь закрыть половину лота
       Print("Ошибка закрытия половины лота на покупку");
      if(!OrderModify(Ticket,OrderOpenPrice(),SL,TP,0)) //Тут переставляю оставшуюся часть в безубыток
       Print("Ошибка модификации в безубыток на покупку");

   }    }   }
Como devo fechar uma metade do pedido e fazer a outra metade ir para o Breakeven uma vez se o preço atingir MinMove?
 
Vasiliy Danilov:
Você pode me dar algumas dicas sobre como lidar com isso? Eu quaseescrevi um simples Expert Advisor usando um indicador externo, mas há um problema.

Se você tiver OrederClose no bloco, ele fecha imediatamente metade do lote e a OrderModify não funciona mais.

Se você remover OrederClose, OrderModify modificará o pedido a cada tick

Aqui está o bloco de modificação para comprar

   if (CountBuy()>0) //В этой функции считается кол-во ордеров на покупку
   { for (int i = OrdersTotal() -1; i>=0; i--)
     { if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {  if (OrderMagicNumber()==Magic && OrderType()==OP_BUY && (Ask-OrderOpenPrice())*10000>MinMove) //Если цена прошла необходимое движение из индикатора
      SL=NormalizeDouble(Ask-(MinMove*10)*Point,Digits); //Тут меняю стоп на безубыток
       if(!OrderClose(Ticket,Lots/2,Ask,Slippage,Black)) //Пытаюсь закрыть половину лота
       Print("Ошибка закрытия половины лота на покупку");
      if(!OrderModify(Ticket,OrderOpenPrice(),SL,TP,0)) //Тут переставляю оставшуюся часть в безубыток
       Print("Ошибка модификации в безубыток на покупку");

   }    }   }
Como devo fechar uma metade do pedido e fazer a outra metade quebrar o breakeven uma vez se o preço atingir MinMove?

Você tem um erro ao fechar a metade do lote, portanto não modifica. Favor corrigi-la de acordo com o meu posto acima.

E para fazer isso uma vez, você tem que definir o breakeven para um número fixo de pontos e adicionar a condição de verificação do lucro do pedido ao fato de cumprimento deste número

E quando o preço passar por tal condição no bloco de modificação de pedido, metade do pedido deve ser fechado

 
Alexey Kozitsyn:
Não. Tente entender o que você está fazendo. O que você escreveu é apenas um protótipo da função (ou seja, apenas uma descrição do que ela faz). Então, você acabou de arrancá-la da documentação. Você precisa usá-lo. Portanto, você tem que substituir seus próprios valores por argumentos. E a função retornará o resultado. Então este resultado deve ser processado.

Obrigado pela resposta ... Pesquisei pela metade da Internet, há muito poucos exemplos de utilização da funçãoStringFind, e pelo que encontrei concluí que os parâmetros deveriam ser:

intStringFind(

stringcomment =OrderComment()// A string onde estamos procurando
seqüênciaOrderStopLoss, OrderTakeProfit//o que estamos procurando
intstart_pos=0// em que posição iniciar a busca

);

... Se eu estiver errado, me corrija ...

 
Vitaly Muzichenko:

Por que você está mentindo sobre o número de sinais? Não induza as pessoas em erro.

O ponto de cada corretor é diferente
Razão: