aventuras de um novato - página 4

 

Olá lendas do mql. Eu preparei o pseudo código para você durante minha hora de almoço no trabalho. Aqui está. me diga o que está faltando e eu o acrescentarei.

Código N&P Pseudo
Com esta estratégia queremos ter 1 código, ser capazes de anexá-lo a qualquer gráfico, e ele seria executado em 5 moedas, entrando com posições curtas e longas em cada uma delas, se as regras forem cumpridas.
---EURUSD---
Se ema7>ema14>sma50 e PriceNow é < TopFilterLevel (ex:1.3080 para eurusd. Isto eu ajustarei diariamente) então:
Comprar EURUSD Lots(lotes a serem variáveis externas, por exemplo 0,01). Caso contrário: (ou seja, condições não atendidas) não comprar.

Se ema7<ema14<sma50 e PriceNow é > BottomFilterLevel (ex.: 1.1508 para eurusd) então:
Curto EURUSD Lots (variável agiana, externa). Caso contrário (ou seja, condições não atendidas não abreviam).

Se a posição BUY alcançar 20 pips a partir do ponto de entrada, então: TAKEPROFIT em EURUSD.
Se a posição SHORT alcançar 20 pips a partir do ponto de entrada, então: TAKEPROFIT em EURUSD: TAKEPROFIT em EURUSD.
Se 20 pips não forem alcançados (comprar ou vender), então continue no mercado até que a posição seja fechada.

manualmente. (o ideal é colocar isto na função OrderSend para manter o código mais curto).

----GBPUSD---
exatamente o mesmo código que o anterior.

----USDJPY...
SAME AS ABOVE

---USDCHF---
SAME AS ABOVE

---AUDUSD---
SAME AS ABOVE

**Código específico
tanto a compra como a venda a descoberto podem ser executadas simultaneamente para qualquer moeda, se os critérios acima indicados atenderem
***Não é necessário nenhum prejuízo para este código.

**não há código de gerenciamento de dinheiro para este aqui

Então, como fica isso?

 
niko:

Olá lendas do mql. Eu preparei o pseudo código para você durante minha hora de almoço no trabalho. Aqui está. me diga o que está faltando e eu o acrescentarei.

Código N&P Pseudo
Com esta estratégia queremos ter 1 código, ser capazes de anexá-lo a qualquer gráfico, e ele seria executado em 5 moedas, entrando com posições curtas e longas em cada uma delas, se as regras forem cumpridas.
---EURUSD---
Se ema7>ema14>sma50 e PriceNow é < TopFilterLevel (ex:1.3080 para eurusd. Isto eu ajustarei diariamente) então:
Comprar EURUSD Lots(lotes a serem variáveis externas, por exemplo 0,01). Caso contrário: (ou seja, condições não atendidas) não comprar.

Se ema7<ema14<sma50 e PriceNow é > BottomFilterLevel (ex.: 1.1508 para eurusd) então:
Curto EURUSD Lots (variável agiana, externa). Caso contrário (ou seja, condições não atendidas não abreviam).

Se a posição BUY alcançar 20 pips a partir do ponto de entrada, então: TAKEPROFIT em EURUSD.
Se a posição SHORT alcançar 20 pips a partir do ponto de entrada, então: TAKEPROFIT em EURUSD: TAKEPROFIT em EURUSD.
Se 20 pips não forem alcançados (comprar ou vender), então continue no mercado até que a posição seja fechada.

manualmente. (o ideal é colocar isto na função OrderSend para manter o código mais curto).

----GBPUSD---
exatamente o mesmo código que o anterior.

----USDJPY...
SAME AS ABOVE

---USDCHF---
SAME AS ABOVE

---AUDUSD---
SAME AS ABOVE

**Código específico
tanto a compra como a venda a descoberto podem ser executadas simultaneamente para qualquer moeda, se os critérios acima indicados atenderem
***Não é necessário nenhum prejuízo para este código.

**não há código de gerenciamento de dinheiro para este aqui

Então, como fica isso?

Ei pessoal, o tutorial básico sobre codificação realmente me ajudou a entender isto (embora a parte de codificação detalhada esteja faltando). Para mostrar que tenho estado ocupado, anexei o código abaixo. A idéia que eu acho que está lá, mas ainda retorna muitos erros. Você verá que tudo está sob um grande parêntese em Start() a razão pela qual eu fiz isso é porque o mql continuou voltando com erro que a variável não pode ser declarada globalmente, e quando eu fiz tudo em 1 parêntese parecia ter parado esse erro (embora muitos outros erros tenham persistido). Usei o bloco de notas++ para verificar o alinhamento dos colchetes. Então, estou pelo menos seguindo o caminho certo com isto?

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

extern double    Lots=0.01;
extern double    TakeProfit=20;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+


   //-------------------Declaring All Variables and Conditions


//--------------------declaration end


int init()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
   return(0);
  }


   // Order counting code
   // Return:  0 = no orders
   //          >0 = # long orders
   //          <0 = # short orders
      int CalcOpenOrders()
         {
         int long=0,short=0;
      for(int i=0; i<OrdersTotal(); i++)   
         //i set to 0 to stop bugs from
         //crawling in, i<Orderstotal means if i is behind the number of orders
         //in market then start counting orders and make i that number
         {
         if(OrderSelect( i, SELECT_BY_POS, MODE_TRADES)==false)break;
         //this function selects an order for further processing
         if(OrderType()==OP_BUY)long++;
         if(OrderType()==OP_SELL)short++;
         }
      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.


//--------------DECLARATION OF VARIABLES-------------------------
double ema1, ema2, ema3, closeup, e1over2, e2over3, e1under2, e2under3,
eurusdbuyok, eurusdshortok;

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start ()
   {
   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(Bars<75)
      {
      Print("Bars less than 100");
      return(0);
      }


   //------------------EURUSD Block-------------------------
   //check order type, if it doesn't equal to buy already then buy


   //here i am setting a condition which will be
   //checked before a trade is opened, it shoudl state 'It's okay to enter
   //into long trade so long as there is either 1 order in place already or
   //none)
  
   // Call function. the returnvalue (output) of the function is stored into ReturnVal
   int ReturnVal = CalcOpenOrders();
  
   // Check output of function
   if ( ReturnVal >0)  // >0 = long orders. See CalcOpenOrders() 
      eurusdbuyok=1;
      else
      {
      eurusdbuyok=0;
      return(0);
      }

   if ( ReturnVal<0)   // <0 = short orders. See CalcOpenOrders()
      eurusdshortok=1;
      else
      {
      eurusdshortok=0;
      return(0);
      }


   //--------------condition ends

   if( eurusdshortok==1)
      {
      static int ticket;
      // deleted if(OrdersTotal()==0)
      if( e1under2 && e2under3)     // short function
         {
         ticket=OrderSend(Symbol(),OP_SELL, Lots,Bid,0,0,Bid- TakeProfit*Point,"ShortOrder ",0,0,Red);
         if( ticket>0)
            {
            if(OrderSelect( ticket, SELECT_BY_TICKET, MODE_TRADES))
            Print("SHORT order opened : ",OrderOpenPrice());
            }
         }
      return(0);
      }



   //  -------------------------------------------------------------------------------------------
   if ( eurusdbuyok==1)
      {
      static int ticket1;
      // deleted if(OrdersTotal()==0)
      if( e1over2 && e2over3 && eurusdbuyok==1) //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);
      }

   return(0);
   } 
esta é a última versão do código. sintaticamente tudo parece estar bem, mas quando eu o analiso através do testador de estratégia, ele não retorna nenhum negócio. algo está errado com a lógica. precisa de ajuda. Estou ficando bastante familiarizado com o código agora, bem a estrutura do lado do programa dele.
 
niko wrote >>

Olá lendas do mql. Eu preparei o pseudo código para você durante minha hora de almoço no trabalho. Aqui está. me diga o que está faltando e eu o acrescentarei.

Código N&P Pseudo
Com esta estratégia queremos ter 1 código, ser capazes de anexá-lo a qualquer gráfico, e ele seria executado em 5 moedas, entrando com posições curtas e longas em cada uma delas, se as regras forem cumpridas.
---EURUSD---
Se ema7>ema14>sma50 e PriceNow é < TopFilterLevel (ex:1.3080 para eurusd. Isto eu ajustarei diariamente) então:
Comprar EURUSD Lots(lotes a serem variáveis externas, por exemplo 0,01). Caso contrário: (ou seja, condições não atendidas) não comprar.

Se ema7<ema14<sma50 e PriceNow é > BottomFilterLevel (ex.: 1.1508 para eurusd) então:
Curto EURUSD Lots (variável agiana, externa). Caso contrário (ou seja, condições não atendidas não abreviam).

Se a posição BUY alcançar 20 pips a partir do ponto de entrada, então: TAKEPROFIT em EURUSD.
Se a posição SHORT alcançar 20 pips a partir do ponto de entrada, então: TAKEPROFIT em EURUSD: TAKEPROFIT em EURUSD.
Se 20 pips não forem alcançados (comprar ou vender), então continue no mercado até que a posição seja fechada.

manualmente. (o ideal é colocar isto na função OrderSend para manter o código mais curto).

----GBPUSD---
exatamente o mesmo código que o anterior.

----USDJPY...
SAME AS ABOVE

---USDCHF---
SAME AS ABOVE

---AUDUSD---
SAME AS ABOVE

**Código específico
tanto a compra como a venda a descoberto podem ser executadas simultaneamente para qualquer moeda, se os critérios acima indicados atenderem
***Não é necessário nenhum prejuízo para este código.

**não há código de gerenciamento de dinheiro para este aqui

Então, como fica isso?

Oi Niko

Seu pseudo-código parece muito bom para uma primeira tentativa.

No entanto, gostaria de vê-lo um pouco mais estruturado e há algumas perguntas que ele me suscita.

Consegui colocá-lo fácil e rapidamente no tipo de formato que eu mesmo normalmente utilizaria. Ele está anexado aqui como um arquivo de texto para que você possa dar uma olhada. Você precisará salvar este arquivo e abri-lo no bloco de notas ou em um editor similar para ver a formatação.

Note que, nesta fase, não estamos escrevendo em nenhuma linguagem específica de computador . Estamos apenas tentando especificar claramente e sem ambigüidade o que estamos tentando fazer.

Você pode notar que o pseudo-código é bastante específico e "legalista". É assim que temos que falar com os computadores. Precisamos explicar muito claramente o que queremos que eles façam. Caso contrário, eles têm uma tendência a gerar lixo.

Você também notará o uso de "blocos" para organizar as coisas em grupos lógicos. Estes podem ser úteis mais tarde para nos ajudar a estruturar o código adequadamente. Como alguém apontou no início desta discussão, não fazemos isso apenas por diversão. Fazemos isso para tornar o código mais legível, mais compreensível, mais fácil de manter e, finalmente, mais confiável e livre de bugs. O último é extremamente importante no software que vai ser usado para negociação ao vivo, sem que você tenha, é claro, baldes de dinheiro que está disposto a jogar fora :) . Sério, negociar já é difícil o suficiente sem ter que lidar também com software de buggy.

Por favor, dê uma olhada no que lhe enviei e sinta-se à vontade para fazer quaisquer mudanças que considere necessárias. Faltam alguns pontos importantes no meu pseudo-código. Você pode identificá-los?

Você também pode gostar de lidar com as duas questões que eu levantei no pseudo-código. Várias outras perguntas me vêm à mente, mas estas podem ser melhor deixadas até a fase de codificação propriamente dita.

Se você ainda não o fez, talvez queira experimentar o editor do Notepad++ que FXtrader2008 mencionou anteriormente nesta discussão. Use quaisquer ferramentas que você possa encontrar que facilitem um pouco a vida. Por favor, poste seu pseudo-código revisado de volta para mim como um anexo de arquivo de texto. Eu acho que tentar escrever código estruturado, pseudo ou não, neste editor HTML é um pouco entediante e confuso.

Cumprimentos

Tim

Arquivos anexados:
 
TSWilson:

Oi Niko

Seu pseudo-código parece muito bom para uma primeira tentativa.

No entanto, gostaria de vê-lo um pouco mais estruturado e há algumas perguntas que ele me suscita.

Consegui colocá-lo fácil e rapidamente no tipo de formato que eu mesmo normalmente utilizaria. Ele está anexado aqui como um arquivo de texto para que você possa dar uma olhada. Você precisará salvar este arquivo e abri-lo no bloco de notas ou em um editor similar para ver a formatação.

Note que, nesta fase, não estamos escrevendo em nenhuma linguagem específica de computador . Estamos apenas tentando especificar claramente e sem ambigüidade o que estamos tentando fazer.

Você pode notar que o pseudo-código é bastante específico e "legalista". É assim que temos que falar com os computadores. Precisamos explicar muito claramente o que queremos que eles façam. Caso contrário, eles têm uma tendência a gerar lixo.

Você também notará o uso de "blocos" para organizar as coisas em grupos lógicos. Estes podem ser úteis mais tarde para nos ajudar a estruturar o código adequadamente. Como alguém apontou no início desta discussão, não fazemos isso apenas por diversão. Fazemos isso para tornar o código mais legível, mais compreensível, mais fácil de manter e, finalmente, mais confiável e livre de bugs. O último é extremamente importante no software que vai ser usado para negociação ao vivo, sem que você tenha, é claro, baldes de dinheiro que está disposto a jogar fora :) . Sério, negociar já é difícil o suficiente sem ter que lidar também com software de buggy.

Por favor, dê uma olhada no que lhe enviei e sinta-se à vontade para fazer quaisquer mudanças que considere necessárias. Faltam alguns pontos importantes no meu pseudo-código. Você pode identificá-los?

Você também pode gostar de lidar com as duas questões que eu levantei no pseudo-código. Várias outras perguntas me vêm à mente, mas estas podem ser melhor deixadas até a fase de codificação propriamente dita.

Se você ainda não o fez, talvez queira experimentar o editor do Notepad++ que FXtrader2008 mencionou anteriormente nesta discussão. Use quaisquer ferramentas que você possa encontrar que facilitem um pouco a vida. Por favor, poste seu pseudo-código revisado de volta para mim como um anexo de arquivo de texto. Eu acho que tentar escrever código estruturado, pseudo ou não, neste editor HTML é um pouco entediante e confuso.

Cumprimentos

Tim

Hey TSW. Obrigado por isto. Vejo que você investiu muito tempo nisto, então eu realmente agradeço. Anexei o pseudo-código atualizado, mas caso não tenha sido anexado, aqui está abaixo. Tentei ver o que você perdeu, mas não consegui perceber, algumas coisas que acrescentei, mas eram apenas esclarecimentos de coisas.


Para onde vamos a partir daqui? Enquanto estamos criando este código 'próprio', eu ainda estou tentando resolver o quebra-cabeça do código acima. Ele não segue nosso pseudo-código, pois é um antigo código remendado, mas ainda estou bastante intrigado com ele como deveria funcionar, pelo menos para 1 moeda. O fundamental é construí-lo desta maneira desorganizada e ao mesmo tempo desordenada é me ensinar os elementos de codificação reais (como como os parênteses afetam o script, onde declarar variáveis, etc.). Alguma idéia sobre por que esse código não funciona como está agora?

Program Title  - N&P Pseudo Code

START BLOCK - List of Currency Pairs

     EURUSD
     GBPUSD
     USDJPY
     USDCHF
     AUDUSD

END BLOCK - List Of Currency Pairs



START BLOCK - Configuration Parameters

      Set the value of TopFilterLevel manually on a daily basis for EURUSD
      Set the value of BottomFilterLevel manually on a daily basis EURUSD
      Set the value of TopFilterLevel manually on a daily basis for GBPUSD
      Set the value of BottomFilterLevel manually on a daily basis GBPUSD

      Set the value of TopFilterLevel manually on a daily basis for USDJPY
      Set the value of BottomFilterLevel manually on a daily basis USDJPY
      Set the value of TopFilterLevel manually on a daily basis for USDCHF
      Set the value of BottomFilterLevel manually on a daily basis USDCHF

      Set the value of TopFilterLevel manually on a daily basis for AUDUSD
      Set the value of BottomFilterLevel manually on a daily basis AUDUSD

      Set Lot size manually for All positions at once (same lot size)

END BLOCK - Configuration Parameters



START BLOCK  - Entry Rules

     If   the 7 Period Exponential Moving Average is greater than the 14 Period Exponential Moving Average  AND
          the 14 Period Exponential Moving Average is greater than the  50 period Simple Moving Average       AND
          Current Price   is less than TopFilterLevel  THEN
                       Signal a  BUY (Long) entry condition

     If   the  7 Period Exponential Moving Average is less than 14 Period Exponential Moving Average  AND
          the 14 Period Exponential Moving Average is less than the 50 period Simple Moving Average       AND
          Current Price   is less than  BottomFilterLevel  THEN
                       Signal a  SELL (Short) entry condition

     ***  Question ***
      What time periods do you want to use for your moving averages? Are the periods  Minutes, Hours, Days, Weeks, Months or  do they need to be variable?
***Answer *** Excellent question. It will be 5 minute periods for all moving averages, they do not need to be variable.

END BLOCK - Entry Rules
      


START BLOCK - Manual Close

      **** Question ***
      You say 
                  "Keep being in the market until the position is closed manually.
                   (ideall we put this into OrderSend function to keep code shorter)."
       
       What exactly do you want the program to do in this block?

***I was unclear on this before, my apologies. There should be no block as this in the code. I will exit positions manually when needed through the trade/terminal window (I assume that’s possible and won’t mess up the EA execution, right). So actually I don’t know if we need to code this flexibility or not? What do you think

END BLOCK - Manual Close  



START BLOCK  - Exit Rules

     If  any Open Position is greater than or equal to 20 pips from the entry level THEN
        Close the Position

END BLOCK  - Exit Rules



START BLOCK - Main  - This block controls the whole flow of the program
         With each Currency Pair in the List of Currency Pairs block do all of the following

                  Process the Exit Rules Block - 
                                    (Note that in practice this would normally just be the automatic execution of a Take Profit  Stop
                                    but we should mention it here in the pseudo code for completness. Of course you may have something else in mind
                                    such as using the program to close an open position—nope not for this code.)
                  Check the Entry Rules block  to see if a BUY or SELL  condition exists for this Currency Pair 

                  Check to see if  there is already  an open  BUY  position for this Currency Pair
                  Check to see if  there is already  an open SELL  position for this Currency Pair

                  If there is no open BUY position  for this currency pair   AND
                      a Buy condition exixts for this currency pair THEN
                              Open a BUY Position  for this currency pair
				Size: Pre-determined Lots

ELSE		If there is already 1 open BUY position for this currency pair		DO NOT OPEN BUY Position for this currency pair.

                   If there is no open SELL position  for this currency pair   AND
                      a SELL condition exixts for this currency pair THEN
                              Open a SELL Position  for this currency pair 
				Size predetermined lots.
  
ELSE		If there is already 1 sell position open for this currency pair		Do not open SELL Positions for this currency pair     
              
END BLOCK - Main 




PS: I will often use just 1 direction on a currency pair (eg: just short, for eurusd for 2 days for instance). How could we build this into the code. My assumption is I could just put ‘//’ infront of the parts of the code I don’t want to use (Eg: infront of buy or sell orders within each currency pair) and then remove them when I need to use that part of code next time. Will this work with a code structured in this way? 

**I can’t really think of anything you left out on purpose, to be honest. Unless it’s to check if there are sufficient funds for the trade, but that’s not necessary yet. Maybe in future versions of the strategy.
 
niko wrote >>

Ei pessoal, o tutorial básico sobre codificação realmente me ajudou a entender isso (embora a parte de codificação detalhada esteja faltando). Para mostrar que tenho estado ocupado, anexei o código abaixo. A idéia que eu acho que está lá, mas ainda retorna muitos erros. Você verá que tudo está sob um grande parêntese em Start() a razão pela qual eu fiz isso é porque o mql continuou voltando com erro que a variável não pode ser declarada globalmente, e quando eu fiz tudo em 1 parêntese parecia ter parado esse erro (embora muitos outros erros tenham persistido). Usei o bloco de notas++ para verificar o alinhamento dos colchetes. Então, estou pelo menos seguindo o caminho certo com isto?

esta é a última versão do código. sintaticamente tudo parece estar bem, mas quando eu o analiso através do testador de estratégia, ele não retorna nenhum negócio. algo está errado com a lógica. precisa de ajuda. Estou ficando bastante familiarizado com o código agora, bem a estrutura do lado do programa dele.

Pessoal, qualquer ajuda com o código acima (não o pseudo código, mas o código) enquanto eu estou aprendendo a fazer da maneira correta.

Hoje eu tive um brainstorming, acho que talvez o erro seja que existe uma função que conta as ordens, e em vez disso talvez eu precise de 2 funções separadamente, uma conta as compras e outra as vendas. Eu programei o código abaixo (mudei algumas coisas para explicar isto), você pode ver abaixo. Mas mesmo assim, tudo ficou confuso, pois ainda sou um iniciante completo. Alguma idéia sobre este aqui?

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

extern double    Lots=0.01;
extern double    TakeProfit=20;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+


  //-------------------Declaring All Variables and Conditions


//--------------------declaration end


int init()
{
  return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
{
  return(0);
}


  // Order counting code
  // Return:  0 = no orders
  //          >0 = # long orders
  //          <0 = # short orders
     int CalcOpenOrders()
        {
        int long=0,short=0;
     for(int i=0;i<OrdersTotal();i++)
        //i set to 0 to stop bugs from
        //crawling in, i<Orderstotal means if i is behind the number of orders
        //in market then start counting orders and make i that number
        {
        if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)break;
        //this function selects an order for further processing
        if(OrderType()==OP_BUY)long++;
        if(OrderType()==OP_SELL)short++;
        }
     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.


//--------------DECLARATION OF VARIABLES-------------------------
double ema1,ema2,ema3,closeup, e1over2, e2over3, e1under2, e2under3,
eurusdbuyok, eurusdshortok;

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start ()
  {
  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(Bars<75)
     {
     Print("Bars less than 100");
     return(0);
     }


  //------------------EURUSD Block-------------------------
  //check order type, if it doesn't equal to buy already then buy


  //here i am setting a condition which will be
  //checked before a trade is opened, it shoudl state 'It's okay to enter
  //into long trade so long as there is either 1 order in place already or
  //none)

  // Call function. the returnvalue (output) of the function is
stored into ReturnVal
  int ReturnVal = CalcOpenOrders();

  // Check output of function
  if (ReturnVal >0)  // >0 = long orders. See CalcOpenOrders()
     eurusdbuyok=1;
     else
     {
     eurusdbuyok=0;
     return(0);
     }

  if (ReturnVal<0)   // <0 = short orders. See CalcOpenOrders()
     eurusdshortok=1;
     else
     {
     eurusdshortok=0;
     return(0);
     }


  //--------------condition ends

  if(eurusdshortok==1)
     {
     static int ticket;
     // deleted if(OrdersTotal()==0)
     if(e1under2 && e2under3)     // short function
        {
        ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,0,0,Bid-TakeProfit*Point,"ShortOrder
",0,0,Red);
        if(ticket>0)
           {
           if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
           Print("SHORT order opened : ",OrderOpenPrice());
           }
        }
     return(0);
     }



  //  -------------------------------------------------------------------------------------------
  if (eurusdbuyok==1)
     {
     static int ticket1;
     // deleted if(OrdersTotal()==0)
     if(e1over2 && e2over3 && eurusdbuyok==1) //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);
     }

  return(0);
  }

 
niko wrote >>

Pessoal, qualquer ajuda com o código acima (não o pseudo código, mas o código) enquanto estou aprendendo como fazê-lo da maneira correta.

Hoje tive um brainstorming, acho que talvez o erro seja que existe uma função que conta as ordens, e em vez disso talvez eu precise de 2 funções separadamente, uma conta as compras e outra as vendas. Eu programei o código abaixo (mudei algumas coisas para explicar isto), você pode ver abaixo. Mas mesmo assim, tudo ficou confuso, pois ainda sou um iniciante completo. Alguma idéia sobre este aqui?

Oi Niko

Com referência ao pseudo-código

A partir do código:
*** Pergunta ***
Quais períodos de tempo você deseja usar para suas médias móveis? Os períodos Minutos, Horas, Dias, Semanas, Meses ou eles precisam ser variáveis?
***Resposta *** Excelente pergunta. Serão períodos de 5 minutos para todas as médias móveis, elas não precisam ser variáveis.

Então eu sugeriria adicionar ao pseudo código na área de parâmetros de configuração uma declaração algo como

"Use um período de 5 minutos para os indicadores".


Você disse:
***I não estava claro sobre isso antes, minhas desculpas. Não deveria haver um bloqueio como este no código.

Sairei das posições manualmente quando necessário através da janela comercial/terminal

(presumo que isso seja possível e não vai atrapalhar a execução da EA, certo).

Então, na verdade eu não sei se precisamos codificar esta flexibilidade ou não? O que você acha que


Sugiro então que você simplesmente apague este bloco do pseudo-código.

Não deve haver problemas na codificação do EA para que você possa usar o terminal para fechar uma posição manualmente sem mexer em nada.

Você acrescentou estas linhas:

ELSE Se já houver 1 posição de COMPRA aberta para este par de moedas NÃO ABRIR posição de COMPRA para este par de moedas.

ELSE Se já houver 1 posição de venda aberta para este par de moedas Não abra posições de VENDA para este par de moedas


*** Pergunta *** Por que você precisa declarar especificamente o que NÃO quer que o programa faça depois que as linhas anteriores tiverem apenas

declarou o que você quer que o programa faça. Na minha opinião, o pseudo-código é o lugar para pensar cuidadosamente através de sua lógica. Caso contrário, é provável que você

se meter em uma confusão quando você começa a codificar realmente.


Você disse:
PS: Muitas vezes usarei apenas 1 direção em um par de moedas (por exemplo: apenas curta, para eurusd por 2 dias, por exemplo). Como poderíamos incorporar isto no código. Minha suposição é que eu poderia simplesmente colocar '//' infrações das partes do código que não quero usar (ex: infrações de ordens de compra ou venda dentro de cada par de moedas) e então removê-las quando eu precisar usar essa parte do código da próxima vez. Será que isto funcionará com um código estruturado desta maneira?


Comentar o código, como você sugere, não é uma maneira muito elegante de agir. Além disso, se você comentar, diga a seção "LONG" do código que você comentaria a função de abertura de posições longas para todos os pares de moedas, a menos que você produza um código com muita duplicação. Este também não é um caminho muito elegante e facilmente leva a erros.

Durante um determinado período você pode querer ser longo EURUSD, curto GBPUSD e não negociar USDCHF de forma alguma. Isto é muito fácil, mas eu gostaria de ver que você tentasse descobrir como descrevê-lo você mesmo no pseudo-código.


Aqui estão algumas dicas de uma maneira possível de fazer isso.

1. Dê uma olhada em como seus níveis são configurados e empregados

2. Os níveis são representados como números decimais. Para situações de go/no go é uma prática comum usar outro tipo de representação conhecida como booleana ou bandeira. Seria possível usar bandeiras para realizar o que você quer fazer?


Você disse:

**Não consigo pensar em nada que você tenha deixado de fora de propósito, para ser honesto. A menos que seja para verificar se há fundos suficientes para o ofício, mas isso ainda não é necessário.

Talvez em versões futuras da estratégia.


Não, não se trata de verificar se há fundos suficientes. Você disse especificamente que não se trata de gerenciamento de dinheiro, exceto, é claro, para especificar o tamanho do lote. Trata-se de algo muito mais fundamental.

De que informações você precisa para fazer um pedido? Onde e como cada um desses itens é descrito e tratado no código psuedo?


Você disse: Não:

Para onde devemos ir a partir daqui? Enquanto estamos criando este código 'próprio', eu ainda estou tentando resolver o quebra-cabeça do código acima. Ele não segue nosso pseudo-código, pois é um código antigo, mas ainda estou bastante intrigado com ele como deveria funcionar, pelo menos para 1 moeda. O fundamental é construí-lo desta maneira desorganizada e ao mesmo tempo desordenada é me ensinar os elementos de codificação reais (como como os parênteses afetam o script, onde declarar variáveis, etc.). Alguma idéia sobre por que esse código não funciona como está agora?


Eu aprecio sua frustração. Eu dei uma olhada muito rápida no código antigo, mas francamente o que você está tentando fazer não faz muito sentido logicamente. Eu poderia reescrever este pedaço de código em cerca de 15 minutos e ele faria o que você quer, mas não é essa a questão, não é? Você disse que queria aprender a escrever código. Estou me esforçando para instruí-lo a fazer isso por si mesmo.


Nico, eu não acho que você esteja muito longe de começar a escrever algum (novo) código apropriado, mas é importante que o "o que você quer fazer" seja pregado com precisão no pseudo-código primeiro.

Ele tornará a codificação "muito mais fácil", como você verá em breve.


Continue com o bom trabalho

Abraço

Tim

 

Hey Tim,


Como sempre, eu realmente aprecio seu tempo comigo. Irei em frente e modificarei o pseudo-código para que ele reflita seus comentários. Sobre código real, sem preocupações, vamos fazê-lo corretamente (às vezes sou apenas um pouco impaciente :), pois o aprendizado é mais poderoso do que qualquer coisa.

 

Hey Tim,


Passei pelo pseudo-código novamente e fiz o máximo que meu cérebro de novato pôde descobrir neste momento. Por favor, encontre-o em anexo, aguardo ansiosamente seus comentários!

Arquivos anexados:
 
niko wrote >>

Hey Tim,

Passei pelo pseudo-código novamente e fiz o máximo que meu cérebro de novato pôde descobrir neste momento. Por favor, encontre-o em anexo, aguardo ansiosamente seus comentários!

Oi Nick

Tudo isso está com bom aspecto.

Eu passei pelo seu último código psuedo e respondi a algumas perguntas, etc.

Acho que estamos quase prontos para começar a codificar.


Como regra geral, eles dizem que 1/3 do tempo de programação deve ser gasto na especificação, 1/3 na codificação e 1/3 na depuração e testes.


Portanto, podemos dizer que agora estamos a cerca de 1/3 do caminho através deste pequeno projeto!

Agora vamos falar sobre a linguagem MT4.


Todas as linguagens de computador têm formas específicas (um formato) nas quais a linguagem deve ser escrita para que o computador possa entender o que você está tentando instruí-lo a fazer. Você descobre sobre esta e outras informações específicas do idioma a partir da documentação. A documentação para MT4 ia disponível on line neste fórum. Se você ainda não o fez, sugiro que passe algum tempo dando uma olhada no tipo de informação que está disponível na documentação. Então, quando você precisar de informações sobre algum tópico ou função específica, você saberá onde procurá-la.


Para facilitar um pouco a vida, muitos idiomas modernos, incluindo o MT4, usam modelos que estabelecem um layout básico do programa para você. Estes modelos de programas são freqüentemente referidos como "feiticeiros". Você encontrará o assistente EA sob o item de menu "Novo" no MetatEditor com a cruz verde nele.


Se você abrir isto, você encontrará um modelo para "Expert Advisor". Selecione isto e você será solicitado a obter um nome EA, detalhes do autor, etc. e parâmetros. Os parâmetros podem ser adicionados ou alterados posteriormente, mas nesta etapa você pode querer inserir os parâmetros do bloco de configuração.

Você deverá dar a cada parâmetro um nome, um tipo e um valor incial.


Os nomes dos parâmetros devem ser sempre descritivos do que eles são


por exemplo EURUSD_TopFilterLevel é um nome significativo ex1 NÃO É. O uso de nomes de dados significativos torna o programa muito mais fácil de entender a depuração ou modificação posterior. Observe que no MT4, os nomes de dados são sensíveis a maiúsculas e minúsculas. LOTSize não é o mesmo que LotSize. Você precisa ser cuidadoso e consistente com os nomes dos dados.


Também será necessário especificar um tipo de dado (tipo) para cada parâmetro. MT4 usa apenas 4 tipos de dados Número inteiro (int), Número decimal (duplo), Texto (string) e Verdadeiro / Falso ou Bandeira (bool) .


Novamente precisamos ser cuidadosos com os tipos de dados e não misturá-los inconscientemente ou podemos introduzir bugs sutis.


Uma vez que você tenha criado seu modelo com o assistente, sugiro que você comece a "estruturar" seu programa . A unidade básica da estrutura no MT4 é a FUNÇÃO.


A função básica mais simples, que como está escrita aqui, na verdade nada faz é -



nulo MyBasicFunction()

{

}


O modelo gerado pelo assistente de metatrader já possui três funções vazias.



int init()

{

retorno(0)

}



init deinit()

{

retorno(0)

}



int start()

{

retorno(0)

}


A função init é chamada toda vez que o EA inicia quando você arrasta-o para um gráfico e clica no botão Expert advisor ON

A função deinit é chamada toda vez que a EA pára quando você a arrasta de um gráfico ou clica no botão Expert advisor OFF


O início é chamada em TODAS AS NOVAS TICK recebidas pelo gráfico a que está anexada. Isto significa que ele pode ser chamado várias vezes ou mais por minuto, dependendo de quão ocupado é o mercado. Aqui é de onde faremos a maior parte do nosso trabalho.


Por enquanto, sugiro que você coloque todo o pseudo-código do bloco principal na função iniciar e depois comente o pseudo-código com // em cada linha.


Em seguida, crie uma nova função própria para o bloco de regras de entrada e comente o pseudo-código da mesma forma.


Deixe as funções de init e deint vazias e como estão por enquanto.


Você deve ser capaz de compilar este código sem erros, mas é claro que nesta fase ele não fará nada.


Continue com o bom trabalho!


Cumprimentos

Tim

(PS podemos falar no skype se necessário, mas vamos apenas ver como vamos com o fórum por enquanto)

Arquivos anexados:
 

Hey Tim,

Como sempre, sua ajuda e seu tempo são altamente inestimáveis! Como gesto de agradecimento, gostaria que você enviasse uma bela garrafa de champanhe quando terminarmos o processo de codificação.

Sim, passei pelo livro do mql várias vezes, a dificuldade foi colocar a teoria em prática. Eu também imprimi cerca de 10 EA's publicadas neste site, para ver hwo coisas são codificadas e colocadas juntas, para tentar compreendê-las. E eu passo muito tempo no MT4 (ou seja, fazendo testes e aprendendo EA's já existentes) no simulador.

Inicio o processo de codificação, e faço blocos muito claros e separados para ajudar a ambos a ver o que está acontecendo. E enviá-los a você via fórum.

1 Pergunta: Você disse que as corretoras colocam em coisas para parar a tubulação agressiva. 1. O que você define "tubulação agressiva"? 2. O que eles põem em prática?

Eu costumava escalpar eurusdar manualmente em intervalos de 1min (com um método de spreadbetting), isto estava indo muito bem até que a corretora clicou e começou a colocar atrasos para execução (entrada e saída). Portanto, agora não há nenhum sentido em fazer isto com esta corretagem, mesmo sendo ilegal, os atrasos ainda acontecerão e bagunçarão o dia inteiro (como se você tipicamente escalpe apenas por 1 hora, 2 atrasos e você perdeu o tempo valioso). Recebi todo o dinheiro de volta por negócios atrasados após uma agressiva ameaça de ação judicial.

2 Pergunta: Você usa corretores diferentes? Que corretores você recomendaria? (se você estiver autorizado a mencionar nomes aqui)

obrigado,

nick