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("no lot higher than 2 is allowed");
CloseDelete(lastTicket);
return;
}
 
Konstantins Korolkovs:
午後
Expert Advisorで、開いた取引の取引量と最大取引量を比較し、一定値以上であれば、最後の取引を自動的に決済するようにしてほしいです。

以下の例では、Expert Advisorは取引ロットが2より大きい場合、取引を終了するように指定しています。この条件はどうでしょうか?

if ((typeLastOrder==OP_BUY && orderlots()>2 || typeLastOrder==OP_BUYSTOP && orderlots()>2 || typeLastOrder==OP_BUYLIMIT && 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:

なぜ最初に開いて、すぐに閉じるのか?全く開かない方がいいのでは?

欲をコントロールするために

 

赤、緑、黄色は珍しいので、ローソクの上のティック番号を左、右、または水平にシフトするのに役立ちます。この数字は縦に動きますが、横にはできないんです。所属するキャンドルの前に出てきてほしいのです。インジケーターのコードです。


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

//| ファインボリューム.mq4
//| イーブイビル|
//| itisallillusion@gmail.com |
//+------------------------------------------------------------------+
#property copyright "Aliev"
#property link "businessystems.ru "

#property indicator_separate_window
#property indicator_minimum 0
#プロパティ indicator_buffers 6

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

#プロパティ indicator_color1 SkyBlue
#プロパティ indicator_color2 Maroon
#property indicator_color3 イエロー
#プロパティ indicator_color4 ブルー
#property indicator_color5 レッド



extern int BarsToCount = 400;

extern string pus1 = "";
extern string p_s = "ポイント設定";
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;

外部文字列 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 = "ダウン";




ダブルアップ[]。
ダブルダウン[]。
double mid[];
double up2[]です。
ダブルダウン2[]。
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")。


return(0)です。
}

int deinit()
{
文字列名_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];

////////////////
if(use_points)
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 = Time[0];
for(int c=BarsToCount;c>=1;c--)
{
////////////
if(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。




/////////////////
if(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;


//////////////
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(クローズ[c]<オープン[c] && クローズ[c+1]<オープン[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);
}



}
return(0)です。
}
//func
//+------------------------------------------------------------------+///////////////////////////////
void Ob_cre(int num_of_bar)
{
文字列名="Vol_"+DoubleToStr(num_of_bar,0);

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


}

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)を使用します。
}
カラー 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.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)
{
文字列名="vol_"+DoubleToStr(num_of_bar,0);

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


}

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


if(ObjectFind("D_w_v")!=-1))です。
ObjectDelete("D_w_v")。



}
 
koctja:

赤、緑、黄色のようにローソクの上のティック番号を左、右、または水平にシフトするのに役立つことはまれである。この数字は縦に動きますが、横にはできないんです。所属するキャンドルの前に出てきてほしいのです。インジケーターのコードです。


そんな時は数字の前にスペースを入れればいいのですが...(横向き印刷の場合)。
 
koctja:

赤、緑、黄色は珍しいので、ローソクの上のティック番号を左、右、または水平にシフトするのに役立ちます。この数字は縦に動きますが、横にはできないんです。所属するキャンドルの前に出てきてほしいのです。インジケーターのコードです。

OBJ_TEXT オブジェクトにアンカーポイントを設定してみて ください。


ANCHOR_CENTER

アンカーポイントは厳密には オブジェクトの中心で ある


ObjectSetInteger(0,name,OBJPROP_ANCHOR,ANCHOR_CENTER);