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

 
hamsteruser:

*returntickも破壊されていません。取引端末の 排気に戸惑うばかりです。未清算の記憶について書いているのです。


関数が返すポインタを使用するコードと、そのポインタを破棄する瞬間をすべて教えてください。助けるのはとても大変なんだ。

 
Anatolij Povoroznyj:

こんにちは。コードの修正をお願いします。私は、EAが一連の注文を開くのではなく、最初のイベントで1つの注文だけを開く必要があります。

CCIが下降線200を越えたらBAYを開き、CCIが再び下降線200を越えたらまたBAYを開く、などなど、CCIが上昇線-200を越えたらすべてのBAYを閉じ、売りを開くという仕組み です。

SSIが200の線を上から下へ横切ったとき、最初のBAIが開き、他のBAIはSSIが-200の線を下から上へ横切るまで開くべきではありません、この場合、BAIは閉じられ、売りが開かれます。(売りのラインと-200のラインをミラーリング)。


該当する種類の未決済注文があるかどうかを確認する機能を追加する。つまり、注文がある場合、この関数はtrueを返し、次の注文は開きません。

 

多分、関係ないんだろうけど...。

MT4への願い

私は多くのアラートを使用していますが、それらはすべて特定のパラメータに設定されています。

アラートの有効期限を必要なだけ長く設定し、新しい目標価格に復活させるようにしています。

私の端末のアラートログは、シンボルやイベントごとにソートされていないので、毎回正しいアラートを探すのは面倒です。

取引」タブのようなソートオプションがあると良いですね

 
hamsteruser:

ポインターを持つ関数があります。


今も別の機能で呼び出しています。


裏の記憶を消すにはどうしたらいいですか?

delete(TickReturn);で、operand exceptedというエラーが出ます。

TickReturn* rt = returntick( period, 1 );

int timeis = rt.curtime;

delete rt;
 
MMM1972:

多分、関係ないんだろうけど...。

MT4への願い

私は多くのアラートを使用していますが、それらはすべて特定のパラメータに設定されています。

アラートの有効期限を必要なだけ長く設定し、新しい目標価格に復活させるようにしています。

私の端末のアラートログは、シンボルやイベントごとにソートされていないので、毎回正しいアラートを探すのは面倒です。

取引」タブのようなソートオプションがあると良いですね

MT4端末の開発は終了しています。発見されたバグのみを修正しています。

 
Алексей Барбашин:

関数が返すポインタを使用するコードと、そのポインタを破棄する瞬間をすべて教えてください。助けるのはとても大変なんだ。

本当に記憶が流れているんです。

  class TickReturn

   {

   public:

      int curtime;

      double open;

      double close;

      double high;

      double low;

      double priceask;

      double pricebid;

      

   };



  TickReturn *returntick(int period, int timeposition)

   {

      TickReturn *returntick = new TickReturn();

      MqlRates rates[];

      MqlTick last_tick;

      

      if(SymbolInfoTick(symbol,last_tick)){}

      else Print("SymbolInfoTick() failed, error = ",GetLastError());

      

      //int timeposition=0;

      ArraySetAsSeries(rates,true);

      ArrayResize(rates,1);

      int copied=CopyRates(symbol,period,timeposition,1,rates);

      

      returntick.curtime = rates[0].time;

      returntick.open = rates[0].open;

      returntick.close = rates[0].close;

      returntick.high = rates[0].high;

      returntick.low = rates[0].low;

      returntick.priceask = last_tick.ask;

      returntick.pricebid = last_tick.bid;

      

      return(returntick);

}

void OnTick() { int period = 15; int timeis = returntick(period, 1).curtime; Print("timeis= ", TimeToStr(timeis,TIME_SECONDS)); Вот здесь пытаюсь уничтожить указатель. }

 
hamsteruser:

本当に記憶が流れているんです。


void OnTick() { int period = 15; int timeis = returntick(period, 1).curtime; Print("timeis= ", TimeToStr(timeis,TIME_SECONDS)); ここでポインタを破棄しようとしています }.


ここで具体的に何を破壊できるかは、よくわからない。メモリがリークするのは当然だ。ポインターとは何ですか?ポインターは、作成された動的変数が格納されているメモリアドレスへの参照である。実際には、クラス変数へのポインタを取得する手続きを呼び、この手続きの中でクラスオブジェクトを生成してメモリ上に配置し、そのポインタを目盛りを取得する関数に戻して......という流れになります。は、関数を終了するときに破棄されます。ポインターは破棄されますが、メモリはクリアされないことに注意してください!そして、新しいカチカチ音がするたびに、どんどんメモリが食べられていくのです。コード内でこの点を回避するには、まず略語を削除し、ポインタを別の変数に入れる必要があります。TickReturn* temptick =returntick(period, 1);// ポインタを取得して変数に格納 int timeis = temptick.curtime; // ポインタでオブジェクトから必要な値を取得 ...... delete temptick; // ポインタを破棄し,メモリをクリア する.

また、ポインタを破棄する前に、それが正しいかどうかを確認した方が、削除エラーを回避できます。

全体として、特にポインタやクラスについては、実際にはもっと簡単な作業であり、クラスを使用する必要もないので、悩むことはないでしょう。必要なフィールドを持つ構造体を作り、この構造体の型を持つグローバル変数を 宣言し、この構造体の情報をtick毎に更新する関数を作り、そこから必要な情報を収集します。変数はグローバルなので、関数を通して実行する必要はなく、ポインタも不要になります。

 

1.mql4で他のEAを無効化することは可能ですか?

2.指定したChartIdで Expert Advisorが動作しているかどうかを確認するには?

 
Sergey Likho:

1.mql4で他のEAを無効化することは可能ですか?

2.指定されたChartIdでExpert Advisorが動作しているかどうかをチェックしますか?


EAのコード内部で取引を無効にし、外部ファイルで切り替えを行うことで、別のEAから取引が不要になったことを通知することができます。

 
Aleksey Vyazmikin:

EAのコード内部で取引を禁止し、外部ファイルで切り替えを行うことで、別のEAがどのEAにも取引が不要であることを伝えることができるようになります。


まさに、EA Aが条件によってEA Bを無効化するという考え方です。