Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Nulle part sans toi - 6. - page 971

 
korobok777:
Vous ne pouvez pas le dire sans le code
 

Après-midi. J'ai écrit un indicateur simple pour la sortie du RSI des zones de surachat/survente.

à droite, dessine des flèches là où c'est censé être. Mais seulement en temps réel.

Question : comment faire pour qu'il dessine sur l'historique pour un nombre n de barres ?

#property indicator_chart_window
#property indicator_buffers 2
#propriété indicator_color1 LimeGreen
#propriété indicateur_color2 LimeGreen

double rsi,rsi1,rsi2 ;
double CrossUp[] ;
double CrossDown[] ;
int FLAG = 0 ;
int FLAG1 = 2 ;
bool New_Bar=false ;
int init()
{
//---- indicateurs
SetIndexStyle(0, DRAW_ARROW,5,1) ;
SetIndexArrow(0, 233) ;
SetIndexBuffer(0, CrossUp) ;
SetIndexStyle(1, DRAW_ARROW,5,1) ;
SetIndexArrow(1, 234) ;
SetIndexBuffer(1, CrossDown) ;
//----
retour(0) ;
}
//+------------------------------------------------------------------+
//| Fonction personnalisée de désinitialisation de l'indicateur |
//+------------------------------------------------------------------+
int deinit()
{
//----

//----
retour(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 limite, i, compteur ;
double Range, AvgRange ;
for(i = 0 ; i <= limite ; i++) {
compteur=i ;
Plage=0 ;
AvgRange=0 ;
for (counter=i ;counter<=i+9;counter++)
{
AvgRange=AvgRange+MathAbs(High[counter]-Low[counter]) ;
}
Gamme=AvgRange/10 ;
si (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 ; }
si( Nouvelle_Barre==vrai)
{FLAG=0;}
si( Nouvelle_Barre==vrai)
{FLAG1=2;}
}
retour(0) ;
}
void Fun_New_Bar()
{
static datetime New_Time=0 ;
New_Bar=false ;
if(New_Time!=Time[0])
{
Nouvelle_Heure=Heure[0] ;
Nouvelle_Barre=vrai ;
}
}
 
Vinin:
On ne peut rien dire sans le code.
//==================================================================+
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);
}
Ceci est seulement pour le premier graphique, je n'ai pas fait plus, la fenêtre pop-up est dans le chemin.
 
Red_Manticore:

Après-midi. J'ai écrit un indicateur simple pour la sortie du RSI des zones de surachat/survente.

à droite, dessine des flèches là où c'est censé être. Mais seulement en temps réel.

Question : comment faire pour qu'il dessine sur l'historique pour un nombre n de barres ?


Insérer le code selon les règles, se familiariser plus tôt ! Cliquez sur le SRC à gauche du bouton vidéo, et supprimez la "feuille" !

#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:
C'est seulement pour le premier graphique, je n'ai pas fait d'autres interférences avec la fenêtre pop-up.

Le script traite tous les graphiques ouverts. L'actuel est traité en dernier. Comme les scripts terminent leur travail en changeant de période, la fenêtre d'avertissement de la fin du script ne sera ouverte qu'une seule fois. Sur tous les graphiques, l'horizon temporel sera remplacé par l'horizon spécifié.

//+------------------------------------------------------------------+
//|                                             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:

Le script traite tous les graphiques ouverts. L'actuel est traité en dernier. Comme les scripts terminent leur travail en changeant de période, la fenêtre d'avertissement de la fin du script ne sera ouverte qu'une seule fois. Sur tous les graphiques, l'horizon temporel sera remplacé par l'horizon spécifié.


Ai)))bien fait!!!!Merci ! !!
 

Bon après-midi,

Je déclare un tableau

double gdClose_array[] ;

ArrayResize(gdClose_array, 1) ;

Copie des données dans le tableau avec la dernière barre fermée, à partir du graphique actuel.

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

Valeur de sortie du tableau

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

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

J'obtiens un numéro mais il est manifestement incorrect :

NormalizeDouble(dX,Digits) 1.0644.

Bien qu'il n'y ait pas une telle valeur dans le graphique (selon la visualisation)

Et cette valeur ne change pas au cours des tests.

J'ai ajouté

ArraySetAsSeries(gdClose_array,true) ;

La situation n'a pas changé.

Où se trouve l'erreur ?

 
n0name:

Après-midi,

...

Copie des données dans un tableau avec une fermeture par la dernière barre fermée, à partir du graphique actuel.

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

Ici, vous n'avez écrit que le nom du tableau sans préciser l'indice de l'élément du tableau. Parce que vous avez précédemment ArrayResize(gdClose_array, 1) ; vous avez défini le nombre d'éléments du tableau comme étant 1, son index est 0. C'est pourquoi il faut procéder de cette façon :

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


Et quelques autres questions/conseils.

1) Si vous n'avez besoin de stocker qu'une seule valeur, vous pouvez utiliser une variable au lieu d'un tableau. Alors au lieu de :

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

faire

double gdClose_array;

et ensuite faire le reste comme votre code original.

2) Si vous avez besoin d'un tableau, mais que vous savez d'emblée qu'il n'aura qu'un seul élément, déclarez un tableau statique avec un élément au lieu de déclarer un tableau dynamique et de le redimensionner ensuite. Il n'y a pas besoin d'opérations supplémentaires.

Au lieu de

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

écrire

double gdClose_array[1];

puis

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

et ensuite comme votre code original.

 

Bonjour, Question aux programmeurs.

J'ai un conseiller expert qui est déclenché lorsqu'un ordre est ouvert et qui place un StopLoss et un TakeProfit sur celui-ci en fonction d'un nombre de points spécifié.

Ma question.

Pouvons-nous modifier le code de sorte qu'au lieu du Stop Loss, l'EA expose un ordre stop inverse en attente de la même taille.

Que dois-je changer dans le code pour cela ?

Merci.

 

Bonjour !

Encore une fois, je n'arrive pas à comprendre ce qui semble être une chose élémentaire - pourquoi tout semble être conforme à l'aide, mais le résultat imprime 0.0 ?

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

Pourquoi la valeur fractale n'est-elle pas extraite ?