[AVISO FECHADO!] Qualquer pergunta de novato, para não desorganizar o fórum. Profissionais, não passem por aqui. Não posso ir a lugar algum sem você. - página 188

 

Tentando calcular swaps, mas não está funcionando

Aqui está o código que produz os swaps dos últimos 20 negócios.

for ( int j=OrdersHistoryTotal( )-1; j>=OrdersHistoryTotal( )-21; j--) {
OrderSelect(j, SELECT_BY_POS, MODE_HISTORY);
if(OrderType()==OP_BUY)
Alert(OrderSymbol()+" ЛОТ = "+OrderLots()+" РЕАЛЬНЫЙ СВОП = "+OrderSwap()+" РАСЧЕТНЫЙ СВОП "+MarketInfo(OrderSymbol(),MODE_SWAPLONG)*MarketInfo(OrderSymbol(),MODE_BID)*OrderLots()*MarketInfo(OrderSymbol(),MODE_TICKVALUE));
if(OrderType()==OP_SELL)
Alert(OrderSymbol()+" ЛОТ = "+OrderLots()+" РЕАЛЬНЫЙ СВОП = "+OrderSwap()+" РАСЧЕТНЫЙ СВОП "+MarketInfo(OrderSymbol(),MODE_SWAPSHORT)*MarketInfo(OrderSymbol(),MODE_BID)*OrderLots()*MarketInfo(OrderSymbol(),MODE_TICKVALUE));
}

Mas a troca estimada e a troca real são diferentes. Não é que o preço da licitação nunca mais será o mesmo, não são os dez milésimos.

Por alguma razão, a diferença é um múltiplo de 10.

Ou seja, a troca calculada é 10 vezes maior do que a real.

Não consigo nem mesmo adivinhar o que está errado aqui.

MarketInfo(OrderSymbol(),MODE_SWAPTYPE) retorna one, depois

"Método de cálculo dos swaps 1 - na moeda base do instrumento";"

Eu tomo o valor de troca em pips, que retorna

MarketInfo(OrderSymbol(),MODE_SWAPLONG)

Multiplico este valor por Bid,

*MarketInfo(OrderSymbol(),MODE_BID)

depois a o tamanho do lote

*OrderLots()

e multiplicando pelo valor de um ponto na moeda de depósito de um lote

*MarketInfo(OrderSymbol(),MODE_TICKVALUE)

Os valores devolvidos são:

EURGBP LOTE = 0,46000000 SWAP REAL = -1,31000000 SWAP ESTIMADO -13,05244609

 

Por favor, me diga como fazer isso))

duplo MA1,MA2;

MA1=iMA(....,0);

MA2=iMA(....,3);

se (MA1-MA2>Ponto)//MA olha para cima

se (MA1-MA2,-Point)//MA olha para baixo

 
vasya_vasya писал(а) >>

Multiplico este valor por Bid,

*MarketInfo(OrderSymbol(),MODE_BID)

Para que é isso?

[Deleted]  
Roger >> :

Por favor, me diga como fazer isso))

duplo MA1,MA2;

MA1=iMA(....,0);

MA2=iMA(....,3);

se (MA1-MA2>Ponto)//MA olha para cima

se (MA1-MA2,-Point)//MA está olhando para baixo

Muito obrigado)))

 
Roger писал(а) >>

Para que serve isto?

Não consegui encontrar uma descrição do que ele retorna

MarketInfo(OrderSymbol(),MODE_SWAPLONG)

Cheguei à conclusão de que este é o tamanho do ponto EUR na cotação EURGBP , então eu o multipliquei por BID para obter o quanto está em GBP

A questão é que

MarketInfo(OrderSymbol(),MODE_TICKVALUE)

Valor do ponto de retorno por lote apenas por GBP em cotação EURGBP, não por EUR.

 
vasya_vasya писал(а) >>

Em nenhum lugar eu encontrei uma descrição do que o valor retorna

Por alguma razão me pareceu que todos os cálculos estão na moeda do depósito.
 
Roger писал(а) >>
Por alguma razão, continuei pensando que todos os cálculos estavam na moeda do depósito.

Função MarketInfo(OrderSymbol(),MODE_SWAPSHORT)

Devolve um valor inteiro de -2, o mesmo que para todas as outras encomendas. Portanto, presumo que este é o valor dos pontos.

Vamos supor que este é o valor do swap expresso em pips de nossa moeda de depósito.

Moeda de depósito = USD

Multiplicar

MarketInfo(OrderSymbol(),MODE_SWAPSHORT)

Por número de lotes

*OrderLots()

Também multiplicar pelo valor de um pip de nossa moeda de depósito por lote

*10

Obtenha

SWAP = -9.20000000

Em vez de

TROCA REAL = -1,31000000

 
vasya_vasya писал(а) >>

Função MarketInfo(OrderSymbol(),MODE_SWAPSHORT)

Devolve um valor inteiro de -2, o mesmo que para todas as outras encomendas. Portanto, presumo que este seja o valor das gratificações.

Para EURGBP ele retorna 0 (isto é Alpari) para shorts e -0,68 para longos e isto é exatamente em dólares.

[Deleted]  
Perfis por favor avise, de acordo com a ajuda da linguagem mql5 não há função iHighest como calcular o máximo alto para o período N? ... Eu tentei copyHigh e fmax, mas apenas por um certo período e não o de claro, ajuda
 

Para dizer de forma grosseira:

double HighestBar(int start, int end)
{
double maxBar;
for (int i= start; i< end; i++)
if( maxBar<High[ i]) maxBar=High[ i];
return( maxBar);
}