ライブラリ: マルチテスター - ページ 3

 
Edgar:

最適化の結果を 見る方法ということであれば、プログラムでキャッシュから結果を読み取るという話をしました。

そういう意味ではない。しかし、キャッシュの読み込みは可能だ。ただ、それを書かなければならない。

削除済み  

クールだ!

Cyclesもねじ込んでみたんだけど、まさに私に足りなかったものだった )))))

#include <fxsaber\MultiTester\MultiTester.mqh> // テスターで複数回の実行/最適化。

enum CyclNum
{
   n01   = 1,     // 1
   n02,           // 2
   n03,           // 3
   n04,           // 4
   n05,           // 5
   n06,           // 6
   n07,           // 7
   n08,           // 8
   n09,           // 9
   n10,           // 0
};
sinput bool Period_M1 = false;         // M1のスイッチを入れる
sinput bool Period_M5 = false;         // M5のスイッチオン
sinput bool Period_M15 = false;        // M15のスイッチオン
sinput bool OnlyCustomSymbols = false; // カスタム文字のみ
sinput CyclNum number_cycles  = n06;   // サイクル数

// この関数はタスクリストを生成する。
void SetTesterSettings()
{
   for(int n = 0; n < number_cycles; n++)
   {
      // マーケット・ウォッチから全シンボルを検索する。
      for (int i = SymbolsTotal(true) - 1; i >= 0; i--)
      {

ありがとう!

 
Сергей Таболин:

サイクルを追加したら、まさに私が必要としていたものだった ))))

テスターにボタンを押す機能が欲しい。そうすれば、自動化は別次元になるだろう。

 

必要なコントロール(Depo、Currency、Leverage、OptimisationType、BarsType、Criteria)に関数を追加しました。しかし、まだテストしていない。後で公開します。

エージェント管理を 実装したかった。例えば、エージェントのリストをクリックし、HOMEを押し、VK_DOWNで各エージェントを選択できます。しかし、選択した行のコンテキストメニューを呼び出す方法がわかりません。また、'd'/'e'を押して無効化/有効化を行う必要があります。

誰かヒントをくれませんか?

クラウドの有効化/無効化(ティックやクロスオプティマイゼーションの前に無効化)はさらに難しい。コンテキストメニューまで行っても、明示的に有効/無効にすることはできず、反転させることしかできない。現在の状態をプログラムで調べることはできない。ターミナルのログから「2019.07.31 19:27:35.664 Tester Cloud servers using switch off」と読み取れます。プログラムでログを読むこともできないようなので、ログファイルを見る必要があります。

文書化されていないWinAPIコマンドの可能性はまだある。おそらくC++プログラマーの中には、それらを見つける方法を知っている人がいるのではないだろうか?

削除済み  

停電の問題に直面。さて、どの程度最適化されたのやら (((

時間があったら、最適化率と作業文字数のチェックを追加してみようと思う。作者は気にしないかな?)))それとも、作者自身がやりたいのだろうか?

 
Сергей Таболин:

停電の問題に直面。今となっては、どれだけ最適化がなされたのかわからない((

MultiTesterはログにその手順を反映する。端末がログを保存していれば、そこに全てが表示される。

しかも、最適化キャッシュは100%保存されている。そのため、何が実行されたかを見ることができる。

 
Edgar:

必要なコントロール(Depo、Currency、Leverage、OptimisationType、BarsType、Criteria)に関数を追加しました。しかし、まだテストしていない。後で公開する。

私的な問題を解決する前に、その解決策を使用するシナリオを 記述するのが良いでしょう。

 
fxsaber:

プライベートの問題を解決する前に、その解決策を使うためのシナリオを描くのは良い考えだ。

前ページで私のシナリオを説明した。

Clickerは全ての代用品ではなく、最適化を自動化するために必要ないくつかのツールの一つである。クリッカーは、最適化を自動化するために必要ないくつかのツールのうちの1つであり、追加のターミナルを立ち上げることなく、1つのターミナルですべてを行うことができる。結果を分析するためのフレーム(最適化キャッシュを読み込むための新しいライブラリも同じ目的に適しています)、入力変数を管理するための関数、状態や統計を保存するためのSQLITEを追加したいと思います。そして、インテリジェントな最適化スクリプトを書くこともできる。各Expert Advisorは独自のスクリプトを持っています。スクリプトは手動で作成し、繰り返し適用する必要があります。

フレームはすでに追加されている。私はSQLITEを使った経験があります。

私はあなたのライブラリを私のニーズに合わせて拡張しただけです。あなた自身が計画していたのでしょうが、私は待ちませんでした。これは上記の技術の中で唯一、私が解決策を用意していなかったものです。ところで、私は自分のアドオンをチェックしました。エージェント管理の問題はまだ関連している。Spy++は、経験豊富なシステムエンジニアのメッセージをキャッチするのに役立つが、私はほとんど助けられなかった。私は、人々が引き上げてくれることを願っています。このトピックは2008年以来ずっと出てきている。

 
Edgar:

これをどのように改善したいかを説明します。私の典型的な最適化シナリオ

OHLCの遺伝的実行をN回行う。カスタマイズされた基準に従って、それぞれから最良の結果を得る。

各パラメーターグループ(各グループは2-3個の相互に依存するパラメーターを持つ)に対して低速最適化を実行する。

最適に達するまで(パラメータが浮動しなくなるまで)、各グループに対して反復的に低速最適化を繰り返す。

実時刻に切り替え、同じ低速最適化を実行。

別のシンボルに切り替え、すべてを繰り返す。

このような作業は私の前にはない。もちろん、自動化が可能になればいいのだが。

私自身は、自動最適化 指標を通じてTSの堅牢性の基準を開発しようと努力している。研究においてより客観性を高めるためには、非常に欠けている。

自動最適化のスキームは完全に考え抜かれており、その実装に技術的な障害はない。

Biblaは間違いなく機能性を補う必要がある。そこで、あなたの実現を提案してほしい。

 
enum eOptType   { eOptOff, eOptSlow, eOptGen, eOptAllSym };
enum eBars      { eBarsEvery, eBarsReal, eBarsOHLC, eBarsOpen, eBarsMath };
enum eCriteria  { eCritBal, eCritPF, eCritEPO, eCritDD, eCritRF, eCritSR, eCritCust };



class MTTESTER {
public:

        static bool 
        SetOptType(eOptType opt) {
                const bool rc = MTTESTER::IsReady();
                if (rc) {
                        static const int ControlID[] = { 0xE81E, 0x804E, 0x28EC, 0x28FB };
                        GET_HANDLE
                        user32::SendMessageW(Handle, WM_KEYDOWN, VK_HOME, 0);
                        for (int i = 0; i < opt; i++)
                                user32::SendMessageW(Handle, WM_KEYDOWN, VK_DOWN, 0);
                }
                return rc;
        }



        static bool 
        SetBars(eBars type) {
                const bool rc = MTTESTER::IsReady();
                if (rc) {
                        static const int ControlID[] = { 0xE81E, 0x804E, 0x28EC, 0x2913 };
                        GET_HANDLE
                        user32::SendMessageW(Handle, WM_KEYDOWN, VK_HOME, 0);
                        for (int i = 0; i < type; i++)
                                user32::SendMessageW(Handle, WM_KEYDOWN, VK_DOWN, 0);
                }
                return rc;
        }



        static bool 
        SetCriteria(eCriteria type) {
                const bool Res = MTTESTER::IsReady();
                if (Res) {
                        static const int ControlID[] = { 0xE81E, 0x804E, 0x28EC, 0x290B };
                        GET_HANDLE
                        user32::SendMessageW(Handle, WM_KEYDOWN, VK_HOME, 0);
                        for (int i = 0; i < type; i++)
                                user32::SendMessageW(Handle, WM_KEYDOWN, VK_DOWN, 0);
                }
                return Res;
        }



        static bool 
        SetCurrency(const string name) {
                const bool Res = MTTESTER::IsReady();
                if (Res) {
                        static const int ControlID[] = { 0xE81E, 0x804E, 0x28EC, 0x293F, 0x03E9 };
                        GET_HANDLE
                        user32::SendMessageW(Handle, WM_LBUTTONDOWN, 0, 0);
                        user32::SendMessageW(Handle, WM_KEYDOWN, VK_DELETE, 0);
                        char Chars[];
                        const int Size = ::StringToCharArray(name, Chars);
                        for (int i = 0; i < Size; i++)
                                user32::SendMessageW(Handle, WM_CHAR, Chars[i], 0);
                }
                return Res;
        }



        static bool 
        SetDepo(const long depo) {
                const bool Res = MTTESTER::IsReady();
                if (Res) {
                        static const int ControlID[] = { 0xE81E, 0x804E, 0x28EC, 0x28F9, 0x03E9 };
                        GET_HANDLE
                        user32::SendMessageW(Handle, WM_LBUTTONDOWN, 0, 0);
                        user32::SendMessageW(Handle, WM_KEYDOWN, VK_DELETE, 0);
                        string s = IntegerToString(depo);
                        char Chars[];
                        const int Size = ::StringToCharArray(s, Chars);
                        for (int i = 0; i < Size; i++)
                                user32::SendMessageW(Handle, WM_CHAR, Chars[i], 0);
                }
                return Res;
        }



        static bool 
        SetLeverage(const long leverage) {
                const bool Res = MTTESTER::IsReady();
                if (Res) {
                        static const int ControlID[] = { 0xE81E, 0x804E, 0x28EC, 0x28E9, 0x03E9 };
                        GET_HANDLE
                        user32::SendMessageW(Handle, WM_LBUTTONDOWN, 0, 0);
                        user32::SendMessageW(Handle, WM_KEYDOWN, VK_DELETE, 0);
                        string s = "1:" + IntegerToString(leverage);
                        char Chars[];
                        const int Size = ::StringToCharArray(s, Chars);
                        for (int i = 0; i < Size; i++)
                                user32::SendMessageW(Handle, WM_CHAR, Chars[i], 0);
                }
                return Res;
        }