[ARCHIVE]フォーラムを乱立させないために、どんなルーキーの質問でも。プロフェッショナルの皆さん、通り過ぎないでください。あなたなしではどこにも行けない - 5. - ページ 366

 
lottamer:


ダニがいない

おそらく、EA内部で正規化されていないことが、この効果を生んでいるのでしょう。

しかし、入力パラメータ タブが表示されても、最適化そのものが行われない。

テスターは、何かを行うには、下部にある現在のオーバーシュートの数(7/62)を見ることができますが、タブの最適化結果 で完了すると、最適化グラフは Emptyです!(1).

チェックマークはもちろん

どっちを向いたらいいのかもわからない...。


テスターでは、テストすると知らず知らずのうちにスプレッドが変化してしまうため、変化のないデータで再現性のある結果を得ることはできない。

キュア: https://www.mql5.com/ru/forum/119830

 
Chiripaha:

空の値は、特定のパラメータを最適化した結果が不採算であること、つまりドレインであることを示す場合があります。Visualisationでパラメータの一つを実行してみると、このような結果になるかもしれません。

正規化については、値が同じなので、数学的な数字もまったく同じになり、変化はありませんから、その影響もないと思います。

どっちで考えるか」については、考えないほうがいい場合もあるし、質問を先送りにしたほうがいい場合もある--考えや思いは後からついてくるものだ。脳には、無理なく操作し、休息し、考えるためのスペースを与えなければなりません。


1.顧問先が儲かっている。

2.手で確認したところ、パラメータの全範囲で利益が出ています。 ただ、もう少し範囲を広げて、ステップを小さくしたかったのです。

 
tara:


テスターは、テスト中に知らず知らずのうちにスプレッドが変化するため、変化のないデータで再現性のある結果を提供することはできない。

治療法: https://www.mql5.com/ru/forum/119830



スプレッドが浮いていますね。

もうひとつは、歴史に定着しなければならないこと...。

一般に、結果は少し浮き、トレード数は変わらないので、この問題はあまり怖くはないのですが......。

あとは、オプティマイザーが全然効かない! これは困る...。

これはテスターがログに書いていることです..:



2013.05.29 12:20:10 最適化中に8つのパスが実行されましたが、8つの結果は重要でないとして破棄されました。

 
tara:


テスターは、テスト中にスプレッドが無意識に変化するため、変化のないデータで再現性のある結果を提供することはできない。

治療法: https://www.mql5.com/ru/forum/119830

可能かもしれませんが、私のスプレッドサイズはInfo-に入れ、変更すると表示されるようになっています。テスターでは、スプレッドの浮きは気になりませんでした。当座預金のMarketInfoから標準的なパラメータデータを取得し、それ以上変更しないようにします。

このキュアでは、スプレッドp-rを変更することで、スプレッドの違いによる最適化結果の違いを確認することができます。私の理解では、リンク先のソフトウェアが必要とされる目的はこれだけです。

 
lottamer:


2013.05.29 12:20:10 最適化中に8つのパスが実行されましたが、8つの結果は重要でないとして破棄されました。

その通り、この結果は重要でないとして破棄されました。- そのため、結果にもグラフにも表示されないのです。
 
Chiripaha:
まあ、その通りなのですが、これらの結果は重要でないと判断されました。- そのため、結果やグラフに表示されないのです。 。



私はここに深い問題があると思います。

昨日の最初の質問は、ユーザー関数内のパラメータを最適化 する方法でした。

言われたのは、「extern doubleに 移動させる。

やりましたよ。

と表示され、オプティマイザがその結果を投げ出してしまいました......移動が間違っていたようです。

これがそのコードです。 これは、stop and takeの共通修飾語です。

STOPとTAKEの代わりに、以前は100と200の数字がありました。

STOPとTAKEに数字を変えてみた

を追加し、コードの冒頭には

extern double STOP = 100;
extern double TAKE = 200;

どこかでエラーになっているのでしょうか?

(モディファイア自体は100%動作します)

int My_modify()
 {
   bool   result;
   double take_profit,stop_loss,point;
   int    cmd,total,error;
//----
   total=OrdersTotal();
   point=MarketInfo(Symbol(),MODE_POINT);
//----
//   for(int i=0; i<total; i++)
//     {
      if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES))
        {
         //---- print selected order
         OrderPrint();
         cmd=OrderType();
         //---- buy or sell orders are considered
         if(cmd==OP_BUY || cmd==OP_SELL)
           {
            //---- modify first market order
            while(true)
              {
               if(cmd==OP_BUY) stop_loss=OrderOpenPrice()-STOP*point;
               else            stop_loss=OrderOpenPrice()+STOP*point;
               
                if(cmd==OP_BUY) take_profit=OrderOpenPrice()+TAKE*point;
                           else take_profit=OrderOpenPrice()-TAKE*point;
               
               
               result=OrderModify(OrderTicket(),0,stop_loss, take_profit,0,CLR_NONE);
               if(result!=TRUE) { error=GetLastError(); Print("LastError = ",error); }
               else error=0;
               if(error==135) RefreshRates();
               else break;
              }
             //---- print modified order (it still selected after modify)
             OrderPrint();
//            break;
           }
        }
      else { Print( "Error when order select ", GetLastError()); }
//     }
//----
   return(0);
  }
 

とりあえずコードを見ているのですが、途中で少しコメントを許します。

このセリフはまったく意味がない。

point=MarketInfo(Symbol(),MODE_POINT);  /* поскольку это ровным счетом то же самое, что штатный параметр */ Point 

多通貨戦略の場合のみ必要となりますが、その場合、多通貨戦略の代わりに

Symbol()

他の定義済みの値を使用する必要がありますが、この通常の機能ではありません。

この変数も不要です。

total=OrdersTotal();

なぜなら、あなたの関数内部では、それは一度だけ、列挙の中で適用され、なぜかコメントアウトされており、コードをごちゃごちゃにするだけだからです。- そこで質問ですが、なぜ順番に列挙することをコメントアウトしたのでしょうか?

これです。

if(cmd==OP_BUY) stop_loss=OrderOpenPrice()-STOP*point;
else            stop_loss=OrderOpenPrice()+STOP*point;
               
if(cmd==OP_BUY) take_profit=OrderOpenPrice()+TAKE*point;
           else take_profit=OrderOpenPrice()-TAKE*point;

一般的に一緒にした方が良い - 状態は同じです。ところで、構造によって書き分けをしていますね。- 構造の喪失の問題にある。文体が均一でなければならない。そうすれば、構造が見えてきて、起こりうる間違いが、雪の後の凸凹のように出てきてしまう。

if(cmd==OP_BUY){ stop_loss   = OrderOpenPrice()-STOP*point;
                 take_profit = OrderOpenPrice()+TAKE*point; }

else           { stop_loss   = OrderOpenPrice()+STOP*point;
                 take_profit = OrderOpenPrice()-TAKE*point; }

ご提示いただいた内容からは、結果に影響を与えるような原理的なポイントは見つかりませんでした。でも...あなたはここで1つの関数しか提示していません(コメントされた列挙を除いては、むしろぞんざいに書かれています - これは質問に反映されています)。評定を言うならば、関数が必要なのではなく、プログラムコードが必要なのです。なぜなら、どこに、どのような原因があるのかがわからず、それを探さなければならないからです。そのためには、テスターでプログラムを実行し、発生しうるエラーを自分の目で確認する必要があります。そして、すでにコードを実行し(または逆順に)、原因を探します。

一般的な感覚として言えるのは、オレグ君はかなりのずぼらさ(無関心さ、と言ってもいい)を持っているということです。1につながる可能性があります。使用中のシステムのポイ捨てに。2.このポイ捨てによる構造物の損失と、虫の特定・発見が困難なこと。そこで、私からのアドバイスはこうです。- 可能であれば、コードからすべての「ゴミ」(余分なもの)を捨ててください - エラーは見つけやすくなります。- これは、助けを求める人の多くが陥る典型的なミス、つまり不注意です。

 
lottamer:


もっと深いところにあるのでしょう。

昨日の最初の質問は、カスタム関数内のパラメータを最適化する方法でした。

私は、「extern doubleに 入れなさい」と言われました。

やりましたよ。

そして今、オプティマイザーがその結果を投げている......どうやら、何かの間違いで取り出してしまったようだ。

いや、間違っていると思う。テスターが結果を投げるのは、こちらが出したパラメータが原因ではなく、結果が有意基準を通らないからです。

しかし、プログラム自体にエラーが含まれている可能性もあります。しかも、不安定な結果は、それを間接的に示すものです。- 何かが間違っているということです。私の実務では、そのようなプログラムは実戦に出せないようにしています。何かが間違っているということは、コントロールできない状況であるということですから。そして、何でも出てくるのです。

Stop-LossとTake-Profitのパラメータは、定義上、どのプログラムでも外部変数にあり、最適化する必要があるからというだけではありません。変更するたびにコードに入り込むのはちょっと。だから、外部変数も内部変数も関係ないんです。- それは確かです。

 
Chiripaha:

とりあえずコードを見ているのですが、途中で少しコメントを許します。

このセリフはまったく意味がない。

多通貨戦略の場合のみ必要となりますが、その場合は、代わりに

他の定義済みの値を代用する必要がありますが、この基本的な機能ではありません。

この変数も不要です。

列挙の関数内部で一度だけ使われるのですが、なぜかコメントアウトされており、コードがごちゃごちゃになるだけです。- そこで質問ですが、なぜ命令による列挙をコメントアウトしたのですか?

これです。

一般的には、グループ化した方が良いのですが、条件は同じです。

まあ、書いてある内容からは、結果に影響を与えるような原理的なポイントは見つかりませんでしたが。しかし!...あなたはここで1つの関数しか提示していません(コメントアウトされたオーバーランを除いては、むしろぞんざいに書かれています-これは質問に反映されています)。評定を言うならば、関数が必要なのではなく、プログラムコードが必要なのです。なぜなら、どこに、どのような原因があるのかがわからず、それを探さなければならないからです。そのためには、テスターでプログラムを実行し、発生しうるエラーを自分の目で確認する必要があります。そして、すでにコードを実行し(または逆順に)、この原因を探します。

一般的な感覚として言えるのは、オレグ君はかなり油断(無関心と言ってもいい)しているということです。1につながる可能性があります。使用中のシステムのポイ捨てに。2.このポイ捨てによる構造物の損失と、虫の特定・発見が困難なこと。そこで、私からのアドバイスはこうです。- 可能であれば、コードから「ゴミ」(不要なもの)をすべて捨てると、エラーが見つかりやすくなります。- これは、助けを求める人の多くが陥る典型的なミス、つまり不注意です。


このモディファイアは私が書いたのではありません。

図書館から用意しました。

100%使えるというのが最大のポイントです。

しかし、なぜ中のパラメータが最適化されないのか、それが問題なのです......。

基本的な間違いはありません!

残りのコードは動作します。

アルゴリズムに任意の条件を付ける。

- 買う

-モディファイ

- 了い

---------------------------

そして、私の注文変更器の中でパラメータを最適化しようとする - すなわち、停止とテイク

 
Chiripaha:

いや、間違っていると思います。テスターが投げ出されるのは、入れたパラメータが原因ではなく、結果が有意基準をクリアしていないからです。

しかし、ソフトウェア自体にエラーが含まれている可能性もあります。しかも、不安定な結果は、それを間接的に示すものです。- 何かが間違っているということです。私の実務では、そのようなプログラムは実戦に出せないようにしています。何かが間違っているということは、コントロールできない状況であるということですから。そして、何でも出てくるのです。

Stop-LossとTake-Profitのパラメータは、定義上、どのプログラムでも外部変数にあり、最適化する必要があるからというだけではありません。いちいちコードに手を入れて変更するのも面倒だし。だから、外部変数も内部変数も関係ないんです。- それは確かです。

まあ、見てください。

今、すべてを元に戻すと、つまり、外部のSTOPとTAKEパラメータを削除し、それらの代わりに関数内に数字を書き込むと、EAは10週間毎週実行され、明確な結果を示しているのです。

停止と離陸のパラメータを手動で変更すると、すべてが動作し、わずかに異なる結果が得られます(もちろんです)。

しかし、なぜ、これらのパラメータをモディファイアの外側に移動させると、オプティマイザーはそれらのパラメータを重要でないとみなすのでしょうか?