Problemas na verificação de comércio aberto

 

Acrescentei isto ao meu código para verificar se já existe um comércio aberto. O problema é que o código executará uma negociação e pronto. Qualquer pessoa pode ver um problema com este código. Eu não sou um super especialista em programação.


// Verifique se há negociações abertas

for(int cnt=OrdersTotal()-1;cnt>=0;cnt--)
{
if(OrderSelect(cnt,SELECT_BY_POS))
{

if(OrderSymbol()==Symbol())
{
tradeopen=true;
}
else
{
tradeopen=false;
}

}

}

 
Seu código vai pegar o comércio Pendente e Aberto, além de me parecer OK.
 

Obrigado Raptor por sua resposta ao baile


Se você não se importa de anexar o código inteiro, talvez haja algo que eu tenha perdido em outro lugar. Eu bati na parede com isto, no momento.

Arquivos anexados:
daz.mq4  3 kb
 
dazamate:
Qualquer pessoa pode ver um problema com este código.

  1. Nenhum número mágico significa que é incompatível com todas as outras EA e negociações manuais e com ela mesma no mesmo par/diferentes períodos de tempo.
  2. Se a primeira ordem aberta não foi a da EA, então a bandeira é falsa, mesmo que ela tenha negócios abertos.
    int TotalOrderCount(){
        int count=0;
        for(pos = OrdersTotal()-1; pos >= 0 ; pos--) if (
            OrderSelect(pos, SELECT_BY_POS)                 // Only my orders w/
        &&  OrderMagicNumber()  == magic.number             // my magic number
        &&  OrderSymbol()       == Symbol() ){              // and my pair.
            count++;
        }
        return(count);
    }

 
dazamate:

Obrigado Raptor por sua resposta ao baile


Se você não se importa, eu anexarei o código inteiro, talvez haja algo que eu tenha perdido em outro lugar. Eu bati na parede com isto, no momento.

Alguns comentários . . .

Você declara i. .

int i;

. mas você não o coloca em nenhum lugar, o que é i...

Você define . . .

static bool tradeopen = false;

. então verifique se você pode colocar uma troca . . . sempre será falso neste ponto . . então você tem um código mais tarde que pode torná-lo verdadeiro

if(OrderSymbol()==Symbol())
    {
    tradeopen=true;
    }  

o barcount está ajustado a 0

static int barcount = 0;

portanto isto será sempre verdade se você tiver pelo menos 1 barra em seu gráfico . .

if(Bars != barcount)

Você precisa percorrer seu código linha por linha . . . qualquer coisa que você não entenda procure e leia sobre ele . . . é a única maneira de aprender.

 

Raptor, obrigado por passar por isso. Como eu disse, eu não sou um super especialista. Tenho lido a maneira como outras pessoas codificam as coisas e tento implementá-la na minha. Tenho feito muitas leituras sobre as funções. Fica frustrante quando não funciona e você não sabe como diagnosticar seu próprio desastre.

Em resposta a seus comentários

int i;

Foi-se, eu estava usando isso para algo mais que acidentalmente deixou lá


Vou explicar o que está acontecendo na minha cabeça em relação ao contador de bar. Ainda não tenho certeza porque esta parte do código não é boa.

static int barcount = 0;  // <- First time program is run bar counter is set to 0

     if(Bars != barcount) // <-  This will be true so the if statement is allowed to run
    
       {      
         if(iBarHour == iOpenHour)
                {
                //If statement
    
                }
         barcount=Bars ; // <- At the end of the if statement, the bar counter is set to Bars so that this if statement will not be true
                         //    again until another bar opens
       }

Quanto à verificação para ver se há alguma negociação em aberto no par...

static bool tradeopen = false;                // First time program is run tradeopen is set to false. I use the static in front 
// because if I don't the programming will keep setting this to false because an ea or   // a program is just a giant loop is it not. However I should set this to true because // the ea should assume there is a trade open until it does it checks that would // probably be the more smarter approach.       for(int cnt=OrdersTotal()-1;cnt>=0;cnt--)         {           if(OrderSelect(cnt,SELECT_BY_POS)) // <- So it scans each open and pending trade             {                           if(OrderSymbol()==Symbol()) // <- Checks to see if any of them trades are the same as the pair the ea is using                {                 tradeopen=true; // If so then set tradeopen to true                }                        else                {                 tradeopen=false; // If not set trade open to false                }                          }                         }

Portanto, ao final da ea faz esta verificação para ver se há ou não uma negociação aberta no par atual. Define tradeopen para verdadeiro ou falso. É um problema o fato de este código de bit off ser usado no final da EA?

Também outro problema que não consigo resolver...

int iBarHour;
iBarHour = TimeHour(TimeCurrent());
Print(iBarHour);
Por que o iBarHour sempre retorna 1? Eu quero que ele retorne a hora atual :(


WHRoeder


Importa se a EA usa ou não um número mágico. Não pode simplesmente verificar todas as negociações abertas e pendentes e se alguma delas é o par atual?


Mais uma vez, pessoal, eu sei que sou um novato, mas toda sua contribuição é apreciada, eu sei que provavelmente vou ser enganado novamente em relação à minha codificação duvidosa :P


AGRADECIMENTOS

 
dazamate:

Explicarei o que se passa na minha cabeça em relação ao balcão de bar. Ainda não tenho certeza por que esta parte do código não é boa.

Desculpe, provavelmente estou mostrando minha ignorância sobre o uso de variáveis estáticas . . . Eu uso variáveis globais em vez disso e qualquer coisa que eu queira definir na inicialização do código eu o coloco na função init. https://docs.mql4.com/basis/functions/special

Se você estiver rodando esta parte do código durante o fim de semana, ela não mudará, ela usa o tempo do Servidor e que se atualiza a cada tick.

int iBarHour;
iBarHour = TimeHour(TimeCurrent());
Print(iBarHour);

Supondo que este código funcione, então o dDayOpenPrice só será definido enquanto iBarHour = 6, quando iBarHour = 7 dDayOpenPrice não será mais definido para o valor correto. Se você fizer do dDayOpenPrice um global, então o seu valor será salvo enquanto o código estiver em execução (tornando-o estático provavelmente funcionará também). Se o código for reiniciado nada acontecerá até o dia seguinte, porém . . . não até a barra das 6 horas da manhã.

WHRoeder

Importa se a EA usa ou não um número mágico. Não pode simplesmente verificar todas as negociações abertas e pendentes e se alguma delas é o par atual?

Se você tiver um EA em um único gráfico sem nenhuma negociação manual . . então você provavelmente poderá escapar sem usar um número mágico, é uma boa prática para usá-lo, mas se você tiver seu código funcionando primeiro e depois implementar um número mágico, isso o ajudará a aprender.

 

ORaptorUK agradece mais uma vez.


Eu backtest o ea para ver se o código está funcionando e Print() a variável para ver o que está acontecendo neles para ajudar a depurar o código. O código ibarhour parece estar funcionando corretamente, apenas não estava mostrando corretamente no backtest porque eu o configurei para imprimir constantemente o valor do ibarhour que não pode mostrá-lo suficientemente rápido enquanto o código o cospe para que o backtester seja bloqueado. Haverá talvez algum dia para colocar um atraso no código de impressão?



Também sim, eu quero que ele armazene o valor da abertura da barra das 06:00 :)


Reorganizei o código, e estou orgulhoso de mim mesmo, consegui verificar se a ea tinha aberto algum negócio no par atual. Usei oexemplodoWHRoeder e o transformei em uma função separada :) e consegui que a função retornasse verdadeira ou falsa. Sim.



Como você é obviamente uma elite no campo de codificação da EA. Quantas histórias de sucesso você já ouviu de pessoas fazendo suas próprias EA? Eu só ouvi/vi histórias ruins.











 
dazamate:

Já que você é obviamente uma elite no campo de codificação da EA. Quantas histórias de sucesso você já ouviu de pessoas que fazem suas próprias EA? Eu só ouvi/vi histórias ruins.











LOL . . seu comentário deve ser dirigido ao WHRoeder e não a mim, ele é um codificador muito, muito mais proficiente do que eu, dê uma olhada em alguns de seus recentes posts no código que ele compartilhou, você pode aprender muito compreendendo seu código, eu sei que tenho, obrigado WHRoeder :-).

Eu ando por aqui porque gosto de tentar ajudar as pessoas a ajudarem a si mesmas ... e aprendo coisas no processo.

Para ter uma EA bem sucedida, é preciso primeiro um método bem sucedido... quantos desses métodos existem... muitas coisas funcionam por um curto período de tempo, algumas coisas funcionam por um mês ou dois, muito poucas funcionam de forma consistente. Mesmo que alguém tenha um bom método (como saberia disso sem os testes adequados, não sei), geralmente não tem o conhecimento ou a capacidade de transformar isso em uma EA viável. Qualquer pessoa que tenha um EA viável dificilmente anunciará o fato, estará usando-o e ganhando dinheiro ...

Fico feliz em saber que você está progredindo . . . no que diz respeito à sua edição impressa, você poderia usar Comentário(iBarHour); em vez disso, ele recebe a saída para a tela no canto superior esquerdo.

 
  1. De nada. "Para aprender alguma coisa, pratique. Para dominá-la, ensine".
  2. As barras não são confiáveis (uma vez atingida a barra máxima no gráfico, ela não mudará e as quebras de código.) Volume[0]==1 não é confiável, se você falhar uma marcação, o código quebra. Use sempre o tempo.
    int start(){
       static datetime Time0;
       if (Time0 == Time[0]) return; Time0 = Time[0];
       // A new bar has started.

  3. provavelmente mostrando minha ignorância sobre o uso de variáveis estáticas . . . Eu uso variáveis globais em vez disso e qualquer coisa que eu queira definir na inicialização do código Se
    a variável precisa ser inicializada, então deve ser global. Se a variável for compartilhada entre duas ou mais funções, então ela deve ser global. Caso contrário, defini-la localmente para a função, estática se necessário.
  4. Importa se a EA usa ou não um número mágico.
    Você provavelmente terá tudo funcionando, depois abrirá outro gráfico para testar lá e, de repente, tudo falha. Faça isso desde o início. Em meu código, eu verifico tanto o número mágico quanto o par, caso eu o coloque em outro gráfico, mas não altere o número mágico.
 

Seu Raptor direito... Desculpe WHRoeder que não foi mal-educado, você está bem. Bem, este é o começo de um grande projeto para mim, então espero realmente que vocês não se importem que eu os incomode.


int start(){
   static datetime Time0;
   if (Time0 == Time[0]) return; Time0 = Time[0];
   // A new bar has started.

WHRoeder, Este código parece tão simples mas não consigo entender como funciona, a afirmação não será sempre verdadeira se fizer o tempo0 igual ao tempo[0] toda vez que0 for igual ao tempo[0]? Não dizer que não funciona, mas simplesmente não entendo como funciona estruturado dessa maneira.


Mais duas perguntas.

Como eu iria fazer um contador onde, se um pedido pendente for feito e não for acionado com em x quantidade de barras, então ele será cancelado? Tudo o que posso fazer é colocar um contador para contar cada vez que uma nova barra se forma e se a quantidade de barras contadas == as barras especificadas permitidas antes de pedidos pendentes serem cancelados. O contador de barras é reinicializado toda vez que uma nova ordem pendente é aberta? Como isso soa?

Próxima pergunta.

Esta eu não tenho idéia de como fazer.

Quero fazer uma função que faça a varredura de eurusd, usdchf, gbpusd, usdjpy em 1hr tf. Volta às últimas 06:00 gmt candle grava a vela aberta, volta outras 24 barras para os registros de vela pré 06:00 gmt candle records que se abrem e grava a faixa de 6gmt -6gmt para cada par. Depois compara o intervalo de 6gmt - 6gmt de todos os pares e retorna aquele que é o mais alto. É possível que uma ea possa fazer isso, desde que esteja anexada a uma tabela de tempo?


Mais uma vez obrigado por seus conhecimentos e seus pacientes.