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

 
korobok777:
Non si può dire senza il codice
 

Pomeriggio. Ho scritto un semplice indicatore per l'uscita dell'RSI dalle zone di ipercomprato/ipervenduto.

giusto, disegna le frecce dove dovrebbe essere. Ma solo in tempo reale.

Domanda: come farlo disegnare sulla storia per un numero n di barre?

#proprietà indicator_chart_window
#proprietà indicator_buffers 2
#property indicator_color1 LimeGreen
#property indicator_color2 LimeGreen

doppio rsi,rsi1,rsi2;
doppio CrossUp[];
doppio CrossDown[];
int FLAG = 0;
int FLAG1 = 2;
bool New_Bar=false;
int init()
{
//---- indicatori
SetIndexStyle(0, DRAW_ARROW,5,1);
SetIndexArrow(0, 233);
SetIndexBuffer(0, CrossUp);
SetIndexStyle(1, DRAW_ARROW,5,1);
SetIndexArrow(1, 234);
SetIndexBuffer(1, CrossDown);
//----
ritorno(0);
}
//+------------------------------------------------------------------+
//| funzione di deinizializzazione dell'indicatore personalizzata
//+------------------------------------------------------------------+
int deinit()
{
//----

//----
ritorno(0);
}
int start()
{

rsi = iRSI(NULL,0,4,PRICE_CLOSE,0);
rsi1 = iRSI(NULL,0,4,PRICE_CLOSE,1);
rsi2 = iRSI(NULL,0,4,PRICE_CLOSE,2);



Fun_New_Bar();
int limit, i, counter;
doppio Range, AvgRange;
for(i = 0; i <= limite; i++) {
contatore=i;
Gamma=0;
AvgRange=0;
for (counter=i ;counter<=i+9;counter++)
{
AvgRange=AvgRange+MathAbs(High[counter]-Low[counter]);
}
Range=AvgRange/10;
se (FLAG<1 && rsi<rsi2 && rsi2>70 && rsi1<70)
{Alert ("RSI DOWN!!! su ", Symbol());
CrossDown[i] = High[i]+ Range*1.8;
FLAG = 1;}
if(FLAG1>1 && rsi>rsi2 && rsi2<30 && rsi1>30)
{Alert ("RSI UP!!! su ", Symbol());
CrossUp[i] = Low[i]- Range*1.8;
FLAG1 = 1; }
if( New_Bar==true)
{FLAG=0;}
if( New_Bar==true)
{FLAG1=2;}
}
ritorno(0);
}
void Fun_New_Bar()
{
static datetime New_Time=0;
New_Bar=false;
if(New_Time!=Time[0])
{
New_Time=Time[0];
New_Bar=true;
}
}
 
Vinin:
Non si può dire nulla senza il codice.
//==================================================================+
extern ENUM_TIMEFRAMES PERIOD_=PERIOD_H1;//Периоды графиков
//==================================================================+

string _ChartSymbol;
long   _ChartID,
       _ChartFirst,
       _ChartPeriod;
int start()
{//---идентификатор графика начиная с первого 
    _ChartFirst=ChartFirst();
if(_ChartFirst>0)//если идентификатор больше ноля
{
 _ChartSymbol=ChartSymbol(_ChartFirst);//символ графика
 _ChartPeriod=ChartPeriod(_ChartFirst);//Периоды графика
 //---выполним функцию конвертации периода если не совпадает
if( _ChartPeriod!=PERIOD_)
 {
  bool  ch=ChartSetSymbolPeriod(_ChartFirst,_ChartSymbol,PERIOD_);
 } 
}
return(0);
}
int  deinit()
{
Alert("скрипт закончил работу");
return(0);
}
È solo per il primo grafico, non ho fatto altro, la finestra pop-up lo impedisce.
 
Red_Manticore:

Pomeriggio. Ho scritto un semplice indicatore per l'uscita dell'RSI dalle zone di ipercomprato/ipervenduto.

giusto, disegna le frecce dove dovrebbe essere. Ma solo in tempo reale.

Domanda: come farlo disegnare sulla storia per un numero n di barre?


Inserisci il codice secondo le regole, informati prima! Clicca sull'SRC a sinistra del pulsante del video, e cancella il "foglio"!

#property indicator_chart_window
#property indicator_buffers 2
#property  indicator_color1 LimeGreen
#property  indicator_color2 LimeGreen

double rsi,rsi1,rsi2;
double CrossUp[];
double CrossDown[];
int FLAG = 0;
int FLAG1 = 2;
bool New_Bar=false; 
 
int init()
  {
//---- indicators
  SetIndexStyle(0, DRAW_ARROW,5,1);
   SetIndexArrow(0, 233);
   SetIndexBuffer(0, CrossUp);
   SetIndexStyle(1, DRAW_ARROW,5,1);
   SetIndexArrow(1, 234);
   SetIndexBuffer(1, CrossDown);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//---- 

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

rsi = iRSI(NULL,0,4,PRICE_CLOSE,0);
rsi1 = iRSI(NULL,0,4,PRICE_CLOSE,1);
rsi2 = iRSI(NULL,0,4,PRICE_CLOSE,2);



Fun_New_Bar(); 
  
   int limit, i, counter;
   double Range, AvgRange;
    for(i = 0; i <= limit; i++) {
   
      counter=i;
      Range=0;
      AvgRange=0;
      for (counter=i ;counter<=i+9;counter++)
      {
         AvgRange=AvgRange+MathAbs(High[counter]-Low[counter]);
      }
      Range=AvgRange/10;
      if (FLAG<1 && rsi<rsi2 && rsi2>70 && rsi1<70)
      {Alert ("RSI DOWN!!! on ", Symbol());
      CrossDown[i] = High[i]+ Range*1.8;
          FLAG = 1;} 
      if(FLAG1>1 && rsi>rsi2 && rsi2<30 && rsi1>30)
      {Alert ("RSI UP!!! on ", Symbol());
      CrossUp[i] = Low[i]- Range*1.8;
         FLAG1 = 1; } 
   
       if( New_Bar==true)
       {FLAG=0;}
       if( New_Bar==true)
       {FLAG1=2;} 
   
   }
  return(0);
  } 
  
  void Fun_New_Bar()                              
  {                                             
   static datetime New_Time=0;                  
   New_Bar=false;                               
   if(New_Time!=Time[0])                        
     { 
      New_Time=Time[0];                         
      New_Bar=true;                            
     } 
  }     
ответить
 
korobok777:
Questo è solo per il primo grafico, non ho fatto ulteriori interferenze con la finestra pop-up.

Lo script elabora tutti i grafici aperti. Quello attuale viene elaborato per ultimo. Poiché gli script terminano il loro lavoro quando cambiano l'intervallo di tempo, la finestra che avverte che lo script termina sarà aperta solo una volta. Su tutti i grafici, il timeframe sarà cambiato per quello specificato

//+------------------------------------------------------------------+
//|                                             ReplaceTimeFrame.mq4 |
//|                                            Copyright 2015, Vinin |
//|                                             http://vinin.ucoz.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, Vinin"
#property link      "http://vinin.ucoz.ru"
#property version   "1.00"
#property strict

#property  show_inputs

input ENUM_TIMEFRAMES PERIOD_=PERIOD_H1;//Периоды графиков

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart()
  {
   long id=ChartFirst();
   long id_current=ChartID();
   int i=0;
   while(i<100)
     {
      ENUM_TIMEFRAMES _ChartPeriod=ChartPeriod(id);//Периоды графика
      if(_ChartPeriod!=PERIOD_ && id!=id_current)
        {
         bool  ch=ChartSetSymbolPeriod(id,ChartSymbol(id),PERIOD_);
        }

      id=ChartNext(id);
      if(id<0){break;}
      i++;
     }
   ENUM_TIMEFRAMES _ChartPeriod=ChartPeriod(id_current);//Периоды графика
   if(_ChartPeriod!=PERIOD_)
     {
      bool  ch=ChartSetSymbolPeriod(id_current,ChartSymbol(id_current),PERIOD_);
     }
  }
 
Vinin:

Lo script elabora tutti i grafici aperti. Quello attuale viene elaborato per ultimo. Poiché gli script terminano il loro lavoro quando cambiano l'intervallo di tempo, la finestra che avverte che lo script termina sarà aperta solo una volta. Su tutti i grafici il timeframe sarà cambiato in quello specificato


Ai)))ben fatto!!!!Grazie!!!
 

Buon pomeriggio,

Dichiaro un array

doppio gdClose_array[];

ArrayResize(gdClose_array, 1);

Copiare i dati nell'array con l'ultima barra chiusa, dal grafico corrente

iX=CopyClose(Symbol(),PERIOD_CURRENT,1,1,gdClose_array) ;

Valore di uscita dell'array

double dX=NormalizeDouble(gdClose_array[0],Digits);

Print ("NormalizeDouble(dX,Digits) ", dX);

Ottengo un numero ma è ovviamente errato:

NormalizeDouble(dX,Digits) 1.0644.

Anche se non c'è questo valore nel grafico (secondo la visualizzazione)

E questo valore non cambia nel corso dei test.

Aggiunto

ArraySetAsSeries(gdClose_array,true);

La situazione non è cambiata.

Dov'è l'errore?

 
n0name:

Pomeriggio,

...

Copiare i dati in un array con una chiusura dall'ultima barra chiusa, dal grafico corrente

iX=CopyClose(Symbol(),PERIOD_CURRENT,1,1,gdClose_array) ;

Qui avete scritto solo il nome dell'array senza specificare l'indice dell'elemento dell'array. Poiché avete precedentemente ArrayResize(gdClose_array, 1); avete impostato il numero di elementi dell'array come 1, il suo indice è 0. Ecco perché deve essere fatto in questo modo:

iX=CopyClose(Symbol(),PERIOD_CURRENT,1,1,gdClose_array[0]);


E un altro paio di domande/consigli.

1) Se avete bisogno di memorizzare solo 1 valore, potete usare una variabile invece di un array. Allora invece di:

double gdClose_array[];
ArrayResize(gdClose_array, 1); 

fare

double gdClose_array;

e poi fare il resto come il tuo codice originale.

2) Se avete bisogno di un array, ma sapete subito che avrà solo 1 elemento, allora dichiarate un array statico con 1 elemento invece di dichiararne uno dinamico e poi ridimensionarlo. Non c'è bisogno di operazioni extra.

Invece di

double gdClose_array[];
ArrayResize(gdClose_array, 1);

scrivere

double gdClose_array[1];

poi

iX=CopyClose(Symbol(),PERIOD_CURRENT,1,1,gdClose_array[0]);

e poi come il tuo codice originale.

 

Ciao, Domanda ai programmatori.

Ho un Expert Advisor che si attiva quando un ordine viene aperto e pone uno Stop Loss e un Take Profit su di esso in base a una quantità specificata di punti.

La mia domanda.

Possiamo cambiare il codice in modo che invece dello Stop Loss, l'EA esponga un ordine inverso di stop pendente della stessa dimensione.

Cosa dovrei cambiare nel codice per questo?

Grazie.

 

Buon pomeriggio!

Ancora una volta non riesco ad uscire da quella che sembra essere una cosa elementare - perché tutto sembra essere secondo l'aiuto, ma il risultato stampa 0.0?

  double FractalDown_1 = iFractals(NULL,0,MODE_LOWER,1); Print("FractalDown_1=",FractalDown_1);

Perché il valore frattale non viene estratto?

Motivazione: