Você está perdendo oportunidades de negociação:
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Registro
Login
Você concorda com a política do site e com os termos de uso
Se você não tem uma conta, por favor registre-se
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?
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.
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.
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 procurandoseqüê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:
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.
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
{ 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("Ошибка модификации в безубыток на покупку");
} } }
A propósito, acabei de notar que OrderSelect por posição SELECT_BY_POS, mas onde está a seleção de ingressos?
OrderClose(OrderTicket()
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:
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?
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.
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
{ 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("Ошибка модификации в безубыток на покупку");
} } }
Quando o fechamento parcial do bilhete muda. Primeiro, para alcançar o ponto de equilíbrio, depois, para fechar.
Ou mudam a lógica.
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 (OrderMagicNumber()==Magic && OrderType()==OP_BUY && (Ask-OrderOpenPrice())*10000>MinMove) //Если цена прошла необходимое движение из индикатора
SL=NormalizeDouble(Ask-(MinMove*10)*Point,Digits); //Тут меняю стоп на безубыток
if(!OrderClose(Ticket,Lots/2,Ask,Slippage,Black)) //Пытаюсь закрыть половину лота Какой тикет?
E se você olhar para o código em que este comentário foi escrito? Não é tão claro aí...
{ 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)) //Пытаюсь закрыть половину лота Какой тикет?