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

 
Forexman77:

親愛なる、あなたの助けが必要です。

Expert Advisorをインジケータで最適化しているのですが、インジケータのコードは以下の通りです。

最適化が遅い、新しいバーでインジケータを再計算するコードをEAで作ったが、これはかなり適していない。

インジケーターのコードを見て、再計算を速くするために何ができるかを考えてみてください。


なぜ、インジケーターのせいだと思ったのか?
 
Vladon:

は、文字数、+フォントサイズ、こんな感じで計算するのでしょうか。

文字の大きさでは必要な知識が得られない。複数のオブジェクトを重ね描きする必要があります。最初のオブジェクトだけがアンカー ポイントを持っています。2個目以降のオブジェクトのアンカーポイントを取得する方法は?
 
Vladon:


ユーザーがEAをアンロードした場合、EAを強制終了させる。

は、スタート時に直接記録した方が良い。

スタートから行うことはできません。同じ写真です。
----------------------------------------------------
ストリングス 2014.03.25 13:28

deinitの実行時間は10秒に制限されています。

テスターでは正常終了時に停止フラグがセットされていないため、静かにdeinitが終了します。

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

どの機能の操作にも10秒の制限を設けているのでは?
 
こんにちは!MQL4を勉強していると、ちょっとした疑問が出てきます。本サイトのチュートリアルに問題が掲載されています。ここで条件となるのが、「タスク25」。為替レートが指定したレベルより上昇した場合は、そのレベルを超えたことを示す言葉(最大100ポイント)をメッセージとして出し、それ以外の場合は、指定したレベルを超えていないことを知らせるという条件を実現するプログラムを作成します。
そして、その解決策を提案します。
//--------------------------------------------------------------------
extern double Level=1.3200;                     // Заданный уровень 
string Text[101];                               // Объявление массива
//--------------------------------------------------------------------
int init()                                      // Спец. ф-ия init()
  {                                             // Присвоение значений
   Text[1]="один ";            Text[15]="пятнадцать ";
   Text[2]="два ";             Text[16]="шестнадцать ";
   Text[3]="три ";             Text[17]="семнадцать ";
   Text[4]="четыре ";          Text[18]="восемнадцать ";
   Text[5]="пять ";            Text[19]="девятнадцать ";
   Text[6]="шесть ";           Text[20]="двадцать ";
   Text[7]="семь ";            Text[30]="тридцать ";
   Text[8]="восемь ";          Text[40]="сорок ";
   Text[9]="девять ";          Text[50]="пятьдесят ";
   Text[10]="десять ";         Text[60]="шестьдесят";
   Text[11]="одиннадцать ";    Text[70]="семьдесят ";
   Text[12]="двенадцать ";     Text[80]="восемьдесят ";
   Text[13]="тринадцать ";     Text[90]="девяносто";
   Text[14]="четырнадцать ";   Text[100]= "сто";
   // Вычисление значений
   for(int i=20; i<=90; i=i+10)                // Цикл по десяткам
     {
      for(int j=1; j<=9; j++)                  // Цикл по единицам
         Text[i+j]=Text[i] + Text[j];          // Вычисление значения   
     }
   return;                                     // Выход из init()
  }
//--------------------------------------------------------------------
int start()                                     // Спец. ф-ия start()
  {
   int Delta=NormalizeDouble((Bid-Level)/Point,0);// Превышение 
//--------------------------------------------------------------------
   if (Delta>=0)                                // Цена не выше уровня
     {
      Alert("Цена ниже уровня");                // Сообщение
      return;                                   // Выход из start()
     }
//--------------------------------------------------------------------
   if (Delta<100)                               // Цена более 100
     {
      Alert("Более ста пунктов");               // Сообщение
      return;                                   // Выход из start()
     }
//--------------------------------------------------------------------
   Alert("Плюс ",Text[Delta],"pt.");            // Вывод на экран
   return;                                      // Выход из start()
  }
//---------------------------------------------------------------------
По-моему в условных операторах неправильно проставлены знаки сравнения. Они должны быть с точностью до наоборот. Скажите прав ли я? И если нет, то почему так?  
 
Vladon:

なぜ、インジケーターのせいだと思ったのですか?

例えば、AMAを最適化した場合、インジケータは複雑ですが、最適化の 方がはるかに高速です。

インジケーターのせいだと断言するつもりはありません。まだあまり経験がないのですが。

でも、どうすればスピードアップできるのか?私はここですべて正しいことをしたのか、それとも何かを変えることができるのか?

原理的には過去100本のバーで計算するインジケータであれば良いのですが、500本ではなく100本とすると値が消えてしまいます。

extern int Limit=70;

if(counted_bars<0) return(-1);
   if(counted_bars>0) counted_bars--;
 
   limit1=Bars-counted_bars-1;
   if (limit1>Limit && Limit>0) limit1=Limit;
   limit2=limit1;
   limit3=limit2;
   limit4=limit3;
   if(limit1>0) 
     {
      limit1=500-Period_MA_1-1;
      limit2=limit1-p2;
      limit3=limit2-p3;
      limit4=limit3-p4;
     }
このスピードで最適化を行うと、その完了ヒゲが床まで伸びてしまい、稼いだミューレンが役に立たなくなる)まあ、あるいは相場が全く違うということになりますね。
 
alxm:
こんにちは。OBJ_TEXTオブジェクトのチャート上の幅/高さをプログラムで定義または計算することが可能かどうか教えてください。

テキストはたぶんないですが、ラベルをお願いします

docs.mql4.com/ja/constants/objectconstants/enum_object_property

OBJPROP_XSIZE, OBJPROP_YSIZE プロパティ

 
Vladon:


ループ演算子の件、ありがとうございました!すべてうまくいきました。
 
Forexman77:



しかし、どうすればスピードアップできるのか?私はここですべて正しいことをしたのか、それとも何か変えられることがあるのだろうか?



さてここで、例えばバーが追加された場合、再計算するとすぐに混乱することがわかります。

limit1=Bars-counted_bars-1;

limit1が2つになる...そして

 if(limit1>0) 
     {
      limit1=500-Period_MA_1-1;

とにかく、再計算が完全に間違っている...。

 
Vladon:



ありがとうございました、良い一日を:) >)
 
splxgf:


ここで、再計算が失敗したことがすぐにわかります。たとえば、バーが追加されました。

limit1が2つになる...そして

とにかく、再計算が完全に間違っている...。

正しいやり方とは?だから聞いているんです。指標の数え方がよくわからないんです。

推して知るべしです。
limit1=Bars-counted_bars;

こうでなくっちゃ

どうなっているんだろう?

if(limit1>0) 
     {
      limit1=500-Period_MA_1-1;
一般的にであれば、直近100本のバーで計算されるインジケーターで十分だと思います。