ライブラリ: エキスパート - ページ 8

 
Stanislav Korotky:

いまだに理解できないのだが、なぜExpert.mqh.tplという定数名のほうが、それを生成するプログラムの名前を冠したテンプレートよりも「実用的」なのだろうか?biblaを使うプログラムA.mq5とB.mq5があるとしよう。もしテンプレートがそれぞれの名前で生成されるのであれば、第一に、片方を上書きするのではなく、それぞれのプログラムのアクションの最後の「フィンガープリント」を持つ方がより実用的でしょう。第二に、ジェネレーターが誰であるかを名前によってすぐに知ることができる(特にそのプログラムが外国のものである場合に便利である)。現在では、Expert.mqh.tplファイルの中に入るまで、それを知ることはできない。私が示した普遍的な解決策は、MQLプログラムの名前+タイムスタンプ+ランダムを取ることです。また、ファイルをsync=trueのままにしておく必要はないと思います。すべてのテストとデバッグはとっくに終わっていると思います。エラーやデバッグが必要な場合は、sync=falseというオプションがあります。そうすれば、ファイルは残されるはずだ。すべてが論理的だと思います。編集も簡単だ。

誰かが複数のプログラムで並行してビブリオを使用しない限り、実際には衝突はめったに起こらないかもしれないことに同意します。私は持っていませんが、コードをざっと見て、FilesフォルダのExpert.mqh.tplに目が留まりました。すべては純粋に想像です。

ファイルを削除したくなかったので、実務での作業の信頼性を考慮すると、1つの共通名で十分だと思った。

Filesフォルダの中にtplファイルがズラリと並んでいるのを見たくなかった。意図的に削除する場合も同様だ。私はここだけを 削除した。

Возможность вызова DLL в Маркет-продуктах.
Возможность вызова DLL в Маркет-продуктах.
  • 2019.07.20
  • www.mql5.com
Возможно написание EX5 с вызовом DLL, который пройдет все проверки Маркета и будет там опубликован.В прицепе такой EX5-скрипт. Он запускает указанные приложения/документы.В прицепе еще один вариант
 
Vitaly Muzichenko:

.ex4形式のExpert Advisorを別の名前のExpert Advisorに接続して実行し、入力パラメータを表示する必要があります。

Trade.ex4という名前でコンパイルされたExpert Advisorがあります。

Hand.ex4 "という名前で新しいExpert Advisorを作成します。

Hand.ex4」を起動したときに「Trade.ex4」が完全に機能し、「Trade.ex4」が「Hand.ex4」に埋め込まれるように、これらを結合するにはどうすればよいでしょうか。

つまり、マシンにはHand.ex4ファイルしかないが、仕事ではTrade.ex4を使っている。

ありがとうございました!

解決策は見つかりましたか?

 
Vitaly Muzichenko:

"Hand.ex4 "を起動したときに、"Trade.ex4 "が完全に機能し、"Trade.ex4 "が "Hand.ex4 "に埋め込まれるように結合する方法。

つまり、マシン上にはHand.ex4ファイルしかないが、仕事ではTrade.ex4を使っている。

インジケーターでも動作するはずです。Expert Advisorは他のExpert Advisorにステッチされないようです。

 
fxsaber:

インジケーターで動作するはずです。Expert Advisorは他のExpert Advisorにステッチされないようです。

はい、Expert Advisorを埋め込むことができませんでした。

 
みんなありがとう!
 
Vitaly Muzichenko:

そう、カウンセラーは縫い付けることができず、解決策は見つからなかった。

解決策がある可能性が高いですし、あるバリエーションで一度ここで 使ったような気がします。でも、どうやったかすっかり忘れてしまった。

Возможность вызова DLL в Маркет-продуктах.
Возможность вызова DLL в Маркет-продуктах.
  • 2019.07.20
  • www.mql5.com
Возможно написание EX5 с вызовом DLL, который пройдет все проверки Маркета и будет там опубликован.В прицепе такой EX5-скрипт. Он запускает указанные приложения/документы.В прицепе еще один вариант
 
fxsaber:

おそらく解決策はあるはずで、私はここで 一度、亜種のひとつでそれを使ったことがあるようだ。でも、不覚にもどうやったか忘れてしまった。

試してみたところ、方法はひとつも見つからなかった。それは4でのことで、5では試していない。

 

取引、自動取引システム、取引戦略のテストに関するフォーラム

mql5言語の特殊性、作業の機微とテクニック

fxsaber, 2020.05.21 09:13

#include <fxsaber\Expert.mqh> //https://www.mql5.com/ja/code/19003

// アカウント変更後にシンボルがない場合、アンロードする。
void OnDeinit( const int Reason )
{
  if (Reason == REASON_ACCOUNT)
  {
    MqlTick Tick;
    
    if (!SymbolInfoInteger(_Symbol, SYMBOL_CUSTOM) && !SymbolInfoTick(_Symbol, Tick))
    {
      Alert("Account is changed!");
      
      if (EXPERT::Remove())
        Alert("Expert is removed!");
      
      // ExpertRemove(); // 役に立ちません。
      // ChartClose(); // 最良の解決策ではない。
    }
// さもなければ
      // カスタムやその他のケースでは、以下の解決策でコードを補強してください。
      //https://www.mql5.com/ru/forum/170952/page175#comment_16365819 
  }  
}
 
fxsaber:
クールなライブラリですね!Expert Advisorのオープニングをこのような方法で実装するとは思いつきませんでした。dllを使わずにmqlを使ってアクティブチャートを定義する方法を教えてください。winapiを使ったことがありますが、あまりに面倒でした:
long                          Agent::ChartGetActiveID()
  {
   static long                terminal_wnd = ChartGetInteger(0,CHART_IS_DOCKED) ?
                              GetAncestor(ChartGetInteger(0, CHART_WINDOW_HANDLE), 2) :
                              GetParent(GetAncestor(ChartGetInteger(0, CHART_WINDOW_HANDLE), 2));

   static uint                process_id = 0;
   static uint                thread_id = GetWindowThreadProcessId(terminal_wnd, process_id);
   static long                mdi_wnd = GetDlgItem(terminal_wnd, 0xE900);
   static GUITHREADINFO       thread_info;


   thread_info.cbSize = sizeof(GUITHREADINFO);
   if(!GetGUIThreadInfo(thread_id, thread_info))
      return -1;

   long wnd_on_focus = 0, chart_id = -1;
   if(GetDlgItem(thread_info.hwndActive, 0xE900)== mdi_wnd)
      wnd_on_focus = GetWindow(SendMessageW(mdi_wnd, 0x0229, 0, 0), 5);
   else
      wnd_on_focus = GetWindow(thread_info.hwndActive, 5);

   for(long ch_id = ChartFirst(); ch_id != -1; ch_id = ChartNext(ch_id))
      if(ChartGetInteger(ch_id, CHART_WINDOW_HANDLE)==wnd_on_focus)
        {
         chart_id = ch_id;
         break;
        }
   return chart_id;
  }

もしかしたら、このケースをmqlで、あるいは少なくともdllを使って、より簡単に実装する方法をご存知かもしれません。

 
vek_y4icb:
mqlツールを使って、dllを使わずにアクティブ・チャートを定義する方法。

正確には覚えていない。この問題は解決されたと思います。検索してみるとよいでしょう。