SOLO CANDELA / BAR - Come catalogare o segregare la candela? - PER FAVORE CORREGGIMI! - pagina 2

 
Wodzuuu:

Per coloro che ancora non capiscono il mio EA scrivere una storia: D hehehe


L'evento è candele - dispone di varie opzioni per l' acquisto e la vendita o la chiusura.

Capisco più guardando il tuo codice che leggendo quello che hai scritto . . ;-)
 

Invece di guardare programmi televisivi come seconda funzione dovresti considerare di leggere e capire il Libro. ;-)

Quello che stai cercando di ottenere è diretto e usato in molte strategie, ma il tuo codice - e le tue storie - sono confuse e parzialmente sbagliate - almeno il codice.... non sono sicuro delle storie.

//Pseudo code

if(NewBar) ResetSignals();                //Set all SignalxExecuted to false
if(SignalBuy1&&!SignalBuy1Executed&&OpenOrders()==1){
//do open buy position
  SignalBuy1Executed=true;                //Set Signal to exectued to prevent a reuse in the same bar
}

if(SignalBuy2&&!SignalBuy2Executed&&OpenOrders()==2){
//do open buy position
  SignalBuy2Executed=true;                //Set Signal to exectued to prevent a reuse in the same bar
}

SignalBuy1=CheckForOpenBull42();          //Check for Signal1 condition is true
SignalBuy2=CheckForOpenBull62();	  //Check for Signal2 condition is true	

if(OpenOrders()>0)CheckForClose();        //Check any order needs to be closed


//and so on.....

Perché non provi ad implementare un solo segnale per il momento e ti concentri sulla codifica delle funzioni necessarie? Se hai un buon codice per un segnale è probabilmente facile implementare gli altri segnali e molte funzioni sono già presenti.

Più tardi potresti usare Arrays e altre funzioni per semplificarlo, ma la semplificazione del tuo codice sopra non dovrebbe essere il tuo problema più grande in questo momento.

 

Kronin Sì, mi hai capito :), molte strategie in un solo EA.
Devo scrivere 150 politiche e devono camminare allo stesso tempo sullo stesso grafico, ed eseguire tutte le strategie in una volta. Quando eseguo 150 EA allo stesso tempo il mio PC esploderà - penso così.

Dopo di che, è inutile perché puoi avere un soloEA di strategia e molti già dentro.

Naturalmente, la strategia non può interferire con l' altro fuori e quando si esegue uno il secondo può eseguire anche, e posso avere eseguito strategie 1, e 3 e 5. e strategie (1,3,5) in esecuzione nello stesso momento.

Non scriverò altre storie :)


Ilmio codice è sbagliato - è noto, ho provato a mettere le due strategie in un unico EA, il codice funziona bene ma la totalità non funziona bene

Iltuocodice è molto interessante, lo studierò, per favore dammi un po' di tempo

 

Ciao amici, dopo un lungo lavoro nel codice e attraverso le informazioni da Kronin il codice è strutturato e funziona.
Ilcodice presenta due strategie in un unico EA


1.Per una piccola candela scenario di acquisto è contrassegnato da una freccia blu, sono due opzioni per BUY
2. Per la candela media scenario diacquisto è contrassegnato da una freccia rossa, sono tre opzioni per BUY


Ho ancheuna situazione in cui 1 punto = 1 pip è conveniente (per risolvere il problema è per dopo)
Non utilizzare leopzioni se (NewBar) ResetSignals () perché penso che non sono la causa dell 'errore

Se si elimina una funzione PART 2 in start() blu una strategia funzionerà, e funziona bene
Se si esegue il codice PART1 e PART2 contenente due strategie di lancio , ma si sovrappongono. questo è l'errore

Potresti dare un'occhiata Kronin

//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
#define MAGICMA  20050610

//+------------------------------------------------------------------+
//| Check NEW BAR     WORK AT BARS  M15                                 |
//+------------------------------------------------------------------+
/*

bool New_Bar = false;

bool Fun_New_Bar()                

   {                                
   static datetime New_Time=0;      
   New_Bar=false;                   
   if(New_Time!=Time[0])           
      {
      New_Time=Time[0];                
      New_Bar=true;                    
      }
   }
*/

//+------------------------------------------------------------------+
//| Calculate open positions    HOW MEANY OF THIS                    |
//+------------------------------------------------------------------+

int OpenOrders(string symbol)
  {
   int buys=0,sells=0;
//----
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break; 
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)
        {
         if(OrderType()==OP_BUY) buys++;
        }
     }
//---- return orders volume
   return(buys);
  }

//+------------------------------------------------------------------+
//| Calculate candle      These is condidion                         |
//+------------------------------------------------------------------+

// scenario 1 / EA 1  /  startegy 1 / blue

bool BULL4()
   {
   if(Close[1]-Open[1]>=4*Point && Close[1]-Open[1]<=5*Point)
   return(true);
   } 

// scenario 2 / EA 2  /  startegy 2 / red

bool BULL6()
   {
   if(Close[1]-Open[1]>=6*Point && Close[1]-Open[1]<=7*Point)
   return(true);
   }
      
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+

// Check for open for scenario 1 / EA 1  /  startegy 1 
 
bool OpenBULL41()
  {
   int    res;
   if(Bid==Close[1]+3*Point)  
     {
      res=OrderSend(Symbol(),OP_BUY,0.41,Ask,0,Close[1]-25*Point,0,"",MAGICMA,0,Blue);
      return (true);
     }
   return (false);  
  }
  
//----------------------------------- 
bool OpenBULL42()
  {
   int    res;
   if(Ask>OrderOpenPrice()+4*Point)  
     {
      res=OrderSend(Symbol(),OP_BUY,0.42,Ask,0,Close[1]-25*Point,0,"",MAGICMA,0,Blue);
      return;
     }
  }  
  
// Check for open for scenario 2 / EA 2  /  startegy 2
  
void OpenBULL61()
  {
   int    res;
   if(Bid==Close[1]+4*Point)  
     {
      res=OrderSend(Symbol(),OP_BUY,0.61,Ask,0,Close[1]-25*Point,0,"",MAGICMA,0,Red);
      return;
     }
  }
//-----------------------------------  
 
void OpenBULL62()
  {
   int    res;
   if(Ask>OrderOpenPrice()+2*Point)  
     {
      res=OrderSend(Symbol(),OP_BUY,0.62,Ask,0,Close[1]-25*Point,0,"",MAGICMA,0,Red);
      return;
     }
  }
  
//----------------------------------- 
void OpenBULL63()
  {
   int    res;
   if(Ask>OrderOpenPrice()+2*Point)  
     {
      res=OrderSend(Symbol(),OP_BUY,0.63,Ask,0,Close[1]-25*Point,0,"",MAGICMA,0,Red);
      return;
     }
  }
//+------------------------------------------------------------------+
//| Check for close order conditions                                 |
//+------------------------------------------------------------------+

void CheckForClose()
{
   RefreshRates();
   if(OrderOpenPrice()+4*Point< Ask)
   for (int i = OrdersTotal()-1; i >= 0;i--)       // I Have do -1 in "OrdersTotal()-1"
   {
      OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
      if (OrderSymbol() == Symbol()) 
      {
         bool ticket = true;
         if (OrderType() == OP_BUY) ticket = OrderClose(OrderTicket(),OrderLots(),Bid,1,Black);

      }
   }
} 
/*
void CheckForClose2()
{
   RefreshRates();
   if(OrderOpenPrice()+6*Point< Ask)
   for (int i = OrdersTotal(); i >= 0;i--)
   {
      OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
      if (OrderSymbol() == Symbol()) 
      {
         bool ticket = true;
         if (OrderType() == OP_BUY) ticket = OrderClose(OrderTicket(),OrderLots(),Bid,1,Black);

      }
   }
} 
*/
                                       
//+------------------------------------------------------------------+
//| Start function                                 |
//+------------------------------------------------------------------+
void start()
  {
      
//------------------                                                          PART1      
           bool SignalBULL41Executed=false;
            if(BULL4() && !SignalBULL41Executed && OpenOrders(Symbol())==0)
               {
               OpenBULL41();//do open buy position
               SignalBULL41Executed=true;
               }
               
            bool SignalBULL42Executed=false;
            if(!SignalBULL42Executed && OpenOrders(Symbol())==1)
               {
               OpenBULL42();//do open buy position
               SignalBULL42Executed=true;
               }  
               
            if(OpenOrders(Symbol())>0)CheckForClose();  
            
//------------------                                                          PART 2
            
            bool SignalBULL61Executed=false;
            if(BULL6() && !SignalBULL61Executed && OpenOrders(Symbol())==0)
               {
               OpenBULL61();//do open buy position
               SignalBULL61Executed=true;
               }
               
            bool SignalBULL62Executed=false;
            if(!SignalBULL62Executed && OpenOrders(Symbol())==1)
               {
               OpenBULL62();//do open buy position
               SignalBULL62Executed=true;
               }  
               
           bool SignalBULL63Executed=false;
            if(!SignalBULL63Executed && OpenOrders(Symbol())==2)
               {
               OpenBULL63();//do open buy position
               SignalBULL63Executed=true;
               }                
               
//            if(SignalBULL61Executed && OpenOrders(Symbol())>0)CheckForClose2();                    
            
  }
//+------------------------------------------------------------------+
 
Wodzuuu:

Non usate leopzioni if (NewBar) ResetSignals () perché penso che non siano la causa dell 'errore

Il modo in cui la funzione Fun_NewBar() è codificata non vi permetterà di farlo. . . dovete farlo così in modo che sia di tipo bool e restituisca un valore bool. . .

bool Fun_New_Bar()                
   {                                
   static datetime New_Time=0;      
                     
   if(New_Time!=Time[0])           
      {
      New_Time=Time[0];                
      return(true);       // <---- we have a new bar so the function returns true
      }

   return(false);
   }
 

hai ragione restituisce bool e c'è int (già fissato) non vedo prima. Grazie
Ma questa funzione non uso, è come un testo

Non credo che questo si applichi alle funzioni che mi separadue strategie sovrapposte. Non vedo la relazione. O forse mi sbaglio?

//Pseudo code

if(NewBar) ResetSignals();                //Set all SignalxExecuted to false
if(SignalBuy1&&!SignalBuy1Executed&&OpenOrders()==1){
//do open buy position
  SignalBuy1Executed=true;                //Set Signal to exectued to prevent a reuse in the same bar
}
 

È bello vedere che hai fatto dei progressi, ma c'è ancora molta strada da fare :-)

Devi sistemare quello che RaptorUK ha detto sopra. Il reset dei segnali è importante, altrimenti l'EA si ferma abbastanza presto con l'apertura di nuovi trade.
La tua implementazione è sbagliata. Se azzeri il SignalExecuted ad ogni tick, non ha senso. Forse non apre più trade, perché filtri anche gli OpenOrders. Ma, dato che la tua strategia permette di avere più ordini aperti, posso immaginare che tu voglia anche un algoritmo per chiudere gli ordini, quindi hai bisogno che il flag SignalExecuted venga resettato su una nuova barra (con la tua implementazione è inutile e non ti serve).

Se ho capito bene, non eseguirai BULL4 se anche BULL6 è vero. O in altre parole, solo la strategia blu, se la strategia rossa non è valida, o la piccola candela solo se la candela media non è valida.

if(BULL4()&&!BULL6(){             // <--- only strategy BULL4 is valid, we are looking at a 'small' bar.
  if(!SignalBULL41Executed && OpenOrders(Symbol())==0){
    OpenBULL41();//do open buy position
    SignalBULL41Executed=true;
  }
  if(!SignalBULL42Executed && OpenOrders(Symbol())==1){
    OpenBULL42();//do open buy position
    SignalBULL42Executed=true;
}
 

I prossimi passi:

// Check for open for scenario 1 / EA 1  /  startegy 1 
 
bool OpenBULL41()
  {
   int    res;
   if(Bid==Close[1]+3*Point)  					                       // <--- equal makes no sense here and you should not compare doubles for equality. 
                                                                                                  Read (again): https://www.mql5.com/en/forum/136997 
     {
      res=OrderSend(Symbol(),OP_BUY,0.41,Ask,0,Close[1]-25*Point,0,"",MAGICMA,0,Blue); // <--- what is your plan with res? You are aware, it does include the ticket 
                                                                                                  number or -1, aren't you?

      return (true);                                                                   // <--- Even if OrderSend() fails you return true.
     }
   return (false);  
  }
  
//----------------------------------- 
bool OpenBULL42()
  {
   int    res;
   if(Ask>OrderOpenPrice()+4*Point) 							// <--- OrderOpenPrice() from a somewhere selected order may or may not work here 
                                                                                                  (may because only one order is open), but it is not nice coded. 
     {
      res=OrderSend(Symbol(),OP_BUY,0.42,Ask,0,Close[1]-25*Point,0,"",MAGICMA,0,Blue);
      return;
     }
  }  

La funzione CheckForClose() ha più o meno gli stessi problemi e in più nessun filtro per il numero magico. Anche qui, OrderOpenPrice() selezionato da un ordine nel conteggio degli acquisti potrebbe finire per chiudere l'ordine sbagliato (non sono sicuro che funzioni effettivamente).
Si prega di rileggere anche ciò che Raptor ha scritto nella prima pagina di questo thread.

Dai tuoi post e dai commenti nel codice, ho la sensazione che tu voglia sapere quale ordine appartiene a quale strategia. Per ottenere ciò, puoi definire un secondo numero magico per la seconda strategia, così sarà più facile chiudere gli ordini in base alla strategia in cui sono stati aperti.

 
kronin:

I prossimi passi:

Dai tuoi post e dai commenti nel codice, ho la sensazione che tu voglia sapere quale ordine appartiene a quale strategia. Per ottenere ciò, puoi definire un secondo numero magico per la seconda strategia. Allora è più facile chiudere gli ordini in base alla strategia in cui sono stati aperti

Non sarebbe più semplice eseguire 2 strategie diverse in 2 EA separati, ognuno sul proprio grafico?
 
RaptorUK:
Non sarebbe più semplice eseguire 2 strategie diverse in 2 EA separati, ognuno sul proprio grafico?

Sì, per 2, 3, 4, 5... d'accordo. Ma secondo le storie e questo:" Devo scrivere 150 politiche e devono camminare allo stesso tempo sullo stesso grafico, ed eseguire tutte le strategie contemporaneamente. Quando eseguo 150 EA allo stesso tempo il mio PC esploderà - penso di ."
Penso che abbia intenzione di eseguire più strategie in un solo EA....

Motivazione: