新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 840

 

怎么了?

有一个模板类

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

然后在代码中,我试图让它变成这样。

MyList myList<OtherClass>();

它皱着眉头!

 
Roman Sharanov:

然后我尝试在代码中这样做。

它皱着眉头!

我需要这样的东西。

MyList<OtherClass> myList;

这里有一个关于如何使用模板的例子 张贴在https://www.mql5.com/ru/forum/221917/page25#comment_11205772

看看你是否可以用我的代码来类比你的代码

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

它必须是这样的。

这里有一个如何使用我发布的模板的例子https://www.mql5.com/ru/forum/221917/page25#comment_11205772

看看你能不能用我的代码来写你的代码

谢谢你

 

是否可以设置文本相对于行的位置?

线条是以编程方式创建的,文本在线条上方绘制,但在某些情况下,我需要文本在底部。


如何做到这一点?


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);
 }
 
下午好,
,我想让它在开立买入交易时,顾问将开立交易的交易手数与最大交易手数进行比较,如果交易手数高于某个值,顾问将自动关闭最后一笔交易。

在下面的例子中,我表示如果交易手数高于2,顾问将关闭交易...你认为这个条件将如何运作?

if ((typeLastOrder==OP_BUY && orderlots()>2 || typeLastOrder==OP_BUYSTOP && orderlots()>2 || typeLastOrder==OP_BUYLIMIT && orderlots()>2)){
Alert("不允许高于2的手数");
CloseDelete(lastTicket);
返回;
}
 
Konstantins Korolkovs:
下午。
我想让专家顾问将开仓交易的交易量与最大交易量进行比较,如果交易量高于某一数值,专家顾问将自动关闭最后一笔交易。

在下面的例子中,我指定专家顾问应该在交易手数高于2时关闭交易。你认为这个条件将如何运作?

如果((typeLastOrder==OP_BUY && orderlots()>2 || typeLastOrder==OP_BUYSTOP && orderlots()>2 || typeLastOrder==OP_BUYLIMIT && orderlots()>2)) {
Alert("lot higher than 2 may not be used")。
CloseDelete(lastTicket)。
返回。
}

而我为什么要马上打开然后再关闭呢?也许根本不打开更好?

 
Alexey Viktorov:

为什么先打开,然后立即关闭?完全不打开不是更好吗?

要控制你的贪婪

 

帮助向左、向右或水平移动蜡烛上面的刻度线数字,因为红色、绿色、黄色是罕见的。这些数字在垂直方向上移动,但我不能在水平方向上做。我希望他们能在属于他们的蜡烛前。该指标的代码。


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

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

#属性 indicator_separate_window
#property indicator_minimum 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 黄色
#property indicator_color4 Blue
#property indicator_color5 Red



外部int BarsToCount = 400;

外部字符串pus1 = ""。
外部字符串p_s = "点数设置"。
外部 bool use_points = true。
外来的int distance_point= 80。
外部颜色 color_point_u = Lime;
外部颜色 color_point_d = Red;
外部颜色 color_point_s = 黄色。
外来的int size_point = 6;

外部字符串 pus2 = ""。
外部字符串s_w = "Way"。
外部 bool use_show_same_way = true。
外部 bool use_show_daily_way = true;

外部字符串 pus3 = ""。
外部字符串al = "Alerts"。
外部 bool use_alerts = false。
外部字符串up_alert = "Up"。
extern string down_alert = "Down";




双倍增加[]。
双降[]。
double mid[];
double up2[]。
双倍下降2[]。
双重无[]。

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()
{
字符串name_de。
for(int c=BarsToCount;c>=0;c--)
{
name_de="Vol_"+DoubleToStr(c,0)。
if(ObjectFind(name_de)!=-1) ObjectDelete(name_de);
}
return(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];

////////////////
如果(use_points)
Ob_cre(0);

if(!use_points)
Ob_del(0)。
////////
如果(use_show_daily_way)
Ob_cre2()。
if(!use_show_daily_way)
Ob_del2()。

////////////
如果(Time[0] == prevtime)返回(0)。
prevtime = Time[0];
///////////////////////////
for(int c=BarsToCount;c>=1;c--)
{
////////////
如果(use_points)
Ob_cre(c);

if(!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。




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


//////////////
如果(use_show_same_way)
{

如果(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。
}

如果(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。
}

}


如果(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
//+------------------------------------------------------------------+///////////////////////////////
空白Ob_cre(int num_of_bar)。
{
string name="Vol_"+DoubleToStr(num_of_bar,0)。

color col_po;
如果(Close[num_of_bar]>Open[num_of_bar]) col_po=color_point_u;
如果(Close[num_of_bar]<Open[num_of_bar]) col_po=color_point_d;
如果(Close[num_of_bar]==Open[num_of_bar]) col_po=color_point_s;

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


}

/////////////////////////////////////////
空白 Ob_cre2()
{
int Num_of_win = WindowFind("Aliev FX Volumes")。

如果(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)。
}
颜色vol_col。
如果(iClose(Symbol(),PERIOD_D1,0)>iOpen(Symbol(),PERIOD_D1,0)) vol_col=Lime;
如果(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)。


}

/////////////////////////////////////////////////////////////////
空白 Ob_del(int num_of_bar)
{
string name="vol_"+DoubleToStr(num_of_bar,0)。

如果(ObjectFind(name)!=-1)
{
ObjectDelete(name)。
}


}

/////////////////////////////////////////
空白 Ob_del2()
{
如果(ObjectFind("D_w")!=-1)
ObjectDelete("D_w")。


如果(ObjectFind("D_w_v")!=-1)
ObjectDelete("D_w_v")。



}
 
koctja:

帮助向左、向右或水平移动蜡烛上面的刻度线数字,因为红色、绿色、黄色是罕见的。这些数字在垂直方向上移动,但我不能在水平方向上做。我希望他们能在属于他们的蜡烛前。指标的代码。


在这种情况下,我只会在数字前面加一个空格(如果是水平打印)...
 
koctja:

帮助向左、向右或水平移动蜡烛上面的刻度线数字,因为红色、绿色、黄色是罕见的。这些数字在垂直方向上移动,但我不能在水平方向上做。我希望他们能在属于他们的蜡烛前。指标的代码。

尝试为OBJ_TEXT 对象设置锚点,在


锚点中心

锚点严格地在 物体中心


ObjectSetInteger(0,name,OBJPROP_ANCHOR,ANCHOR_CENTER);