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

 



インジケータからのデータ取得に問題があるのですが、どなたか教えてください。

関数の目的 インジケータ「ボリンジャーバンド」の外側のライン間の平均距離を、指定された期間について、ポイント単位で計算する。

問題の本質: 指定したバーのインジケーターのライン上の価格の実際の値を取得することができません。なぜなら、何らかの理由で、同じ価格値がインジケーターの異なるバッファに書き込まれ、このバーのどのラインの実際の値にも対応していないからです。
また、この関数と全く同じ方法で、他のインジケーターからインジケーターを取得することができましたが、ここではうまくいきません。

int Bollinger_Bands(int _Average_Period, int _Number)
{
   double   Buffer_BASE_LINE[];                                                                          // Массив Буффера Линии BASE_LINE
   double   Buffer_UPPER_BAND[];                                                                         // Массив Буффера Линии UPPER_BAND
   double   Buffer_LOWER_BAND[];                                                                         // Массив Буффера Линии LOWER_BAND
   int      Bar_Cash             = _Average_Period;                                                                       // Количество плучаемых значений от индикатора
   int      Bands_Handel         = 0;                                                                       // Хендл индикатора Bollinger_Bands
   //---//
   double   Base_Line            = 0;                                                                       // Значение линии BASE_LINE
   double   Upper_Line           = 0;                                                                       // Значение линии UPPER_BAND
   double   Lower_Line           = 0;                                                                       // Значение линии LOWER_BAND
   //---//
   double   Band_Size_Buffer[];											// Буфер расчётных значений разницы между линиями индикатора 
   int      Band_Size_Total      = 0;										// Итог среднего значения расстояния между линиями в пунктах
   ENUM_APPLIED_PRICE   applied_price = PRICE_CLOSE; // тип цены 
   //---//
      ArrayResize(Band_Size_Buffer,_Average_Period+1);  
      ArrayResize(Buffer_UPPER_BAND,_Average_Period+1);
      ArrayResize(Buffer_LOWER_BAND,_Average_Period+1);
      //---//
         Bands_Handel = iBands(_Symbol,PERIOD_CURRENT,20,2,0,applied_price);
         //---//      
            CopyBuffer(Bands_Handel,0,_Number,_Average_Period,Buffer_BASE_LINE);       ArraySetAsSeries(Buffer_BASE_LINE,true);
            CopyBuffer(Bands_Handel,1,_Number,_Average_Period,Buffer_UPPER_BAND);      ArraySetAsSeries(Buffer_UPPER_BAND,true);
            CopyBuffer(Bands_Handel,2,_Number,_Average_Period,Buffer_LOWER_BAND);      ArraySetAsSeries(Buffer_LOWER_BAND,true);
            //---//

         //---//  Тут получение значений для выбранного номера бара из переменной которая передаётся в функцию (использовал как проверку получения данных по линиям)
         Base_Line   = NormalizeDouble(Buffer_BASE_LINE[_Number], _Digits);      //Alert("Base_Line[",_Number,"] = ",Base_Line);
         Upper_Line  = NormalizeDouble(Buffer_UPPER_BAND[_Number], _Digits);     //Alert("Upper_Line[",_Number,"] = ",Upper_Line);
         Lower_Line  = NormalizeDouble(Buffer_LOWER_BAND[_Number], _Digits);     //Alert("Lower_Line[",_Number,"] = ",Lower_Line);
             //---//
         
         
         //---// ** А это расчёт среднего расстояния между внешними линиями Боллинджера за указанный период. Получается 0 потому что одно число отнимается само от себя.
         for(int i=_Average_Period; i>=0; i--) { 
         //---//
            Upper_Line  = NormalizeDouble(Buffer_UPPER_BAND[i], _Digits);     //Alert("Upper_Line[",i,"] = ",Upper_Line);
            Lower_Line  = NormalizeDouble(Buffer_LOWER_BAND[i], _Digits);     //Alert("Lower_Line[",i,"] = ",Lower_Line);
            //---//
               Band_Size_Buffer[i] = NormalizeDouble( ((Upper_Line - Lower_Line) / _Point), 2);     //Alert("Band_Size_Buffer[",i,"] = ",Band_Size_Buffer[i]);
              }//---//
         
               Band_Size_Total = (int) MathMean(Band_Size_Buffer);
               //---//

   
 return(Band_Size_Total);
}
 


標準ライブラリを 使用して注文をオープンした後、チケットを取得するにはどうすればよいですか?
サーバーからの応答がすでにここで受信 されていることを確認できますか?サーバーからの応答を待っている間、ターミナルがハングアップしますか?よくわかりません。

                     if(!m_trade.BuyLimit(...))
                       {
                        ...
                       }
                     else
                       {
                       int ticket=m_trade.RequestOrder();  // ??? 
                        ...
                        a[n]=ticket; 
                       }

MQ4ではすべてがシンプルでした:

         ticket=OrderSend(...);
         if(ticket>0)
           {
            ...
            a[n]=ticket;
           }
 
Nauris Zukas 標準ライブラリを 使用して注文をオープンした後、チケットを取得するにはどうすればよいですか?
サーバーからの応答がすでにここで受信 されていることを確認できますか?サーバーからの応答を待っている間、ターミナルがハングアップしますか?理解できません。

MQ4ではすべてがシンプルでした:

OnTradeTransaction() イベント処理を使用するのがよいでしょう。

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Функции обработки событий - Функции - Основы языка - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Alexey Viktorov #:

OnTradeTransaction() イベント・ハンドラを使用する方が良いでしょう。

ありがとうございます!では、いくつかの関数を作り直さなければなりませんね。

mql5でスリッページを計算する関数をどこかで見たことがありませんか?

 
Nauris Zukas #:

ありがとう!じゃあ、いくつかの機能を作り直さないとね。

mql5でスリッページを計算する関数をどこかで見ませんでしたか?

なぜそれを探すのですか?OnTradeTransactionでは、注文のイベントをキャッチして注文価格を読み取り、次に取引をキャッチして取引価格を読み取り、これらの価格の差を取得します。

グローバルレベルで変数を作成し、注文送信時にその変数に価格を書き込み、OnTradeTransactionで 取引 価格を取得することもできます。

 

Alexey Viktorov #:

グローバルレベルで変数を作成し、注文が送信されたときにその変数に価格を書き込み、OnTradeTransactionで 取引価格を取得 することもできます。

このオプションは間違いなくアウトです。多くの注文を送信する場合、チケットなしで価格が必要ですが、OnTradeTransactionはどのように対処しますか?

 
Nauris Zukas #:

このオプションは間違いなくアウトです。多くの注文を送信する場合、チケットなしでどのように価格を設定すればよいですか?

ポジションIDによって問題なく整理されます。

取引を取得し、そこからポジションIDを取得し、このIDで履歴から注文と取引を引き出し、注文と取引の価格をINで読み取ります。

ドキュメントを読んでください。そこには興味深いことがたくさん書かれています。

 

Alexey Viktorov #:

取引を取得し、そこからポジションIDを取得し、このIDで履歴から注文と取引を引き出し、注文と取引の価格をINで読み取ります。

明快だ!しかし、グローバル・レベルで注文を送信し、OnTradeTransactionで取引価格を取得する際に、保存された価格を使用する2つ目のオプションは、私には理解できません。なぜ注文を送信中に(注文に)結びついていない価格を保存するのでしょうか?


要するに、私はこのようにします - 取引を取得し、それから他のすべてを引き出します。

 
Adam Dee ボリンジャーバンド"インディケータの外側のライン間の平均距離を、指定された期間について、ポイント単位で計算する。

問題の本質: 指定したバーのインジケーターのライン上の価格の実際の値を取得することができません。なぜなら、何らかの理由で、同じ価格値がインジケーターの異なるバッファに書き込まれ、このバーのラインの実際の値にも対応していないからです。
また、この関数と全く同じ方法で、他のインジケーターからインジケーターを取得することができましたが、ここではうまくいきません。

ボリンジャーはSMA +- N*standard_deviations です。

標準偏差とSMAについては独自のインジケーターがあります。でも、それを使わなくても計算できます。参考書を読んで、ここに計算式があります。そこから「線間の平均点間距離」を求めますが、これはデフォルト値では現時点で4シグマに相当します。
、平均値(どの期間の?)をわざわざ計算する必要がありますか?

あなたは事実上、標準偏差の平均を知りたいのです。

 
Nauris Zukas #:

これは明確です!しかし、注文の送信中にグローバルレベルで価格を保存し、OnTradeTransaction で取引価格を取得するという 2 番目のオプションは、私には理解できません。注文の送信中に、なぜ(注文に)結びついていない価格を保存するのですか?


要するに、私はこのようにします - 取引を取得し、それから他のすべてを引き出します。

これは、冷静な取引について言われた、すべてが時間内になるとき... これを考慮せずに

取引、自動取引システム、取引戦略のテストに関するフォーラム

初心者からの質問 MQL5 MT5 MetaTrader 5

ナウリス・ズカス, 2022.06.11 17:49

このオプションは間違いなくアウトです。多くの注文を送信した場合、チケットなしで私の価格は、OnTradeTransactionはどのようにそれに対処するのでしょうか?


理由: