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

 
Alexey Viktorov #:

誰かの教えが悪いのか。変数_LastErrorには、次のエラーが発生するまでの値が格納 されます。


さて、見てみると、メインコードの冒頭で、次のようなエラーが発生しています。

err_invalid_datetime

4010

日付や時刻の値が正しくない


そして、コードによってオブジェクトが生成され、_LastErrorは次のように書き換えられます。

err_object_not_found

4202

グラフィックオブジェクトが見つかりません


いつものように_LastErrorの チェックがコードの最後にある場合、4202が表示されますが、そのまま無視 します。つまり、エラー4010は気づかれずに残ってしまうのです。どこが間違ってるんだろう?

Alexey Viktorov(アレクセイ ビクトロフ #:


ブローカーの serverdc から執行エラーを受信しないことが市場の要件である。

ありがとうございます、知りませんでした、すべてのエラーは禁止されていると思っていました。

 
leon_17 #:

見てください、例えばメインコードの冒頭で、次のようなエラーが発生しています。

err_invalid_datetime

4010

日付や時刻の値が正しくない


そして、コードによってオブジェクトが生成され、_LastErrorは次のように書き換えられます。

err_object_not_found

4202

グラフィックオブジェクトが見つかりません


いつものように_LastErrorの チェックがコードの最後にある場合、4202が表示されますが、そのまま無視 します。つまり、エラー4010は気づか れずに残ってしまうのです。私はどこで間違っているのだろう?

ありがとうございます、知らなかったです、すべてのエラーは禁止されていると思っていました。

その通りです。あなたは間違っていない...

 

こんにちは、どなたかヒントを教えてください。

各バーの時間値を具体的に配列に書き込んでいます。チャート上のバーは3000本までという制限があります。

課題です。

- 新しい小節ごとに値の配列をシフトさせること。

void CNewBar::PriceHL2()
  {
   int start= 0;
   ArrayResize(this.m_tim_pr_hl2,this.m_rt);
  
   if(this.m_pc!=0)
     {
      start= this.m_pc;
      ArrayCopy(this.m_tim_pr_hl2, this.m_tim_pr_hl2, 0, this.m_rt-this.m_pc);
     }  
   for(int b= start; b < this.m_rt; b++)
     {
      this.m_tim_pr_hl2[b]= iTime(this.m_symbol, this.m_timeframe, this.m_rt-b);
     }
  }

正常に動作するように調整できない。

(this.m_rt-this.m_pc)=1 のとき、新しいバーで配列をシフトさせるのは正しいですか?

ArrayCopy(this.m_tim_pr_hl2, this.m_tim_pr_hl2, 0, this.m_rt-this.m_pc); // this.m_rt-this.m_pc=1
 
Mikhail Toptunov #:

こんにちは、どなたかヒントを教えてください。

各バーの時間値を具体的に配列に書き込んでいます。チャート上のバーは3000本までという制限があります。

課題です。

- 新しい小節ごとに値の配列をシフトさせること。

正常に動作するように調整できない。

(this.m_rt-this.m_pc)=1 の場合、新しいバーで配列をシフトするのが正しいのでしょうか?

つまり、配列のサイズはちょうど3000でなければならず、新しいバーの形成時には、まずゼロインデックスが上書きされ......最後に新しい値が書き込まれるのでしょうか。

私の理解が正しければ、ループは何のためにあるのでしょうか?配列自体を先頭から順にNULLインデックスにコピーし、最後のインデックスに新しい値を書き込むだけです。

 
Alexey Viktorov #:

オブジェクトが見つからない場合は、オブジェクト検索エラーになります...

err_object_not_found

4202

グラフィックオブジェクトが見つかりません


アラーターする必要はない...

いくつかのテストをしてみたところ...こんな感じです。MQL5では、オブジェクトの作成時にObjectFind()を使用する必要はありません。
オブジェクトの存在を事前に確認することなく(ObjectCreateを使用するだけ)、オブジェクトを作成することができます。 OnTick内部でも、このようなコードは_LastErrorエラーを発生させません。

MQL5のシステムコードの奥底でどのように実装されているかはわかりませんが、もしかしたら、まだオブジェクトが存在しない場合にのみオブジェクトを作成するというチェックがすでにアップロードされているのかもしれませんね。しかし、少なくともMQL5内部でオブジェクトを作成する場合には、ObjectFind()は 必要ないことが判明しました。そして、そのすべてのプロパティは、刻々と更新 されていく。

これはMQL4では言えません。既存のオブジェクトの上にオブジェクトを作成すると、4200("The object already exists")エラーが 発生します。その作成には、ObjectFind()使用が義務付けられて いるということです。このため、_LastErrorエラーを発生させることなく、一定の更新からそのプロパティを閉じることができる簡単な可能性が残されています。

私の結論を確認してください。

 
Alexey Viktorov #:

つまり、配列のサイズはちょうど3000で、新しいバーが形成されるとき、まずゼロインデックスが上書きされ......新しい値が最後に追加されるはずなのですが......?

私の理解が正しければ、なぜループが必要なのでしょうか?単純に、配列そのものを最初のインデックスから順にNULLインデックスにコピーし、最後のインデックスに新しい値を追加する必要があります。

まあ、そうなんですが、例えば、遅れて、2小節が現れた、などの区切りがあれば、それを書いています。

ありがとうございます、了解しました。CopyTimeで試してみます。

 
leon_17 #:

いくつかのテストをしてみたところ...こんな感じです。MQL5では、オブジェクトの作成時にObjectFind()を使用する必要はありません。
オブジェクトの存在を事前に確認することなく(ObjectCreateを使用するだけ)、オブジェクトを作成できます。 OnTickコードの内部でも、このコードは_LastErrorエラーを発生させません。

MQL5のシステムコードの奥底でどのように実装されているかはわかりませんが、もしかしたら、まだオブジェクトが存在しない場合にのみオブジェクトを作成するというチェックがすでにアップロードされているのかもしれませんね。しかし、少なくともMQL5内部でオブジェクトを作成する場合には、ObjectFind() は必要ないことが判明しました。そして、そのすべてのプロパティは、刻々と更新 されていく。

これはMQL4では言えません。既存のオブジェクトの上にオブジェクトを作成すると、4200("The object already exists")エラーが 発生します。その作成には、ObjectFind()使用が義務付けられて いるということです。このため、_LastErrorエラーを発生させることなく、一定の更新からそのプロパティを閉じることができる簡単な可能性が残されています。

私の結論を確認してください。

エラーは全く関係ありません。ポイントは、オブジェクトが作成されると、特定のプロパティが割り当てられ、なぜ変更を加えずにプロパティを再定義するためにマシンの時間とリソースを浪費するのかということです。オブジェクトが存在するかどうかを確認し、変更が必要なものだけに新しいプロパティを割り当てる方が、はるかに安上がりです。例えば、テキストラベルやLableなど、これらのオブジェクトのテキストのみを変更することがよくあります。その他の物件は現状のまま...
 
Mikhail Toptunov #:

そうですね......クリアに見えますが、ディレイや2小節の出現など、区切りがある場合は、それを書き込んでいます。

ありがとうございます、了解しました。CopyTimeから試してみます。

まあ、CopyTime経由でやれば、まったく問題ないんですけどね。現在の3000本のバーからコピーすればいいだけです。

 

保留中の注文を 出すとき、またはマーケットからポジションを開くとき、プログラムコードで通常のトレーリングストップのレベルをどのように設定すればよいですか?

これをどのように手動で行うかは明確である。非標準のトレーリングストップのためのプログラムは面白くない。

よろしくお願いします。

 
   for (int symbols; symbols < SymbolsTotal(true); symbols++) 
      {
        Print(SymbolName(symbols ,true));
      }

なぜ、このようなデザインがうまくいかないのでしょうか?どこがエラーなのか・・・。(ログは空です)


そして、ログは空っぽです。

enum c_mode
  {
   Auto,
   Manual,    
  };

input c_mode MODE         = Auto;

if (MODE==Auto) 
      {
      Print("MODE=Auto");
      } 
理由: