エキスパートアドバイザー - 雑多な質問 - ページ 13

 

このような関数を 書くことができます。

void DrawLabel(string name, string text, int x, int y, int fontsize=10)

最終的な値を指定せずに呼び出すと、デフォルトの値が使用されます。

DrawLabel("MyLabel","Hello,World!",50,50); // final parameter not passed (default value used)

あるいは、明示的にfontsizeの デフォルト値を上書きすることもできます。

DrawLabel("MyLabel","Hello,World!",50,50,24); // fontsize parameter is 24

ということでしょうか?

 
honest_knave:

そういうことですか?

私の英語力では、あなたのコメントを理解することができないかもしれません。
コメントありがとうございます。
私の理解が正しければ、このように理解します。Labelに1つのVoid関数を書き、それを以下のように2つの方法で使用することができます。(フォントサイズのパラメータがあるラベルオブジェクトと ないラベルオブジェクトに対して、1つのVoid関数を使うことができる、ということでしょ うか?)

DrawLabel("MyLabel","Hello,World!",50,50);    // #1
DrawLabel("MyLabel","Hello,World!",50,50,24); // #2

ということで、このSpreadsheet Objectのために数時間を費やして、この問題はどこから来て、どうすれば 解決できるのかを考えてみました。
なぜなら、2つのLabel関数があり、そのうちの1つを削除したところ、BidとAskの価格表示(市場価格)はまだ正常に動作しますが、SpreadsheetはLabel関数と一緒に動作しないのです。Label関数を使用しない場合、スプレッドシートは正常に動作します。

スプレッドシートからいくつかのコードを共有する必要があります。以下のようなコードはどうでしょうか?( さらに - 私はスプレッドシートのためのラベル関数なしでラベルオブジェクトを作成するときに、以下のコードがうまく動作することをもう一度言及する必要があります)

double  spread                                                 ;
        spread       = MarketInfo  ( symbol, MODE_SPREAD ) / 10;
        spreadstring = DoubleToStr ( spread, 1           )     ;

ありがとうございました。

 

作成しようとしたものが実際に作成されたかどうかを確認するのは良い習慣です。

例えば、画面サイズに関して言えば、多くのユーザーは異なる解像度を使用しており、何らかの理由でチャートの幅や高さの境界を越えてオブジェクトが作成された場合、オブジェクトは描画されない か、消えてしまうのです。

また、例えばエラー4200は、作成しようとしているオブジェクトがすでに存在することを示しています。

これは、オブジェクトに異なる値を割り当てようとした場合に重要なことで、作成に失敗すると新しい値は割り当てられません。

このため、これらの関数は、作成が成功したかどうかを確認できるように、値を返すようになっています。

関数が成功したかどうかを確認するのはあなた次第ですが、優れたコーダーは結果を確認するものです。

void関数を書いた場合、何も返さないので、呼び出したときに返ってくるものを分析することで、結果を確認することはできません。

しかし、関数自体の中でチェックし、何か問題があれば簡単なアラートを出すこともできます。

そうすれば、普段はアラートが表示されませんが、何か問題が発生したときに、すぐにその問題を指摘することができます。


2つ目の問題については、パラメータの一部を省略することができますが、その場合、関数はデフォルトの値を想定します。

そのため、標準的なパラメータを省略する必要がない限り、パラメータを指定する必要があります。

フォントサイズなどは良い例で、指定しない場合は単にデフォルトの設定が使用されます。

また、オブジェクトによって多少の違いがありますが、これは関数に渡されるパラメータを分析することでわかります。

関数に渡されるパラメータを分析すると、その違いがよくわかります。オブジェクトはすべて同じ変数セットを共有しているわけではないので、参照として渡せるものとそうでないものを確認することが重要です。

Spreadstringで何をしたいのかよくわからないのですが、何のためにそれを使うのか、どのように使いたいのか、もう少し詳しく説明してください。

 
Marco vd Heijden:

私はあなたがspreadstringで何をしたいのかわからない 多分あなたはそれが何のためにあり、どのようにそれを使用したいもう少し説明することができますか?

私は、BidAskスプレッドシートの ラベルオブジェクト関数を 使用して、そうです。スプレッドシートを 削除して書き直したのですが、良い効果はありませんでした。

私はエラーの説明のためのエラーコードの@honest_knave メソッドを使用した後。私はこれ以上 4200の警告を見ることはありません。
私は、Init()関数とOnTick()関数の2 箇所でスプレッドシートを 使用していますが、スプレッドシートの2箇所ではBid, Askも使用しており、エラーや警告は出ていません。しかし、このスプレッドシートは警告を発しないだけでなく、更新もされません。

私のEAのコードでは、どのオブジェクトについても、エラーも警告もなく、作成は絶対に成功します。

私は良いコーダーか何であるかわからない!(私は私がコーダーであるとは思わない。(でも、結果は出ています。だから、私はラベルオブジェクト(表計算用の関数なし)だけを使うことができます。

Void関数は、私が欲しい結果を返します。また、この関数は、スプレッド初期値用のオブジェクトを作成しますが、更新は行いません。



Spreadstringで何をしたいのかよくわからないのですが、何のために使うのか、どのように使いたいのか、もう少し説明してもらえますか?

OK、私はこのように使いたいだけです。私はただ、私がEAを開いたり、チャートに追加したりするときに、スプレッドシートのサイズ(/値)を与えてほしいのです。その後、私は現在の時間のためのコードを書くことを試みるだろう 高/低サイズを広げる(/値)。

事前にありがとうございます。

 

ダブル配列[]に格納し、すべての配列を比較して、最も低いスプレッドがあるかを確認することもできます。


double spread[];
--

ArrayResize(spread,SymbolsTotal(1),0);
   for(int i=0;i<SymbolsTotal(1);i++)
     {
      spread[i]=MarketInfo(SymbolName(i,1),13);
     }
 

私は以下のコードを削除すると、スプレッドシートは完璧に動作するようになります。
だから、私はちょうど助ける必要がある、どのように私はそれの代わりに良い(/最適) コードを書くことができます、お願いします?

{
    Print(__FUNCTION__, ": failed to create text label! Error code = ", GetLastError());
    return(false);
}

以下のコードをLabel Object 関数として保持しているだけです。

if( !ObjectCreate( chart_ID, name, OBJ_LABEL, sub_window, 0, 0 ) ) 

事前にありがとうございます。

( もしこの問題が本当の問題なら - MetaQuotesがそれを修正することを望みます - なぜならそれは私から数時間を要し、このコード業界で新しい人たちを助けるためです )

 

return(false)」を削除し、Print文を残して、コードを実行してみてください。

何かメッセージが表示されるかもしれませんね。値を変更するのではなく、ラベルを何度も作成しようとしているのではないでしょうか?

 
honest_knave:

return(false)」を削除して、Print文を残して、コードを実行してみてください。

なんじゃこりゃー!?
この
クソゲーには 数時間かかりました。
私のすべてのオブジェクト関数から これを削除することはできますか?
また、どのように動作するか教えてください。

return(false);

ただただ感謝、です。

 
Max Enrik:

WHAT THE HELL!
すべてのObjects
関数から これを取り除くことは できますか?

はい、でもそのままにしておいて、エラーの原因に対処したほうがいいと思います。

Max Enrik です。

なんなんだ、これは!
また
、どのように動作するのか教えてください。

return(false);

return 演算 子は、単に関数をすぐに終了させるように指示します。もし関数が値を返すなら(あなたの場合はbool)、あなたも値を返さなければなりません。

オブジェクトを作成する前に、オブジェクトが存在するかどうかをチェックすれば、エラー(4200ですよね?)を取り除くことができます。

Return Operator - Operators - Language Basics - MQL4 Reference
Return Operator - Operators - Language Basics - MQL4 Reference
  • docs.mql4.com
Return Operator - Operators - Language Basics - MQL4 Reference
 
honest_knave:

明確なコメントありがとうございます。

すでに、以下のコードのように、あなたのメソッドに置き換えています。(Label Object 関数用 )

エラーの記述について、コメントをいただく前のものです。

if( !ObjectCreate( chart_ID, name, OBJ_LABEL, sub_window, 0, 0 ) )
{
    Print( __FUNCTION__, ": failed to create text label! Error code = ", GetLastError() );
    return(false);
}

// which one this code gives me error no: 4200 

の後です。

if( !ObjectCreate( chart_ID, name, OBJ_LABEL, sub_window, 0, 0 ) )
{
    if( errorcode !=0 ) printf( "Error %i: %s", errorcode, ErrorDescription( errorcode ) );
    return(false);
}

// prevent error no: 4200 - but was not update spreadsheet values 

今 - と完全に動作します。

if( !ObjectCreate( chart_ID, name, OBJ_LABEL, sub_window, 0, 0 ) )
{
    if( errorcode !=0 ) printf( "Error %i: %s", errorcode, ErrorDescription( errorcode ) );
    return(false); // removed this line
}

// now spreadsheet values updates, no any more error no: 4200 

すべてのベストをあなたに。