Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 840

 

Cosa c'è che non va?

C'è una classe template

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];
    }
};

Poi provo a fare questo nel codice:

MyList myList<OtherClass>();

Si acciglia!

 
Roman Sharanov:

Poi provo a fare questo nel codice:

Si acciglia!

Mi serve così:

MyList<OtherClass> myList;

ecco un esempio di come lavorare con i modelli pubblicatosu https://www.mql5.com/ru/forum/221917/page25#comment_11205772

vedi se puoi usare il mio codice come un'analogia con il tuo

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

deve essere così:

ecco un esempio di come lavorare con i modelli che ho postatohttps://www.mql5.com/ru/forum/221917/page25#comment_11205772

Vedi se puoi scrivere il tuo per analogia con il mio codice

Grazie

 

è possibile impostare la posizione del testo rispetto alla linea?

La linea è creata programmaticamente, il testo è disegnato sopra la linea, ma in alcuni casi ho bisogno che il testo sia in basso...


come fare?


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);
 }
 
Buon pomeriggio,
Vorrei fare in modo che quando si apre un trade di acquisto il consulente confronti il lotto di trading del trade aperto con il lotto massimo di trading e se il lotto è superiore a un certo valore, il consulente chiuderà automaticamente l'ultimo trade.

nell'esempio seguente ho indicato che il consulente dovrebbe chiudere i trade se il lotto di trading è superiore a 2... Come pensa che funzionerà questa condizione?

if ((typeLastOrder==OP_BUY && orderlots()>2 || typeLastOrder==OP_BUYSTOP && orderlots()>2 || typeLastOrder==OP_BUYLIMIT && orderlots()>2)){
Alert("nessun lotto superiore a 2 è permesso");
CloseDelete(lastTicket);
return;
}
 
Konstantins Korolkovs:
Pomeriggio,
Vorrei che l'Expert Advisor confrontasse il volume di scambio del trade aperto con il volume di scambio massimo, e se il volume è superiore a un certo valore, l'Expert Advisor chiuderà automaticamente l'ultimo trade.

Nell'esempio qui sotto, ho specificato che l'Expert Advisor dovrebbe chiudere i trade se il lotto di trading è superiore a 2. Come pensate che funzionerà questa condizione?

se ((typeLastOrder==OP_BUY && orderlots()>2 || typeLastOrder==OP_BUYSTOP && orderlots()>2 || typeLastOrder==OP_BUYLIMIT && orderlots()>2)){
Alert("lotto superiore a 2 non può essere usato");
CloseDelete(lastTicket);
ritorno;
}

E perché dovrei aprire e poi chiudere subito? Forse è meglio non aprire affatto?

 
Alexey Viktorov:

Perché aprire prima e chiudere subito dopo? Non sarebbe meglio non aprire affatto?

Per controllare la tua avidità

 

Aiuta a spostare a sinistra, a destra o orizzontalmente i numeri di tick in cima alle candele come rosso, verde, giallo sono rari. Questi numeri si muovono in verticale, ma non posso farlo in orizzontale. Voglio che siano davanti alla candela a cui appartengono. Il codice dell'indicatore:


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

//| Volumi fini.mq4 |
//| eevviill |
//| itisallillusion@gmail.com |
//+------------------------------------------------------------------+
#proprietà copyright "Aliev"
#proprietà link "businessystems.ru "

#proprietà indicator_separate_window
#proprietà indicatore_minimo 0
#proprietà indicator_buffers 6

#proprietà indicator_width1 2
#proprietà indicator_width2 2
#proprietà indicator_width3 2
#proprietà indicator_width4 4
#proprietà indicator_width5 4

#property indicator_color1 SkyBlue
#property indicator_color2 Maroon
#proprietà indicator_color3 Giallo
#property indicator_color4 Blue
#property indicator_color5 Red



extern int BarsToCount = 400;

extern string pus1 = "";
extern string p_s = "Impostazioni punti";
extern bool use_points = true;
extern int distance_point = 80;
extern color_point_u = Lime;
extern color_point_d = Red;
extern color_point_s = Giallo;
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";




double up[];
double down[];
doppio mid[];
doppio up2[];
doppio down2[];
doppio nessuno[];

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);


IndicatoreNomeCorto("Aliev FX Volumi");


ritorno(0);
}

///////////////////////////////////////
int deinit()
{
stringa name_de;
for(int c=BarsToCount;c>=0;c--)
{
name_de="Vol_"+DoubleToStr(c,0);
if(ObjectFind(name_de)!=-1) ObjectDelete(name_de);
}
ritorno(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];

////////////////
se(punti_utili)
Ob_cre(0);

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

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

se(!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;




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


//////////////
se(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);
}



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

colore col_po;
se(Close[num_of_bar]>Open[num_of_bar]) col_po=color_point_u;
if(Close[num_of_bar]<Open[num_of_bar]) col_po=color_point_d;
if(Close[num_of_bar]==Open[num_of_bar]) col_po=color_point_s;

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


}

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

se(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", "Volume giornaliero",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);
}
colore vol_col;
if(iClose(Symbol(),PERIOD_D1,0)>iOpen(Symbol(),PERIOD_D1,0)) vol_col=Lime;
se(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_of_bar)
{
string name="vol_"+DoubleToStr(num_of_bar,0);

if(ObjectFind(name)!=-1)
{
ObjectDelete(nome);
}


}

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


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



}
 
koctja:

Aiuta a spostare a sinistra, a destra o orizzontalmente i numeri di tick in cima alle candele come rosso, verde, giallo sono rari. Questi numeri si muovono in verticale, ma non posso farlo in orizzontale. Voglio che siano davanti alla candela a cui appartengono. Il codice dell'indicatore:


Metterei semplicemente uno spazio davanti al numero in questi casi (se si stampa orizzontalmente)...
 
koctja:

Aiuta a spostare a sinistra, a destra o orizzontalmente i numeri di tick in cima alle candele come rosso, verde, giallo sono rari. Questi numeri si muovono in verticale, ma non posso farlo in orizzontale. Voglio che stiano davanti alla candela a cui appartengono. Il codice dell'indicatore:

Prova aimpostare il punto di ancoraggio per l'oggettoOBJ_TEXT nel file


CENTRO ANCORA

Il punto di ancoraggio è strettamente nel centro dell'oggetto


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