aventuras de um novato

 

Ei pessoal, obrigado por me ajudarem com meu código, são 2.11 da manhã em Londres, e eu tenho tentado decodificar este enigma mql já faz um tempo. A propósito, a CodesGuru agradece por tutoriais, eles são mais claros do que as coisas padrão oferecidas, bom esforço!


Estou em uma busca de novato para codificar uma estratégia e como sempre preciso da ajuda dos profissionais para isso.


Abaixo está um código que eu elaborei, mas por alguma razão ele executa apenas pequenos negócios.


Estou preso sem saber o porquê. Além disso, também preciso acrescentar isto a ele: 1. O código deve executar tanto as operações Longas como as Curtas, independentemente de já haver uma operação aberta na direção oposta (por exemplo: se houver uma operação longa que esteja aberta, o código ainda deve entrar em uma posição curta se as condições forem cumpridas). Acho que preciso brincar com'OrdersTotal()==0; função, mas não sei o que fazer.


Por favor, ajude. o código está anexado. (eu tentei anexá-lo, mas por alguma razão ele não o faz, alguma idéia do que está acontecendo?)


Prometo uma boa garrafa de champanhe para a pessoa que mais me ajuda a levar este código à fruição ao vivo :-)


ps: Testei isto no simulador/teste de estratégia mt4.


Procurem awar aos seus ajudantes!

nick

 
//+------------------------------------------------------------------+
//|                                     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); 
      }
   //Declaration
   
  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;

 
 

   if(OrdersTotal()==0)   // one order at the time
      {
      // Short  Entry
      static int ticket;
      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());
            }
            if(OrdersTotal()==0)   // one order at the time
            if( e1over2 && e2over3)     //this may be messy cos old version had ==1 for all variables
         
         {
         if( e1over2 && e2over3) //buy function                                                                    
         ticket=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( ticket>0)
            {
            if(OrderSelect( ticket, SELECT_BY_TICKET, MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
            }
            else Print("Error opening BUY order : ",GetLastError());
            return(0);     
         }
 
            
            

            
            
            
            return(0);     
         }
         
         
  
   return(0);
   }
   }
esse é o pessoal do código!
 

Uau! Muito bom trabalho de codificação para um "novato". Você pode escrever seu código de forma muito mais concisa do que eu sou capaz.


Eu noto que você tem duas linhas condicionais idênticas para a seção COMPRAR, enquanto a seção VENDER tem apenas uma.


A segunda condição idêntica - se as declarações para a função COMPRAR são provavelmente inofensivas, mas será necessário?


            if(OrdensTotal()==0)   // um pedido na época
if(e1over2 && e2over3) //isto pode ser confuso porque a versão antiga tinha ==1 para todas as variáveis <<<<<<<<<<<<<<<<<<<<<< em nenhum lugar é o primeiro

{
if(e1over2 && e2over3) // função de compra <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
em nenhum lugar é o segundo ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,0,0,Ask+TakeProfit*Point,"",0,0,Green); // Para que serve 12345? ADICIONEI ASk-30*Point for stop loss
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
}
else Print("Error opening BUY order : ",GetLastError());
return(0);
}


Também, parece que você tem ambas as funções Vender e Comprar contidas dentro da mesma Condição - se:



if(OrderTotal()==0) // um pedido no momento
{
// Entrada curta
bilhete int estático;
if(e1under2 && e2under3) // função curta
{ // O parêntese correspondente para isto está muito abaixo da função VENDER e COMPRAR<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
ver abaixo 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)) Imprimir("Pedido CURTO aberto : ",OrderOpenPrice());
}


if(OrderTotal()==0) // um pedido na época
if(e1over2 && e2over3) //isto pode ser confuso porque a versão antiga tinha ==1 para todas as variáveis

{
if(e1over2 && e2over3) // função de compra
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,0,0,Ask+TakeProfit*Point,"",0,0,Green); // Para que serve 12345? ADICIONEI ASk-30*Point for stop loss
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
}
else Print("Error opening BUY order : ",GetLastError());
return(0);
}







return(0);
} // este é o parêntese correspondente para o mostrado acima<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<


ver acima return(0);
}
}





A ordem de compra está sujeita aos critérios de VENDA da forma como você tem o condicional- se anotado.









 
niko:
esse é o pessoal do código!

A razão pela qual ele nunca faz uma ordem longa é que você não fechou o bloco de código que realiza a ordem curta com um parêntese de fechamento. Isto significa que, essencialmente, você só estará executando uma ordem longa se (e1under2 & e2under3) E (e1over2 & e2over3) o que eu imagino que não acontecerá.


Você diz que deseja abrir uma ordem, mesmo que já exista uma ordem aberta na outra direção. A partir disto, presumo que você queira limitar o número de pedidos a um máximo de um em cada direção. Ao incluir a verificação de que OrdensTotal() é igual a zero, isto limita efetivamente a um total de ordens, não a uma em cada direção. O que você precisa fazer é verificar o número e o tipo de pedidos existentes usando um laço e contadores (cargas de exemplos neste site), depois use o resultado para determinar se um pedido deve ser feito.


Notei em seu outro post, como você mencionou que queria aprender a escrever MQL, então não vou escrever isto para você. Este exemplo é exatamente o tipo certo de código e lógica simples que é essencial no processo de aprendizagem.


Por favor, faça isto por você mesmo e me informe como você se sai.

 

Ei, pessoal, vocês são lendas!!!

Obrigado por seus comentários FXTrader2008 e cloudbreaker. Eu não notei que havia uma condição repetida para a compra, que não se cortava isso, e faz sentido que o suporte não esteja fechado. Boa idéia de não me dar a resposta codificada, pois eu mesmo quero aprender o código. Tenho uma procura on-line de loop/counters.

Oh, a razão pela qual o código é tão bonito e compacto é porque um amigo meu me ajudou a montá-lo (que é um programador).

Eu continuo com meu lado das coisas e se eu ficar preso, eu aviso-o!

Vocês negociam mercados ao vivo independentemente ou trabalham por metaquotas?

 

Eu não olhei fundo em seu código, mas uma primeira dica:


Tente estruturar seu código com mais clareza - não fazemos isso por diversão, mas para melhor leitura e compreensão! Não tem influência no "sentido" ou significado do código...


Vamos ver, como seu código DEVERÁ parecer (apenas a parte essencial):

if(OrdersTotal()==0)   // one order at the time
  {
   // Short  Entry
   static int ticket;
   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());
        }
      if(OrdersTotal()==0)   // one order at the time
      if( e1over2 && e2over3)     //this may be messy cos old version had ==1 for all variables
        {
         if( e1over2 && e2over3) //buy function                                                                    
            ticket=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( ticket>0)
           {
            if(OrderSelect( ticket, SELECT_BY_TICKET, MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
           }
         else Print("Error opening BUY order : ",GetLastError());
         return(0);    
        }
      return(0);    
     }
   return(0);
  }
 

Como você pode ver agora: Você só testa para sua "curta" condição

   // Short  Entry
   static int ticket;
   if( e1under2 && e2under3)     // short function

e dentro disto você testa para a condição "longa", duas vezes - para segurança ; ) - isto não pode funcionar.

      if( e1over2 && e2over3)     //this may be messy cos old version had ==1 for all variables
        {
         if( e1over2 && e2over3) //buy function                                                                    
 

Melhor: (mas longe de perfeito)

if(OrdersTotal()==0)   // one order at the time
  {
   // Short  Entry
   static int ticket;
   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());
        } }
   if( e1over2 && e2over3) //buy function {
      ticket=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 ( ticket>0)
        {
         if(OrderSelect( ticket, SELECT_BY_TICKET, MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
        }
      else Print("Error opening BUY order : ",GetLastError());
     }
  return(0);
  }

Agora deve funcionar para negócios curtos e longos.

Recomendo vivamente a leitura deste livro aqui sobre a MQL4 - especialmente a seção Criação de um programa normal - ele está muito bem escrito e você pode facilmente implementar sua estratégia. Eu também comecei assim...

Se você baixar os arquivos lá e tiver problemas com os comentários (já que são cirílicos) abra "palavra", copie&colar a fonte de cada arquivo da página da internet (já que os comentários lá são em inglês) para palavra e finalmente copie&colar da palavra para o Metaeditor. De agora em diante você pode estudar os programas em inglês.


Espero, eu poderia ajudar...


(A propósito: Eu também sou muito novo na MQL4, mas trabalho como programador e, portanto, a sintaxe e a estrutura não são problema para mim...)


Saudações TuRRiCAN

 
Ooops, no tempo que eu precisava para responder, os outros têm sido mais rápidos ...
 
TuRRiCAN wrote >>
Ooops, no tempo que eu precisava para responder, os outros têm sido mais rápidos ...

Ei Tourrican, isto é muito útil, obrigado! Cirílico sem problemas, eu sou russo, da Sibéria, na verdade.

Sim, estudei o livro mql, mas ele ainda está fora do aprendizado prático, é uma coisa totalmente diferente estudá-lo e depois tentar escrever um programa você mesmo (porque eles não explicam claramente com exemplos da vida real em cada parte do livro, por que e como essas coisas são usadas você sabe.

Mas eu chego lá, o desejo ardente dentro de mim de fazer este trabalho é maior do que qualquer obstáculo.

 
niko:

Vocês negociam mercados ao vivo independentemente ou trabalham por metaquotas?

Em resposta à sua pergunta, eu normalmente trabalho como piloto de helicóptero. Entretanto, dada a situação econômica, a empresa para a qual trabalho não quer voar no momento. Portanto, nesse ínterim, tenho desenvolvido EAs para uma empresa que é propriedade de meu melhor amigo. Estamos negociando ao vivo em nome de alguns fundos bastante conhecidos.

Estou contente que você esteja tentando aprender a codificar e que ajude quando eu puder. É refrescante encontrar alguém para participar do fórum e querer aprender a ser auto-suficiente.

Razão: