初心者の方からの質問 MQL5 MT5 MetaTrader 5 - ページ 1478

 
MrBrooklin #:

何が分からないのですか?EA初期化関数の作り方?それなら、初心者向けのこの記事で 勉強してみてください。

よろしく、ウラジミール。

初期化とはどういう意味でしょうか?)

 
Valeriy Yastremskiy #:

イニシャライズとはどういう意味なのだろうか?)

こんばんは、ヴァレリー!私たちは、その人に提案された記事を開き、そこにまず簡単な説明を見つける:

Далее идет функция инициализации советника. Это функция вызывается первой после запуска советника или смены графика и вызывается только один раз.

Этот раздел - лучшее место для проведения проверок, чтобы убедиться в правильности работы нашего советника.

Например, можно проверить, достаточно ли баров на графике для работы нашего советника и т.п.

Также это лучшее место для получения хэндлов технических индикаторов, которые будут использоваться (в нашем случае это индикаторы ADX и Moving Average).

そして、より詳細なものを見つける:

int OnInit()
  {
//--- Получить хэндл индикатора ADX
   adxHandle=iADX(NULL,0,ADX_Period);
//--- Получить хэндл индикатора Moving Average
   maHandle=iMA(_Symbol,_Period,MA_Period,0,MODE_EMA,PRICE_CLOSE);
//--- Нужно проверить, не были ли возвращены значения Invalid Handle
   if(adxHandle<0 || maHandle<0)
     {
      Alert("Ошибка при создании индикаторов - номер ошибки: ",GetLastError(),"!!");
     }

一般的に、彼は少なくとも最初にこの記事を読むべきです。))

ありがとう、ウラジーミル。

 

皆さん、こんにちは!

自習を続けているのですが、またしても混乱に陥りました。これがスクリプトのコードです:

//+------------------------------------------------------------------+
//| Input variables                                                  |
//+------------------------------------------------------------------+
input uchar candles = 60;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   MqlRates price_array[];
   double price_low[];
   ArraySetAsSeries(price_low, true);
   ArraySetAsSeries(price_array, true);
   int copy_low = CopyLow(_Symbol, _Period, 0, candles, price_low);
   if(copy_low > 0)
     {
      int candle_low = ArrayMinimum(price_low, 0, candles);
      int Data = CopyRates(_Symbol, _Period, 0, candles, price_array);
      ObjectCreate(0, "UpwardTrendline", OBJ_TREND, 0, price_array[candle_low].time, price_array[candle_low].low,
                   price_array[0].time, price_array[0].low,0);
      ObjectSetInteger(0, "UpwardTrendline", OBJPROP_COLOR, Blue);
      ObjectSetInteger(0, "UpwardTrendline", OBJPROP_STYLE, STYLE_SOLID);
      ObjectSetInteger(0, "UpwardTrendline", OBJPROP_WIDTH, 3);
      ObjectSetInteger(0, "UpwardTrendline", OBJPROP_RAY_RIGHT, true);
     }
  }
//+------------------------------------------------------------------+

スクリプトはトレンドラインをセグメントとして描画することになっていました。これを行うために、私はこのセグメントを描画するための初期点と第2点を設定しました。ドキュメントには、トレンド・ラインを描くには2つのアンカー・ポイントが必要だとも書いてある。私の理解では、2つ目の点はトレンド・ラインを描くためのアンカー・ポイントであり、2つ目の点はトレンド・ラインを描くためのアンカー・ポイントである。私の理解では、2点目も極端な点ですが、なぜかセグメントではなくレイが描画されます。


どこが間違っているのか教えていただけますか?

よろしく、ウラジミール。

 

MrBrooklin #:
     

      ObjectSetInteger(0, "UpwardTrendline", OBJPROP_COLOR, Blue);
      ObjectSetInteger(0, "UpwardTrendline", OBJPROP_STYLE, STYLE_SOLID);
      ObjectSetInteger(0, "UpwardTrendline", OBJPROP_WIDTH, 3);
      ObjectSetInteger(0, "UpwardTrendline", OBJPROP_RAY_RIGHT, true);
ObjectSetInteger(0, "UpwardTrendline", OBJPROP_RAY_RIGHT, false);
 
Artyom Trishkin #:

ありがとう、アルチョム!こんな簡単で当たり前のことを理解できるほど、僕には知性がなかったんだ。神のご加護を!

ウラジーミル

 

皆さん、おはようございます!

それだ"今行くよ、君の屋根!"俺だスクリプトを実行すると

//+------------------------------------------------------------------+
//|                                              Count_Pos (v.2).mq5 |
//|                                  Copyright 2023, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Calculate positions Buy and Sell                                 |
//+------------------------------------------------------------------+
void Calc_Pos(uint pos_buy,uint pos_sell)
  {
   for(int i=0; i<PositionsTotal(); i++)
     {
      PositionGetSymbol(i);
      if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
         pos_buy++;
      if(
         PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
         pos_sell++;
     }
   Print("pos_buy ",pos_buy);
   Print("pos_sell ",pos_sell);
  }
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   uint count_buy=0, count_sell=0;
   Calc_Pos(count_buy,count_sell);
   Print("По символу ",_Symbol," открыто: ",count_buy," длинных позиций");
   Print("По символу ",_Symbol," открыто: ",count_sell," коротких позиций");
  }
//+------------------------------------------------------------------+

こうだ

2023.11.22 07:59:29.375 Count_Pos (v.2) (EURUSDrfd,M1)  pos_buy 0
2023.11.22 07:59:29.375 Count_Pos (v.2) (EURUSDrfd,M1)  pos_sell 2
2023.11.22 07:59:29.375 Count_Pos (v.2) (EURUSDrfd,M1)  По символу EURUSDrfd открыто: 0 длинных позиций
2023.11.22 07:59:29.375 Count_Pos (v.2) (EURUSDrfd,M1)  По символу EURUSDrfd открыто: 0 коротких позиций

2つのショートポジションがあるはずです。どこを間違えたのか教えてください。

よろしく、ウラジミール。

 
MrBrooklin #:

皆さん、おはようございます!

それだ"今行くよ、君の屋根!"俺だ台本通りです

こうだ

2つのショートポジションがあるはずです。どこで間違えたのか教えてください。

よろしく、ウラジミール。

最後の2つのプリント

は変数の値を出力しています。

uint count_buy=0, count_sell=0;


つまり、すべて書いてあるとおりに動いている-奇跡はない。

 
Alexander Sevastyanov #:

最後の2枚のプリント

は変数の値を出力する。


つまり、すべてが書いてあるとおりに動く。奇跡は起こらない。

こんにちは、アレクサンダー。私はそこでつまずきました。何が代入されるべきなのでしょうか?Calc_Pos(count_buy,countsell)関数が機能するはずだと思うのですが。

ウラジミール、よろしく。

 
MrBrooklin #:

こんにちは、アレクサンダー。そこで困ったんだ。何を代入すればいいのでしょうか?Calc_Pos(count_buy,countsell)という関数が使えると思うのですが。

ウラジミール、よろしく。

1.2つの変数を宣言し、初期化します。

uint count_buy=0, count_sell=0;

2.その値を関数に渡す。

Calc_Pos(count_buy,count_sell);


次に、これらの変数の値を出力する。
、それぞれゼロが出力される。すべて書いてあるとおりに動く。

追伸:この2つの変数をグローバルに宣言することができます。
たとえば、このように:

//+------------------------------------------------------------------+
//|                                              Count_Pos (v.2).mq5 |
//|                                  Copyright 2023, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"

   uint pos_buy=0, pos_sell=0;  // это глобальные переменные

//+------------------------------------------------------------------+
//| Calculate positions Buy and Sell                                 |
//+------------------------------------------------------------------+
void Calc_Pos()
  {
   for(int i=0; i<PositionsTotal(); i++)
     {
      PositionGetSymbol(i);
      if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
         pos_buy++;
      if(
         PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
         pos_sell++;
     }
   Print("pos_buy ",pos_buy);
   Print("pos_sell ",pos_sell);
  }
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   Calc_Pos();
   Print("По символу ",_Symbol," открыто: ",pos_buy," длинных позиций");
   Print("По символу ",_Symbol," открыто: ",pos_sell," коротких позиций");
  }
//+------------------------------------------------------------------+
 
Alexander Sevastyanov #:

1.2つの変数を宣言し、初期化する。

2.それらの値を関数に渡す。


次に、これらの変数の値を出力する。しかし、これらはどこにも変更されておらず、
、それぞれゼロが出力される。すべて書いてあるとおりに動く。

追伸:あなたの計画を理解するために試行錯誤しています:これらの2つの変数をグローバルに宣言することができます。
例えば、このように:

アレクサンダー、どうもありがとう。あなたの修正のおかげで、コードが動くようになりました。正直に言うと、私自身が3つの松で混乱していたことに気づきました。関数に引数を渡すことをもう一度勉強する必要がある。どうやら私は完全に誤解しているようだ。

ありがとう、ウラジミール。

理由: