ASAR

 

He terminado de pagar a la gente para construir mis EAs. Por fin es hora de que lo haga yo mismo.

Me gustaría crear una plantilla sobre la que pueda seguir construyendo llamada ASAR (ATR Stop And Reverse) pero no estoy seguro de cómo empezar ya que este será mi primer EA. Debido a que la plantilla no modificada sería sólo un ATR trailing stop (e inverso) con tamaño de lote ATR, se ejecutaría sin parar durante toda la semana desde la apertura del mercado hasta el cierre del mercado. Por lo tanto, la señal de apertura al abrir el mercado sería simplemente abrir en la dirección de la barra anterior (que sería la última barra del cierre del mercado anterior). Dado que esto sólo ocurriría una vez al principio de la semana, ¿se necesitaría un script?

¿Cómo puedo averiguar cómo codificar esto?

He visto ejemplos que llevan a una persona a través del proceso de codificación, pero el problema con tales ejemplos es que no muestran realmente a una persona cómo averiguar cosas que no se presentan. Por ejemplo, el libro MQL4 de MetaQuotes es bueno para explicar los fundamentos acompañados de ejemplos específicos, pero en todo lo que he leído, no recuerdo haber encontrado la información que me permitiría averiguar la codificación de la señal de comercio inicial que he elegido para la plantilla.

 
ASAR:

¿Cómo puedo averiguar cómo codificar esto?

Parece que te has dado cuenta de que la codificación es la parte fácil... te pueden enseñar cómo codificar, qué tipos de variables hay, cuál es la sintaxis del código... pero lo que estás preguntando aquí es la resolución de problemas. Eso es mucho más difícil de enseñar...

El mejor consejo que puedo darte es que escribas lo que quieres hacer. . . luego escribe cómo lo harías si el trading fuera manual. . . luego amplía esto paso a paso como si estuvieras mostrando a un completo novato en MT4. . . entonces tendrás algo que puedas codificar.

 
RaptorUK:

Parece que te has dado cuenta de que la codificación es la parte fácil... te pueden enseñar cómo codificar, cuáles son los tipos de variables, cuál es la sintaxis del código... pero lo que estás preguntando aquí es la resolución de problemas. Eso es mucho más difícil de enseñar...

El mejor consejo que puedo darle es escribir lo que quiere hacer . . luego escribir cómo lo haría si el comercio manual . . luego ampliar en este paso a paso como si estuviera mostrando un completo novato en MT4 . . entonces usted tendrá algo que usted puede código.


De acuerdo, lo haré.

Gracias por sus consejos. Esto será sin duda una aventura.

 

Bien, he resuelto el problema de la apertura en la dirección de la barra anterior con

(Cierre de la barra 1 > Apertura de la barra 1; OP_BUY)

(Cierre de la barra 1 < Apertura de la barra 1; OP_SELL)

Ahora me pregunto, ¿hay algún código para la apertura de una orden al cierre de una orden anterior?

 
ASAR:

Bien, he resuelto el problema de la apertura en la dirección de la barra anterior con

(Cierre de la barra 1 > Apertura de la barra 1; OP_BUY)

(Cierre de la barra 1 < Apertura de la barra 1; OP_SELL)

Ahora me pregunto, ¿hay algún código para la apertura de una orden al cierre de una orden anterior?


Esta no puede ser la forma en que se escribe en mq4

no necesitas preguntarte si hay un código para la apertura de una orden al cierre de una orden anterior

sólo tienes que saber cómo hacerlo...

tienes que encontrar en tu historial de órdenes la última operación cerrada de tu EA y luego mirar su ordereropenprice y ordercloseprice y ordertype

 

Gracias.

Sólo necesitaba algún tipo de pista para ponerme en la dirección correcta y la información que has proporcionado probablemente lo hará por mí.

 

Bien, este es el código que he generado en el sitio Expert Advisor Builder para abrir la primera operación.

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

Bien, este es el código que he generado en el sitio Expert Advisor Builder para abrir la primera operación.

Oh querido ... leer este post y el resto del hilo:https://www.mql5.com/en/forum/139608
 
ASAR:

Y este es un bucle que me han sugerido que me gustaría añadir pero no estoy seguro de dónde aplicarlo.

¿Qué hace ese código? ¿Qué es InstanceID? ¿Qué vas a hacer con lastClosedDirection?
 
Si quieres usar el código de Expert Advisor Builder te sugiero que vayas a su Foro para obtener ayuda: http://sufx.core.t3-ism.net/ExpertAdvisorBuilder/forum/viewforum.php?f=4
 
ASAR:

Bien, este es el código que he generado en el sitio Expert Advisor Builder para abrir la primera operación.

Cuando estaba en la universidad, la primera clase de informática era para saludar al profesor. Si tenéis problemas, habrá sesiones de laboratorio y podréis preguntar a los estudiantes de postgrado, que están obligados a ayudar durante estas sesiones de laboratorio. No se tiende a enseñar informática; se deja que la persona aprenda. Uno de los primeros programas del libro que define el lenguaje de programación C consiste en escribir "HELLO WORLD" en la pantalla. ¡Hay una razón por la que no se le da un programa de 1000 líneas y se le dice que haga cambios en él!

Este llamado Expert Adviser Builder es un lastre para cualquier persona que se tome en serio la creación de EAs y el comercio con ellos por dinero. Tienes que ser capaz de mirar cualquier línea de código en tu EA y saber lo que está haciendo y por qué. Yo no usaría el código de nadie más. Mire y vea lo que están haciendo y haga algo similar por todos los medios, pero escriba cada línea usted mismo - si usted es serio sobre él.

Y el código del constructor de EA no es un buen código en mi opinión.