aventuras de um novato - página 3

 
niko:

Obrigado cloudbreaker! Isto está começando a tornar um pouco mais divertido, eu não sabia que você pode chamar uma função dentro de um retorno (mesmo que provavelmente esteja no livro mql, assim como tudo o resto teórico). Helicóptero com bom aspecto EC 155! Por que 'felizmente', você não quer seu próprio helicóptero?

Pergunta Aero HC2:


Tenho 3 roteiros para minha estratégia até aqui. 2 são uni-direcionais, 1 é bidirecional (que é o que estamos trabalhando aqui).

A partir de sua experiência com o MT4, devo esperar sérios problemas se eu anexar diferentes scripts a 5 ou mais pares na tela (1 script por par). Será mais fácil para mim do que programar ou mudar 1 script grande e fazer com que um escolha o par que eu quero (pois isso exigiria mudanças diárias no código)?

 
niko:

Pergunta Aero HC2:


Tenho 3 roteiros para minha estratégia até aqui. 2 são uni-direcionais, 1 é bidirecional (que é o que estamos trabalhando aqui).

A partir de sua experiência com o MT4, devo esperar sérios problemas se eu anexar diferentes scripts a 5 ou mais pares na tela (1 script por par). Será mais fácil para mim do que programar ou mudar 1 script grande e fazer com que um escolha o par que eu quero (pois isso exigiria mudanças diárias no código)?

Assumindo aqui que estamos falando de uma única estratégia de negociação entre pares de moedas:-

Eu prefiro fazer meu EAs par-agnóstico - ou seja, o mesmo EX4 pode ser anexado a qualquer par.

-Assim, temos apenas uma base de código para manter.

-A lógica permanece tão simples quanto possível.

 
cloudbreaker:

Assumindo aqui que estamos falando de uma única estratégia comercial entre pares de moedas:-

Eu prefiro fazer meu EAs par-agnóstico - ou seja, o mesmo EX4 pode ser anexado a qualquer par.

-Assim, temos apenas uma base de código para manter.

-A lógica permanece tão simples quanto possível.

Sim, isso seria o ideal, mas eu estabeleço um filtro manual para cada moeda a cada dia, não baseado em indicadores, além de que ele acaba sendo 3 estratégias, embora a idéia seja a mesma. Isto tornaria o código realmente grande em meu entendimento e incômodo de ajustar diariamente se tivéssemos que colocar tudo junto. Para o futuro próximo eu programo o filtro para cortar meu tempo de trabalho, mas sempre há coisas que você não pode programar (90% para ser programado, o resto é o que o cérebro é para mim. Embora eu tenha perseguido o 'Santo Graal' antes de tentar programar tudo e chegar ao modelo perfeito haha, olhando na direção errada).


Estou lançando as 2 estratégias ao vivo nesta segunda-feira, à medida que o código sobre elas é feito. Elas foram executadas manualmente por meu pai na lei e por mim mesmo um pouco, a codificação deve trazer resultados mais altos. Para a estratégia combinada, posso lançar 2 EA's, acho que no mesmo gráfico (um para longo e outro para curto), mas ainda quero aprender, portanto, vou retomar o processo de codificação. Portanto, espero que muitas perguntas venham muito em breve!


Em que país você está baseado? Estou em Londres, Reino Unido.

 

Hey quebrador de nuvens e outros mt4 gurus aqui!


Pergunta: Tenho 2 roteiros (um é para comprar outro é para abreviar). Eu queria usar ambos hoje em 3 pares. Agora, como apenas 1 EA pode ser anexado a um gráfico, abri 6 gráficos (2 por par), e anexei os scripts a eles. Entretanto, apenas 1 script foi executado. Não tenho a menor idéia do motivo. Alguma ajuda, por favor?


Resumindo: 2 EAs, um só compra outro só abrevia, regras muito básicas (cruz de ouro em emas e pronto), o lucro leva 20 pips, sem stop loss. Por que apenas 1 é executado? Eu verifiquei que os Expert Advisors foram ativados, e todos os scripts tinham caras sorridentes ao lado deles nos gráficos.

 
niko:

Hey quebrador de nuvens e outros mt4 gurus aqui!


Pergunta: Tenho 2 roteiros (um é para comprar outro é para abreviar). Eu queria usar ambos hoje em 3 pares. Agora, como somente 1 EA pode ser anexado a um gráfico, abri 6 gráficos (2 por par), e anexei os scripts a eles. Entretanto, apenas 1 script foi executado. Não tenho a menor idéia do motivo. Alguma ajuda, por favor?


Resumindo: 2 EAs, um só compra outro só abrevia, regras muito básicas (cruz de ouro em emas e pronto), o lucro leva 20 pips, sem stop loss. Por que apenas 1 é executado? Eu verifiquei que os Expert Advisors foram ativados, e todos os scripts tinham caras sorridentes ao lado deles nos gráficos.



O que dizem os arquivos de log? ou seja, o que está no diretório de logs e o que está no diretório de experts?

Você está recebendo alguma mensagem "Trade Context Busy"? Se sim, então eu recomendaria adicionar alguma lógica fazendo uso da função IsTradeAllowed().

Se não, então eu recomendaria que você lascasse seus EAs com declarações Print().

 
cloudbreaker wrote >>

O que dizem os arquivos de log? ou seja, o que está no diretório de logs e o que está no diretório de especialistas?

Você está recebendo alguma mensagem "Trade Context Busy"? Se sim, então eu recomendaria adicionar alguma lógica fazendo uso da função IsTradeAllowed().

Se não, então eu recomendaria que você lascasse seus EAs com declarações Print().

hey cloudbreaker! obrigado por ter vindo para resgatar!

1. O que você quer dizer com diretório de log? Como chegar a esses dois? (Eu tentei abri-lo via C>ProgramFiles>MT4>Experts>Logs mas a pasta aparece vazia).

 
niko wrote >>

Ei, quebra-nuvens! obrigado por terem vindo resgatar!

1. O que você quer dizer com diretório de log? Como chegar a esses dois? (Eu tentei abri-lo via C>ProgramFiles>MT4>Experts>Logs mas a pasta aparece vazia).

Ei, quebra-nuvens!

Já passei por seus comentários sobre codificação muitas vezes (tenho todos eles postados na minha parede), tentando entender e remendar tudo junto, mas ainda assim completamente perdido. Até onde pude chegar foi copiar a função MyOrderCount de outra EA, mas ainda não tenho idéia de como integrar isso no código. Estou completamente fora do meu alcance, mas isso não significa que não possamos progredir. Se você pudesse me ajudar a construir o código pouco a pouco (e me direcionar para talvez coisas mais específicas que eu mesmo pudesse construir também), então faremos o código e eu aprenderei muito mais rápido.

Anexei o código até onde consegui com ele, e também o Mapa do Desenho do Programa da forma como o vejo. Não se preocupe com as coisas menores como parênteses no código, eu os verificarei duas vezes com o bloco de notas++ à medida que formos avançando.

A prioridade principal, é se você pudesse me ajudar passo a passo a integrar o código MyOrderCount no restante, e por favor, explique tudo pouco a pouco à medida que vamos avançando. Ou você também pode me enviar para partes específicas do livro ou qualquer coisa do gênero, se achar apropriado. Desta forma, progredimos muito mais rápido.

Obrigado!

ps: me avise se o mapa do programa não anexou

//+------------------------------------------------------------------+
//|                                     N&P 1DailyUpTrendExec.mq4 |
//| Copyright Nick Lou & Pete Arh 2009                               |
//|                                     20090523                     |
//|                                                                  |
//+------------------------------------------------------------------+

extern double    Lots=0.01;
extern double    TakeProfit=20;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
{
  return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
{
  return(0);
}
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
{
if(Bars<75)
     {
     Print("Bars less than 100");
     return(0);
     }
  //-------------------Declaring All Variables and Conditions

double ema1,ema2,ema3,closeup, e1over2, e2over3,e1under2,e2under3;

ema1= iMA(NULL,0,7,0,MODE_EMA,PRICE_CLOSE,0);
ema2= iMA(NULL,0,14,0,MODE_EMA,PRICE_CLOSE,0);
ema3= iMA(NULL,0,50,0,MODE_SMA,PRICE_CLOSE,0);
e1under2=ema1<ema2;
e2under3=ema2<ema3;
e1over2=ema1>ema2;
e2over3=ema2>ema3;
//--------------------declaration end

//-------------order counting code
int CalculateNumberOfOrders(string Symbol)
{
int long=0,short=0;
for(int i=0;i<OrdersTotal();i++)
      {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)break;
      if(OrderType()==OP_BUY)long++;
      if(OrderType()==OP_SELL)sell++;
     {
  //---return orders Volume
  if(long>0)return(long);
  if(short>0)return(short);
{
//------------ (fingers crossed this is right). I still don't get it
why we need to count orders.


//------------------EURUSD Block-------------------------
//check order type, if it doesn't equal to buy already then buy
if(OrderType()
     {
    static int ticket;
      // deleted if(OrdersTotal()==0)
     if(e1under2 && e2under3)     // short function
       {
        ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,0,0,Bid-TakeProfit*Point,"Short
Order ",0,0,Red);
        if(ticket>0)
              {
              if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("SHORT order opened : ",OrderOpenPrice());
              }
              //return(0);
       }

      //  -------------------------------------------------------------------------------------------

      {
      static int ticket1;
            // deleted if(OrdersTotal()==0)
        if(e1over2 && e2over3) //buy function
        {
         ticket1=OrderSend(Symbol(),OP_BUY,Lots,Ask,0,0,Ask+TakeProfit*Point,"",0,0,Green);
//What's 12345 for? I ADDED ASk-30*Point for stop loss
         if(ticket1>0)
           {
           if(OrderSelect(ticket1,SELECT_BY_TICKET,MODE_TRADES))
Print("BUY order opened : ",OrderOpenPrice());
           }
           //return(0);   //the problem is with this return not being
in the right place i think
        }
      }
return(0);
}
}

ps: por favor ignore os comentários // aleatórios no código, são de notas antigas

 
niko wrote >>

Ei, quebra-nuvens!

Já passei por seus comentários sobre codificação muitas vezes (tenho todos eles postados em minha parede), tentando entender e remendar tudo junto, mas ainda assim completamente perdido. Até onde pude chegar foi copiar a função MyOrderCount de outra EA, mas ainda não tenho idéia de como integrar isso no código. Estou completamente fora do meu alcance, mas isso não significa que não possamos progredir. Se você pudesse me ajudar a construir o código pouco a pouco (e me direcionar para talvez coisas mais específicas que eu mesmo pudesse construir também), então faremos o código e eu aprenderei muito mais rápido.

Anexei o código até onde consegui com ele, e também o Mapa do Desenho do Programa da forma como o vejo. Não se preocupe com as coisas menores como parênteses no código, eu os verificarei duas vezes com o bloco de notas++ à medida que formos avançando.

A prioridade principal, é se você pudesse me ajudar passo a passo a integrar o código MyOrderCount no restante, e por favor, explique tudo pouco a pouco à medida que vamos avançando. Ou você também pode me enviar para partes específicas do livro ou qualquer coisa do gênero, se achar apropriado. Desta forma, progredimos muito mais rápido.

Obrigado!

ps: me avise se o mapa do programa não anexou

ps: por favor ignore os comentários // aleatórios no código, são de notas antigas

Oi Niko

Permitam-me acrescentar meus dois pences a esta discussão,

Como um programador antigo, virtualmente antigo :), com um pouco de experiência de ensino e treinamento, encontrei um monte de código ruim em meu tempo. Um erro comum que leva a um código mal escrito é a falta de planejamento. Ele pode estar afirmando o óbvio, mas você realmente precisa especificar o que quer fazer antes de começar a tentar codificá-lo. Isto pode parecer um trabalho extra, mas lhe poupará muito tempo no longo prazo e produzirá um código mais confiável, mais compreensível e de mais fácil manutenção.

Uma técnica muito útil para especificar o código do computador é conhecida como Pseudo Codificação. Basicamente, é apenas um conjunto lógico de instruções informáticas como instruções escritas em inglês simples. Não há nenhum formato específico necessário, mas você pode usar o jargão típico de programa de computador que é encontrado de uma forma ou de outra em praticamente todas as linguagens de programação de computador.

Aqui está um exemplo de algum Pseudo Code para cozinhar queijo e macarrão. Eu o peguei de um artigo "Intro to Programming by Patrick Nouvion" no site do IBFX. O artigo inteiro provavelmente vale a pena ser lido. http://www.ibfx.com/ibfxu/catalog/programming/pro1010.aspx

INICIAR
Encontrar leite e manteiga e caixa Kraft
Se encontrado continuar
caso contrário, enviar criança para a loja

Encontrar Pote em tábua de copos

Se for encontrado, peça à esposa para ajudar a encontrá-lo.

Encontre o fogão
Se encontrado continuar
caso contrário, peça pizza

Verificar se há um queimador disponível
Se disponível, continuar
senão, fazer uso

Ligue o fogão para o alto
Encontrar Água
Se encontrado continuar
caso contrário, peça pizza

Colocar Água na panela
Certifique-se de que o fogão esteja quente
se o calor continuar
caso contrário, verifique se está conectado
senão chame o reparador e peça pizza

Coloque a panela no queimador
se você tiver sal, acrescente uma pitada de sal
se não continuar
se você tiver pimenta, acrescente uma pitada de pimenta
se não continuar
enquanto a água não está fervendo espera
caixa Kraft aberta
adicionar o macarrão da caixa à panela
esperar 8 minutos
enquanto espera, se a panela ferver, abaixe o calor e sopre sobre ela
Encontrar o coador
Macarrão de drenagem em coador
voltar ao pote
adicionar conteúdo de embalagem de queijo
adicionar manteiga
adicionar 1 colher de sopa de leite
mexer para combinar
se for muito espesso, acrescentar 1 colher de sopa de leite; se não, comer
FIM

Se eu mesmo estivesse escrevendo este pseudo-código, eu mesmo o refinaria um pouco mais, dividindo-o em blocos funcionais e usando um pouco de indentação para torná-lo "Look Pretty". Por exemplo

BLOCO DE INÍCIO - Preparar água fervente

Colocar Água na panela

Coloque a panela no queimador
se você tiver sal, acrescente uma pitada de sal
se não continuar
se você tiver pimenta, acrescente uma pitada de pimenta
se não continuar
enquanto a água não está fervendo espera

BLOCO FINAL - Preparar a água de aparafusamento

e assim por diante....

Niko, eu o elogio por querer aprender a escrever seu próprio código. Em minha experiência, a maneira mais rápida e fácil de aprender é fazer o que você está fazendo e apenas tentar. O que eu sugeriria, porém, é que você dê um breve passo atrás e escreva o que você quer alcançar em pseudo-código. Isto deve ajudá-lo a deixar claro o que você está tentando alcançar exatamente.

Uma vez que você tenha feito isso, talvez queira colocá-lo de volta aqui para que eu ou outra pessoa o vejamos. Uma vez que você tenha o pseudo-código certo, então você pode começar a convertê-lo para o código MT4. Tentar fazer tudo de uma só vez é um salto muito grande, especialmente quando você é um iniciante.

A propósito, meu pseudo-código nunca é desperdiçado. A maior parte dele termina como comentários em meu código acabado.

Boa sorte!

Tim Wilson

 
niko:

Ei, quebra-nuvens!

Já passei por seus comentários sobre codificação muitas vezes (tenho todos eles postados em minha parede), tentando entender e remendar tudo junto, mas ainda assim completamente perdido. Até onde pude chegar foi copiar a função MyOrderCount de outra EA, mas ainda não tenho idéia de como integrar isso no código. Estou completamente fora do meu alcance, mas isso não significa que não possamos progredir. Se você pudesse me ajudar a construir o código pouco a pouco (e me direcionar para talvez coisas mais específicas que eu mesmo pudesse construir também), então faremos o código e eu aprenderei muito mais rápido.

Anexei o código até onde consegui com ele, e também o Mapa do Desenho do Programa da forma como o vejo. Não se preocupe com as coisas menores como parênteses no código, eu os verificarei duas vezes com o bloco de notas++ à medida que formos avançando.

A prioridade principal, é se você pudesse me ajudar passo a passo a integrar o código MyOrderCount no restante, e por favor, explique tudo pouco a pouco à medida que vamos avançando. Ou você também pode me enviar para partes específicas do livro ou qualquer coisa do gênero, se achar apropriado. Desta forma, progredimos muito mais rápido.

Obrigado!

ps: me avise se o mapa do programa não anexou

ps: por favor ignore os comentários // aleatórios no código, são de notas antigas

Um olhar rápido me diz que você está cometendo um erro fundamental.

Você parece estar tentando declarar a função MyOrderCount() dentro do bloco de código da função start().

Pense em seu código como uma série de funções init(), start(), suafunção1(), suafunção2() ... suafunçãoN().

As funções init() e start() são funções especiais. A função init() é executada uma vez quando você inicializa a EA pela primeira vez. A função start() é executada cada vez que chega um tick de entrada.

Portanto, a função start() forma a raiz da qual toda sua lógica será chamada uma vez que a EA estiver em funcionamento.

Como exemplo, cada vez que um tick chegar, sua função start() será executada e fará isso:

- verifique algumas condições

- se as condições forem cumpridas, executar uma ordem

Uma das condições que você precisa é certificar-se de não ter já uma ordem do tipo (digamos, comprar) antes de fazer uma ordem de compra.

Assim, a partir da função start(), você precisará saber quais ordens de compra existem por um CALL para sua função de contagem de ordens de compra (cujo bloco de código fica fora da função start()).

Sua função de contagem de ordens retornará o número de ordens de compra e você retomará a execução da função start() na linha após sua chamada para a função de contagem de ordens de compra.

Então você usará o valor retornado da função de contagem de ordens de compra para determinar se deve ou não executar sua ordem de compra.

A execução real da ordem de compra pode ser uma chamada para OUTRA função que você criar para si mesmo (novamente, declarada fora da função start()).

Espero que isto faça sentido. Você pode estruturá-la de forma completamente diferente, mas eu estou apenas tentando dar a sua cabeça no conceito de funções e chamadas.


CB

 

Ei TSWilson e CB!

Vocês são ótimos! Muito obrigado.

Completamente de acordo com o pseudo-código. Eu fiz isso quando fiz uma programação muito básica em linguagem pro**realtime, mas lá era tão simples, sem declarações, sem blocos, etc (o código inteiro era apenas "se...então" haha). Comecei o pseudo código esta manhã (cheguei a trabalhar uma hora mais cedo só para fazê-lo) e escrevi um diagrama visual sobre como e que blocos ter. Terminarei isto mais tarde hoje e o publicarei aqui.

Uma vez feito isto, o resto dos blocos e as especificidades do código eu posso descobrir com seus ajudantes. Portanto, de volta à prancheta de desenho por enquanto!

Estou feliz por trabalhar durante a noite de hoje e amanhã para terminar o código o mais rápido possível, pois estou de folga na próxima semana e quero ter tudo pronto antes de ir.

Portanto, continue observando este tópico hoje, eu vou postar o pseudo-código e o diagrama!

E como sempre, obrigado ao Universo por pessoas como você!

Razão: