Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 840

 

¿Qué pasa?

Existe una clase de plantilla

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

Entonces en el código trato de hacerlo así:

MyList myList<OtherClass>();

¡Frunce el ceño!

 
Roman Sharanov:

Entonces intento hacer esto en el código:

¡Frunce el ceño!

Lo necesito así:

MyList<OtherClass> myList;

aquí hay un ejemplo de cómo trabajar con plantillas publicadoen https://www.mql5.com/ru/forum/221917/page25#comment_11205772

a ver si puedes usar mi código como analogía del tuyo

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

tiene que ser así:

aquí hay un ejemplo de cómo trabajar con las plantillas que publiquéhttps://www.mql5.com/ru/forum/221917/page25#comment_11205772

A ver si puedes usar mi código para escribir el tuyo

Gracias

 

¿es posible fijar la posición del texto en relación con la línea?

La línea se crea programáticamente, el texto se dibuja por encima de la línea, pero en algunos casos necesito que el texto esté en la parte inferior...


¿Cómo hacer esto?


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);
 }
 
Buenas tardes,
Me gustaría hacer que al abrir una operación de compra el asesor compare el lote de negociación de la operación abierta con el lote máximo de negociación y si el lote es superior a un determinado valor, el asesor cierre automáticamente la última operación.

en el ejemplo siguiente he indicado que el asesor debe cerrar las operaciones si el lote de negociación es superior a 2... ¿Cómo cree que funcionará esta condición?

if ((typeLastOrder==OP_BUY && orderlots()>2 || typeLastOrder==OP_BUYSTOP && orderlots()>2 || typeLastOrder==OP_BUYLIMIT && orderlots()>2)){
Alert("no se permite ningún lote superior a 2");
CloseDelete(lastTicket);
volver;
}
 
Konstantins Korolkovs:
Por la tarde,
Me gustaría que el Asesor Experto comparara el volumen de operaciones de la operación abierta con el volumen máximo de operaciones, y si el volumen es superior a un determinado valor, el Asesor Experto cerrará automáticamente la última operación.

En el ejemplo siguiente, he especificado que el Asesor Experto debe cerrar las operaciones si el lote de negociación es superior a 2. ¿Cómo cree que funcionará esta condición?

if ((typeLastOrder==OP_BUY && orderlots()>2 || typeLastOrder==OP_BUYSTOP && orderlots()>2 || typeLastOrder==OP_BUYLIMIT && orderlots()>2)){
Alert("no se puede utilizar un lote superior a 2");
CloseDelete(lastTicket);
volver;
}

¿Y por qué debo abrirlo y cerrarlo enseguida? ¿Tal vez sea mejor no abrir en absoluto?

 
Alexey Viktorov:

¿Por qué abrir primero y cerrar después? ¿No sería mejor no abrir en absoluto?

Para controlar su codicia

 

Ayuda a desplazar a la izquierda, derecha u horizontalmente los números de las velas como rojo, verde, amarillo son raros. Estos números se mueven verticalmente, pero no puedo hacerlo horizontalmente. Quiero que estén frente a la vela a la que pertenecen. El código del indicador:


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

//| Volúmenes finos.mq4 ||
//| eevviill ||
//| itisallillusion@gmail.com |
//+------------------------------------------------------------------+
#property copyright "Aliev"
#enlace de propiedad "businessystems.ru "

#property indicador_separar_ventana
#propiedad indicador_mínimo 0
#property indicator_buffers 6

#property indicator_width1 2
#property indicator_width2 2
#property indicator_width3 2
#property indicator_width4 4
#property indicator_width5 4

#property indicator_color1 SkyBlue
#property indicator_color2 Maroon
#property indicator_color3 Amarillo
#property indicator_color4 Azul
#property indicator_color5 Rojo



extern int BarsToCount = 400;

extern string pus1 = "";
cadena externa p_s = "Configuración de puntos";
extern bool puntos_de_uso = true;
extern int punto_distancia = 80;
extern color color_point_u = Lime;
extern color color_point_d = Rojo;
extern color color_point_s = Amarillo;
extern int tamaño_punto = 6;

extern string pus2 = "";
cadena externa s_w = "Camino";
extern bool use_show_same_way = true;
extern bool use_show_daily_way = true;

extern string pus3 = "";
cadena externa al = "Alertas";
extern bool use_alerts = false;
cadena externa up_alert = "Up";
extern string down_alert = "Down";




doble[];
doblemente hacia abajo[];
doble mid[];
doble up2[];
doble down2[];
doble ninguno[];

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


return(0);
}

///////////////////////////////////////
int deinit()
{
nombre_de_cadena;
for(int c=BarsToCount;c>=0;c--)
{
name_de="Vol_"+DoubleToStr(c,0);
if(ObjectFind(nombre_de)!=-1) ObjectDelete(nombre_de);
}
return(0);
}


//////////////////////////////////////////
int inicio()
{
////////////
up[0]=Valor_de_Empleo;
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(puntos_de_uso)
Ob_cre(0);

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

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

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




/////////////////
if(Close[c]>Open[c]) up[c]=Volumen[c];
if(Close[c]<Open[c]) down[c]=Volumen[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]=VALOR_EMPTY; down[c+1]=VALOR_EMPTY;
}

}


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



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

color col_po;
if(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(nombre,OBJ_TEXT,0,0)
}
ObjectSet(name,OBJPROP_TIME1,Time[num_of_bar]);
ObjectSet(nombre,OBJPROP_PRICE1,Alto[número_de_barra]+punto_distancia*Punto);
ObjectSet(nombre,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");

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);
}
color vol_col;
if(iClose(Symbol(),PERIOD_D1,0)>iOpen(Symbol(),PERIOD_D1,0)) vol_col=Lime;
if(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)
{
BorrarObjeto(nombre);
}


}

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


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



}
 
koctja:

Ayuda a mover a la izquierda, derecha u horizontalmente los números de garrapatas en la parte superior de las velas como rojo, verde, amarillo son raros. Estos números se mueven verticalmente, pero no puedo hacerlo horizontalmente. Quiero que estén frente a la vela a la que pertenecen. El código del indicador:


Yo sólo pondría un espacio delante del número en estos casos (si se imprime en horizontal)...
 
koctja:

Ayuda a desplazar a la izquierda, derecha u horizontalmente los números de las velas como rojo, verde, amarillo son raros. Estos números se mueven verticalmente, pero no puedo hacerlo horizontalmente. Quiero que estén frente a la vela a la que pertenecen. El código del indicador:

Intentaestablecer el punto de anclaje para el objetoOBJ_TEXT en el


CENTRO DE ANCLAJE

El punto de anclaje está estrictamente en el centro del objeto


ObjectSetInteger(0,name,OBJPROP_ANCHOR,ANCHOR_CENTER);
Razón de la queja: