Preço por pipa - página 3

 

Hehe outro cliente feliz :)- Já que estamos nisso, LEHayes se importa em me ajudar a calcular a administração do dinheiro em porcentagem Sem arredondar os pips para cima. Aqui está o que eu uso atualmente quando quero apostar 1% do patrimônio da minha conta:

double Profit_F=0.00001,Lots=0.1;
Lots=NormalizeDouble((AccountEquity()*Profit_F),1);
se (Lotes < 0,1) Lotes=0,1;
if (Lotes > 1,0) Lotes=1,0;

Isto funciona bem para minha perda de 100 quando eu tenho um valor de $10.000, por exemplo. Como $10.000 X 0,00001 = 0,1 Lote. Mas quando eu tenho $15.000 o tamanho do lote agora é igual a 0,15, mas ele arredonda para 2,0 talvez porque meu corretor não permite lotes macro. Como posso forçá-lo a ficar em 0,1 até que o patrimônio líquido atinja $20.000? Estou acordado há muito tempo, depois de ler seu tópico, estou muito cansado para procurar e estudar. Se você tiver outra equação para calcular mm, por favor, forneça em seu lugar.

 
LEHayes:

Isto está me deixando louco, há meses venho procurando por um algorythem existente que nada mais faz do que calcular o Preço por Pip, independentemente do par em que ele esteja. Encontrei 2 estratégias realmente boas de gerenciamento de dinheiro que dependem tanto deste valor como uma forma de pré-calcular o tamanho do comércio e o gerenciamento do risco monetário, mas não consigo encontrar um único exemplo de um cálculo que trate do Preço Por Pip.

Estou disposto a oferecer meu sistema de gerenciamento de dinheiro a você em troca disto em uma função. Eu lhe fornecerei ambas as técnicas sugeridas pelos mentores com os quais tenho trabalhado.


Primeiro temos que reconhecer que existem cinco tipos de símbolos básicos. Isto é importante quando se trata de questões como o cálculo do tick_value, alavancagem, e assim por diante.

Não há uma definição formal de tipo de símbolo, mas para uma conta denominada em dólares americanos, aqui é como enumero os tipos de símbolo: (estes são exemplos específicos, não todos inclusivos)
            SymbolType 1:  Symbol() = USDJPY
                           
                           Base = USD
                           Counter = JPY
            
            SymbolType 2:  Symbol() = EURUSD
                           
                           Base = EUR
                           Counter = USD

            SymbolType 3:  Symbol() = CHFJPY
                           
                           Base = CHF
                           Counter = JPY
                           
                           USD is base to the base currency pair - USDCHF
                           
                           USD is base to the counter currency pair - USDJPY
            
            SymbolType 4:  Symbol() = AUDCAD
                           
                           Base = AUD
                           Counter = CAD
                           
                           USD is counter to the base currency pair - AUDUSD
                           
                           USD is base to the counter currency pair - USDCAD
            
            SymbolType 5:  Symbol() = EURGBP
                           
                           Base = EUR
                           Counter = GBP
                           
                           USD is counter to the base currency pair - EURUSD
                           
                           USD is counter to the counter currency pair - GBPUSD

A relevância é como a conta é denominada em relação à moeda base e moeda cotada do instrumento financeiro de interesse. É o mesmo tanto para os CFD's quanto para os pares de moedas.

Uma vez que você tenha o tipo de símbolo você pode então calcular a alavancagem por instrumento financeiro - por exemplo, aqui está o código necessário para calcular a alavancagem para o AUDCAD:

CalculatedLeverage=NormalizeDouble(MarketInfo(Symbol(),MODE_LOTSIZE)*(MarketInfo(CalculatedBasePairForCross,MODE_BID)+MarketInfo(CalculatedBasePairForCross,MODE_ASK))/(2*MarketInfo(Symbol(),MODE_MARGINREQUIRED)),2)
Neste exemplo, a função de chamada que codifiquei já teria determinado que para AUDCAD o CalculatedBasePairForCross é AUDUSD:
CalculatedBasePairForCross=StringConcatenate(SymbolBase,AccountCurrency(),postfix);
E a SymbolBase (que é a moeda base do instrumento financeiro Symbol()) é:
SymbolBase=StringSubstr(Symbol(),0,3);
E assim por diante.

Para o cálculo do valor do tick é necessário contabilizar o tipo de símbolo, pois isso importa quando a avaliação muda tanto no instrumento financeiro de interesse - Symbol() - quanto no par de moedas de conexão que leva de volta à denominação da conta. Continuando o exemplo acima onde estamos discutindo o tipo de símbolo 4 - AUDCAD quando a conta é denominada em USD - o valor do Tick é explicitamente definido como:

CalculatedTickValue=MarketInfo(Symbol(),MODE_POINT)*MarketInfo(Symbol(),MODE_LOTSIZE)/MarketInfo(CalculatedCounterPairForCross,MODE_BID)
Onde a variável CalcululatedCounterPairForCross para AUDCAD foi previamente determinada como USDCAD:
CalculatedCounterPairForCross=StringConcatenate(AccountCurrency(),SymbolCounter,postfix);
E o SymbolCounter foi determinado por:
SymbolCounter=StringSubstr(Symbol(),3,3);

Ao programar o cálculo destes valores explicitamente desta forma, você pode fazer determinações agnósticas de informações do mercado de corretagem.

Tenha em mente que o código aqui só é útil para o tipo de símbolo = 4 no qual a moeda de denominação da conta é a moeda cotada quando pareada com a moeda base da Symbol() e da mesma forma a moeda de denominação da conta é a moeda base quando pareada com a moeda cotada que forma o par Symbol().

(AUDCAD -> AUDUSD & USDCAD)

Acontece que, embora existam cinco tipos de símbolos universais, você só precisa categorizar quatro deles para o cálculo de alavancagem, margem e tickvalue. E a matemática só se torna um ponto de colagem específico quando se trata de pares de moedas cruzadas em relação à denominação da conta.

Trabalhei as relações específicas entre todas as combinações de base e contador porque minha abordagem de gestão de dinheiro é definir explicitamente o valor em risco de perda para cada negociação e isso requer saber exatamente o valor do preço no qual a negociação precisa ser encerrada, de modo que a perda esteja de acordo com o orçamento previamente definido para perdas. Para os pares de moedas cruzadas, é natural que o valor em risco seja baseado no preço de dois pares de moedas em qualquer instante (a menos que você se proteja contra um ou outro).

Esta informação ajuda em alguma coisa?

 
cloudbreaker:

TICKVALUE, quando usado por conta própria, pode não ser confiável.

Seria interessante saber a que corretor(es) isto se aplica, ou se há outras considerações, como estar em torno do mercado aberto/fechado. Eu nunca fui capaz de replicar estas suas descobertas.

 
Ha ha. Eu percebo que a jjc. Mas não dói usar a proporção. Na maioria das vezes estaremos dividindo por 1. seguro em vez de arrependido eh? CB
 
1005phillip:

Esta informação ajuda em alguma coisa?

Eu nunca notei a distinção que você fez entre símbolos tipo 3-5 (ou talvez eu simplesmente não tenha pensado sobre isso neste contexto). De qualquer forma, boa comida para pensar... Kudos por um excelente resumo!
 

wow eu nunca percebi que havia tanto para calcular o valor de um pip, na minha EA eu fiz isso deixando a ea calculá-lo usando o primeiro pedido aberto se for uma compra, preço de compra atual - preço de compra aberto / lucro do pedido = valor do pip na moeda base atual, ou se for uma venda, preço atual + preço aberto / lucro do pedido = valor do pip, isso não vai funcionar corretamente ?

Editar: Percebi que ao contrário, eu quis dizer ordem-lucro/(preço atual de compra-aberto)=valor da pip

 
SDC:

wow eu nunca percebi que havia tanto para calcular o valor de um pip, na minha EA eu fiz isso deixando a ea calculá-lo usando o primeiro pedido aberto se for uma compra, preço de compra atual - preço de compra aberto / lucro do pedido = valor do pip na moeda base atual, ou se for uma venda, preço atual + preço aberto / lucro do pedido = valor do pip, isso não vai funcionar corretamente ?


Esse cálculo é válido no limite de que cada pip tem a mesma avaliação independentemente do preço atual de compra ou venda.

Isto é rigorosamente verdadeiro para pares de moedas que são do tipo símbolo = 2 como os defini acima, ou seja, EURUSD, etc. (qualquer par de moedas em que a denominação da conta é a contra-moeda no par).

Para a maioria das pessoas, as diferenças provavelmente não são importantes, os erros resultantes são pequenos. No meu caso, eu queria calcular os valores de forma robusta com expressões analíticas corretas.

Por exemplo, se eu orçar $200 para o máximo de perda possível em uma próxima negociação e minhas paradas estiverem definidas para 200 pontos, então eu quero saber os lotes para meu pedido de forma que minhas perdas não possam exceder $200... para ser robusto sobre isso, eu devo calcular corretamente a avaliação do pip no ponto do preço de parada. A asa não era uma opção aceitável para mim ou para meus clientes ;)
 

Estou feliz que LEHayes tenha resolvido tudo. E Phillip, você desmistificou completamente os pares TickValue & Layout - sintetizando muito bem para que todos se beneficiem. Muito bom!

Eu só gosto de acrescentar : as operações de sintetização ...

CalculatedCounterPairForCross=StringConcatenate(AccountCurrency(),SymbolCounter,postfix);

SymbolCounter=StringSubstr(Symbol(),3,3);

... precisam ter cuidado com a idade extra de anexação como USDJPYm em alguns corretores de mini-lotes. Não sei se um corretor pode/everá alterar as primeiras seis letras dos símbolos colocando ou anexar uma carta na frente ou entre base & balcão, se você estiver procurando robustez, a leitura IMO de um arquivo .set ou arquivo .sel é uma aposta mais segura.

 
cameofx:

Estou feliz que LEHayes tenha resolvido tudo. E Phillip, você desmistificou completamente os pares TickValue & Layout - sintetizando muito bem para que todos se beneficiem. Muito bom!

Eu só gosto de acrescentar : as operações de sintetização ...

CalculatedCounterPairForCross=StringConcatenate(AccountCurrency(),SymbolCounter,postfix);

SymbolCounter=StringSubstr(Symbol(),3,3);

... precisam ter cuidado com a idade extra de anexação como USDJPYm em alguns corretores de mini-lotes. Não sei se um corretor pode/everá alterar as primeiras seis letras dos símbolos colocando ou anexar uma carta na frente ou entre base & balcão, se você estiver procurando robustez, a leitura IMO de um arquivo .set ou arquivo .sel é uma aposta mais segura.


Bem visto! no entanto, não estou procurando esse tipo de robustez quando falo de cálculos robustos.

Os corretores podem nomear seus pares de moedas o que quiserem, espera-se que eu tenha a presença de espírito para notar isso e emendar meus códigos de acordo antes de tentar negociar ao vivo com um novo corretor usando o símbolo de moeda lovelyUSDmoonCADcheese! :P

Este código trata simplesmente de 100% dos casos que encontrei até agora (Alpari, CitiFX, CMS forex, forex.com, FXCM, FXDD, IBFX, MIG, e ODL)... Não estou preocupado em torná-lo prova futura, apenas prova presente. Agora se você tivesse algo em mente para torná-la à prova de futuro...bem agora é um bom momento para dizer o que pensa :)

 

lovelyUSDmoonCADcheese! ...

Lol! Vi a descrição do símbolo na propriedade do símbolo (não o parâmetro Symbol(), mas eles têm que digitar este em algum momento também!). Quem sabe! :))

Não sei dizer se alguma vez seria 100% infalível (o que é?). Mas estou pensando em algo como isto :

  • criar uma lista/inventário de possíveis 3 letras maiúsculas de base/ nome do contador.
  • Leia a seqüência de par a partir de .set ou .sel.
  • Procure uma possível troca de correspondência de uma letra de cada vez. Ignorando a aceitação de possíveis combinações de maiúsculas e minúsculas (o valor ASCII seria diferente por x inteiro, precisamos verificar), podemos usar um laço para transformar todas as letras em maiúsculas, por exemplo.
  • Se for encontrada uma correspondência, salve-a como o nome 'corretor'/'alias' ao invés do nome 'inventário' que temos. Continue procurando a segunda parte do par e faça o mesmo.
  • precisamos verificar também se um nome base / nome do contador é consistente através det al Symbol(). E salvar seus 'pseudônimos' também.
  • usar os pseudônimos para sintetizar o par.
  • se um novo nome de base/contador for alterado ou adicionado. Acrescente-o aos pseudônimos.

Gordon há algum tempo me oferece seu ponto de vista sobre o que merece uma verificação automática infalível em um EA. Tendo isto em mente (e respeitando isso), ainda acho que isto pode ser algo que valha a pena, mesmo que seja apenas para o inferno! :)