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

 
Ihor Herasko:


しかし、実際はどうでしょう。スリープしても、インジケーターのデータの再計算には影響しないはずです。バッファの充填がおかしい。もしかしたら、再現性のあるコードがあるのでは?

インジケータはオーダーメイドで書きました。野暮ったいOOPで、よくわかりません :(

この問題には一晩中かかりましたが、テスターと実アカウントの 乖離の原因はわかりましたので、寝たら秘密のロジックをいくつか削除してレビュー用に投稿するかもしれません。

 
Aleksey Vyazmikin:

問題が発生しました。インジケータベースのEAは実際の口座では正常に動作しますが、テスターではOHLCによるティック生成モードと すべてのティックによるティック生成モードの両方で、結果は同じです。エラーの結果は、ゼロバーでインジケータのバッファが空になります(インジケータの計算に使用される上位TFに新しいバーがある場合のみ)。しかし、Expert AdvisorにSleepを追加することで、なんとか指標を計算させることができました。 しかし、ティックの生成モードによって、このSleepが異なることがわかりました。すべてのティックからの生成にはSleep(15000)で十分で、OHLCにはSleep(30000)が必要なのです。

というのも、論理的に考えて、ティック生成のモードによって異なる遅延時間がモデル化されていることがわかったからです。

開発者の皆さん、インジケータの状況を説明してください。私自身、原因が何なのか理解できません。

PMでインジケータとExpert Advisorを渡す用意があるが、誰に渡すか教えてくれ。

価格を配列にコピーする場合、履歴があるかどうか、価格が変更されていないかどうかをチェックする必要があります。そのためには、TF用の履歴があるかどうかを確認し、なければ再度コピーを試み、ループ内に読み込まれるのを待つ必要があります。

これはプログラマーの腕の見せ所です。

スリップは正常ではありません
 
void OnChartEvent(            const int id,        // идентификатор события   
                              const long& lparam,  // параметр события типа long 
                              const double& dparam,// параметр события типа double 
                              const string& sparam // параметр события типа string 
                              )
   {
   Print(My_Name, " ---  ", id, "    lparam = ", lparam, "    dparam = ", dparam, "    sparam = ", sparam, "    ChartID() = ", ChartID() );        // <<|+|+|+<<  // 

   }                              

説明してください...

キーを押すと、イベントID=0が表示されます。これは何度でも繰り返せます。スペースバーが押されていない限り、結果は同じです。

スペースバーを押した=イベントID=0を取得。それ以降は、キーボードで操作しても何のイベントも発生しません。

呆然とした状態から抜け出すために、マウスボタンを押すと=イベントID=4が表示される。その後、再びキーボードをクリックすればいい=クリックするごとにイベントが発生する。スペースキーが押されていない限り=同じ結果になります。

質問:私は何かを理解していない愚か者なのでしょうか、それともこんなはずではなかったのでしょうか?リンクを貼ってください。

 
Nikita Chernyshov:

こんにちは、同僚たち。

質問:mql4で、ポジション数を 計算するためには、次のような関数を書けばよいのです。

mql5ではどのように実装されているのですか?マジックナンバーやタイプ別にポジションを計算するにはどうしたらいいですか?

MQL4-functionの前に以下の行を追加します。

#include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006

で、MT5で動作します。

 
Maxim Dmitrievsky:

インジケーターの場合、タイムスケールはまだ準備ができていない可能性があり、つまり価格を一度に配列にコピーすることはできません。そのためには、TF用の履歴があるかどうかを確認し、なければ再度コピーを試み、ループ内に読み込まれるのを待つ必要があります。

これはプログラマが知らないと手も足も出ない。

あながち間違いでもない

テスターではどうなっているのでしょうか?本番とテスターのどちらに問題があるのか、履歴がないのは理解できますが...。しかし、このテストはどのようなものであるべきなのでしょうか。

開発者は私のメッセージを無視している、残念だ。

 
Aleksey Vyazmikin:

テスターではどうなっているのでしょうか?本番やテスターでの問題であれば、そこに履歴が残らないのは理解できますが......。しかし、このテストはどのようなものであるべきなのでしょうか。

開発者は私のメッセージを無視している、残念だ。

価格がコピーされているかどうかをチェックし、もしCopycloseなどが-1を返したら、コピーされていない。

 
Maxim Dmitrievsky:

価格がコピーされているかどうかをチェックし、もしCopycloseなどが-1を返したら、コピーされていない。

インジケータは新しいバーの出現時に一度だけ計算されますが、私の理解が正しければ、このように実装されています。

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   static int counted_bars=0;
   if(rates_total==prev_calculated) return(rates_total);

も簡単なプリントで確認できます。

そのため、計算する価格がないと仮定すれば、インジケータは 1回計算 され、バッファは満たされないままですが、そうではなく、EAにスリープを追加して待てば満たされる、という状況になっています。もしかしたら、インジケータの計算が遅くて、テスターがそれを待っていないだけかもしれませんよ?でも、どうやって確認するのでしょうか?

 
Aleksey Vyazmikin:

このインジケータは、新しいバーが表示されたときに1回計算されますが、これは、私の理解が正しければ、このように実装されています。

ということも、簡単なプリントで確認することができます。

そのため、計算する価格がないと仮定すれば、インジケータは 一度計算 され、バッファは満たされないままですが、そうではなく、EAにスリープを追加して待っていれば満たされる、という状況になっています。もしかしたら、インジケータの計算が遅くて、テスターがそれを待っていないだけかもしれませんよ?でも、どうやって確認するのですか?

それなら時間制にすべきかもしれない

 
Maxim Dmitrievsky:

それならタイマーを使ったほうがいいのでは?

はい、EAにタイマーがあると、テストはタイマーなしより少し進みますが、スリープより 悪く、タイマーはスリープと本質的に同じです。

このインジケータは、他の2つのインジケータのデータを使用して計算されており、コードは他のインジケータの計算されたバーの数を要求しています。

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CChannel::BarsCalculated(void)
  {
   int upchbars=BarsCalculated(m_upch);
   int dnchbars=BarsCalculated(m_dnch);
   if(upchbars<=dnchbars) return(upchbars);
   return(dnchbars);
  }

と予想される算出バー数

int barsch=(InpChPeriod==PERIOD_CURRENT?rates_total:Bars(_Symbol,InpChPeriod));

この2つの値が一致しない場合、バッファは満たされない。

   if(!channel.CreateChannel() || barsch<=0 || barsch!=channel.BarsCalculated() || channel.FillChBuffers(rates_total,calculated,time)==0)
     {
      for(;counted_bars<rates_total;counted_bars++)
        {
         ZigzagBuffer[counted_bars]=0.0;
         ZigzagStepBuffer[counted_bars]=0.0;
         UpChBuffer[counted_bars]=0.0;
         DnChBuffer[counted_bars]=0.0;
         InfoZigzagBuffer[counted_bars]=0.0;
         InfoUpChBuffer[counted_bars]=0.0;
         InfoDnChBuffer[counted_bars]=0.0;
         InfoDirectBuffer[counted_bars]=0.0;
         InfoBegPriceBuffer[counted_bars]=0.0;
         InfoEndPriceBuffer[counted_bars]=0.0;
         InfoBegTimeBuffer[counted_bars]=0.0;
         InfoEndTimeBuffer[counted_bars]=0.0;
         InfoStartPriceBuffer[counted_bars]=0.0;
         InfoStartTimeBuffer[counted_bars]=0.0;
         InfoZigzagTotal[counted_bars]=InfoZigzagTotal[counted_bars-1];
        }
      if(InpInfEnd) CopyInfoBuffers(rates_total-1,(int)InfoZigzagTotal[rates_total-1]);
      return(calculated);
     }

私が正しく理解していれば、指標は1つのスレッドで実行され、それらの優先順位はそれらの作成時間によって分配されます。つまり、私がEAからアドレスした指標はより高い優先順位を持ち、最初にその計算を実行し、その後、(バッファデータに基づいて)計算を実行すべき指標にスレッドを渡すことが判明しています。

プリントでは、十分な大きさのSleepを設定すると、インジケータで再計算が行われることがわかります(まだ方法は理解していませんが)なぜ13秒後だけなのでしょうか?

2019.01.22 19:50:16.992 2019.01.21 23:45:00   barsch=6275
2019.01.22 19:50:16.992 2019.01.21 23:45:00   BarsCalculated=6274

2019.01.22 19:50:16.993 2019.01.21 23:45:13   barsch=6275
2019.01.22 19:50:16.993 2019.01.21 23:45:13   BarsCalculated=6275

インジケーターにタイマーはありません。

また、正しい計算をするためにはどうしたらよいでしょうか。バッファの値を待つ前にEAでwhileを使おうとしても、役に立ちません - ハングします。

 
こんにちは、私は自分のEAにステップ付きトレーリングストップを実装したいと思いました。KodobaseとMacd Sampleには、テンプレート以外のものは見つかりませんでした。他の選択肢もあるのでは?
理由: