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

 
Roll:

GRAZIE MILLE!

La tua versione dell'indicatore funziona!

Ho provato a risolverli con il tutorial MQL4 e gli esempi rivisti di indicatori, ma niente ha funzionato.

Se avete il desiderio, il tempo e la voglia di aiutarmi a capire perché:

1. Quando si installa la linea indicatore riceve un valore di 0 (zero) e solo con l'arrivo del primo tick prende il valore della variabile top, o dovrebbe aprire la finestra dei parametri e chiuderla immediatamente;

2. Il parametro top è calcolato al 4° segno, anche se c'è la seguente linea in init()

IndicatoreCifre(Cifre+1);

e la linea

top=WindowPriceMax(win_idx);

L'ho sostituito con

top=NormalizeDouble((WindowPriceMax(win_idx)),Digits+1);

Non aiuta! E i valori numerici della scala della finestra dell'indicatore sono 5 cifre.

3. Con la rimozione dell'indicatore Comment non viene rimosso dal grafico.



Codice

--------

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 Lime
#property indicator_color2 Red
double ExtMapBuffer1[],
ExtMapBuffer2[];
//--------------------------------
int init()
{
SetIndexStyle(0,DRAW_LINE);
SetIndexBuffer(0,ExtMapBuffer1);
SetIndexStyle(1,DRAW_LINE);
SetIndexBuffer(1,ExtMapBuffer2);
IndicatorShortName("MACD_max-min_v2");

IndicatorDigits(Digits+1);

return(0);
}
//--------------------------------
int deinit()
{

return(0);
}
//+------------------------------------------------------------------+
int start()
{
int counted_bars=IndicatorCounted(),limit,win_idx;
double top;

if(counted_bars>0)counted_bars--;
limit=Bars-counted_bars;
win_idx=WindowFind("MACD_max-min_v2");

for(int i=0;i<limit;i++)
{
ExtMapBuffer1[i]=iMACD(0,0,12,26,9,PRICE_CLOSE,MODE_MAIN,i);
ExtMapBuffer2[i]=iMACD(0,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,i);
}

// top=WindowPriceMax(win_idx);
top=NormalizeDouble((WindowPriceMax(win_idx)),Digits+1);
Comment( "\n"," top = ",top);
ObjectDelete("max");

if(ObjectFind("max")!=win_idx)
{
ObjectCreate("max",OBJ_HLINE,win_idx,Time[0],top);
ObjectSet("max",OBJPROP_COLOR,Yellow);
ObjectSet("max",OBJPROP_WIDTH,0);
}

return(0);
}
//+------------------------------------------------------------------+


File:
 
MK07:

Correzione tecnica - usa il pulsante SRC sul pannello superiore per inserire il codice, come fanno i tuoi consulenti. Sarà molto più facile da leggere.

P.S.
per cancellare la linea di commento, inserire Comment(") in deinit();
 
granit77:
Correzione tecnica - usa il pulsante SRC sul pannello superiore per inserire il codice, come fanno i tuoi consulenti. Sarà molto più facile da leggere.

P.S.
Per cancellare la linea di commento, inserite Comment(") in deinit();
Grazie per le informazioni, è la mia prima volta sul forum, un GRAZIE speciale per lo snippet di codice.
 
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 Lime
#property indicator_color2 Red
double ExtMapBuffer1[],ExtMapBuffer2[];
int init(){SetIndexStyle(0,DRAW_LINE);SetIndexBuffer(0,ExtMapBuffer1);
SetIndexStyle(1,DRAW_LINE);SetIndexBuffer(1,ExtMapBuffer2);
IndicatorShortName("MACD_max-min");return(0);}
int deinit(){Comment("");return(0);}
//+------------------------------------------------------------------+
int start(){int counted_bars=IndicatorCounted(),limit,win_idx;double top;
if(counted_bars>0)counted_bars--;limit=Bars-counted_bars;win_idx=WindowFind("MACD_max-min");
for(int i=0;i<limit;i++){ExtMapBuffer1[i]=iMACD(0,0,12,26,9,PRICE_CLOSE,MODE_MAIN,i);
  ExtMapBuffer2[i]=iMACD(0,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,i);}
  top=WindowPriceMax(win_idx);ObjectDelete("max");
  if(ObjectFind("max")!=win_idx){ObjectCreate("max",OBJ_HLINE,win_idx,Time[0],top);
  ObjectSet("max",OBJPROP_COLOR,Yellow);ObjectSet("max",OBJPROP_WIDTH,0);}
  Comment( "\n"," top = ",DoubleToStr(top,5));return(0);}
//+------------------------------------------------------------------+
 
https://docs.mql4.com/ru/common/Comment
void Comment(. ...)
La funzione stampa un commento definito dall'utente nell'angolo superiore sinistro del grafico. I parametri possono essere di qualsiasi tipo. Il numero di parametri non può superare 64.
Gli array non possono essere passati a Comment(). Gli array devono essere stampati elemento per elemento.
I dati di tipo doppio vengono stampati con 4 cifre decimali dopo il punto. Per produrre numeri con maggiore precisione, usate DoubleToStr().
I tipi bool, datetime e color saranno stampati come numeri.
Per emettere dati datetime come una stringa, usate la funzione TimeToStr().

Per dividere l'output in più righe, puoi usare il carattere di avanzamento di riga "\n" o "\r\n".
Vedere anche Alert() e Print().
 
Potete dirmi come scrivere:
Il prezzo ha attraversato la linea orizzontale verso l'alto....
E come dovrebbe essere descritta questa linea?
 
Roll:
Grazie per la scienza.
 

Salve,

Ecco il problema che ho.

Lavorare su PERIOD_H1.

Per chiudere alla fine dell'ora faccio così:

   for(j = OrdersTotal()-1; j >= 0; j--){ 
       if(OrderSelect(j, SELECT_BY_POS, MODE_TRADES))
          if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber){
            OpenTime= OrderOpenTime();          
          if(OrderType() == OP_BUY){
            if(TimeCurrent()>Time[0]+3580){ 
             OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),0,Red);}
             }
           else 
          if(OrderType() == OP_SELL){
            if(TimeCurrent()>Time[0]+3580){
             OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),0,Blue);}
             }
           }
         }
Per aprire una posizione all'inizio dell'ora faccio quanto segue
   if(TimeCurrent()<Time[0]+3500 && HaveBuy==false && HaveSell==false)
     if(Ask <= EnBuy && IsFreeLevel==true){
          ticket = OrderSend(Symbol(),OP_BUY,Lot,NormalizeDouble(Ask,Digits),0,0,forecast-5*MyPoint,"",MagicNumber,0,Blue);
         }
     if(Bid >= EnSel && IsFreeLevel==true){
          ticket = OrderSend(Symbol(),OP_SELL,Lot,NormalizeDouble(Bid,Digits),0,0,forecast+5*MyPoint,"",MagicNumber,0,Red);
         }

Ma per il test va così

Non riesco a capire dove sto sbagliando.

Non tutte le volte funziona così, ma ci sono questi momenti.

Grazie a chi risponderà :).

 
alsu:
Non sto dicendo questo, sto dicendo che differenza fa dove è attaccato l'EA? Se è scritto correttamente, non importa dove è collocato - basta metterlo su un grafico del cambio mongolo, ma se è impostato per operare su EURUSD 1 minuto, lo farà. E non è difficile da programmare, basta cambiare un paio di righe.

Grazie mille per il chiarimento!

Sono solo preoccupato per il tester che simula barre da un minuto per le modifiche all'apertura di ogni barra da un minuto.

Proverò a cambiare Open[0] in iOpen(NULL,1,0) e ad aggiungere una funzione per controllare l'apertura della barra di un minuto.

Sono passati alcuni minuti, durante i quali ho messo a punto il codice e l'ho provato con il tester a M5 e ho fatto in modo che in questo caso il tester non apra barre di 1 minuto, anche se prescritto, e lo modifichi solo ogni 5 minuti, cosa che temevo. In modalità all ticks è un po' meglio, perché modifica più spesso. Ma su M1 solo all'apertura della barra funziona lo stesso, sia con Open[0] che con iOpen(NULL,1,0), di cui sono ancora grato!

Ora userò sempre iOpen verde, poiché vedo che posso fare a meno di Open rosso. Il profitto verde è più bello della perdita rossa. (:))

 
mario065:

Salve,

Ecco il problema che ho.

Lavorare su PERIOD_H1.

Per chiudere alla fine dell'ora faccio così:

Per aprire una posizione all'inizio dell'ora, faccio così
Ma per il test va così

Non riesco a capire dove sto sbagliando.

Non tutte le volte funziona così, ma ci sono questi momenti.

Grazie, chi risponde :)


Un amico mi ha dato un consiglio:
Invece di TimeCurrent().

TimeSeconds(TimeCurrent())

E ha funzionato.