どんな新人の質問でも、フォーラムを乱雑にしないように。プロフェッショナルは、通り過ぎないでください。Nowhere without you - 6. - ページ 159

 
hoz:

機能があります。その始まりをご紹介します。

その要旨は次のとおりです。関数の第2形式パラメータは、デフォルト値として0が 設定されています。つまり、ドキュメントによると、2番目のパラメータはデフォルトで0に なるので、この関数を呼び出すことができるのです。

このように呼んでいます。

コンパイラは顔をしかめる。

なぜ?

ライブラリから何々コードに移動させる。エラーが消えるなら、ワータムドゥのコードで正しいライブラリ接続に問題があることを意味します。まず第一に。

それでも消えない場合は、関数にどのようなパラメータが渡されているかを見てください。考え方としては、通貨ペアの名前を文字列型の パラメータで指定します。Symbol()を渡すだけ

 
artmedia70:

ライブラリからワータムドゥのコードに移動させる。エラーが消える場合は、wha-tam-doのコードでライブラリの正しい接続に問題があることを意味します。まず第一に。

それでも消えない場合は、関数にどのようなパラメータが渡されているかを見てください。考え方としては、通貨ペアの名前を文字列型のパラメータで指定します。Symbol()を渡すだけです。



本当に助かります。考えておくよ。

これはとても奇妙なことです。パラメータの受け渡しが 正しいのに、なぜライブラリで調べなければならないのですか?間違いがはっきり書いてある。それとも特にないのでしょうか?何が必要なのかがわかればいいのですが。

この機能はお借りしたものなので、作者の連絡先とともに掲載します。

//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Автор : TarasBY, taras_bulba@tut.by                                              |
//+-----------------------------------------------------------------------------------+
//|        Получаем торговую информацию по символу                                    |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void fGet_MarketInfo (string fs_Symbol, int fi_Ticket = 0)
{
//----
         if (fs_Symbol != bs_Symbol || fi_Ticket < 0)
         {
                  if (fi_Ticket > 0)
                  {
                     bs_Symbol = OrderSymbol();
                  }
                  else
                  {
                     bs_Symbol = fs_Symbol;
                  }
                  if (bs_Symbol == Symbol())
                  {
                      bi_SymDigits = Digits;
                      bd_SymPoint = Point;
                  }
                  else
                  {
                      bi_SymDigits = MarketInfo (fs_Symbol, MODE_DIGITS);
                      bd_SymPoint = MarketInfo (fs_Symbol, MODE_POINT);
                  }
        if (bd_SymPoint == 0.0)
        {
           bd_SymPoint = fGet_Point (fs_Symbol);
        }
                  bd_ProfitMIN = NDP (ProfitMIN_Pips);
         }
         if (fi_Ticket > 0)
         {
            fGet_OrderDetails (fi_Ticket);
         }
    //---- Получаем текущие цены по инструменту
    RefreshRates();
    bda_Price[0] = NDD (fGet_TradePrice (0, bb_RealTrade, bs_Symbol));
    bda_Price[1] = NDD (fGet_TradePrice (1, bb_RealTrade, bs_Symbol));
    bd_Spread = NDD (bda_Price[1] - bda_Price[0]);
//----
}

こうして取り込んだ。

#import "hoz_Base@Library.ex4"
    double ND (double v);
    string DToS (double v);
    string DToSByLots (double v);
    void fGet_MarketInfo (string fs_Symbol, int fi_Ticket = 0);
#import

今のコールはこんな感じです。

fGet_MarketInfo (fs_Symbol);

そのような問題をどのように解決しているのでしょうか。

 
hoz: そのような問題はどのように解決されるのでしょうか。

ドキュメントを勉強する。コンパイルされたライブラリはデフォルトでパラメータを渡さないので、関数を呼び出す際にはすべてのパラメータを渡す必要があります。よく読んでみて ください。抜粋

インポートされた関数はコンパイル中のモジュールの外にあるため、コンパイラは渡されたパラメータが正しいかどうかを確認することができません。したがって、インポートされた関数に渡されるパラメータの構成や順序は、実行時のエラーを避けるために正確に記述する必要があります。インポートされた関数(EX4とDLLモジュールの両方)に渡されるパラメータは、デフォルト値を持つことができません。
 
TarasBY:

コンパイルされたライブラリにはデフォルトのパラメータは渡されません - 関数を呼び出す際にはすべてのパラメータを渡す必要があります。よく読んでみて ください。抜粋

インポートされた関数はコンパイル中のモジュールの外にあるため、コンパイラは渡されたパラメータが正しいかどうかを確認することができません。したがって、インポートされた関数に渡されるパラメータの構成や順序は、実行時のエラーを避けるために正確に記述する必要があります。インポートされた関数(EX4とDLLモジュールの両方)に渡されるパラメータは、デフォルト値を持つことができません。

あ、それですね。ライブ・アンド・ラーニング!ありがとうございます、肝に銘じておきます。
 

MT4で最適化を実行する場合、「最適化結果」タブで、「レポート」タブで1つのパスで生成されるものと同様の情報を受け取る必要があります。

どうすれば実現できるのか?

 

私は、図書館に親しむことにした。私は自分のインジケータからコードの一部をコピーして関数に貼り付け、この関数を2つのライブラリファイルにコピー&ペーストしました。

1枚目を「indi.mqh」、2枚目を単に「djo.mq4」と名付けました。

int countbars(int& hist, int obrax, bool tikk)
{ 
 int z=0;
 static int PreBars=0; 
 static datetime BarTime=0;
 if (Bars == PreBars && tikk==false)return(-1);
 if (Bars < hist+obrax)  
 {
  if (Bars-obrax<=1) {Alert (" Недостатьньо історії");return(-1);}
  hist=Bars-obrax;
 }
 
 if (Bars-PreBars == 0 && BarTime==Time[0] && tikk==true) return(0);
 else  
 {
  if (Bars-PreBars == 1 && BarTime==Time[1]) z=1;
  else  z=hist;
 }
 PreBars = Bars;  
 BarTime=Time[0];
 return (z);
}

ポイント:最初のものを参照すると、すべてが計画通りに動いています。

 include <indi.mqh>

第1を第2で置き換え、第2をメソッドでアクセスする場合。

#import "djo.ex4"  int countbars(int& hist, int obrax, bool tikk);  #import

しかし、アラートさえも全く機能せず、起動後もどこにも表示されません。そして、たった今、端末が勝手に終了しました ))

インポートした関数に アクセスするたびに、すべての定数が再初期化されるのではないでしょうか?

mql4のインポートについて、どのようなバグが修正されたか、あるいはされていないかなど、詳しいことはどこで読むことができますか?

ありがとうございます、寝ます............。

 
ALXIMIKS:

私は、図書館に親しむことにした。私のインジケータからコードの一部を取り出して関数に入れ、この関数を掛け合わせて2つのライブラリファイルに貼り付けました。

1枚目を「indi.mqh」、2枚目を単に「djo.mq4」と名付けました。

ポイント:最初のものを参照すると、すべてが計画通りに動いています。

第1を第2で置き換え、第2をメソッドでアクセスする場合。

しかし、アラートさえも全く機能せず、起動後もどこにも表示されません。そして、たった今、端末が勝手に終了しました ))

インポートした関数にアクセスするたびに、すべての定数が再初期化されるのではないでしょうか?

mql4のインポートについて、どのようなバグが修正されたのか、あるいはされていないのか、など詳しいことはどこで読むことができますか?

ありがとうございます、寝ます............。

パラメータを参照渡しすることも可能である。この場合、そのようなパラメータの変更は、参照渡しされる呼び出し側関数の対応する変数に影響します。配列の要素を参照渡しすることはできません。パラメータを参照渡しできるのは、1つのモジュールの範囲内に限られ、ライブラリ関数にはそのような機会は ありません。パラメータが参照渡しであることを指定するには、データ型の後に修飾子 & を付けなければならない。さらに、こんな実験もあります。
 
教えてください。 スライドアベレージを2つ越えるとサウンドメッセージが出ます。開くと、このサウンドメッセージが、歴史の中で交差した回数だけ繰り返されます。質問です。どうすれば、現在発生している信号に対してのみメッセージを出すようにできるのでしょうか。つまり、その時だけ、文字通りその瞬間に受信した信号だけ...。
 
Zolotai:
教えてください。 スライドアベレージを2つ越えるとサウンドメッセージが出ます。開くと、このサウンドメッセージが、歴史の中で交差した回数だけ繰り返されます。質問です。どうすれば、現在発生している信号に対してのみメッセージを出すようにできるのでしょうか。つまり、その時だけ、文字通りその瞬間に受信した信号だけ...。
何のオープニングで?指標になるような気がします。解決策はたくさんあります。全てはコード次第です。
 
artmedia70:
いつ何を開けるのか?指標になるような気がします。解決策はたくさんあります。全てはコード次第です。


コードとは関係ないんです。条件が揃えばいいんです。問題は、現在のバーの時刻を知ることができるかどうかである。バーの時刻がまったくわからないのですが?