エキスパート: Multik

 

Multik:

このエキスパートアドバイザーはCreating anエキスパートアドバイザー, which Trades on a Number of Instrumentsの記事で示されたアイディアに基づいています。

これはEURUSDとGBPUSDで取引されています。 MAが上向きの時に買い、MAが下向きの時に売ります。

作者: Andrew Kornishkin

 

すべてのペアを現在の測定器で正規化するのですか?

dsma2 = NormalizeDouble(SMA[2] - SMA[3], _Digits);      // サイト2-3のMA
dsma1 = NormalizeDouble(SMA[1] - SMA[2], _Digits);      // 第1-2サイトのMA
 
Valmars:

すべてのペアを現在の測定器で正規化するのですか?


そうです。それに、新しいバーを 定義する機能は、時間コピーの機能を使わなくても実装できます。
 
Valmars:

すべてのペアを現在の測定器で正規化するのですか?


また、警告が出ないようにするにはどうすればよいでしょうか?

オリジナル・バージョンではこのようになっています:

     int Digits_ = SymbolInfoInteger(Symbol_, SYMBOL_DIGITS) + 4;
     dsma2 = NormalizeDouble(SMA[2] - SMA[3], Digits_);      // サイト2-3のMA
     dsma1 = NormalizeDouble(SMA[1] - SMA[2], Digits_);      // 第1-2サイトのMA
削除済み  
AM2:

警告を出さない正しい実装方法は?

原文ではこうなっています:

4がどう関係するのか?論理的にはこうあるべきだ

int Digits_ = SymbolInfoInteger(Symbol_, SYMBOL_DIGITS);
dsma2 = NormalizeDouble(SMA[2] - SMA[3], Digits_); // サイト2-3のMA
dsma1 = NormalizeDouble(SMA[1] - SMA[2], Digits_); // 第1-2サイトのMA
 
Interesting:

それが+4と何の関係があるんだ?論理的であるべきだ。

警告もこうなっている:

型変換によるデータ損失の可能性 Multik.mq5 218 18

 
AM2:

警告もそういうものだ:

型変換によるデータ損失の可能性 Multik.mq5 218 18

警告を避けるには、次のように変換する必要がある。

int Digits_ = (int)SymbolInfoInteger(Symbol_, SYMBOL_DIGITS);
 

しかし、同じセットアップで複数のペアを取引する場合、マルチ・インストゥルメントの意味がなくなるのでは?ドローダウンが同時期に発生することが予想され、それが問題になるかもしれません。残念ながら、すべての通貨ペアは相関しているので、これは避けられないかもしれません。実際、私はEUR/USDGBP/USDのペアも 一緒にトレードしていますが、一方ではトレンドフォロワーを使い、もう一方ではリバーサル、トップス・アンド・ボトムズタイプのEAを使っています。

 
sergey1294:

警告を受けたくない場合は、このように変換する必要があります。

ありがとう!
 

request.volume = Money_M();

このEAは整理されたコードの素晴らしい例で、コメントも素晴らしいです。 しかし、Money_M()と呼ばれるロットサイズ関数に関して 1つ質問がありました。 この背後にある決定木は何で、どこにあるのでしょうか?

サポートサイトを検索してみましたが、参照は見つかりませんでしたし、関連クラスにリンクされているようにも見えませんでした。

削除済み  
bdwezensky:

request.volume = Money_M();

このEAは整理されたコードの素晴らしい例で、コメントも素晴らしいです。 しかし、Money_M()というロットサイズ関数に関して1つ質問があります。 この背後にある決定木は何ですか?

サポートサイトを検索してみましたが、参照は見つからず、関連するクラスにもリンクされていないようでした。

double Money_M()
  {
   double Lots=AccountInfoDouble(ACCOUNT_FREEMARGIN)/100000*10;
   Lots=MathMin(5,MathMax(0.1,Lots));
   if(Lots<0.1)
      Lots=NormalizeDouble(Lots,2);
   else
     {
      if(Lots<1) Lots=NormalizeDouble(Lots,1);
      else       Lots=NormalizeDouble(Lots,0);
     }
   return(Lots);
  }

この関数は、取引ロットのサイズを計算するために使用されます。

double Lots=AccountInfoDouble(ACCOUNT_FREEMARGIN)/100000*10;

この文字列では、計算された取引ロットのサイズが表示されます。計算はフリーマネー(ACCOUNT_FREEMARGIN)で行われます。リスク = 利用可能な自由資金の10%。

Lots=MathMin(5,MathMax(0.1,Lots));
この行では、取引ロットの正規化が実行されます。0.1 <= ロット <= 5.0