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
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?
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.
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");
} } }
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
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
{ 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("Ошибка модификации в безубыток на покупку");
} } }
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
{ 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("Ошибка модификации в безубыток на покупку");
} } }
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
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 procurandoseqüênciaOrderStopLoss, OrderTakeProfit//o que estamos procurando
intstart_pos=0// em que posição iniciar a busca
);
... Se eu estiver errado, me corrija ...
Por que você está mentindo sobre o número de sinais? Não induza as pessoas em erro.