Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 6. - pagina 175

 

L'EA esce su 33 barre dopo un trade:

static datetime t;

if (условие)
      {
      Opn_B = true; 
      t=Time[0];
      minimum = iLow(Symbol(),Period(),0);
      }
if (Time[33]>t) 
          {                                      
          Cls_B=true;              
          }

Nel reale e nel tester è uscito su 43 barre. Ho provato a impostare i parametri di uscita sulla quinta barra, tutto è normale. Secondo voi, quale può essere il problema?

 
Forexman77:

L'EA esce su 33 barre dopo un trade:

Nel reale e nel tester è uscito su 43 barre. Ho provato a impostare i parametri di uscita sulla quinta barra, tutto è normale. Secondo voi, quale può essere il problema?


Forse if (condizione) è stato eseguito più volte (una volta in più a 10 barre, per esempio) e questa esecuzione ha ritardato il tempo di vita?

 
ALXIMIKS:


Forse se (condizione) è stato eseguito più volte (una volta di più a 10 barre per esempio) ? e questa esecuzione ha ritardato il tempo di vita

Un trade: entrata 15:37, uscita 16:19. Esci sulla barra 41, per essere più corretto.
 
Forexman77:
Un trade: entrata 15:37, uscita 16:19. Esci a 41 barre, per essere più corretto.


E se lo sostituiamo con iBarShift mi chiedo se l'errore rimarrà? Forse mancano delle barre nella storia (sicuramente non ci sono buchi?) ?

Entrare dopo che la condizione è soddisfatta, contare le barre aperte, vedere quante di esse si sono realmente aperte, perché riferirsi al tempo non è molto corretto.

 
ALXIMIKS:


Se lo sostituiamo con iBarShift mi chiedo se l'errore rimarrà? Forse ci sono delle barre che saltano nella storia (sicuramente non ci sono buchi?) ?

Dopo che la condizione è soddisfatta, inserire un conteggio delle barre aperte e vedere quante barre sono realmente aperte, perché riferirsi al tempo non sembra giusto

Il codice dovrebbe essere così?

static datetime t;
datetime s=Time[33]>t;

if (условие)
    {
      Opn_B = true; 
      t=Time[0];
      int shif= iBarShift(Symbol(),PERIOD_M1,t,false);
      minimum = iLow(Symbol(),Period(),0);
      }
if (iBarShift(Symbol(),PERIOD_M1,s,false)) 
    {                                      
     Cls_B=true;              
    }

Questo tipo di codice blocca l'Expert Advisor.

 

Ciao, puoi per favore aiutarmi a far passare l'allarme una volta per barra su ogni linea, non solo sulla prima,

Ho limitato il numero di avvisi per tempo, ma non capisco come fare un buffer per una barra

 datetime LastAlertTime = 0;
int start()
  {

  string namesymb=Symbol();
  string tf=Period();

       for(int i = ObjectsTotal()-1; i >= 0; i--)
      {
         string name = ObjectName(i);
         
         if(ObjectType(name) == OBJ_TREND)
         {
            double value = ObjectGetValueByShift(name, 0);                    
             if(Bid <= value + Point && Bid >= value - Point)          
            {
            if (LastAlertTime < Time[0]){
            LastAlertTime = Time[0];
            
               Alert(namesymb,"  M",tf,"   ",name);
             }
                Comment("\n\n Alert running \n ", TimeToStr(TimeLocal(), TIME_DATE|TIME_SECONDS),"\n\n M",tf,"   ",name); 
            } 
         }      
}
 
Forexman77:

L'EA esce su 33 barre dopo un trade:

Nel reale e nel tester è uscito su 43 barre. Ho provato a impostare i parametri di uscita sulla quinta barra, tutto è normale. Quale pensi possa essere il problema?


Cominciamo con la mente sgombra.

Il tempo del flag Opn_B = true non significa nulla, perché l'ordine può non aprirsi nello stesso secondo.

Puoi usare il tempo di apertura dell'ordine OrderOpenTime, o puoi assegnare alla variabile t il valore del tempo dopo l'apertura riuscita.

Dopo: avete usato

minimum = iLow(Symbol(),Period(),0);

1) Hai bisogno di iLow, o sarebbe meglio usare solo Low, se usi la stessa valuta e lo stesso timeframe?

2) I valori di Symbol() e Period() sono meglio da mettere nelle variabili quando vengono usati ripetutamente. Tutto influisce sulle prestazioni - abituatevi.

Il grafico a minuti - se per un minuto non c'è stato un solo tick - non viene disegnata una nuova barra (può essere un trucco).

E che dire di iBarShift?

static datetime t;

if (условие)
      {
      Opn_B = true; 
      t=Time[0];
      minimum = iLow(Symbol(),Period(),0);
      }
if (iBarShift(Symbol(),1,t,false)>33) 
          {                                      
          Cls_B=true;              
          }

Il più adeguato al momento sembra essere

if ((TimeCurrent-t)/60)>33) Cls_B=true;
 
oleksaz:

Ciao, puoi per favore aiutarmi a far passare l'allarme una volta per barra su ogni linea, non solo sulla prima,

Ho limitato il numero di avvisi per tempo, ma non capisco come fare il buffer per una barra

string namesymb=Symbol();
string tf=Period();

Vale la pena rivalutare le variabili ad ogni tick?

La stringa tf = Periodo() influisce sulle prestazioni in 1000000 esecuzioni di loop o è più corretto int tf = Periodo()? Non lo so nemmeno io.

 if(Bid <= value + Point && Bid >= value - Point)  

Questa condizione è corretta? E se il ciclo ha 4 picchi?

if (LastAlertTime < Time[0])
LastAlertTime = Time[0];
          

Qui abbiamo un altro problema. Cioè, se la condizione per la prima linea è valida, sarà ovviamente falsa per la seconda e l'allarme non apparirà,

Non apparirà nemmeno al prossimo tick, perché il tempo di apertura della candela cambierà solo con l'arrivo di una nuova candela.

 
ALXIMIKS:


L'opzione più appropriata al momento sembra essere


Scusa, ma cercare di calcolare il numero di barre in base al tempo è un approccio molto inadeguato.
 
ALXIMIKS:

Le variabili devono essere ricalcolate ad ogni tick?

La stringa tf = Periodo() influisce sulle prestazioni in 1000000 esecuzioni di loop, o è più corretto int tf = Periodo()? Non lo so nemmeno io.

Questa condizione è corretta? E se il ciclo ha 4 picchi?

Qui abbiamo un altro problema. Cioè, se la condizione per la prima linea è valida, sarà ovviamente falsa per la seconda e l'allarme non apparirà,

Non apparirà nemmeno al prossimo tick, perché il tempo di apertura della candela cambierà solo con l'arrivo di una nuova candela.


int start()
  {
string scrdate,nametf;

        if (Period()==PERIOD_M1)  nametf="9_M1";
        if (Period()==PERIOD_M5)  nametf="8_M5";
        if (Period()==PERIOD_M15) nametf="7_M15";
        if (Period()==PERIOD_M30) nametf="6_M30";
        if (Period()==PERIOD_H1)  nametf="5_H1";
        if (Period()==PERIOD_H4)  nametf="4_H4";
        if (Period()==PERIOD_D1)  nametf="3_D1";
        if (Period()==PERIOD_W1)  nametf="2_W1";
        if (Period()==PERIOD_MN1) nametf="1_Monthly";
/////////////////  
       for(int i = ObjectsTotal()-1; i >= 0; i--)//мониторим все объекты
      {
         string name = ObjectName(i);//имя объектов берем из i переменной
         
         scrdate=StringConcatenate(Symbol()," ",TimeToStr(TimeCurrent(), TIME_DATE),"_",Hour(),".",Minute()," ",nametf," ",".jpg");//,name

         if(ObjectType(name) == OBJ_TREND)//отбираем тип по имени 
         {
            double value = ObjectGetValueByShift(name, 0);//функция для объектов
            
            Comment("\n\n Alert running \n ", TimeToStr(TimeLocal(), TIME_DATE|TIME_SECONDS),"\n\n M",Period(),"   ",name);           
            
             if(Bid <= value + Point && Bid >= value - Point)
             
            {
            if (LastAlertTime < Time[0]){
            LastAlertTime = Time[0];
            
               Alert(Symbol(),"  M",Period(),"   ",name);
               /////////////////////////////////////////////////
               WindowScreenShot(scrdate,1920,1200,0,-1,-1);
               ////////////////////////////////////////////////////////
             }               
            }
         }
}
   return(0);
  }

1. rimosso

2. sono d'accordo che se il gap non è un segnale (dovrebbe esserlo) nessun segnale -> nessun prezzo -> nessun trade

3. questo è quello che ho detto sopra, ma cosa fare

PS grazie per la risposta