Salve galera. Estou criando uma estratégia em Martingale para usar no Forex. Minha estrategia se baseia em um robo que tenho que usa essa estrategia e vai incrementando a qtd de lotes.
Basicamente, o robo vai abrindo ordens conforme o mercado anda, por exemplo se estiver subindo ele vende, se estiver caindo ele compra.
Minha duvida é quanto a quantidade de ordens, como exemplo esse robo que tenho vai abrindo ordens e movendo o takeprofit dependendo da quantidade de ordens.
Por exemplo: Se ele abre 15 ordens, ele move o takeprofit dxando sempre as ultimas 5 ou 4 para recuperar o lucro na volta, é isso que não estou conseguindo fazer.
Atualmente eu estou somando os valores de abertura da primeira e da segunda ordem e divido por 2, porem, quero acertar isso, para que me deixe sempre as ultimas 5 ordens para recuperação como falei. Então caso abra 15 ordens, ele move o takeprofit dxando as 5 ultimas e perdendo as outras 10 na volta.
Como fazer isso, como fazer para dxar sempre as ultimas 4 ou 5 ordens para recuperação ?
Atualmente estou fazendo.
Olá Fernando, bom dia,
Primeiro veja a ordem de cálculo da matemática, pois divisão vem antes de adição. Então seu código precisa:
double _total = (x + y) / 2;
Depois disso para você manter as últimas 5 posições vai precisar guardá-las em uma array ou se não souber usar array use variáveis separadas. Dai da mesma forma que você fez esse seu cálculo da última posição com a primeira, você vai poder fazer da segunda, da terceira... da quinta... também fazendo eles separadamente ou usando um for(...)... ou ainda usando um while.
Parece simples, tente fazer dessa forma.
https://www.mql5.com/pt/docs/basis/operators/dowhile
- www.mql5.com
Olá Fernando, bom dia,
Primeiro veja a ordem de cálculo da matemática, pois divisão vem antes de adição. Então seu código precisa:
Depois disso para você manter as últimas 5 posições vai precisar guardá-las em uma array ou se não souber usar array use variáveis separadas. Dai da mesma forma que você fez esse seu cálculo da última posição com a primeira, você vai poder fazer da segunda, da terceira... da quinta... também fazendo eles separadamente ou usando um for(...)... ou ainda usando um while.
Parece simples, tente fazer dessa forma.
https://www.mql5.com/pt/docs/basis/operators/dowhile
Ruy, acho que vc não entendeu minha duvida, não eh quanto a linguagem e nem quanto a a ordem matematica, mas sim, como diminuir o takeprofit para que fique sempre abaixo de 5 ou 4 ordens abertas. A divisão por 2 eu ja faco, porem, sempre fica na metade das ordens. Ja fiz o teste no robo que tenho, e as vezes ele divide por 0.199950 e por ai vai. O que preciso, eh bolar uma formula para que sempre fique abaixo de 5 ordens caso abra 10, ok, divido por 2, mas se abrir 15 como ignoro 10 e fico só com 5 ordens. Não sei se estou explicando bem, mas basicamente é isso.
Salve galera. Estou criando uma estratégia em Martingale para usar no Forex. Minha estrategia se baseia em um robo que tenho que usa essa estrategia e vai incrementando a qtd de lotes.
Basicamente, o robo vai abrindo ordens conforme o mercado anda, por exemplo se estiver subindo ele vende, se estiver caindo ele compra.
Minha duvida é quanto a quantidade de ordens, como exemplo esse robo que tenho vai abrindo ordens e movendo o takeprofit dependendo da quantidade de ordens.
Por exemplo: Se ele abre 15 ordens, ele move o takeprofit dxando sempre as ultimas 5 ou 4 para recuperar o lucro na volta, é isso que não estou conseguindo fazer.
Atualmente eu estou somando os valores de abertura da primeira e da segunda ordem e divido por 2, porem, quero acertar isso, para que me deixe sempre as ultimas 5 ordens para recuperação como falei. Então caso abra 15 ordens, ele move o takeprofit dxando as 5 ultimas e perdendo as outras 10 na volta.
Como fazer isso, como fazer para dxar sempre as ultimas 4 ou 5 ordens para recuperação ?
Atualmente estou fazendo.
Como @Ruy Christian Hoffman bem apontou, seu código está errado.
Para ser um programador minimamente decente você precisa conhecer não só o básico de programação, como também o básico de Matemática. Se você lembrar dos seus tempos de escola, a menos que você tenha faltado nessa aula, existe a Precedência de Operadores. Reveja esse assunto e você entenderá a razão do erro.
;)
E depois... Tente isto:
double _total = ((x+y)/2 <= 5 ? 5 : (x+y)/2);
Ruy, acho que vc não entendeu minha duvida, não eh quanto a linguagem e nem quanto a a ordem matematica, mas sim, como diminuir o takeprofit para que fique sempre abaixo de 5 ou 4 ordens abertas. A divisão por 2 eu ja faco, porem, sempre fica na metade das ordens. Ja fiz o teste no robo que tenho, e as vezes ele divide por 0.199950 e por ai vai. O que preciso, eh bolar uma formula para que sempre fique abaixo de 5 ordens caso abra 10, ok, divido por 2, mas se abrir 15 como ignoro 10 e fico só com 5 ordens. Não sei se estou explicando bem, mas basicamente é isso.
Eita Fernando, desculpe mas entendi não :( ... você teria um exemplo prático em Excel para dar um print?
Ruy, acho que vc não entendeu minha duvida, não eh quanto a linguagem e nem quanto a a ordem matematica, mas sim, como diminuir o takeprofit para que fique sempre abaixo de 5 ou 4 ordens abertas. A divisão por 2 eu ja faco, porem, sempre fica na metade das ordens. Ja fiz o teste no robo que tenho, e as vezes ele divide por 0.199950 e por ai vai. O que preciso, eh bolar uma formula para que sempre fique abaixo de 5 ordens caso abra 10, ok, divido por 2, mas se abrir 15 como ignoro 10 e fico só com 5 ordens. Não sei se estou explicando bem, mas basicamente é isso.
Para atingir este objetivo, você deve utilizar a função matemática MathMod.
Acompanhando o EA que eu falei que tenho para ver como ele faz como base de calculo para mudar o TP. Fiz os calculos, somando o valor da primeira ordem aberta com o da ultima e dividi pelo TP que o EA estava usando, então encontrei o numero 0.199950 como base, e percebi que ele adiciona 100 a cada qtd de ordens abertas, então criei um método para retornar isso e fazer o calculo pra mim.
Não sei se é dessa maneira que o EA faz, nem sei como chegou a essa formula, mas é um padrão que reconheci.
Então comecei a testar e meu TP estava se posicionando igual ao do EA, ou seja, funcionou.
Aqui como fiz e está funcionando como preciso
/* Altera posicao take profit de todas as ordens abertas mn = magic number moveTPAsOfOrder = mover tp a partir de X ordens */ void changeTP(int mn, int moveTPAsOfOrder){ double _diffPrice = 0; double _firstOrderOpenPrice = 0; double _lastOrderOpenPrice = 0; double _normalizePrice = 0; int _digits = getDigits(); int _qtdOrdens = OrdersTotal(); double _index = getIndexToChangeTP(); if(OrdersTotal() >= moveTPAsOfOrder){ //seleciona primeira ordem aberta if(OrderSelect(getTicketFirstOrder(mn), SELECT_BY_TICKET)){ _firstOrderOpenPrice = OrderOpenPrice(); } //seleciona ultima ordem aberta if(OrderSelect(getTicketLastOrder(mn), SELECT_BY_TICKET)){ _lastOrderOpenPrice = OrderOpenPrice(); } //soma o preço da primeira e ultima ordem aberta e divide por _index _diffPrice = (_firstOrderOpenPrice + _lastOrderOpenPrice) / _index; //normaliza o resultado _normalizePrice = NormalizeDouble(_diffPrice, _digits); //reposiciona TP de todas as ordens for(int x = 0; x < OrdersTotal(); x++){ if(OrderSelect(x, SELECT_BY_POS)){ if(OrderMagicNumber() == mn && OrderSymbol() == Symbol()){ if(!OrderModify(OrderTicket(), OrderClosePrice(), 0, _normalizePrice, 0, clrRed)){ //Comment("Erro Tentando Mudar TP: ", GetLastError()); }//modify take profit }//if ordermagicnumber }//if select }//for }//OrdersTotal }//changeTP //retorna o indice para calculo da mudança do TP double getIndexToChangeTP(){ double _index = 1.99950; if((OrdersTotal() >= 4) && (OrdersTotal() < 8)){ return _index; } if((OrdersTotal() >= 8) && (OrdersTotal() < 12)){ return _index + 0.00100; } if((OrdersTotal() >= 12) && (OrdersTotal() < 16)){ return _index + 0.00200; } if((OrdersTotal() >= 16) && (OrdersTotal() < 20)){ return _index + 0.00300; } if(OrdersTotal() >= 20){ return _index + 0.00400; } return 0; }
PS: Em 1995, quando comecei a programar em Cobol e Clipper, havia alguns programadores com o EGO enorme, e até hoje percebo que existe esse tipo de programador.
@Flavio Jarabeck cuidado com o EGO, muitas vezes ele cega e leva vc a julgar as pessoas sem nem mesmo conhece-las. Humildade sempre !
abraços e obrigado a todos.!
Acompanhando o EA que eu falei que tenho para ver como ele faz como base de calculo para mudar o TP. Fiz os calculos, somando o valor da primeira ordem aberta com o da ultima e dividi pelo TP que o EA estava usando, então encontrei o numero 0.199950 como base, e percebi que ele adiciona 100 a cada qtd de ordens abertas, então criei um método para retornar isso e fazer o calculo pra mim.
Não sei se é dessa maneira que o EA faz, nem sei como chegou a essa formula, mas é um padrão que reconheci.
Então comecei a testar e meu TP estava se posicionando igual ao do EA, ou seja, funcionou.
Aqui como fiz e está funcionando como preciso
PS: Em 1995, quando comecei a programar em Cobol e Clipper, havia alguns programadores com o EGO enorme, e até hoje percebo que existe esse tipo de programador.
@Flavio Jarabeck cuidado com o EGO, muitas vezes ele cega e leva vc a julgar as pessoas sem nem mesmo conhece-las. Humildade sempre !
abraços e obrigado a todos.!
Não é questão de Ego.
Você tinha uma linha de código que estava errada, outra pessoa apontou o erro, e você insistiu que estava fazendo certo.
Eu não julgo pessoas, eu julgo o código-fonte.
Mas ok.
Boa sorte com seu Martingale.
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso
Salve galera. Estou criando uma estratégia em Martingale para usar no Forex. Minha estrategia se baseia em um robo que tenho que usa essa estrategia e vai incrementando a qtd de lotes.
Basicamente, o robo vai abrindo ordens conforme o mercado anda, por exemplo se estiver subindo ele vende, se estiver caindo ele compra.
Minha duvida é quanto a quantidade de ordens, como exemplo esse robo que tenho vai abrindo ordens e movendo o takeprofit dependendo da quantidade de ordens.
Por exemplo: Se ele abre 15 ordens, ele move o takeprofit dxando sempre as ultimas 5 ou 4 para recuperar o lucro na volta, é isso que não estou conseguindo fazer.
Atualmente eu estou somando os valores de abertura da primeira e da segunda ordem e divido por 2, porem, quero acertar isso, para que me deixe sempre as ultimas 5 ordens para recuperação como falei. Então caso abra 15 ordens, ele move o takeprofit dxando as 5 ultimas e perdendo as outras 10 na volta.
Como fazer isso, como fazer para dxar sempre as ultimas 4 ou 5 ordens para recuperação ?
Atualmente estou fazendo.