MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 1738

 
Nikolay Ivanov #:

あなたのコードは-1でなく0を表示します。

もしかしたら、-1が他の場所に印刷されているかもしれません。最も可能性が高いのは、コード全体がプリンターの中にあることですが...。



例が間違っています。すみません、コード自体が大きいのです。

でも、Konstantinの解決策で問題は解決しました!確かに、i--とゼロチェックを入れ替えたところ、ロジックが正常に動作し、-1の代わりに0または1が出力されるようになりました。(0または-1より前で、後者は即座にエラーとなる)。

 
Nikolay Ivanov #:

あなたのコードは-1でなく0を表示します。

1が他の場所に印刷されている可能性があります。最も可能性が高いのは、コード全体がプリンターに...

問題を解決しようとする前に、その問題を特定する必要がある...。そこにあることを確認し、場所を特定してから解く...。

ペンと紙を用意してください。そして、ループのカウントの仕方を書いてください。このコードでは

void OnStart()
  {
int i=10;
for (i; i>0; i--)
{
i--;
if (i==0) break;
}

Print(i);
  }

点検

if (i==0) break;

は、このコードでは決して動作しません。を初期設定しない限り

int i=11;

は奇数値である。もし偶数なら、このコードは

int i=10;
for (i; i>0; i--)
{
i--;
if (i==0) break;
}

まで

if (i==0) break;

は奇数値で来ます。

 
Nikolay Ivanov #:

問題を解決しようとする前に、その問題を特定する必要がある...。あることを確認して、ローカライズして、解決する...。

なるほど、そういうことだったんですね。

 
Konstantin Nikitin #:

ペンと紙を用意してください。そして、その周期がどのようにカウントされるかを書き込む。このコードでは

なぜ、印刷=-1という条件なのに、実際には(確認したところ)0と印刷される、つまり、例題が間違っていると、紙とペンを持っていくのでしょう?そして、不正解の例に対して正しい答えを出すことは不可能です...。

 
Nikolay Ivanov #:

なぜ、印刷=-1という条件なのに紙とペンを取るのかというと、実際には(確認したところ)0と印刷されるので、例が正しくないのです。そして、不正解の例に対して正しい答えを出すことは不可能です...。

この行からゼロが出力される

for (i; i>0; i--)

であり、チェックとブレークの 出力からではありません。

一般的には、次のように書くのが正しいでしょう。

for (i; i>= 0; i--)

配列はゼロインデックスで始まるので

 
Konstantin Nikitin #:

この行からゼロが出力される

ブレイクチェックと 終了からではなく

この行から、指定されたコードに対して0が出力される...

Print(i);

問題は、なぜbreakが機能しないかではなく、なぜプリンターが-1を印刷したのか...それだけです。 そして、i startが偶数か奇数かは関係なく、決して-1は印刷されない...ということです。

 
長時間のティックやローソク足の計算方法を教えてください。(例えば1年)。

Close[]を試してみましたが、インデックスが5000以上出てきません。
 
Ivan Butko #:
長い期間のティックやローソクを 計算する方法を教えてください。(例えば1年)。 Close[]も試しましたが、インデックスが5000以上出ません。

ダニやロウソクでこれだけ変わるんだから、怖いといえば怖い...。

 
Alexey Viktorov #:

ダニとロウソクの違いがありすぎて怖いくらい...。

例えばEAで、任意の期間を指定すると、テスターではティック単位で行ったり、M1バーで行ったり、みんなそれを考慮します。

しかし、リアルタイムで長い履歴に行き、そこからデータを取るEAを取る場合、どう整理したらいいのか分かりません。ターミナルでは5000本以上のロウソクは出ません。


UPD
これを使ってみます。コードはネットにあります。

MqlRates rates[];

   int copied=CopyRates(NULL,0,0,100,rates);

   if(copied<=0)

      Print("Ошибка копирования ценовых данных ",GetLastError());

   else Print("Скопировано ",ArraySize(rates)," баров");


UPD
不思議ですね。突然、動くようになった。100万本目もチェック。何もせず、ドキュメントを読んだり、お茶を飲んだりしていた。今、もう一度実行したら、うまくいきました。
というわけで、追加コード(上記)のチェックも不要でした。
MT4は何かと気難しいですね。あるいは、forex chifにそのような機能があるのかもしれません。ブローカーのものでなく、標準のものを置く必要がありますね。

 
Ivan Butko #:

例えば、Expert Advisorの場合、任意の期間を指定すれば、ティック単位でもM1バー単位でもテスターを通過し、誰もがそれを考慮します。

しかし、リアルタイムモードで長い履歴に行き、そこからデータを取得するExpert Advisorを取る場合、それをどう整理すればいいのかが分かりません。ターミナルでは5000本以上のロウソクは出ません。


UPD
これを使ってみます。コードはネットにあります。

MqlRates rates[];

   int copied=CopyRates(NULL,0,0,100,rates);

   if(copied<=0)

      Print("Ошибка копирования ценовых данных ",GetLastError());

   else Print("Скопировано ",ArraySize(rates)," баров");


UPD
不思議ですね。突然、動くようになった。100万本目もチェック。何もせず、ドキュメントを読んだり、お茶を飲んだりしていた。今、もう一度実行したら、うまくいきました。
というわけで、追加コード(上記)のチェックも不要でした。
MT4は何かと気難しいですね。あるいは、forex chifにそのような機能があるのかもしれません。証券会社のものではなく、標準のものを置かないといけないですね。

CopyRates()の最初の呼び出しは、過去のデータのポンピングを開始しています(1週間も実行しなければ、また同じことが起こります、まあ、1週間でなくても、ある程度の時間はかかりますが)。
サーバーにあるデータ量を確認し、利用可能な量をExpert Advisorと比較すればいいのです。必要量より少ない場合 - 次のティックまでEAを残す。次のティックで、もう一度確認する。何度試みても必要な量の履歴が取得できない場合、このエラーは必要なものとして処理されます。