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

 
Klimenko_a_e:

実際のコードでは、この関数はオブジェクトを返します。

この場合、コピーコンストラクタは一時的なコピーを作成する必要があると思います。

このコードはMQL5 build 1545で正しく動作します。

新しいビルドでは、コピーコンストラクタが1次元配列のサイズさえも変更できません:エラー4007。

正しくないのではと思います。

この場合、はっきりとしたことは申し上げにくいのですが。あなたの質問に対しては、非常に優れた専門家がいるので、この質問はhttps://www.mql5.com/ru/forum/1111 にすることをお勧めします。

私の編集により、コードは正常に動作するようになりました。それがないと、ダメなんです。しかし、あなたのコードが動作するはずかどうかは、上記のリンク先のブランチまでが良いでしょう。

Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • www.mql5.com
Форум алго-трейдеров MQL5
 
Klimenko_a_e:

実際のコードでは、この関数はオブジェクトを返します。

コピーコンストラクタは、この場合、一時的なコピーを作成するべきだと私は考えています。

このコードはMQL5 build 1545で正しく動作します。

新しいビルドでは、コピーコンストラクタが1次元配列のサイズさえも変更できません:エラー4007。

これは正しくないと私は思います。


このエラーはビルド1580で修正されました、ありがとうございます、すべて正常に動作します)。
 
fxsaber:

この件に関して、私は断定的なことを言うのは難しいです。ご質問の件に関しては、非常に優秀な専門家がいらっしゃいますので、https://www.mql5.com/ru/forum/1111 の支店に持ち込むことをお勧めします。

私の編集により、コードは正常に動作するようになりました。それがないと、ダメなんです。しかし、あなたのコードが動作するはずかどうかは、上記のリンク先のブランチに指示されたほうがよいでしょう。


リンクありがとうございます。
 

誰かヒントをくれるかもしれませんね。

入力設定を手動で変更した後、EAの実行を中断する方法がわかりません。

1) チャート上でこのようなEAコードを実行します。

#property version   "1.00"

input int Setting_ = 0;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
   Print ("OnInit:",Setting_);
   
   return (INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   Print ("OnDeinit(",reason,"):",Setting_);
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
   while (!_StopFlag)
   {
      Sleep(1000);
   }
}

2) 設定画面を開き、"Setting_"パラメータを1に変更します。

3) そして、変更を適用します。

そのため、変更の適用を開始するためには、OnInitを実行する必要がありますが、OnTick(またはその他)の計算が停止するまで、OnInitは実行されません。

私の知る限り、_StopFlag - mql5-programを停止するフラグによってプログラムを停止 するチェックはありますが、それは完全終了の場合のみです。しかし、入力設定が変わって計算が止まったというのは、どう理解したらいいのかわかりません。

もしかしたら、そんな状況に直面した人がいるのでは?もしかしたら、何か秘密のハックがあるのでは?

 
Marat Sultanov:

誰かヒントをくれるかもしれませんね。

入力設定を手動で変更した後、EAの実行を中断する方法がわかりません。

1) チャート上でこのようなEAコードを実行します。

2) 設定画面を開き、"Setting_"パラメータを1に変更します。

3) そして、変更を適用します。

そのため、変更の適用を開始するためには、OnInitを実行する必要がありますが、OnTick(またはその他)の計算が停止するまで、OnInitは実行されません。

私の知る限り、_StopFlag - mql5-programを停止するフラグによってプログラムを停止 するチェックはありますが、それは完全終了の場合のみです。しかし、入力設定が変わって計算が止まったというのは、どう理解したらいいのかわかりません。

もしかしたら、そんな状況に直面した人がいるのでは?もしかしたら、何か秘密のハックがあるのでは?

OnInit()内の非初期化コードのチェック

非初期化の理由

UninitializeReason()によって返されるExpert Advisorの非初期化理由コードです。以下のいずれかの値を持つことができる。

定数.

価値

商品説明

REASON_PROGRAM

0

ExpertRemove()の呼び出しにより、Expertの動作が停止しました。

REASON_REMOVE

1

チャートから削除されたプログラム

理由_リコンパイル

2

プログラムの再コンパイル

reason_chartchange

3

チャートシンボルまたはピリオドが変更されました

reason_chartclose

4

チャートは閉じています

reason_parameters

5

入力パラメーターがユーザーによって変更された

REASON_ACCOUNT

6

アカウント設定の変更により、別のアカウントがアクティブになった、またはトレードサーバーに再接続された

reason_template

7

別のチャートテンプレートが適用された

reason_initfailed

8

OnInit()ハンドラがゼロ以外の値を返したことを示すサイン

REASON_CLOSE

9

ターミナルを閉鎖

 
Artyom Trishkin:

OnInit()内の初期化コードをチェックする。

...

あの...あなたは私を理解していない :)

ユーザが入力パラメータを変更したことを関数内部で知る必要があります(例えばOnTick で)。

 
Marat Sultanov:

あの...あなたは私を誤解している :)

ユーザが入力パラメータを変更したことを関数内部(例えばOnTick)で知る必要があります。つまり、そろそろ終了してOnDeinitでプログラムを終了させる時期であることを知る必要があります。

ユーザーがEA設定ウィンドウを呼び出し(F7)、そこでOKボタンをクリックすると、すぐにOnDeinit()が呼び出され、これによって、初期化解除コードにREASON_PARAMETERS 値が書き込まれます。次に OnInit() が呼ばれ、そこで UninitializeReason() を使って 初期化解除コードをチェックし、その値が REASON_PARAMETERSと等しければ 、次に 何をすべきかを決定することができるのです。
 
Artyom Trishkin:
ユーザーがEA設定ウィンドウを呼び出し(F7)、そこでOKボタンをクリックすると、直ちにOnDeinit()が呼び出され、これによって、初期化解除コードにREASON_PARAMETERSの値が書き込まれるのである。次に OnInit() が呼ばれ、そこで UninitializeReason() を使って 初期化解除コードをチェックし、その値が REASON_PARAMETERSと等しければ 、次に 何をすべきかを決定することができるのです。

わかりました。

お願いします。

1)まず、最初の投稿にある私のコードを実行 します。美しさのために置いたわけではないのですが...。どのチャートでも実行可能です。

2)EA設定ウィンドウを呼び出す。

3) パラメータを変更し、OKを押す。

OnDeinit() は呼び出されないのです。

 

それだけでなく、エキスパートがdeinitに到達していないことを確認できるように、deinitで理由とパラメータの両方を印刷するようにしました。

コードの中で最も重要な部分にご注目ください。

void OnTick()
{
   while (!_StopFlag)
   {
      Sleep(1000);
   }
}

入力パラメータが変わっても中断されない、長い計算を明確にエミュレートしているのです。そして、それを中断する必要があるのですが、問題はどのようにするかということです。:)

MQL5で見逃しているものがないかを確認したいだけで、言語には本当に_StopFlag 以外何もありませんが、残念ながらこの状況を解決することはできません。

大雑把に言うと、重い計算中に入力パラメータが変化する瞬間をとらえる必要があるんです。

 
Marat Sultanov:

それだけでなく、エキスパートがdeinitに到達していないことを確認できるように、deinitで理由とパラメータの両方を印刷するようにしました。

コードの中で最も重要な部分にご注目ください。

入力パラメータが変わっても中断されない、長い計算を明確にエミュレートしているのです。そして、それを中断する必要があるのですが、問題はどのようにするかということです。:)

MQL5で見逃しているものがないかを確認したいだけで、言語には本当に_StopFlag 以外何もありませんが、残念ながらこの状況を解決することはできません。

大雑把に言うと、重い計算中に入力パラメータが変化する瞬間をとらえる必要があるんです。

大雑把に言うと、私があなたに書いたことをよく読み直し、あなたのコードから無限ループを削除してください。

Expert Advisor を無限ループに追い込むことは、本当に正しい解決策なのでしょうか?

理由: