ASAR

 

Terminei de pagar às pessoas para construir meus EAs. Finalmente chegou a hora de eu mesmo fazer isso.

Eu gostaria de criar um modelo que eu possa construir ainda mais chamado ASAR (ATR Stop And Reverse), mas não tenho certeza de como começar, pois este será meu primeiro EA. Como o modelo não modificado seria apenas um ATR stop (e reverse) com tamanho de lote ATR, ele funcionaria sem parar durante toda a semana, do mercado aberto ao mercado fechado. Assim, o sinal de abertura sobre o mercado aberto seria simplesmente abrir na direção da barra anterior (que por acaso seria a última barra do fechamento do mercado anterior). Como isto só aconteceria uma vez no início da semana, será que isto exigiria um roteiro?

Como posso descobrir como codificar isto?

Já vi exemplos que levam uma pessoa através do processo de codificação, mas o problema com tais exemplos é que eles não mostram realmente a uma pessoa como descobrir coisas que não são apresentadas. Por exemplo, o livro MQL4 da MetaQuotes é bom em explicar o básico acompanhado de exemplos específicos, mas em todas as coisas que li, não me lembro de ter encontrado as informações que me permitiriam descobrir a codificação do sinal comercial inicial que escolhi para o modelo.

 
ASAR:

Como faço para descobrir como codificar isto?

Parece que você já percebeu que a codificação é a parte fácil... você pode ser ensinado como codificar, que tipos de variáveis são, qual é a sintaxe do código... mas o que você está perguntando aqui é sobre a solução de problemas. Isso é muito mais difícil de ensinar. . .

O melhor conselho que posso lhe dar é escrever o que você quer fazer . . . então escreva como você o faria se fosse uma negociação manual. . então expanda neste passo a passo como se você estivesse mostrando um novato completo no MT4 . . . então você terá algo que você pode codificar.

 
RaptorUK:

Parece que você já percebeu que a codificação é a parte fácil . . . você pode ser ensinado como codificar, que tipos de variáveis são, qual é a sintaxe do código . . . mas o que você está perguntando aqui é sobre a solução de problemas. Isso é muito mais difícil de ensinar. . .

O melhor conselho que posso lhe dar é escrever o que você quer fazer . . . então escreva como você o faria se fosse uma negociação manual . . então expanda neste passo a passo como se você estivesse mostrando um novato completo no MT4 . . . então você terá algo que você pode codificar.


Está bem, eu farei isso.

Obrigado por seu conselho. Isto certamente será uma aventura.

 

Ok, eu resolvi o problema de abertura na direção do bar anterior com

(Barra 1 Fechada > Barra 1 Aberta; OP_BUY)

(Barra 1 Fechada < Barra 1 Aberta; OP_SELL)

Agora estou me perguntando: existe um código para a abertura de um pedido no encerramento de um pedido anterior?

 
ASAR:

Ok, eu resolvi o problema de abertura na direção do bar anterior com

(Barra 1 Fechada > Barra 1 Aberta; OP_BUY)

(Barra 1 Fechada < Barra 1 Aberta; OP_SELL)

Agora estou me perguntando: existe um código para a abertura de um pedido no encerramento de um pedido anterior?


Esta não pode ser a forma como você escreve em mq4

você não precisa se perguntar se existe um código para a abertura de um pedido no encerramento de um pedido anterior

você só tem que saber como fazer...

você precisa encontrar em seu orderhistory o último negócio fechado de sua EA e então olhar para seu ordenopenprice e ordercloseprice e tipo de pedido

 

Obrigado.

Eu só precisava de algum tipo de pista para me colocar na direção certa e as informações que você me forneceu provavelmente farão isso por mim.

 

Certo, este é o código que eu gerei no site do Expert Advisor Builder para a abertura do primeiro negócio.

//+------------------------------------------------------------------+
//| This MQL is generated by Expert Advisor Builder                  |
//|                http://sufx.core.t3-ism.net/ExpertAdvisorBuilder/ |
//|                                                                  |
//|  In no event will author be liable for any damages whatsoever.   |
//|                      Use at your own risk.                       |
//|                                                                  |
//+------------------- DO NOT REMOVE THIS HEADER --------------------+
#define SIGNAL_NONE 0
#define SIGNAL_BUY   1
#define SIGNAL_SELL  2
#define SIGNAL_CLOSEBUY 3
#define SIGNAL_CLOSESELL 4
#property copyright "Expert Advisor Builder"
#property link      "http://sufx.core.t3-ism.net/ExpertAdvisorBuilder/"
extern int MagicNumber = 0;
extern bool SignalMail = False;
extern bool EachTickMode = True;
extern double Lots = 0.01;
extern int Slippage = 3;
extern bool UseStopLoss = False;
extern int StopLoss = 30;
extern bool UseTakeProfit = False;
extern int TakeProfit = 60;
extern bool UseTrailingStop = True;
extern int TrailingStop = 30;
int BarCount;
int Current;
bool TickCheck = False;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init() {
   BarCount = Bars;
   if (EachTickMode) Current = 0; else Current = 1;
   return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit() {
   return(0);
}
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start() {
   int Order = SIGNAL_NONE;
   int Total, Ticket;
   double StopLossLevel, TakeProfitLevel;
 
   if (EachTickMode && Bars != BarCount) TickCheck = False;
   Total = OrdersTotal();
   Order = SIGNAL_NONE;
   //+------------------------------------------------------------------+
   //| Variable Begin                                                   |
   //+------------------------------------------------------------------+
double Buy1_1 = iClose(NULL, 0, Current + 1);
double Buy1_2 = iOpen(NULL, 0, Current + 1);
double Sell1_1 = iClose(NULL, 0, Current + 1);
double Sell1_2 = iOpen(NULL, 0, Current + 1);
 
   
   //+------------------------------------------------------------------+
   //| Variable End                                                     |
   //+------------------------------------------------------------------+
   //Check position
   bool IsTrade = False;
   for (int i = 0; i < Total; i ++) {
      OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
      if(OrderType() <= OP_SELL &&  OrderSymbol() == Symbol()) {
         IsTrade = True;
         if(OrderType() == OP_BUY) {
            //Close
            //+------------------------------------------------------------------+
            //| Signal Begin(Exit Buy)                                           |
            //+------------------------------------------------------------------+
            
            //+------------------------------------------------------------------+
            //| Signal End(Exit Buy)                                             |
            //+------------------------------------------------------------------+
            if (Order == SIGNAL_CLOSEBUY && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {
               OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, MediumSeaGreen);
               if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Bid, Digits) + " Close Buy");
               if (!EachTickMode) BarCount = Bars;
               IsTrade = False;
               continue;
            }
            //Trailing stop
            if(UseTrailingStop && TrailingStop > 0) {                 
               if(Bid - OrderOpenPrice() > Point * TrailingStop) {
                  if(OrderStopLoss() < Bid - Point * TrailingStop) {
                     OrderModify(OrderTicket(), OrderOpenPrice(), Bid - Point * TrailingStop, OrderTakeProfit(), 0, MediumSeaGreen);
                     if (!EachTickMode) BarCount = Bars;
                     continue;
                  }
               }
            }
         } else {
            //Close
            //+------------------------------------------------------------------+
            //| Signal Begin(Exit Sell)                                          |
            //+------------------------------------------------------------------+
            
            //+------------------------------------------------------------------+
            //| Signal End(Exit Sell)                                            |
            //+------------------------------------------------------------------+
            if (Order == SIGNAL_CLOSESELL && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {
               OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, DarkOrange);
               if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Ask, Digits) + " Close Sell");
               if (!EachTickMode) BarCount = Bars;
               IsTrade = False;
               continue;
            }
            //Trailing stop
            if(UseTrailingStop && TrailingStop > 0) {                 
               if((OrderOpenPrice() - Ask) > (Point * TrailingStop)) {
                  if((OrderStopLoss() > (Ask + Point * TrailingStop)) || (OrderStopLoss() == 0)) {
                     OrderModify(OrderTicket(), OrderOpenPrice(), Ask + Point * TrailingStop, OrderTakeProfit(), 0, DarkOrange);
                     if (!EachTickMode) BarCount = Bars;
                     continue;
                  }
               }
            }
         }
      }
   }
   //+------------------------------------------------------------------+
   //| Signal Begin(Entry)                                              |
   //+------------------------------------------------------------------+
   if (Buy1_1 > Buy1_2) Order = SIGNAL_BUY;
   if (Sell1_1 < Sell1_2) Order = SIGNAL_SELL;
   //+------------------------------------------------------------------+
   //| Signal End                                                       |
   //+------------------------------------------------------------------+
   //Buy
   if (Order == SIGNAL_BUY && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {
      if(!IsTrade) {
         //Check free margin
         if (AccountFreeMargin() < (1000 * Lots)) {
            Print("We have no money. Free Margin = ", AccountFreeMargin());
            return(0);
         }
         if (UseStopLoss) StopLossLevel = Ask - StopLoss * Point; else StopLossLevel = 0.0;
         if (UseTakeProfit) TakeProfitLevel = Ask + TakeProfit * Point; else TakeProfitLevel = 0.0;
         Ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, StopLossLevel, TakeProfitLevel, "Buy(#" + MagicNumber + ")", MagicNumber, 0, DodgerBlue);
         if(Ticket > 0) {
            if (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES)) {
    Print("BUY order opened : ", OrderOpenPrice());
                if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Ask, Digits) + " Open Buy");
   } else {
    Print("Error opening BUY order : ", GetLastError());
   }
         }
         if (EachTickMode) TickCheck = True;
         if (!EachTickMode) BarCount = Bars;
         return(0);
      }
   }
   //Sell
   if (Order == SIGNAL_SELL && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {
      if(!IsTrade) {
         //Check free margin
         if (AccountFreeMargin() < (1000 * Lots)) {
            Print("We have no money. Free Margin = ", AccountFreeMargin());
            return(0);
         }
         if (UseStopLoss) StopLossLevel = Bid + StopLoss * Point; else StopLossLevel = 0.0;
         if (UseTakeProfit) TakeProfitLevel = Bid - TakeProfit * Point; else TakeProfitLevel = 0.0;
         Ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, StopLossLevel, TakeProfitLevel, "Sell(#" + MagicNumber + ")", MagicNumber, 0, DeepPink);
         if(Ticket > 0) {
            if (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES)) {
    Print("SELL order opened : ", OrderOpenPrice());
                if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Bid, Digits) + " Open Sell");
   } else {
    Print("Error opening SELL order : ", GetLastError());
   }
         }
         if (EachTickMode) TickCheck = True;
         if (!EachTickMode) BarCount = Bars;
         return(0);
      }
   }
   if (!EachTickMode) BarCount = Bars;
   return(0);
}
//+------------------------------------------------------------------+


And this is a loop that's been suggested to me that I'd like to add but am unsure of where to apply it.
 

for(int i=0;i < OrdersHistoryTotal() ;i++)
  {
   OrderSelect(i, 
SELECT_BY_POS)
   
   if (OrderMagicNumber() == InstanceID)
  
lastClosedDirection = OrderType() ;
  }

Can anyone tell me where this should be applied? 
 
ASAR:

Certo, este é o código que eu gerei no site do Expert Advisor Builder para a abertura do primeiro negócio.

Oh querido . . . leia este post e o resto do tópico:https://www.mql5.com/en/forum/139608
 
ASAR:

E este é um loop que me foi sugerido que eu gostaria de acrescentar, mas não tenho certeza de onde aplicá-lo.

O que esse código faz ? o que é InstanceID ? o que você vai fazer com a lastClosedDirection ?
 
Se você quiser usar o código Expert Advisor Builder, sugiro que você vá ao Fórum deles para obter ajuda: http://sufx.core.t3-ism.net/ExpertAdvisorBuilder/forum/viewforum.php?f=4
 
ASAR:

Certo, este é o código que eu gerei no site do Expert Advisor Builder para a abertura do primeiro negócio.

Quando eu estava na faculdade, nossa primeira palestra sobre computação foi para o palestrante dizer olá. Ele então disse "compre o livro e siga em frente". "Se você tiver problemas, haverá sessões de laboratório e você pode perguntar aos alunos de pós-graduação" - que são obrigados a ajudar durante estas sessões de laboratório. Você não tende a ensinar computação; você permite que a pessoa aprenda. Um dos primeiros programas do livro que define a linguagem de programação C é escrever "HELLO WORLD" para a tela. Há uma razão pela qual não lhe é dado um programa de 1000 linhas e lhe é dito para fazer mudanças nele!

Este chamado "Expert Adviser Builder" é uma responsabilidade para qualquer pessoa que esteja seriamente empenhada em fazer EAs e trocá-los por dinheiro. Você precisa ser capaz de olhar para qualquer linha de código em seu EA e saber o que ele está fazendo e por quê. Eu não usaria o código de qualquer outra pessoa. Olhe e veja o que eles estão fazendo e faça algo semelhante por todos os meios, mas escreva você mesmo todas as linhas - se você está levando isso a sério.

E o código do construtor da EA não é um bom código IMHO.

Razão: