記事"CGraphic ライブラリを使用したスキャルピング相場深度の実装"についてのディスカッション - ページ 3

 
Konstantin Seredkin:

私の質問に書いた言葉には意味がないのですか?

あなたの例

このコードは、このトピックの作者がhttps://www.mql5.com/ja/articles/3336。

ですから、この質問は少なくとも私宛てではないはずです...。

あなたは例のコードを研究していない。

あなたは削除の例を

m_book_market.SetMarketBookSymbol(Symbol())

このメソッドを開くと、渡されたティッカーへの購読が表示されます。

bool CMarketDepth::SetMarketBookSymbol(string symbol) {
   m_sell_deals = 0;
   m_buy_deals  = 0;
   ArrayResize(market_book, 0);
   m_available = false;
   m_best_ask_index = -1;
   m_best_bid_index = -1;
   m_depth_total = 0;

   bool _selelect = SymbolSelect(symbol, true);
   if(_selelect)
      m_symbol = symbol;
   else {
      if(!SymbolSelect(m_symbol, true) && SymbolSelect(Symbol(),true))
         m_symbol = Symbol();
   }

   if(_selelect)
      if(!MarketBookAdd(m_symbol))
         printf("%s - %d: [ %s ]がガラスを開けられない!!!", __FUNCTION__, __LINE__, m_symbol);

   this.Refresh();
//---
   return _selelect;
}

しかし、購読の削除ではありません)購読の削除は関数を通して行われます:

MarketBookRelease

Обеспечивает закрытие стакана цен по указанному инструменту, а также отменяет подписку на получение извещений об изменении указанного стакана.

bool  MarketBookRelease(
   string  symbol      // キャラクター名
   );

Параметры

symbol

[in]  Имя символа.

Возвращаемое значение

Значение true в случае успешного закрытия, иначе false.

Примечание

Обычно эта функция должна вызываться из функции OnDeinit() в том случае, если в функции OnInit() была вызвана соответствующая функция MarketBookAdd(). Либо должна вызываться из деструктора класса, если в конструкторе этого класса вызывается соответствующая функция MarketBookAdd().
 
TheXpert:

コピペに違いない。よくあることだ。作者はおそらくこのコードを部分的にブラウザで書いたのだろう。

代わりに

CMarketBook MarketBook.mqh

を書く。

CMarketBook MarketBook;

これは、あなたの名前に対するひっかけ問題でした )) 彼はコードを読む のが好きではなく、用意された答えを待っています ))

 
Konstantin:

彼はコードを読むのが 好きではなく、用意された答えを待つのです)。

それこそ私がいつもやっていることで、最初はあなたの例のようにガラスの取り外しをあるべき姿にしました。

しかし、この方法を使うと

if(!MarketBookRelease(Symbol()))
   {
   if(Debug){Print("Error MarketBookRelease ",m_symbol.Name());}}

こんなエラーが出ます。


このメソッドがクラスのコンストラクタで使われている場合、OnDeinitで使う必要はないことがわかりました。


私の質問を撤回します、あなたは私にキャンディを与えることができます。

 
Konstantin Seredkin:

クラスでデストラクタを使わない場合

この構文は正常に動作します。

しかし、私がデストラクタの使い方を知らないだけかもしれませんし、曲がった方法で実装されているため、本来の動作をしないのかもしれません。

サブスクリプション関数はブロードキャストであり、OnDeinitですべてのサブスクリプションを削除することが保証されています。コードの中にオブジェクトが多すぎて、それらの削除に遅延がある場合、OnDeinitの処理に十分な時間が割り当てられない可能性があります。

この場合、コードに問題がないか探すか、OnDeinitでオブジェクトを削除して忘れてしまうかのどちらかになります。

ps.

Konstantin Seredkin:

私はいつもそうしています。

あなたは明らかに例を解析していないか、最初から曲がったコードを滑り込ませています。)

そのようなオブジェクトCMarketBook MarketBook.mqh コンパイラがコードをコンパイルしますか? さて、あなたはオブジェクトMarketBook.mqhを 作成し、コンパイラはこの冒とくを逃したが、あなたは オブジェクト MarketBookで 作業して いる、あなたはそのようなオブジェクトを持っていなかったので、OnInitの段階でエラーを持っているでしょうその例は明らかに機能していないので、私はすぐにそれに注目し、あなたに質問したのですが、あなたはすべてをクラス開発者とその例のせいにしました。

このエラーが再現されるような動作するコード例を示すか、今のように不要なコードを使わずにすべてを一度に説明するか、どちらかであれば、あなたの時間も節約できるでしょう。

Использование аналитических объектов - Графики котировок, технический и фундаментальный анализ - MetaTrader 5
Использование аналитических объектов - Графики котировок, технический и фундаментальный анализ - MetaTrader 5
  • www.metatrader5.com
Определение трендов, построение каналов, выявление циклов и уровней поддержки/сопротивления — все эти и многие другие задачи решаются при помощи аналитических объектов. Всего в торговой платформе доступно 46 таких инструментов. Среди них имеются геометрические фигуры, различные каналы, инструменты Ганна, Фибоначчи, Эллиотта и многое другое. В...
 
Konstantin:

サブスクリプション関数はブロードキャストであり、OnDeinitですべてのサブスクリプションを削除することが保証されています。コード内にオブジェクトが多すぎて、それらの削除に遅延がある場合、OnDeinit処理に十分な時間が割り当てられない可能性があります。

明らかに問題があり、いつか足元をすくわれることになるので、コードに問題がないか探すのが正しい方法ですが、OnDeinitでオブジェクトを削除して忘れてしまうこともできます。

ps.

ps.あなたは明らかに例を解析していないか、最初から曲がったコードを入れ込んでいる。)

そのようなオブジェクトCMarketBook MarketBook.mqh コンパイラは、コードをコンパイルしますか? さて、あなたはオブジェクトMarketBook.mqhを 作成し、コンパイラはこの冒とくを見逃しているが、あなたは オブジェクト MarketBookで 作業している 、あなたはそのようなオブジェクトを作成していないため、OnInitの段階でエラーを持っているだろう、私はすぐにあなたにそれを与えた。この例は明らかに機能していないので、私はすぐにそれに注意を払った。

このエラーが再現される動作するコード例を提示するか、今のように不要なコードを省いて一度にすべてを説明した方が、あなたの時間も節約できますよ。

あなたは自分のレパートリーの中にいるだけで、作者がその例で何をしたのか、どんなミスプリントをしたのかは気にしない。

質問はまったく違う。

彼の例では、グラスの呼び出しという初期化があり、Refresh()メソッドによる更新がある。

MarketBookRelease

//+------------------------------------------------------------------+
//|MarketBook.mq5
//| Copyright 2017, MetaQuotes Software Corp.
//|http://mql5.commql5.com
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 0
#property indicator_plots 0
#include "GlobalMarketBook.mqh"
#include "MBookBtn.mqh"
#include "EventNewTick.mqh"

CMBookBtn MButton;
CEventNewTick EventNewTick;
double fake_buffer[];
//+------------------------------------------------------------------+
//| カスタムインジケータ初期化関数
//+------------------------------------------------------------------+
int OnInit()
  {
   MarketBook.SetMarketBookSymbol(Symbol());
//--- インジケータ・バッファのマッピング
   SetIndexBuffer(0,fake_buffer,INDICATOR_CALCULATIONS);
// パネルが実行されているチャートをユーザーが変更した場合、
// パネルを一旦非表示にして、再度開く必要がある。 
   MButton.Hide();
   MButton.Show();
//---
   return(INIT_SUCCEEDED);
  }

//+------------------------------------------------------------------+
//| MarketBookの変更イベント|
//+------------------------------------------------------------------+
void OnBookEvent(const string &symbol)
  {
   if(symbol!=MarketBook.GetMarketBookSymbol())
      return;
   MarketBook.Refresh();
   MButton.Refresh();
   ChartRedraw();
  }
//+------------------------------------------------------------------+
//| チャートイベント|
//+------------------------------------------------------------------+
void OnChartEvent(const int id,         // イベント識別子 
                  const long& lparam,   // ロング・タイプのイベント・パラメータ
                  const double& dparam, // double 型のイベント・パラメータ
                  const string& sparam  // 文字列型のイベント・パラメータ
                  )
  {
   MButton.Event(id,lparam,dparam,sparam);
   ChartRedraw();
  }
//+------------------------------------------------------------------+
//| カスタム・インジケータ反復関数
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
  {
//---
//--- 次の呼び出しのためにprev_calculatedの値を返す
   return(rates_total);
  }
//+------------------------------------------------------------------+
| 終了|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   MButton.Hide();
   if(!MarketBookRelease(Symbol()))
   {
   Print("Error MarketBookRelease ",Symbol());}
  }
//+------------------------------------------------------------------+

OnDeinitやその実装はなく、クラスのデストラクタにあります。

というわけで、作者に質問したのですが、作者のクラスを使ってグラスを削除する方が正しいというのは、作者の意見ではどうなのでしょうか?この作業は、メインの例やクラス自体に欠けているので、以前から実装しておくのが良いと思います。

私自身は自分のコードですべてを理解することができ、それはまさに私がしたことです。質問はまったく違った。

コードの上に、添付のインジケーターにあるべきと私が考えるものを黄色で書き加えた。

 
Konstantin Seredkin:

あなたは自分のレパートリーの中にいるだけで、作者が例の中で何をしようが、どんな誤植をしようが、それがただのタイプミスだと気づかないなんて、よっぽどのバカでなければ気づかないよ。

質問はまったく違う。

彼の例では、グラスの呼び出しという初期化があり、Refresh()メソッドによる更新がある。

OnDeinitやその実装はなく、クラスのデストラクタにあります。

そのため、私は作者に質問したのですが、彼の主な例やクラス自体にこの作業が欠けているため、彼のクラスを使ってグラスを殺すことが彼の意見ではより正しいのか、また、前にそれを実装するのが良いのではないか、ということです。

この質問は著者に投げかけられたものであり、普通に定式化されたものである。なぜ、私が何を読んだか、誰かから何を得たいかなどについて、数ページにわたって私の質問やデマゴギーを尋ねたり議論したりするのだろうか。質問は完全に異なっていた

私の意見では、添付のインジケーターに存在するはずのものを、コードの上に黄色で追加した。

ここにテレパスはいません、あなたが元の質問で与えた例は、あなたが書いている問題を再現していません、その上、すべてのメカニズムはクラスに存在し、解決策はあなたに与えられています、しかし、私は非難しか見ません、論争は終了しました。

 
Konstantin:

ここにはテレパスはいないし、あなたが最初の質問で挙げた例は、あなたが書いている問題を再現していない。その上、すべてのメカニズムはクラスに存在し、解決策はあなたに与えられている。

- 第一に、私の質問にはまったく問題はなかった。

- 第二に、私は誰も何も非難していません。私はただ、私の推測を明確にするために作者に簡単な質問をしただけです...そして、あなたはすべてのメッセージで、コードに関するばかげた非難や質問を、私の方向に向けてしました。

ヘルプにはこうある:

デストラクタはクラスのオブジェクトが破壊される ときに自動的に呼び出される特別な関数です。デストラクタの名前は、クラス名にチルダ(~)を付けて記述します。文字列、動的配列、および初期化を必要とするオブジェクトは、デストラクタの有無にかかわらず、いずれにせよ初期化されます。デストラクタが存在する場合、これらのアクションはデストラクタが呼び出された後に実行されます。

このクラスには、メソッドによって価格を閉じるようなデストラクタはありません。

MarketBookRelease

また

void OnDeinit(const int reason)

また、インジケーター自体にもデストラクタは存在しません。

私はこの質問に対する答えを期待していました、

- デストラクタが宣言されていなくても、クラス自体がすべてを閉じます。

- 追加

void OnDeinit(const int reason)
  {
   if(!MarketBookRelease(Symbol()))
   {Print("Error MarketBookRelease ",Symbol());}
  }

あるいは、クラス自体にデストラクタを追加してください。

public:
    ~CMarketBook(void);
//--
//--

CMarketBook::~CMarketBook(void)
{
   if(!MarketBookRelease(m_symbol)){
   printf(__FUNCTION__ + "Error MarketBookRelease ",m_symbol);} 
}

そして、あなたは満足するでしょう...そして、あなたは他人のコードに誤植がある、コンパイルできない、と私を非難するdimagogyを始めた。ロシア語で、あなたは私を鹿として登録した。

 
パーフェクト!  完璧!素晴らしい仕事だ!
 

これは素晴らしいツールです。 非常に簡単に修正できます。

 
コード全体をコピー&ペーストしてコンパイルしようとすると、コンパイル時にエラーが出ます。どなたか解決策を知っていますか?