[Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas votre chemin. Je ne peux aller nulle part sans toi. - page 239

 
dmmikl86 >> :

Chers utilisateurs du forum !

J'ai écrit un indicateur et le problème est que je ne peux pas dessiner la moyenne mobile (Buf_2), voici le code :

Aidez-moi à comprendre quel est le problème.

Et pourquoi serait-il dessiné si vous n'entrez pas dans la boucle après //moyenne et i<0 sinon vous ne sortirez pas de la précédente boucle

 i++; // поставьте здесь увеличение на один и всё заработает или присвойте i=0; напрямую ноль
//====================================================================
// average
int n=0;
   while( i>=0) 
      {  
       //----
       while( n<= average){
         Buf_2[ i]= Buf_1[ i- n];
         n++;
         }
       
       i--;
       //----
      }

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

Bonjour)


Désolé pour l'intrusion, j'ai déjà posé cette question, mais je n'ai pas eu la réponse( De toute façon, pendant la semaine, rien n'a bougé


Pouvez-vous me dire comment écrire une fonction plaçant un ordre en attente?


Que dois-je mettre à la place de Bid ou Ask ? J'ai besoin d'un ordre en attente au sommet d'une des bougies. J'obtiens cette valeur et comment dois-je la saisir dans la fonction ? Ce prix peut ne pas figurer dans le flux commercial. Je me demande si vous pourriez sortir le code pour placer un ordre en attente et, plus important encore, où trouver son prix de fixation !

 

Par exemple (exemple de fixation d'un stop d'achat) :

(il n'est pas du tout nécessaire que le prix fixé soit dans le flux de cotation afin de fixer un ordre en attente.

vous pouvez danser avec le prix actuel ou prendre n'importe quel prix, tant que vous adhérez au niveau d'arrêt du PRIX ACTUEL AU PRIX D'ARRÊT)

( 'EURUSD - Tendances, Prévisions et Conséquences' )

extern int      Magic = 77777;
extern int      StopLoss=400;
extern int      TakeProfit=120;
extern double   Lots=0.1;

static int prevtime = 0;
//-- Подключаемые модули --
#include <stderror.mqh>
#include <stdlib.mqh>


//=======================================================
int start()
{
if(Time[0] == prevtime)   return(0);//ждём появления нового бара
   prevtime = Time[0];//если появился новый бар , включаемся
   

//-----------------------------------------------------------------------
if ( NumberOfOrders(NULL,OP_BUYSTOP, Magic)<1 )  {//если нет открытых бай- поз.
if   ( NumberOfPositions(NULL,OP_BUY, Magic)<1)  {//если нет ордеров байстоп
double priceBUY=iHigh(NULL,0,iHighest(NULL,0,MODE_HIGH,50,0));//-задаем цену
// установки  ордера по максимуму из посл. 50-ти свечей
double SL=0;double TP=0;//выставляем стопы
if( StopLoss>0)   SL= priceBUY-Point* StopLoss;
if( TakeProfit>0) TP= priceBUY+Point* TakeProfit;  
//ставим ордер 
ticket=OrderSend(Symbol(),OP_BUYSTOP, Lots, price,5, SL, TP,"байстоп", Magic,0,Blue);
if( ticket < 0) { Print("Ошибка открытия ордера BUY #", GetLastError()); 
               Sleep(10000);   return (0); }
}}
//--------------------------------------------------------------------------

Аналогично ставится селл-стоп


//----------------------------------------------------------------------------
return (0);
 //-----------------Конец функции int start()----
}//int start()

//--------ставим пользовательские функции -------------

Au lieu de

double priceBUY=..... ....

entrez votre formule

 

Je suis en train d'écrire un indicateur dont l'essence est la suivante : si une bougie est haussière, la ligne de l'indicateur est ascendante, baissière est descendante. enfin, le volume est ajouté à tout cela (de sorte que chaque bougie a un poids de volume). Et la deuxième ligne est une moyenne mobile de la ligne actuelle.

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 Lime
#property indicator_color2 Red

extern int average=14;
//---- buffers
double Buf_1[], Buf_2[];
double sum_b;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0, Buf_1);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1, Buf_2);
   
   sum_b=0.0;
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int    i, 
          Counted_bars=IndicatorCounted();

int n=0;
//----
//====================================================================
// график тела с объемом

i=Bars- Counted_bars-1;           // Индекс первого непосчитанного
   while( i>=0) 
      {  
       //----
       if (Close[ i]>Open[ i]) {
         sum_b = sum_b + (Close[ i]-Open[ i])*Volume[ i];
         Buf_1[ i]= sum_b;
         }
         
       if (Close[ i]<Open[ i]) {
         sum_b = sum_b - (Open[ i]-Close[ i])*Volume[ i];
         Buf_1[ i]= sum_b;
         }
         
       if (NormalizeDouble(Close[ i],Digits)==NormalizeDouble(Open[ i],Digits)) {
         Buf_1[ i] = Buf_1[ i-1];
         }
       
       // average  
       while( n<= average){
         Buf_2[ i]= Buf_1[ i- n];
         n++;
         }

       i--;
       //----
      }
//====================================================================


//----
   return(0);
  }
//+------------------------------------------------------------------+
problèmes : la ligne principale dessine des pics lorsqu'un doji est formé, et la moyenne mobile n'est pas dessinée ?
 
dmmikl86 >> :

Je suis en train d'écrire un indicateur dont l'essence est la suivante : si une bougie est haussière, la ligne de l'indicateur est à la hausse, baissière à la baisse. bien, le volume est ajouté à tout cela (de sorte que chaque bougie a un poids de volume). Et la deuxième ligne est la moyenne mobile de la ligne actuelle.

problèmes : la ligne principale dessine des pics pendant la formation de doji et la moyenne mobile n'est pas dessinée ?


Le bloc d'ifs peut être remplacé par une méthode plus efficace

if (Close[ i]>Open[ i]) {
         sum_b = sum_b + (Close[ i]-Open[ i])*Volume[ i];
         Buf_1[ i]= sum_b;
}
else if (Close[ i]<Open[ i]) {
         sum_b = sum_b - (Open[ i]-Close[ i])*Volume[ i];
         Buf_1[ i]= sum_b;
}
else {  //       if (NormalizeDouble(Close[i],Digits)==NormalizeDouble(Open[i],Digits)) {
         Buf_1[ i] = Buf_1[ i + 1];
}

[i + 1] - puisque les tableaux d'index sont numérotés de droite à gauche. Maintenant, les chandeliers avec zéro corps seront traités correctement.

Avec la ligne centrale buf_2 du code , iln'est pas du tout clair ce que l'auteur voulait.


 
OneDepo >> :

Le bloc if-value peut être remplacé par un bloc plus efficace

[i + 1] - car les tableaux d'index sont numérotés de droite à gauche. Maintenant, les chandeliers avec un corps nul seront traités correctement.

Avec la ligne centrale buf_2 du code , iln'est pas du tout clair ce que l'auteur voulait.


voulait que ce soit une moyenne mobile avec une période de 14, basée sur la valeur de l'indicateur

 
dmmikl86 >> :

je voulais qu'il s'agisse d'une moyenne mobile avec une période de 14, tracée par rapport à la valeur de l'indicateur

Alors ça se passe comme ça :

//+------------------------------------------------------------------+
//|                                                     dmmikl86.mq4 |
//|                      Copyright © 2007, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 Lime
#property indicator_color2 Red

extern int BarsCount = 1000;
extern int average=14;

//---- buffers
double Buf_1[], Buf_2[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
    if ( average < 1)
        average = 1;

    //---- indicators
    SetIndexStyle(0,DRAW_LINE);
    SetIndexBuffer(0, Buf_1);
    SetIndexStyle(1,DRAW_LINE);
    SetIndexBuffer(1, Buf_2);
    //----
    return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
{
    int i, n;

    //====================================================================
    // график тела с объемом
    double s, sum_b = 0;

    int limit = BarsCount;
    if ( limit > Bars)
        limit = Bars;

    for ( i = limit; 0 <= i; i--) {

        if (Close[ i]>Open[ i]) {
            sum_b += (Close[ i]-Open[ i])*Volume[ i];
            Buf_1[ i] = sum_b;
        }
        else if (Close[ i]<Open[ i]) {
            sum_b -= (Open[ i]-Close[ i])*Volume[ i];
            Buf_1[ i] = sum_b;
        }
        else {
            Buf_1[ i] = Buf_1[ i + 1];
        }

        // SMA calculation
        if ( i + average < limit) {
            s = 0;
            for ( n = 0; n < average; n++) {
                s += Buf_1[ i+ n];
            }
            Buf_2[ i] = s/ average;
        }

    }

    return(0);
  }
//+------------------------------------------------------------------+
 
comment puis-je effectuer une transaction une fois par barre et ne pas ouvrir d'autres ordres sur cette barre s'il y a déjà une transaction sur cette barre ?
 
Il suffit de regarder ce fil de discussion.
 
Vinin >> :
Il suffit de regarder ce fil de discussion.

Ou lisez la tâche 27 dans le manuel de Kovalev. Il existe des exemples de code et une explication détaillée de son fonctionnement.

Raison: