Colegas, estou testando um robô em conta demo tipo hedge. Ele abre compras e vendas, num determinado momento ocorre um equilíbrio e é comum eu ver 1 compra e 1 venda aberta simultaneamente, ou 3 compras + 2 vendas, etc, e o saldo não mudar mais. Saldo que eu digo é ali onde mostra o resultado das operações em aberto em tempo real. Como é que eu posso criar um if que eu detecte que o saldo fica X minutos igual. Um trecho de código que me dê um norte, algo assim:
if (saldo == saldo-1) {
count++;
if(count>5000) {
CloseAllPositions();
count = 0;
}
}
count seria um simples contador. Como faço isso ? ...Grato
Essa vissao por tempo eh possivel, mas tu pode fazer tambem eh o seguinte, ao percorrer a lista de posicoes e ver que tem posicoes opostas, tu guarda elas e reordena elas do jeito a voce ter o maior lucro, dai tu ve se o preco do ativo esta fora do intervalo de duas posicoes. Se estiver o saldo ira permanecer o mesmo porque ele so vai mudar quando o preco voltar para dentro do intervalo, dai quando estiver fora desse intervalo tu manda um closeby passando as duas posicoes...
Legal também, mas como teria que ficar este código que eu postei para dar certo usando o counter++ ?
Voce que fez o codigo inicial
Não. É um EA gratuito da lista da biblioteca.
Eu queria só um 'norte' de como seria um bloco tipo IF conforme eu postei para que daí em diante que tente conseguir fazer por conta própria.
Seria uma lógica + ou - assim: Se o saldo parou de variar inicia um contador counter++, este começa a contar na velocidade de uns 500 ms (meio segundo), se passar mais do que X segundos aciona a função CloseAllPositivons() que já existe no EA para fechar todas as ordens. Este EA quado não tem ordens ele recomeça abrindo novas ordens.
Não. É um EA gratuito da lista da biblioteca.
Eu queria só um 'norte' de como seria um bloco tipo IF conforme eu postei para que daí em diante que tente conseguir fazer por conta própria.
Seria uma lógica + ou - assim: Se o saldo parou de variar inicia um contador counter++, este começa a contar na velocidade de uns 500 ms (meio segundo), se passar mais do que X segundos aciona a função CloseAllPositivons() que já existe no EA para fechar todas as ordens. Este EA quado não tem ordens ele recomeça abrindo novas ordens.
Olá Sérgio,
fiz um script para você se basear.
//+------------------------------------------------------------------+ //| Forum_387542.mq5 | //| Copyright 2021, Rogério Giannetti Torres | //| mailto:giannetti.rogerio@gmail.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2021, Rogério Giannetti Torres" #property link "mailto:giannetti.rogerio@gmail.com" #property version "1.00" //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ double saldo = 0; int timeSaldoZero = INT_MAX; int minutos = 1; void OnStart() { do { if(calculaSaldo() == 0) { if(timeSaldoZero == INT_MAX) { timeSaldoZero = (int) TimeTradeServer(); // Instante em que o saldo zerou } if(TimeTradeServer() >= timeSaldoZero + minutos * PeriodSeconds(PERIOD_M1)) { Print(" O saldo ficou zerado de ", (datetime) timeSaldoZero, " até as: ", TimeTradeServer()); break; } } else timeSaldoZero = INT_MAX; } while(true); } //+------------------------------------------------------------------+ double calculaSaldo() { saldo = 0; return(saldo); } //+------------------------------------------------------------------+
Sou sempre grato aos comentários que tentam me orientar. Principalmente os que vem com códigos. Mas preciso dizer que não é quando o saldo fica igual a zero, é quando ele para de mudar de valor. Por exemplo, tenho 2 ordens SELL e 2 ordens BUY, e o saldo está parado em R$ 120,00 ou - R$ 330,00 ou qualquer outro valor. O preço do ativo continua variando conforme o book (tô falando do mini índice), porém o tanto que ele sobe gera prejuízo nas ordens abertas SELL porém gera o mesmo lucro nas ordens abertas BUY, e por isso, o saldo não muda de valor. Fica empatado. É esse empate que eu quero intervir chamando a função CloseAllPositions() que já existe no EA e que fecha todas as ordens.
Então, quando ficar mais que X minutos sem mudar o saldo (sinal que empatou) a função CloseAllPositions() deve ser chamada.
Acho que daria certo assim:
int count; // cria uma variável count
int ticket; //variável que percebe cada ticket que a cotação do ativo der
if (IsPositions()) //se tem ordem aberta, BUY ou SELL (no código já tem esta função que detecta se há ordens abertas)
count++; //o contador vai incrementando 1 em 1
if (saldo muda a cada ticket, que é a cotação do ativo) // enquanto o saldo estiver mudando a cada cotação do ativo
count=0; // o contador vai sendo zerado
if (count => 1000) // Mas se este contador atingir determinado valor é porque o saldo não mudou
CloseAllPositions(); // aí fecha todas as ordens
count = 0; // e zera o contador esperando novas ordens serem abertas e recomeçar o acompanhamento
Como fazer isso dar certo ? vou pesquisar mas se puderem me adiantar alguma coisa, agradeço.
Sou sempre grato aos comentários que tentam me orientar. Principalmente os que vem com códigos. Mas preciso dizer que não é quando o saldo fica igual a zero, é quando ele para de mudar de valor. Por exemplo, tenho 2 ordens SELL e 2 ordens BUY, e o saldo está parado em R$ 120,00 ou - R$ 330,00 ou qualquer outro valor. O preço do ativo continua variando conforme o book (tô falando do mini índice), porém o tanto que ele sobe gera prejuízo nas ordens abertas SELL porém gera o mesmo lucro nas ordens abertas BUY, e por isso, o saldo não muda de valor. Fica empatado. É esse empate que eu quero intervir chamando a função CloseAllPositions() que já existe no EA e que fecha todas as ordens.
Então, quando ficar mais que X minutos sem mudar o saldo (sinal que empatou) a função CloseAllPositions() deve ser chamada.
Olá,
o caminho das pedras está no código que te mandei, basta uma pequena alteração para fazer o que você quer.
Acho que daria certo assim:
int count; // cria uma variável count
int ticket; //variável que percebe cada ticket que a cotação do ativo der
if (IsPositions()) //se tem ordem aberta, BUY ou SELL (no código já tem esta função que detecta se há ordens abertas)
count++; //o contador vai incrementando 1 em 1
if (saldo muda a cada ticket, que é a cotação do ativo) // enquanto o saldo estiver mudando a cada cotação do ativo
count=0; // o contador vai sendo zerado
if (count => 1000) // Mas se este contador atingir determinado valor é porque o saldo não mudou
CloseAllPositions(); // aí fecha todas as ordens
count = 0; // e zera o contador esperando novas ordens serem abertas e recomeçar o acompanhamento
Como fazer isso dar certo ? vou pesquisar mas se puderem me adiantar alguma coisa, agradeço.
Então, quando ficar mais que X minutos sem mudar o saldo (sinal que empatou) a função CloseAllPositions() deve ser chamada.
Pelo que entendi, seu EA vai abrindo ordens: hora estão mais compradas BUY e hora estão mais vendidas SELL o que provoca mudança de saldo..
Evidente que chega o momento que tanto a quantidade de ordens BUY e SELL de suas posições se igualam travando o saldo e é aqui que vc quer intervir através de uma rotina que calcule o tempo em que esta situação esta ativa? Capiche?
- 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
Colegas, estou testando um robô em conta demo tipo hedge. Ele abre compras e vendas, num determinado momento ocorre um equilíbrio e é comum eu ver 1 compra e 1 venda aberta simultaneamente, ou 3 compras + 2 vendas, etc, e o saldo não mudar mais. Saldo que eu digo é ali onde mostra o resultado das operações em aberto em tempo real. Como é que eu posso criar um if que eu detecte que o saldo fica X minutos igual. Um trecho de código que me dê um norte, algo assim:
if (saldo == saldo-1) {
count++;
if(count>5000) {
CloseAllPositions();
count = 0;
}
}
count seria um simples contador. Como faço isso ? ...Grato