MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 151

 
Maxim Kuznetsov:

というようなものです.

string level="Level"+IntegerToString(iTime(_Symbol,iBarShift(OrderCloseTime())); // ид.уровня - по времени бара (!! не по тикету)

if (ObjectFind(level)‌==-1) {

  // гор.вектора нет - видимо первый ордер из закрытых на баре

  // сделать горизонтальную линию‌

  ObjectCreate(0,level,OBJ_TREND,0,OrderCloseTime(),OrderClosePrice(),OrderCloseTime()+PeriodSeconds(_Period)*3,OrderClosePrice);

 // указывающую только вправо‌

  ObjectSetInteger(level,‌OBJPROP_RAY,1);

  ObjectSetInteger(level,OBJPROP_RAYLEFT,0);

‌ // украсить её как-то :-)

 ObjectSetInteger(level,OBJPROP_‌COLOR,....)

 ....‌

} else {

  // гор.уровень есть - значит были ордера закрытые на этом баре

  // по фантазии - обновить метки/корректировать уровень/etc‌

}‌

int TotalPos=-1;

void start()
 
{
 // остальной код

//--
  if(OrdersTotal()!=TotalPos) { // не мучаем каждый тик
   for(int i=OrdersHistoryTotal()-1; i>=0; i--) {
    if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
     if(OrderSymbol()==Symbol() && OrderType()<=1) {
      History();

  
     }
  }}} TotalPos=OrdersTotal(); // запомним количество
//--
}
 
 
 
 void History() {
  string Ticket=(string)OrderTicket();
  color col=Red;
  if(OrderType()==0)col=Blue;
  datetime a=OrderOpenTime();
  double b=OrderOpenPrice();
  datetime c=OrderCloseTime();
  double d=OrderClosePrice();
  double prSep=OrderProfit()+OrderCommission()+OrderSwap();
  double prAll=0;
  int    cn=0;
  string hTicket;
   for(int i=OrdersHistoryTotal()-1; i>=0; i--) {
    if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
     if(OrderSymbol()==Symbol() && OrderType()<=1) {
      datetime ct=OrderCloseTime();
      // 60 секунд разницы между закрытием первой и последней в сетке
      if(c<=ct+60 && c>=ct-60) {
        prAll+=OrderProfit()+OrderCommission()+OrderSwap();
        hTicket=(string)OrderTicket();
        cn++;
      }
   }}}
   ObjectCreate(Ticket+"Open",OBJ_ARROW,0,a,b);
   ObjectSet(Ticket+"Open",OBJPROP_COLOR,col);
   ObjectSet(Ticket+"Open",OBJPROP_ARROWCODE,1);
     
   ObjectCreate(Ticket+"Line",OBJ_TREND,0,a,b,c,d);
   ObjectSet(Ticket+"Line",OBJPROP_COLOR,col);
   ObjectSet(Ticket+"Line",OBJPROP_WIDTH,1);
   ObjectSet(Ticket+"Line",OBJPROP_STYLE,STYLE_DOT);
   ObjectSet(Ticket+"Line",OBJPROP_RAY,0);
     
   ObjectCreate(Ticket+"Close",OBJ_ARROW,0,c,d);
   ObjectSet(Ticket+"Close",OBJPROP_COLOR,Green);
   ObjectSet(Ticket+"Close",OBJPROP_ARROWCODE,3);
 
   Ticket=cn>1?hTicket:Ticket;
   ObjectCreate(Ticket+"Profit",OBJ_TEXT,0,c,d);
   ObjectSet(Ticket+"Profit",OBJPROP_ANCHOR,0);
   ObjectSetText(Ticket+"Profit",DoubleToString(prAll,2),10,"Arial",White);
   ObjectSet(Ticket+"Profit",OBJPROP_PRICE1,d);
   ObjectSet(Ticket+"Profit",OBJPROP_TIME1,c+Period()*60*2);
}

ベクトルをレベルファインダーに使うのは間違っている...。いまいち・・・・・・((

馬を動かすとどうなるか)

レベル検索では、すでに記録されている価格レベルでの利益総和の原則を使用します...

例:ここでは60秒の遅延でトライして利益を加算しています

 for(int i=OrdersHistoryTotal()-1; i>=0; i--) {
    if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
     if(OrderSymbol()==Symbol() && OrderType()<=1) {
      datetime ct=OrderCloseTime();
      // 60 секунд разницы между закрытием первой и последней в сетке
      if(c<=ct+60 && c>=ct-60) {
        prAll+=OrderProfit()+OrderCommission()+OrderSwap();
        hTicket=(string)OrderTicket();
        cn++;

次に、レコードを考える必要があります。

レベル> 1の累積利益数であれば、これは我々のオーダーであり、我々のレベルであり、このレベルから我々はレイを描く。

 

ごあいさつ

私は、毎ティック ごとに、そのEAで作成された利用可能な注文をループして、状況に応じて行動する機能を持つEAを計画しています。

新しい注文ごとに個別の変数を作成し、さらにループでそれらを処理 する方法をアドバイスしてください。(Peremennaja+ticket=12345;のようなものだと思われます)

 
Andrey Sokolov:

ごあいさつ

私は、毎ティック ごとに、そのEAで作成された利用可能な注文をループして、状況に応じて行動する機能を持つEAを計画しています。

新しい注文ごとに個別の変数を作成し、さらにループでそれらを処理 する方法をアドバイスしてください。(Peremennaja+ticket=12345;のようなものだと思われます)

好ましくは、配列、あるいは構造体の配列である。
 
Alexey Viktorov:
配列、あるいは構造体の配列がベターです。

すみません、詳しく教えてください。
 
Andrey Sokolov:

すみません、もう少し詳しくお願いします。


ここと ここ

構造体と構造体型の配列が作成されます。すべてのコードの外側で。

struct trade_settings
  {
   double take;         // значения цены фиксации прибыли
   double stop;         // значение цены защитного стопа
   uchar  slippage;     // значение допустимого проскальзывания
  };
//--- создали массив типа trade_settings
trade_settings my_set[];
// присвоить значение нулевому индексу массива в основном коде
my_set[0].take = что_то;
Структуры и, классы и интерфейсы - Типы данных - Основы языка - Справочник MQL4
Структуры и, классы и интерфейсы - Типы данных - Основы языка - Справочник MQL4
  • docs.mql4.com
Структуры и, классы и интерфейсы - Типы данных - Основы языка - Справочник MQL4
 

こんにちは。

水平線"ResisL"とトレンド 線の交点を角度"TrndL"で求める方法を教えてください。

トラ
 
Nikolay Fedyay:

こんにちは。

水平線"ResisL"とトレンド 線の交点を角度"TrndL"で求める方法を教えてください。

//+------------------------------------------------------------------+
//| Уравнение прямой                                                 |
//+------------------------------------------------------------------+
double EquationDirect(double left_bar, double left_price, double right_bar, double right_price, double bar_to_search) {
  return((right_bar==left_bar)?left_price:(right_price-left_price)/(right_bar-left_bar)*(bar_to_search-left_bar)+left_price);
}
//+------------------------------------------------------------------+
傾斜線の座標点を2つ知っていて、それをこの関数のパラメータとして貼り付けると、bar_to_search上の点の価格が出力されます。あとは、バーループの中でこの関数を呼び出し、それが返す値と水平線の価格を比較するだけです。サイクルの最後のバーで関数が返す値が水平線の価格より低いか等しく、サイクルの現在のバーで関数が返す値が線の価格より大きければ、クロスポイントのX座標はサイクルインデックスに対応する時間となり、Y座標は関数が返す価格となります。
 
Artyom Trishkin:

ありがとうございます。

まだバーがないとき、つまり将来の日付のクロスオーバーポイントを知りたい場合はどうでしょうか。

 
Nikolay Fedyay:

ありがとうございます。

まだバーがないとき、つまり将来の日付のクロスオーバーポイントを知りたい場合はどうでしょうか。

この機能はまだ試していません - 実験が必要です。

 
Artyom Trishkin:

この機能はまだ試していません - 実験が必要です。

ぜひ、時間を見つけては実験し、その結果を共有してください。

何を実験 したらいいのかわからないから
.