Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 840

 

Qu'est-ce qu'il y a ?

Il existe une classe modèle

template <typename T>
class MyList{
 private:
    T *array[];
    int _size;
public:
    WavesList(){
        _size = 0;
    }
    void add(T &obj){
        _size++;
        ArrayResize(array, _size, 0);
        array[_size-1] = obj;
    }
    void cut(){
        delete array[_size-1];
        _size--;
        ArrayResize(array, _size, 0);
    }
    int size(){
        return _size;
    }
    T lastWave(){
        return array[size-1];
    }
};

J'essaie ensuite de faire cela dans le code :

MyList myList<OtherClass>();

Il fronce les sourcils !

 
Roman Sharanov:

J'essaie ensuite de faire cela dans le code :

Il fronce les sourcils !

J'en ai besoin comme ça :

MyList<OtherClass> myList;

Voici un exemple de la façon de travailler avec les modèles publiésà l'adresse https://www.mql5.com/ru/forum/221917/page25#comment_11205772.

voir si vous pouvez utiliser mon code comme une analogie au vôtre

Библиотека Generic классов - ошибки, описание, вопросы, особенности использования и предложения
Библиотека Generic классов - ошибки, описание, вопросы, особенности использования и предложения
  • 2019.04.03
  • www.mql5.com
С 6 декабря 2017 года в стандартную поставку MetaTrader 5 стали входить так называемые Generic-классы, реализующие эффективные алгоритмы для хранен...
 
Igor Makanu:

il faut que ce soit comme ça :

Voici un exemple de la façon de travailler avec les modèles que j'ai postéshttps://www.mql5.com/ru/forum/221917/page25#comment_11205772.

Voyez si vous pouvez écrire le vôtre par analogie avec mon code

Merci.

 

est-il possible de définir la position du texte par rapport à la ligne ?

La ligne est créée de manière programmatique, le texte est dessiné au-dessus de la ligne, mais dans certains cas, j'ai besoin que le texte soit en bas...


comment faire ?


void paintShLine(datetime sdata, datetime edata, double bev, string nm, string txt, color cl)
   {
      ObjectCreate(0, nm, OBJ_TREND, 0, sdata, bev, edata, bev);
       
      //--- установим цвет линии
      ObjectSetInteger(0,nm,OBJPROP_COLOR,cl);
      //--- установим стиль отображения линии
      ObjectSetInteger(0,nm,OBJPROP_STYLE,STYLE_DASH);
      //--- установим толщину линии
      ObjectSetInteger(0,nm,OBJPROP_WIDTH,1);
      //--- включим (true) или отключим (false) режим продолжения отображения линии вправо
      ObjectSetInteger(0,nm,OBJPROP_RAY_RIGHT,true);
      ObjectSetInteger(0,nm,OBJPROP_RAY,true);    
      //--- отобразим на переднем (false) или заднем (true) плане
      ObjectSetInteger(0,nm,OBJPROP_BACK,true);
      //--- включим (true) или отключим (false) режим перемещения линии мышью
      ObjectSetInteger(0,nm,OBJPROP_SELECTABLE,false);
      ObjectSetInteger(0,nm,OBJPROP_SELECTED,false);
      //--- установим текст
      if (showShadowText) ObjectSetString(0,nm,OBJPROP_TEXT,"  "+txt);
      //--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
      ObjectSetInteger(0,nm,OBJPROP_HIDDEN,true);
 }
 
Bonjour,
Je voudrais faire en sorte que lors de l'ouverture d'une transaction d'achat, le conseiller compare le lot de transaction de la transaction ouverte avec le lot de transaction maximum et si le lot est supérieur à une certaine valeur, le conseiller fermera automatiquement la dernière transaction.

Dans l'exemple ci-dessous, j'ai indiqué que le conseiller devrait fermer les transactions si le lot de transaction est supérieur à 2... Comment pensez-vous que cette condition va fonctionner ?

if ((typeLastOrder==OP_BUY && orderlots()>2 || typeLastOrder==OP_BUYSTOP && orderlots()>2 || typeLastOrder==OP_BUYLIMIT && orderlots()>2)){
Alert("aucun lot supérieur à 2 n'est autorisé") ;
CloseDelete(lastTicket) ;
retour ;
}
 
Konstantins Korolkovs:
Après-midi,
Je voudrais que le conseiller expert compare le volume de la transaction ouverte avec le volume maximum de la transaction, et si le volume est supérieur à une certaine valeur, le conseiller expert fermera automatiquement la dernière transaction.

Dans l'exemple ci-dessous, j'ai spécifié que le conseiller expert doit fermer les transactions si le lot de négociation est supérieur à 2. Comment pensez-vous que cette condition va fonctionner ?

if ((typeLastOrder==OP_BUY && orderlots()>2 || typeLastOrder==OP_BUYSTOP && orderlots()>2 || typeLastOrder==OP_BUYLIMIT && orderlots()>2)){
Alert("un lot supérieur à 2 ne peut être utilisé") ;
CloseDelete(lastTicket) ;
retour ;
}

Et pourquoi devrais-je l'ouvrir et le fermer tout de suite ? Peut-être vaut-il mieux ne pas ouvrir du tout ?

 
Alexey Viktorov:

Pourquoi ouvrir d'abord et fermer ensuite immédiatement ? Ne serait-il pas préférable de ne pas ouvrir du tout ?

Pour contrôler votre avidité

 

Aidez à déplacer vers la gauche, la droite ou horizontalement les numéros de tic-tac en haut des bougies comme rouge, vert, jaune sont rares. Ces chiffres se déplacent verticalement, mais je ne peux pas le faire horizontalement. Je veux qu'ils soient devant la bougie à laquelle ils appartiennent. Le code de l'indicateur :


//+------------------------------------------------------------------+

//| Fine volumes.mq4 |
//| eevviill |
//| itisallillusion@gmail.com |
//+------------------------------------------------------------------+
#property copyright "Aliev"
#property link "businessystems.ru "

#propriété indicator_separate_window
#property indicator_minimum 0
#property indicator_buffers 6

#property indicator_width1 2
#property indicator_width2 2
#propriété indicator_width3 2
#propriété indicator_width4 4
#propriété indicator_width5 4

#property indicator_color1 SkyBlue
#property indicator_color2 Maroon
#property indicator_color3 Yellow
#property indicator_color4 Blue
#property indicator_color5 Red



extern int BarsToCount = 400 ;

extern string pus1 = "" ;
extern string p_s = "Paramètres des points" ;
extern bool use_points = true ;
extern int distance_point = 80 ;
extern color color_point_u = Lime ;
extern color color_point_d = Red ;
extern color color_point_s = Yellow ;
extern int size_point = 6 ;

extern string pus2 = "" ;
extern string s_w = "Way" ;
extern bool use_show_same_way = true ;
extern bool use_show_daily_way = true ;

extern string pus3 = "" ;
extern string al = "Alerts" ;
extern bool use_alerts = false ;
extern string up_alert = "Up" ;
extern string down_alert = "Down" ;




doubler[] ;
double down[] ;
double mid[] ;
double up2[] ;
double down2[] ;
double none[] ;

static int prevtime = 0 ;

///////////////////////////////////////
int init()
{
SetIndexStyle(0,DRAW_HISTOGRAM) ;
SetIndexBuffer(0,up) ;
SetIndexStyle(1,DRAW_HISTOGRAM) ;
SetIndexBuffer(1,down) ;
SetIndexStyle(2,DRAW_HISTOGRAM) ;
SetIndexBuffer(2,mid) ;
SetIndexStyle(3,DRAW_HISTOGRAM) ;
SetIndexBuffer(3,up2) ;
SetIndexStyle(4,DRAW_HISTOGRAM) ;
SetIndexBuffer(4,down2) ;
SetIndexStyle(5,DRAW_NONE) ;
SetIndexBuffer(5,none) ;


IndicatorShortName("Aliev FX Volumes") ;


retour(0) ;
}

///////////////////////////////////////
int deinit()
{
chaîne de caractères nom_de ;
for(int c=BarsToCount;c>=0;c--)
{
nom_de="Vol_"+DoubleToStr(c,0) ;
if(ObjectFind(name_de)!=-1) ObjectDelete(name_de) ;
}
retour(0) ;
}


//////////////////////////////////////////
int start()
{
////////////
up[0]=EMPTY_VALUE ;
down[0]=EMPTY_VALUE ;
mid[0]=EMPTY_VALUE ;
if(Close[0]>Open[0]) up[0]=Volume[0];
if(Close[0]<Open[0]) down[0]=Volume[0];
if(Close[0]==Open[0]) mid[0]=Volume[0];

////////////////
if(use_points)
Ob_cre(0) ;

si(!use_points)
Ob_del(0) ;
////////
if(use_show_daily_way)
Ob_cre2() ;
if(!use_show_daily_way)
Ob_del2() ;

////////////
si (Time[0] == prevtime) return(0) ;
prevtime = Time[0] ;
///////////////////////////
for(int c=BarsToCount;c>=1;c--)
{
////////////
if(use_points)
Ob_cre(c) ;

si(!use_points)
Ob_del(c) ;
////////////
up[c]=EMPTY_VALUE ;
down[c]=EMPTY_VALUE ;
mid[c]=EMPTY_VALUE ;
up2[c]=EMPTY_VALUE ;
down2[c]=EMPTY_VALUE ;




/////////////////
si(Close[c]>Open[c]) up[c]=Volume[c] ;
si(Close[c]<Open[c]) down[c]=Volume[c] ;
if(Close[c]==Open[c]) mid[c]=Volume[c];
none[c]=Volume[c]+Volume[c]/6;


//////////////
if(use_show_same_way)
{

if(Close[c]>Open[c] && Close[c+1]>Open[c+1])
{
up2[c]=Volume[c]; up2[c+1]=Volume[c+1];
up[c]=EMPTY_VALUE ; up[c+1]=EMPTY_VALUE ;
}

if(Close[c]<Open[c] && Close[c+1]<Open[c+1])
{
down2[c]=Volume[c]; down2[c+1]=Volume[c+1];
down[c]=EMPTY_VALUE ; down[c+1]=EMPTY_VALUE ;
}

}


if(use_alerts)
{
if(up2[1]!=EMPTY_VALUE && up2[4]==EMPTY_VALUE) Alert(up_alert) ;
if(down2[1]!=EMPTY_VALUE && down2[4]==EMPTY_VALUE) Alert(down_alert) ;
}



}
retour(0) ;
}
//func
//+------------------------------------------------------------------+///////////////////////////////
void Ob_cre(int num_de_bar)
{
string name="Vol_"+DoubleToStr(num_de_barre,0) ;

couleur col_po ;
if(Close[num_de_bar] >Open[num_de_bar]) col_po=color_point_u ;
if(Close[num_de_bar] <Open[num_de_bar]) col_po=color_point_d ;
if(Close[num_de_bar] ==Open[num_de_bar]) col_po=color_point_s ;

si(ObjectFind(name)==-1)
{
ObjectCreate(nom,OBJ_TEXT,0,0)
}
ObjectSet(name,OBJPROP_TIME1,Time[num_de_bar]) ;
ObjectSet(name,OBJPROP_PRICE1,High[num_de_bar] +distance_point*Point) ;
ObjectSet(name,OBJPROP_ANGLE,90) ;
ObjectSetText(name,DoubleToStr(Volume[num_de_bar],0),size_point, "Arrial",col_po) ;


}

/////////////////////////////////////////
void Ob_cre2()
{
int Num_of_win = WindowFind("Aliev FX Volumes") ;

if(ObjectFind("D_w")==-1)
{
ObjectCreate("D_w",OBJ_LABEL,Num_of_win,0,0) ;
ObjectSet("D_w",OBJPROP_CORNER,1) ;
ObjectSet("D_w",OBJPROP_XDISTANCE,20) ;
ObjectSet("D_w",OBJPROP_YDISTANCE,20) ;
ObjectSetText("D_w", "Daily volume",10, "Arrial",White) ;
}


if(ObjectFind("D_w_v")==-1)
{
ObjectCreate("D_w_v",OBJ_LABEL,Num_of_win,0,0) ;
ObjectSet("D_w_v",OBJPROP_CORNER,1) ;
ObjectSet("D_w_v",OBJPROP_XDISTANCE,20) ;
ObjectSet("D_w_v",OBJPROP_YDISTANCE,45) ;
}
couleur vol_col ;
if(iClose(Symbol(),PERIOD_D1,0)>iOpen(Symbol(),PERIOD_D1,0)) vol_col=Lime ;
si(iClose(Symbol(),PERIOD_D1,0)<iOpen(Symbol(),PERIOD_D1,0)) vol_col=OrangeRed ;

ObjectSetText("D_w_v",DoubleToStr(iVolume(Symbol(),PERIOD_D1,0),0),12, "Arrial",vol_col) ;


}

/////////////////////////////////////////////////////////////////
void Ob_del(int num_de_bar)
{
string name="vol_"+DoubleToStr(num_of_bar,0) ;

si(ObjectFind(name)!=-1)
{
ObjectDelete(nom) ;
}


}

/////////////////////////////////////////
void Ob_del2()
{
if(ObjectFind("D_w")!=-1)
ObjectDelete("D_w") ;


if(ObjectFind("D_w_v")!=-1)
ObjectDelete("D_w_v") ;



}
 
koctja:

Aidez à déplacer vers la gauche, la droite ou horizontalement les numéros de tic-tac en haut des bougies comme rouge, vert, jaune sont rares. Ces chiffres se déplacent verticalement, mais je ne peux pas le faire horizontalement. Je veux qu'ils soient devant la bougie à laquelle ils appartiennent. Le code de l'indicateur :


Dans ce cas, je mettrais simplement un espace devant le numéro (si l'impression est horizontale)...
 
koctja:

Aidez à déplacer vers la gauche, la droite ou horizontalement les numéros de tic-tac en haut des bougies comme rouge, vert, jaune sont rares. Ces chiffres se déplacent verticalement, mais je ne peux pas le faire horizontalement. Je veux qu'ils soient devant la bougie à laquelle ils appartiennent. Le code de l'indicateur :

Essayez dedéfinir le point d'ancrage de l'objetOBJ_TEXT dans le fichier


CENTRE D'ANCRE

Le point d'ancrage est strictement au centre de l' objet.


ObjectSetInteger(0,name,OBJPROP_ANCHOR,ANCHOR_CENTER);
Raison: