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

 
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?

Você quer atribuir um número mágico a cada pedido?
 
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 cumprida, 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! Seria muito interessante entender exatamente como isso é feito.

OrderOpenPrice - preço aberto do pedido, o mesmo (preço) é a relação de uma moeda para outra

AccountMargin - dá a margem total da conta para todos os pedidos em aberto.

 
Vladimir Karputov:

Adiado:

Vasiliy Danilov, 2016.12.02 07:18

Você pode me dizer, por favor, o que devo fazer? Eu quaseescrevi um simples Expert Advisor usando um indicador externo, mas há um problema.

O fechamento da metade do lote não funciona corretamente e o pedido é modificado para cada carrapato.

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

se (CountBuy()>0) // Nesta função, o número de ordens de compra é calculado
{ 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");

} } }


Se SL != OrderStopLoss()) modificar .... Então o pedido será modificado somente se SL for diferente do atual OrderStopLoss.

E para entender o que dá errado no fechamento, use GetLastError(); em geral, seria bom verificar OrderClose ... teste de boolOrCls

testOrCls=OrderClose ......

if(!testOrCls) Print (GetLastError() );

ou seja, se houver um erro, pedimos o código de erro; se não houver erro, não pedimos o código de erro.


 
bablusut:

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 devem ser:

intStringFind(

stringcomment =OrderComment()// a string na qual estamos procurando
seqüênciaOrderStopLoss, OrderTakeProfit//o que estamos procurando
intstart_pos=0// a partir da qual posição para iniciar a busca

);

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

Não funciona um pouco dessa maneira. Os argumentos desta função são 1) a cadeia de caracteres que você deseja pesquisar; 2) a combinação de caracteres que você deseja encontrar; 3) o início da pesquisa (por padrão, a partir do caracter nulo da cadeia de caracteres de acordo com o passo 1).

Ele retorna o número de posição na corda, na qual começa o substrato procurado, ou -1 se não for encontrado substrato.

Em outras palavras, escreva-o assim:

if(StringFind(OrderComment(),"[tp]",0)>-1) {действие при нахождении признака закрытия по TP}
 
Renat Akhtyamov:

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

Se você quiser fazer isso apenas uma vez, você deve especificar o breakeven por um número fixo de pontos e adicionar a condição de pedido, verifique o lucro para ver se ele corresponde a esse número

E ao passar por tal condição no bloco de modificação de ordem, a metade é fechada.

Vasiliy Danilov:
Você pode me dizer, por favor, o que devo fazer? Eu quaseescrevi um simples Expert Advisor usando um indicador externo, mas há um problema.

Se houver OrederClose no bloco, metade do lote será fechada imediatamente e a OrderModify não funcionará mais.

Se removermos OrederClose, então OrderModify modifica o pedido 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 fechar metade do pedido quando o preço chega a MinMove, e a outra metade vai para Breakeven uma vez?

A propósito, acabei de notar que OrderSelect por posição SELECT_BY_POS, mas onde está a seleção de ingressos?

OrderClose(OrderTicket()

 
Babu Bonappan:

Favor aconselhar como usar a MQL4 para obter um valor de margem para cada posição aberta no terminal?

Eu costumava fazer isso desta maneira:

margin = MarketInfo(Symbol(),MODE_LOTSIZE) * OrderOpenPrice() / AccountLeverage() * OrderLots();

Ao negociar o EUR/USD esta construção funcionou bem e eu estava certo de que sua lógica estava correta.

Mas agora eu quero obter o mesmo resultado para EUR/JPY (ou EUR/CHF). Obviamente, ao invés deOrderOpenPrice() eu preciso multiplicar o valor de um lote padrão pela taxa da moeda base para a moeda de depósito (no meu caso, por EUR/USD). Mas qual é essa taxa? A taxa de câmbio que estava no momento da abertura da posição ou a que temos agora (no momento em que queremos saber a quantidade de depósito para esta posição)?

Sem MODE_MARGINMAINTENANCE?

 
A1exPit:

A propósito, acabei de notar OrderSelect na posição SELECT_BY_POS, mas onde está o bilhete de seleção?

OrderClose(OrderTicket()

Você não sabe de nada neste tópico?

Se o pedido for selecionado, então o OrderTicket() devolve o bilhete do pedido selecionado. E não importa como o pedido é selecionado - por índice ou por bilhete.

Há uma sutileza no caso da seleção por bilhete - o pool não é levado em conta, e temos que verificar de qual lista o pedido é selecionado, verificando a hora de seu fechamento.

 
Vasiliy Danilov:
Você poderia me dar algumas dicas sobre como entender isso? Eu quaseescrevi um simples Expert Advisor usando um indicador externo, mas encontrei um problema.

Se houver um OrederClose no bloco, metade do lote é fechada 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 compra

   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 quando o preço atinge o nível MinMove e a outra metade vai para Breakeven uma vez?

Quando o fechamento parcial do bilhete muda. Primeiro, para alcançar o ponto de equilíbrio, depois, para fechar.

Ou mudam a lógica.

 
Artyom Trishkin:

A1exPit:

A propósito, acabei de notar OrderSelect by SELECT_BY_POS , mas onde está o bilhete de seleção?

OrderClose(OrderTicket()

Você não sabe de nada neste tópico?

Se um pedido for selecionado, então o OrderTicket() devolve o bilhete do pedido selecionado. E não importa como o pedido é selecionado - por índice ou por bilhete.

Há uma nuance ao selecionar por bilhete - o pool não é levado em conta, e você precisa verificar de qual lista o pedido é selecionado, verificando o horário de fechamento.

E se olharmos para o código para o qual este comentário foi escrito? Não é tão simples aí...

{ 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)) //Пытаюсь закрыть половину лота Какой тикет?
 
Vitalie Postolache:

E se você olhar para o código em que este comentário foi escrito? Não é tão claro aí...

{ 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)) //Пытаюсь закрыть половину лота Какой тикет?
Bem... Sim... Eu não olhei de perto. Apenas um vislumbre. Não estou interessado nesta linha por algum motivo