ASAR

 

Ho finito di pagare persone per costruire i miei EA. È finalmente giunto il momento di farlo da solo.

Vorrei creare un modello su cui posso costruire ulteriormente chiamato ASAR (ATR Stop And Reverse) ma non sono sicuro di come iniziare, dato che questo sarà il mio primo EA. Poiché il modello non modificato sarebbe solo un ATR trailing stop (e reverse) con ATR lot sizing, verrebbe eseguito non-stop per tutta la settimana dall'apertura alla chiusura del mercato. Quindi, il segnale di apertura all'apertura del mercato sarebbe semplicemente quello di aprire nella direzione della barra precedente (che sarebbe l'ultima barra della chiusura del mercato precedente). Dato che questo accadrebbe solo una volta all'inizio della settimana, questo richiederebbe uno script?

Come faccio a capire come codificare questo?

Ho visto esempi che portano una persona attraverso il processo di codifica, ma il problema con tali esempi è che non mostrano veramente come capire le cose che non sono presentate. Per esempio, il libro MQL4 di MetaQuotes è buono per spiegare le basi accompagnate da esempi specifici, ma in tutte le cose che ho letto, non ricordo di aver trovato le informazioni che mi avrebbero permesso di capire la codifica del segnale di trading iniziale che ho scelto per il modello.

 
ASAR:

Come faccio a capire come codificare questo?

Sembra che tu abbia capito che la codifica è la parte facile... ti si può insegnare come codificare, quali sono i tipi di variabili, qual è la sintassi del codice... ma quello che stai chiedendo qui è la risoluzione dei problemi. Questo è molto più difficile da insegnare . . .

Il miglior consiglio che posso darti è di scrivere ciò che vuoi fare . . . poi scrivi come lo faresti se il trading fosse manuale. . . poi espandi questo passo per passo come se stessi mostrando a un completo principiante MT4 . . . poi avrai qualcosa che puoi codificare.

 
RaptorUK:

Sembra che tu abbia capito che la codifica è la parte facile. . . si può insegnare come codificare, quali sono i tipi di variabili, qual è la sintassi del codice. . . ma quello che stai chiedendo qui è la risoluzione dei problemi. Questo è molto più difficile da insegnare . . .

Il miglior consiglio che posso darti è di scrivere quello che vuoi fare . . . poi scrivi come lo faresti se il trading fosse manuale . . . poi espandi questo passo per passo come se stessi mostrando un completo novizio di MT4 . . . allora avrai qualcosa che puoi codificare.


Ok, lo farò.

Grazie per i vostri consigli. Questa sarà certamente un'avventura.

 

Ok, ho risolto il problema dell'apertura nella direzione della barra precedente con

(Chiusura della barra 1 > Apertura della barra 1; OP_BUY)

(Bar 1 Close < Bar 1 Open; OP_SELL)

Ora mi chiedo: esiste un codice per l'apertura di un ordine alla chiusura di un ordine precedente?

 
ASAR:

Ok, ho risolto il problema dell'apertura nella direzione della barra precedente con

(Chiusura della barra 1 > Apertura della barra 1; OP_BUY)

(Bar 1 Close < Bar 1 Open; OP_SELL)

Ora mi chiedo: esiste un codice per l'apertura di un ordine alla chiusura di un ordine precedente?


Questo non può essere il modo in cui si scrive in mq4

non è necessario chiedersi se esiste un codice per l'apertura di un ordine alla chiusura di un ordine precedente

devi solo sapere come farlo...

devi trovare nella tua orderhistory l'ultimo trade chiuso del tuo EA e poi cercare il suo orderopenprice e ordercloseprice e ordertype

 

Grazie.

Avevo solo bisogno di qualche indizio per mettermi nella giusta direzione e le informazioni che hai fornito probabilmente lo faranno per me.

 

Ok, questo è il codice che ho generato nel sito Expert Advisor Builder per aprire il primo 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:

Ok, questo è il codice che ho generato nel sito Expert Advisor Builder per aprire il primo trade.

Oh caro . . . leggi questo post e il resto del thread:https://www.mql5.com/en/forum/139608
 
ASAR:

E questo è un ciclo che mi è stato suggerito e che vorrei aggiungere ma non sono sicuro di dove applicarlo.

Cosa fa questo codice? Cos'è InstanceID? Cosa farai con lastClosedDirection?
 
Se vuoi usare il codice di Expert Advisor Builder ti suggerisco di andare sul loro Forum per avere aiuto: http://sufx.core.t3-ism.net/ExpertAdvisorBuilder/forum/viewforum.php?f=4
 
ASAR:

Ok, questo è il codice che ho generato sul sito di Expert Advisor Builder per aprire il primo trade.

Quando ero all'università, la nostra prima lezione di informatica consisteva nel saluto del docente. Poi ha detto "compra il libro e vai avanti", "se hai problemi ci saranno sessioni di laboratorio e puoi chiedere agli studenti post-laurea" - che sono tenuti a dare una mano durante queste sessioni di laboratorio. Non si tende ad insegnare l'informatica; si permette alla persona di imparare. Uno dei primi programmi nel libro che definisce il linguaggio di programmazione C è scrivere "CIAO MONDO" sullo schermo. C'è una ragione per cui non ti viene dato un programma di 1000 linee e ti viene detto di apportarvi delle modifiche!

Questo cosiddetto Expert Adviser Builder è una responsabilità per chiunque sia seriamente intenzionato a creare EAs e a farne trading per soldi. Devi essere in grado di guardare qualsiasi linea di codice nel tuo EA e sapere cosa sta facendo e perché. Non userei il codice di nessun altro. Guarda e vedi cosa stanno facendo e fai qualcosa di simile con tutti i mezzi, ma scrivi ogni linea da solo - se fai sul serio.

E il codice di EA builder non è un buon codice IMHO.

Motivazione: