ロボットコードの一部をインジケータに保持する意味があるのはどんな場合ですか? - ページ 33

 

ゼロの役に立つ談話...

そして、参加者のリソースとポテンシャルを知っている私は、挑発的にチックのスピードと「Unglottability」を測定することを提案します。

1) ソフニグ

2)1ミリ秒の周波数で動作するサイクリック・スクリプト

3) 誘導

4) サードパーティ製の DDE レシーバー。

私のような初心者のアデプトにも、きっと役に立つはずです。

;)

 

夜の終わりに。

ファイル:
experts.zip  1 kb
 

私なりに補足させていただきます。

インジケータコードをEA内に完全に配置したExpert Advisorのパフォーマンスは、カスタムインジケータを 呼び出したものに比べて約3倍高速になることが多いようです。これは、インジケータの計算が非常に重いバリアントでも同様です。これらの計算が非常に軽ければ、差はないでしょう。EMAは原始的な計算方法なので、このような計測には使えません。このサイトの最近の記事で、私はJMAの非常に重い指標計算を行うExpert Advisorのバリエーションを紹介したこともある。インジケータコールのないコードを使ったバリアントは、3倍速くなりました。

私自身は、誰かに何かを証明しようとは思っていません。ただ、自分の目で見て、一度も見たことのない結論を出しているだけです。もちろん、このようなことをずっとやっているわけではありませんし、MT4の最後のビルドがこの画像を何か違うものに見せている可能性もありますけどね。そして、最初はMT5でも全く同じでした。しかし、そんな細かいことを記録しているわけではないので、今も同じだと断言することはできません。

 

GODZILLA:

このサイトの最近の記事の中には、JMAの非常に重い指標計算を行うExpert Advisorの亜種を掲載したこともあります。インジケータコールのないコードを使ったバリアントは、3倍速く動作します。

ここで?結論は簡単で、3つの可能性があります。

1. インジケータを呼び出さないコードが間違って書かれている。

2.インジケーターの書き方が非効率的である。

3.表示されている数値は、実態を反映していません。

 
GODZILLA:

私なりに補足させていただきます。

インジケータコードをEA内に完全に配置したExpert Advisorのパフォーマンスは、カスタムインジケータを呼び出したものに比べて約3倍高速になることが多いようです。これは、インジケータの計算が非常に重いバリアントでも同様です。これらの計算が非常に軽ければ、差はないでしょう。EMAは原始的な計算方法なので、このような計測には使えません。このサイトの最近の記事で、私はJMAの非常に重い指標計算を行うExpert Advisorのバリエーションを紹介したこともある。インジケータコールを使用しないバリアントは3倍高速です。

私自身は、誰かに何かを証明しようとは思っていません。ただ、自分の目で見て、一度も見たことのない結論を出しているだけです。もちろん、このようなことをずっとやっているわけではありませんし、MT4の最後のビルドが、この絵を何か違うものに見せているかもしれません。そして、最初はMT5でも全く同じでした。しかし、そんな細かいことを記録しているわけではないので、今も同じだと断言することはできません。


バカにしないでください。まだインジケーターの書き方を覚えていないだけでしょう。

そんな異端児の後に

//---- ЭМУЛЯЦИЯ ИНДИКАТОРНЫХ БУФЕРОВ
  int NewSize = iBars(symbol, timeframe);
  //----  Проверка на смену нулевого бара
  if(ArraySize(Ind_Buffer0) < NewSize)
    {
      //---- Установить прямое направление индексирования в массиве 
      ArraySetAsSeries(Ind_Buffer0, false);
      ArraySetAsSeries(Ind_Buffer1, false);
      ArraySetAsSeries(Ind_Buffer2, false);
      //---- Изменить размер эмулируемых индикаторных буферов 
      ArrayResize(Ind_Buffer0, NewSize); 
      ArrayResize(Ind_Buffer1, NewSize); 
      ArrayResize(Ind_Buffer2, NewSize); 
      //---- Установить обратное направление индексирования в массиве 
      ArraySetAsSeries(Ind_Buffer0, true);
      ArraySetAsSeries(Ind_Buffer1, true);
      ArraySetAsSeries(Ind_Buffer2, true); 
    } 
//----

このスレッドで意見を言うのは完全に控えた方が良かったのでは?

 

誤謬の否定その1:IndicatorCounted()はなくても大丈夫。

それを使ったインジケーター。

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Red

extern double Alpha = 0.9;

double EMA[];

int init()
{
   SetIndexBuffer(0, EMA);
   return(0);
}

int start()
{
   int toCount = MathMin(Bars - 1, Bars - IndicatorCounted());
   if (toCount == Bars - 1) EMA[Bars - 1] = Open[Bars - 1];
   for(int i = toCount - 1; i >= 0; i--)
   {
      EMA[i] = (1 - Alpha)*Open[i] + Alpha*EMA[i + 1];
   }
   return(0);
}

それがなければ、hrenfxの 原理で

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Yellow

extern double Alpha = 0.9;

double EMABuffer[];

double GetPrice( int Shift )
{
  return(Open[Shift]);
}

double EMA;

int init()
{
   EMA = GetPrice(Bars - 1);

   SetIndexBuffer(0, EMABuffer);
   return(0);
}

double GetEMA()
{
   static int PrevTime = 0;

   if (PrevTime == Time[0])
      return(EMA);

   int i = iBarShift(Symbol(), Period(), PrevTime) - 1;

   PrevTime = Time[0];
   while (i >= 0)
   {
      EMA = EMA * Alpha + (1 - Alpha) * GetPrice(i);
      EMABuffer[i] = EMA;
      i--;
   }
   return(EMA);
}

void start()
{
  GetEMA();
}

そして、その指標をチャートに適用し、オートマトンの実行中に接続が切れることをエミュレートする。結果


 

ええ、私もこのテーマについて少し調べました。もちろん、プラットフォーム開発者のデタラメに手を出すのは本当にデタラメだが、ともかく。

私のEAをインジケータに変えてくれたんですね。私も24時間前に、Expert AdvisorのインジケータとシンプルなEAのインジケータが同じ結果を示すはずだと確信したのですが、どちらもティックでトリガされるからです。しかし、そのきっかけはさまざまです。接続出現後の最初のティックが、EAとEAから引き出されたインジケーターとで異なる。自 分で確認することができます。

上のスクリーンショットは、接続が切れた後のEA(EAのインジケーターではありません)とiCustomを比較したものです。通信の途絶は、そこそこ問題なく進みます。

 

接続が切れた後の最初のティックでは、インジケータはすぐにトリガされないと推測されます。より正確には、IndicatorCounted()関数が実行されるのを待ちます。ただし、この機能は(接続状況にもよりますが)最大で数秒程度実行されることがあります。すなわち、このようなスキームです。

  1. 接続失敗後の最初のティック。
  2. インジケーターがスタートしました。
  3. IndicatorCounted()がしばらく実行される(IndicatorCounted()がインディケータ本体に存在しなくても、インディケータ起動直後のようだ)。
  4. 結果を受け取った後、取引環境を更新する。
  5. そして、インディケータは、最初のティックではなく、IndicatorCounted()の結果の前の最後のティックで開始されたかのように、そのコードを実行し始めます。

追伸:ビルド226でのテストです。

 
オールインワンEAの絶対的な信頼性のために、EmptyインジケータとRefreshRates()を関数の一番最初に呼び出す必要があることがわかりました。これにより、ヒストリーのロード(ブレーク後)と、既にロードされたヒストリーに対応する最初のティックでのEAの実行が保証されます。
 
hrenfx:
オールインワンEAの絶対的な信頼性のために、EmptyインジケータとRefreshRates()を関数の一番最初に呼び出す必要があることがわかりました。これにより、ヒストリーの読み込み(ブレーク後)と、すでに読み込まれたヒストリーに対応する最初のティックでのEAの実行が保証されます。


また、この推測に関する調査やチェックを掲載していただけますか?

ふむふむ もしそうで、読み込みの保証をしてくれるのであれば、非常に良い選択肢だと思います。

ForexToolsのスレッドで、ターミナルとExpert Advisorを起動した瞬間に履歴が入れ替わるという問題の解決策がないのを見たのですが、どうしたらいいでしょうか?