ASAR

 

I am finished paying people to build my EAs. It's finally time that I do this myself.

I would like to create a template that I can further build upon called ASAR (ATR Stop And Reverse) but am unsure of how to begin as this will be my first EA. Because the unmodified template would just be an ATR trailing stop (and reverse) with ATR lot sizing, it would run non-stop throughout the week from market open to market close. Thus, the opening trade signal upon the market open would simply be to open in the direction of the previous bar (which would happen to be the last bar of the previous market close). Since this would only happen once at the beginning of the week, would this call for a script?

How do I go about figuring out how to code this?

I've seen examples that take a person through the coding process but the problem with such examples is that they don't really show a person how to figure out things that aren't presented. For instance, MetaQuotes' MQL4 book is good at explaining the basics accompanied by specific examples, but in all the things that I've read, I don't recall coming across the information that would enable me to figure out the coding of the initial trade signal I've chosen for the template.

 
ASAR:

How do I go about figuring out how to code this?

It sounds like you have realised that coding is the easy part . . . you can be taught how to code, what variable types are, what the code syntax is . . . but what you are asking about here is problem solving. That is much harder to teach . . .

The best advice I can give you is write down what you want to do . . . then write down how you would do it if manual trading . . . then expand on this step by step as if you were showing a complete novice at MT4 . . . then you will have something that you can code.

 
RaptorUK:

It sounds like you have realised that coding is the easy part . . . you can be taught how to code, what variable types are, what the code syntax is . . . but what you are asking about here is problem solving. That is much harder to teach . . .

The best advice I can give you is write down what you want to do . . . then write down how you would do it if manual trading . . . then expand on this step by step as if you were showing a complete novice at MT4 . . . then you will have something that you can code.


Okay, I'll do that.

Thanks for your advice. This will certainly be an adventure.

 

Okay, I've solved the problem of opening in the direction of the previous bar with

(Bar 1 Close > Bar 1 Open; OP_BUY)

(Bar 1 Close < Bar 1 Open; OP_SELL)

Now I'm wondering, is there a code for the opening of an order upon the close of a previous order?

 
ASAR:

Okay, I've solved the problem of opening in the direction of the previous bar with

(Bar 1 Close > Bar 1 Open; OP_BUY)

(Bar 1 Close < Bar 1 Open; OP_SELL)

Now I'm wondering, is there a code for the opening of an order upon the close of a previous order?


This can't be the way you write it in mq4

you don't need wondering if there is a code for the opening of an order upon the close of a previous order

you only have to know how to do it...

you need to find in your orderhistory the last closed trade of your EA and then look to its orderopenprice and ordercloseprice and ordertype

 

Thank you.

I just needed some kind of clue to set me in the right direction and the information you've provided will probably do that for me.

 

Okay, this is the code I've generated at the Expert Advisor Builder site for opening the first trade.

//+------------------------------------------------------------------+
//| 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:

Okay, this is the code I've generated at the Expert Advisor Builder site for opening the first trade.

Oh dear . . . read this post and the rest of the thread: https://www.mql5.com/en/forum/139608
 
ASAR:

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.

What does that code do ? what is InstanceID ? what are you going to do with lastClosedDirection ?
 
If you want to use Expert Advisor Builder code I suggest you go to their Forum for help: http://sufx.core.t3-ism.net/ExpertAdvisorBuilder/forum/viewforum.php?f=4
 
ASAR:

Okay, this is the code I've generated at the Expert Advisor Builder site for opening the first trade.

When I was at college our first lecture on computing was for the lecturer to say hello. He then said "buy the book and get on with it". "If you have problems then there will be lab sessions and you can ask the post-grad students" - who are required to help out during these lab sessions. You don't tend to teach computing; you allow the person to learn. One of the first programs in the book defining the C programming language is to write "HELLO WORLD" to the screen. There is a reason why you are not given a 1000 line program and told to make changes to it!

This so called Expert Adviser Builder is a liability to anyone who is serious about making EAs and trading them for money. You need to be able to look at any line of code in your EA and know what it is doing and why. I would not use anybody else's code. Look and see what they are doing and do something similar by all means, but write every line yourself - if you are serious about it.

And the EA builder code is not good code IMHO.

Reason: