どんな新人の質問でも、フォーラムを乱雑にしないように。プロフェッショナルは、通り過ぎないでください。Nowhere without you - 6. - ページ 185

 

こんにちは。

あるイベントの後にEAをシャットダウンさせたい。

これはdeinit() 関数だと理解しています、何とかして呼び出したい のです。これはチュートリアルからの引用です。

「特別な関数deinit()は、クライアントターミナルがシャットダウンされたとき、金融商品ウィンドウが閉じられたとき、金融商品やチャート期間を 変更する直前、MetaEditorでプログラムが正常に再コンパイルされたとき、入力パラメータが変更されたとき、およびアカウントが変更されたときにも実行用にコールされます。"

では、この関数が呼び出されるためには、例えば手動で端末を閉じなければならないのですか?

条件が発生したときにこの関数を呼び出すようにしたところ、実行されましたが、新しいティックが来て、再びスタート関数が起動されました。

int deinit()
  {
  Alert("Закрываем программу"); 
   return(0);
  }

int start()
{
//код
..............
if (OrdersTotal()==0) deinit();
return(0);
}



それでも解約するにはどうしたらいいですか?

ありがとうございます。

 
GygaByte:

こんにちは。

あるイベントの後にEAを停止させたいのですが。

これはdeinit() 関数だと理解しています、何とかして呼び出したい のです。これはチュートリアルからの引用です。

「特別な関数deinit()は、クライアントターミナルがシャットダウンされたとき、金融商品ウィンドウが閉じられたとき、金融商品やチャート期間を変更する直前、MetaEditorでプログラムが正常に再コンパイルされたとき、入力パラメータが変更されたとき、およびアカウントが変更されたときにも実行用にコールさ れます。"

では、この関数が呼び出されるためには、例えば手動で端末を閉じ なければならないのですか?

条件が発生したときにこの関数を呼び出すようにしたところ、実行されましたが、新しいティックが来て、再びスタート関数が起動されました。

それでも解約するにはどうしたらいいですか?

ありがとうございます。

プログラム的に端末を閉じる には、コードの一番最初、start()関数の前に挿入します。

//----
#import "user32.dll"
int GetParent(int hWnd);  // вызов API
#import
//----

start()関数の中で、端末を閉じる必要がある場合は、start()関数の外で宣言したExitMT4()を呼び出します。

//+----------------------------------------------------------------------------+
void ExitMT4() {  // выгрузить MT4 из памяти

   int hwnd=WindowHandle(Symbol(),Period());
   int hwnd_parent=0;
//----
   while(!IsStopped()) {
      hwnd=GetParent(hwnd);
      if(hwnd==0) break;
      hwnd_parent=hwnd;
      }
   if(hwnd_parent!=0) PostMessageA(hwnd_parent,WM_CLOSE,0,0);
}
//+----------------------------------------------------------------------------+
 
artmedia70:

プログラム的に端末を閉じるには、コードの一番最初、start()関数の前に挿入します。

start()関数の中で、端末を閉じる必要がある場合は、start()関数の外で宣言したExitMT4()を呼び出します。



詳細なご回答をありがとうございました。

基本的にはEAを終了させるだけで十分で、ターミナルを閉じる 必要はない。簡単にできる方法はないのでしょうか?

deinit()でどうにか解決するはずなのですが、何か間違って いるのでしょうか...。

 

Alpari Limited, build 509からTerminal.exeを削除できません。

コントロールパネルを使用してアンインストールする際に、「アンインストールするための十分な権限がありません」と表示される。システム管理者に連絡してください!」と言われた。

Uninstall.exeを使用すると、「Server has returned the link」と表示されます。

アルパリのテクニカルサポートでは、フォルダごと削除して、別のディレクトリに端末をインストールするようにと言われるだけで、何も理解できない。

Win 7, Ultimateを持っています。Administrator権限を有効にして、Uninstall.exeをAdministratorで実行しました。

この問題を解決するために、何かご助言をいただければ幸いです。

 
GygaByte:


詳細なご回答をありがとうございました。

原理的にはEAを終了させるだけで十分であり、ターミナルを閉じる必要はない。簡単な方法はないのでしょうか?

deinit()でどうにか解決するはずなのですが、何か間違って いるのでしょうか...。

deinit()ではなく、return(0)です。
 
artmedia70:
deinit()ではなく、return(0); 。


私が間違っていなければ、return(0)は単に現在の関数start()を終了させて次のティックを待ちますが、一方で私はEAをチャートから手動で切り離したかのように、その作業を終了させなければ なりません。

実際に確認したところ、1ティック ごとに「0オープンオーダー」のアラートが表示され続けています。

大事な「バイバイ」を待たずに。

int start()
  {
  if (OrdersTotal()==0) 
   {
   Alert("Открытых ордеров - ", OrdersTotal());
   return(0);
   }  
  }
//+------------------------------------------------------------------+
int deinit()
  {
 Alert("Пока");  
   return(0);
  }
 
polycomp:

Alpari Limited, build 509のTerminal.exeを削除できない。

コントロールパネルを使用してアンインストールする際に、「アンインストールするための十分な権限がありません」と表示される。システム管理者に連絡してください!」と言われた。

Uninstall.exeを使用すると、「Server has returned the link」と表示されます。

アルパリのテクニカルサポートでは、フォルダごと削除して、別のディレクトリに端末をインストールするようにと言われるだけで、何も理解できない。

Win 7, Ultimateを持っています。管理者権限を有効にし、uninstall.exeを管理者として実行する。

この問題を解決するためのアドバイスがあれば、とてもありがたいです。

悪意のあるプログラム(mail.ru、私が持っていた)の中には、アクセス権を再配布するものがあり、管理者権限を持つあなたはその削除にアクセスできないのです。

権利の再配布(フォルダをクリック、プロパティ、セキュリティ、変更、追加、オプション、オブジェクトの種類、検索......)で科学的に突くという方法で解決しました。

しかし、その後「Revoアンインストーラー」を知り、何かを削除する煩わしさが消え、レジストリが彼らの活動からきれいになったという確信が持てるようになったのです。

 
GygaByte:


私が間違っていなければ、return(0)は単に現在の関数start()を終了し、次のティックを待ちます。 私はEAをチャートから手動で切り離したかのように作業を終了させる必要が あるのです。

実際に確認したところ、1ティックごとに延々と「Open orders - 0」というアラートが表示されます。

大切な「バイバイ」を待たずして

あなたの願いは、「チェッカーズ」のジョークを彷彿とさせます。もしEAを停止させたいのであれば、(グローバル)フラグを有効にして(ある条件の後に)start()関数に割り込み(returnで終了)すれば期待通りの結果が得られるでしょう。
 
ALXIMIKS:

悪意のあるプログラム(私が持っていたmail.ru)の中には、アクセス権を再配布して、管理者権限のある人には削除の権限がないようにするものがあります。

この問題は、パーミッションの再配布という科学的な方法で解決しました(フォルダー上のPCM、プロパティ、セキュリティ、変更、追加、オプション、オブジェクトの種類、検索......)。

しかし、「Revoアンインストーラー」を知ってから、何かを削除する手間がなくなり、レジストリもきれいになったので、彼らの活動から解放されたことを確信しました。

ありがとうございました。Revoアンインストーラーと懇意にさせていただきます。
 
TarasBY:
あなたの願いは、「ドラえもん」のジョークを彷彿とさせますね。もし、アドバイザーの取引を停止させたいのであれば、(グローバル)フラグを起動させ(ある条件の後)、関数start()に割り込み(returnで終了)すれば、期待通りの結果が得られるでしょう。

だいたいこんな感じです。

bool GlobalFlag;
int init()
{
   GlobalFlag = true;
   return(0);
}
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
{
   if ( GlobalFlag )
      if (OrdersTotal() == 0) 
      {
         GlobalFlag = false;
         Alert("Открытых ордеров - ", OrdersTotal());
         Alert("Пока");  
      }  
   return(0);
}
//+------------------------------------------------------------------+
int deinit()
{
   return(0);
}
//+------------------------------------------------------------------+