[ARCHIVE]Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Je ne peux aller nulle part sans toi - 5. - page 280

 
tesla-pip:
Je ne trouve pas la commande qui redessine l'indicateur personnalisé. Si quelqu'un le sait, qu'il me le dise. Merci d'avance =)

Je l'ai déjà trouvé. Merci à tous =)
 

Bon après-midi.

Pouvez-vous m'aider à trouver une formule ?

J'ai une étape de recharge SD=100 ;

si le prix est de 25, alors pour lui le niveau de dépassement sera DE=100

si le prix est de 102, son taux d'unités sera de UD=200

si le prix est de 215, alors le taux de rechargement est BP=300

le prix a chuté à 135 de nouveau, le niveau de dépassement sera UD=200

 
TarasBY:

Et cet ordre des choses est normal (ce sont les principes du terminal).

Si vous voulez que l'indicateur B change ses indications quand les paramètres de l'indicateur A changent, faites un échange d'informations entre les indicateurs (il peut s'agir d'un fichier, de variables globales du terminal, de la RAM de l'ordinateur) : l'indicateur A passe ses paramètres initialisables pendant l'initialisation et l'indicateur B vérifie périodiquement les éventuels changements de paramètres de l'indicateur A. Quand il détecte des changements, l'indicateur B doit aussi se périnitialiser avec de nouveaux paramètres (init() forcé).

Merci pour votre réponse, mais je ne peux pas l'utiliser car je ne comprends pas tout et je ne suis pas très doué en programmation, pourriez-vous s'il vous plaît apporter les modifications nécessaires à mes codes indicateurs.



Le premier code est l'indicateur A.

Deuxième code-indicateur B.

//---- indicator settings
#property  indicator_separate_window
#property  indicator_buffers 3
#property  indicator_color1  Black
#property  indicator_color2  Green
#property  indicator_color3  Red
#property  indicator_width2  2
#property  indicator_width3  2
#property  indicator_level1 0.0

//---- input parameters
extern int FastPeriod =5;
extern int LowPeriod  =34;
//---- indicator buffers
double     ExtBuffer0[];
double     ExtBuffer1[];
double     ExtBuffer2[];



//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   //---- drawing settings
   SetIndexStyle(0,DRAW_NONE);
   SetIndexStyle(1,DRAW_HISTOGRAM);
   SetIndexStyle(2,DRAW_HISTOGRAM);
   IndicatorDigits(Digits+1);
   SetIndexDrawBegin(0,34);
   SetIndexDrawBegin(1,34);
   SetIndexDrawBegin(2,34);
//---- 3 indicator buffers mapping
   SetIndexBuffer(0,ExtBuffer0);
   SetIndexBuffer(1,ExtBuffer1);
   SetIndexBuffer(2,ExtBuffer2);
//---- name for DataWindow and indicator subwindow label
   IndicatorShortName("My_AO");
   SetIndexLabel(1,NULL);
   SetIndexLabel(2,NULL);
//---- initialization done
   return(0);
  }
//+------------------------------------------------------------------+
//| Awesome Oscillator                                               |
//+------------------------------------------------------------------+
int start()
  {
      
  
   int    limit;
   int    counted_bars=IndicatorCounted();
   double prev,current;
//---- last counted bar will be recounted
   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;
//---- macd
   for(int i=0; i<limit; i++)
      ExtBuffer0[i]=iMA(NULL,0,FastPeriod,0,MODE_SMA,PRICE_MEDIAN,i)-iMA(NULL,0,LowPeriod,0,MODE_SMA,PRICE_MEDIAN,i);
//---- dispatch values between 2 buffers
   bool up=true;
   for(i=limit-1; i>=0; i--)
     {
      current=ExtBuffer0[i];
      prev=ExtBuffer0[i+1];
      if(current>prev) up=true;
      if(current<prev) up=false;
      if(!up)
        {
         ExtBuffer2[i]=current;
         ExtBuffer1[i]=0.0;
        }
      else
        {
         ExtBuffer1[i]=current;
         ExtBuffer2[i]=0.0;
        }
        
       
     }
//---- done
   return(0);
  }
#property indicator_separate_window
#property indicator_minimum -1.5
#property indicator_maximum 1.5
#property indicator_buffers 2
#property indicator_color1 Green
#property indicator_color2 Red
#property  indicator_width1  2
#property  indicator_width2  2
#property indicator_level1 0.0

//--- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_HISTOGRAM);
   SetIndexBuffer(0,ExtMapBuffer1);
   SetIndexStyle(1,DRAW_HISTOGRAM);
   SetIndexBuffer(1,ExtMapBuffer2);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {  
      
       
    double UP,DN;     
  
  
    int counted_bars=IndicatorCounted(),
       limit;  
       
    if(counted_bars>0)
      counted_bars--;
   
      limit=Bars-counted_bars;
//----
   for(int i=0;i<limit;i++)
       
      { 
        UP=iCustom(NULL,0,"My_AO",1,i+1);               
        DN=iCustom(NULL,0,"My_AO",2,i+1);    
             
        
       if(UP>0)       
         {ExtMapBuffer1[i+1]=1;
          ExtMapBuffer2[i+1]=0;
         }
         
       if(UP<0)       
         {ExtMapBuffer1[i+1]=-1;
          ExtMapBuffer2[i+1]=0;
         }  
         
                              
       if(DN>0)            
         {
          ExtMapBuffer1[i+1]=0;
          ExtMapBuffer2[i+1]=1;
         }
              
       if(DN<0)            
         {
          ExtMapBuffer1[i+1]=0;
          ExtMapBuffer2[i+1]=-1;
         }
               
                       
    
    }
//----
   return(0);
 
   }
   
//+------------------------------------------------------------------+    
   

 

La dernière question a été résolue, la nouvelle est la suivante

Je fais recalculer le niveau de recharge sur chaque barre.

Comment se souvenir du niveau de la dernière barre ?

et l'utiliser pour ouvrir une transaction

 
MK07:
Merci pour votre réponse, mais je ne peux pas l'utiliser car je ne comprends pas tout et je ne suis pas très doué en programmation.

Vous me proposez de faire pour vous ce avec quoi vous jouez. Désolé, je ne suis pas intéressé.

Et, si vous apprenez à programmer, c'est une tâche intéressante pour vous.

 
Bonne journée à tous. J'ai un problème avec l'indicateur "CurrencyPowerMeter" et je ne peux pas le déplacer vers une autre position dans la fenêtre du terminal. Si vous pouvez m'aider, je serai très heureux de le faire.
 
J'ai décidé de vous poser une question, vous pourrez peut-être me donner un conseil. J'écris un indicateur, dans l'indicateur je traite les ticks sur le timeframe tick (qui s'ouvre indépendamment,celui-ci). Mon tableau tampon ne traite PAS CHAQUE tick, mais de manière sélective (par exemple, un tick toutes les 60 secondes, mais ce n'est pas nécessaire). Au lieu de
int    counted_bars=IndicatorCounted();

Je comprends la construction suivante :

extern int sec=60;//объявляем количество секунд
int i;//будет индексом текущей "свечи" (тика)
int i_prev;//будет индексом предыдущей "свечи" (тика), отстоящего от теущего на sec секунд назад
double MyBuffer[];//этот будет на чарте
double MyTemp[];//этот только для подсчётов

int init(){
   IndicatorBuffers(2);
   SetIndexBuffer(0,MyBuffer)
   SetIndexBuffer(1,MyTemp)
   SetIndexDrawBegin(0,14);
   i=Bars-1;
   while(Volume[i]-Volume[Bars-1]<sec) i--;//потому что в Volume[] на тиковом у нас время сервера точностью до секунды (а в Time[] - моделируемое для предоставления тиков на чарте)
   i_prev=Bars-1;//отошли от первого исторического тика на чарте на заданное количество секунд, запомнили его, запомнили первый, уходим в start()
   return(0);
}

int start(){
   double deltaHigh,deltaLow;
   int counted_bars=IndicatorCounted();//честно говоря, не уверен, т.к. считаем мы не все "свечи" (тики)
   if(counted_bars>=i) i=Bars-counted_bars-1;//аналогично
   while(i>=0){//цикл обработчика
      deltaHigh=High[i]-High[i_prev];//к примеру
      deltaLow=Low[i_prev]-Low[i];
      //и дальше код обработчика (формируем предварительный массив MyTemp[]). В конце цикла:
      i_prev=i;//запоминаем теперь текущий индекс как индекс предыдущего тика
      while(Volume[i_prev]-Volume[i]<sec){//и уходим вперёд на заданное количество секунд
         i--;
      }
   }
...

Maintenant la question. Dans la version pure M1, la chose suivante est standard.

   if(counted_bars>0) counted_bars--;
   int limit=Bars-counted_bars;//принтовал, при первом обращении limit=Bars-2, при последующих limit=2
   for(i=0; i<=limit; i++){
      MyBuffer[i]=iMAOnArray(MyTemp, 0, 14, 0, MODE_EMA, i);

Avec quoi remplacer la limite et counted_bars ? D'après ce que j'ai compris,

int counted_bars=ArraySize(MyTemp)-1;//сразу после цикла while

(parce que le nombre de ticks en 60 secondes n'est pas constant, c'est-à-dire qu'écrire simplement int counted_bars=IndicatorCounted()/_number_of_ ticks_in_60_seconds_ ne fonctionnera pas).

Ou ai-je tort sur tout ?

p.s. en prévision d'une éventuelle question, je vais répondre : je sais que sur le forex sec!=60 n'est pas applicable, et sec=60 n'a aucun sens, mais je ne trade pas sur le forex non plus.

 
MK07:
Merci pour votre réponse, mais je ne peux pas l'utiliser car je ne comprends pas tout et je ne suis pas bon en programmation, pourriez-vous s'il vous plaît faire les changements nécessaires à mes codes indicateurs.
Excusez-moi, vous avez une voiture ? Si vous en avez un, vous ne le considérez pas comme un luxe, juste comme une nécessité, n'est-ce pas ? Si ce n'est pas le cas, vous n'allez pas le laisser comme ça pour le reste de votre vie, n'est-ce pas ? C'est l'âge, vous devez savoir comment conduire une voiture. Je ne suis qu'un agriculteur, mais je fais ce que je fais, pour moi la programmation n'est pas différente du travail de jardinage, comme le travail de serrurier, le même travail avec mes mains (je vis à la campagne). Une brouette ou le MQL4 ne sont que des outils pour moi. Peut-être que c'est perçu différemment pour les citadins, je ne sais pas. Variables globales dans le manuel ici, fonctions de fichier standard ici, plus rapides celles-là, mais via WinAPI. Je voulais répondre hier, mais je ne l'ai pas fait.
 

Bonjour à tous !

J'apprends à utiliser les tableaux.

J'ai un tableau que j'ai initialisé avec des chaînes de caractères, c'est-à-dire une double masse [3567]={0.85374 , 0.85694 , 0.85974 , .... } ;

Et le programme a lu le tableau et l'a exécuté.

Maintenant j'ai initialisé le même tableau dans une colonne

double massif [3567]

{

masse [ 0] = 0.85374 ;
masse [ 1] = 0.85694 ;
masse [ 2] = 0. 85974 ;
masse [ 3] = 0.86174 ;
masse [ 4] = 0.86474 ;
masse [ 5] = 0.86494 ;
masse [ 6] = 0.86504 ;

masse [ 7] = 0,86524 ;

}

Le compilateur ne génère pas d'erreur mais un avertissement.

'{' - expression sur la portée globale non autorisée C:\Program Files\Alpari NZ MT4(2)\experts\include\MASSIV.mqh (4, 2)

Le tableau est déclaré globalement comme auparavant (lorsqu'il était initialisé avec des chaînes de caractères et fonctionnait bien).

 #include <MASSIV.mqh> 


 
int start()
{
 double Price=iOpen (Symbol (),0,0);         
 double SL=NormalizeDouble (Price+3000*Point, Digits);         
 double TP=NormalizeDouble (Price-100*Point, Digits);   

 double value =  Bid ;//параметру value функции ArrayBsearch присваивается значение  цены последнего тика
 double ld_Delta = 0.0010;
 int S = ArrayBsearch(  mass,  value, WHOLE_ARRAY,  0, MODE_ASCEND);//функция возвращает индекс значения цены макс. близкой к цене последнего тика 
 

 int last_order_bar = 0;
int ot = OrdersTotal();
...............................(остальной код опустил,но он  не изменился)

Il n'y a que 2 entrées dans le journal.

2013.04.12 16:14:44 XXX test démarré

2013.04.12 16:14:36 XXX EURUSD,H1 : chargé avec succès


QUESTION.POURQUOI LE PROGRAMME NE LIT-IL PAS UN TABLEAU INITIALISÉ EN UNE SEULE COLONNE.

Merci.

 
solnce600:

QUESTION.POURQUOI LE PROGRAMME NE LIT-IL PAS UN TABLEAU INITIALISÉ DANS UNE COLONNE.

double mass[8]={0.85374,
               0.85694,
               0.85974,
               0.86174,
               0.86474,
               0.86494,
               0.86504, 
               0.86524};
Il lit tout. Enlever les points-virgules dans la déclaration du tableau, mettre des virgules. Et le nombre d'espaces ou de tabulations dans le tableau n'a pas d'importance. Ou peut-être que je me trompe.