EA作成時に有線移動平均の問題が発生しました。

 

何が間違っているのでしょうか?

移動平均の コードの一部をスクリーンショットにしました。もう一つのスクリーンショットは、MAとMAインジケータをチャートに投影したときの違いを示しています(というか、4種類全部)。

水色は実はSmoothedの方で、テスターで生成されたMAには到底及びません。
生成されたMAに一番近いのはSimpleなのに、一致しない。

一体どうなっているのでしょうか?

ファイル:
ma_problem1.png  154 kb
ma_problem2.png  80 kb
 
angreeee:

何が間違っているのでしょうか?

移動平均のコードの一部をスクリーンショットにしました。もう一つのスクリーンショットは、MAとMAインジケータの描画の違いをチャート(というか4種類全部)に投影しているところです。

水色は実はSmoothedの方で、テスターで生成されたMAには到底及びません。
生成されたMAに一番近いのはSimpleなのに、それにマッチしていない。

一体どうなっているのでしょうか?

また、どのような値を取得したのでしょうか?どこにも見当たりません。
 
angevoyageur:
また、どのような値が出たのでしょうか?どこにも表示されないのですが。

2つのウィンドウを比べてみてください。左側はStrategy Testerが生成したMAで、トレードの間に正確に入ります。右側にはすべてのタイプのMA370(SMA、EMA、SSMA、LWMA)がありますが、どれも左側の370にマッチしません。SSMAは水色のもので、バックテストで生成したMAの近くにあります。

現在の "ma "変数の値のデバッグ警告行を追加した別のスクリーンショットを添付します(ログに最後のMA値を表示し、右側にはチャート上でライトブルースムージング370MAの最後の値が "投げ "られます)。

チャート上のMAは終値を 参照し、コードのMAは始値を参照していることに気づきましたが、チャート上の移動平均を変更しても、視覚的に大きな変化はありませんでした。

ファイル:
ma_problem3.png  142 kb
 
それはEAが動作しないわけではありません。それはうまく動作しますが、私がそれをデバッグしていたとき、生成されたMAは、それがあるべきものとは全く異なっていることに気づきました。私は何か間違ったことをしていることを知っているが、それが何であるかはまだわからない。私は水色の平滑化されたeaの設定の別のスクリーンショットを添付します、従って完全な映像を持っています。
ファイル:
ma_problem4.png  66 kb
 
私が見つけた最も類似したMAはSmoothed MA 220で、スクリーンショットが添付されています。これは何の意味もありません、 :( しかし、多分それはある種の手掛かりです。)
ファイル:
ma_problem5.png  57 kb
 

別のEAに問題を分離しました。

#property copyright   "Grzegorz Korycki"
#property version     "1.0"
#property description "MA TEST"


#include <Trade/Trade.mqh>

   #define  MAGICMA  20131002

double Bid;
double Ask;

   
double OnTester()
{
    double custommax = TesterStatistics(STAT_EQUITY_DDREL_PERCENT);
    return (custommax);
}

CTrade  trade;
   
void OnTick()
{
   MqlTick last_tick;
   if(SymbolInfoTick(Symbol(),last_tick))
     {
      Bid = last_tick.bid;
      Ask = last_tick.ask;
     }
   start();
}
  
int OnInit()
{
   trade.SetExpertMagicNumber(MAGICMA);
   int deviation=99;
   trade.SetDeviationInPoints(deviation);
   trade.SetAsyncMode(false);
   return(0);
}  
  
      
      
      
void trend1()
{

   int ma_temp;
   double ma_buffer[20];

   double ma;
   ma_temp=iMA(Symbol(),PERIOD_D1,370,0,MODE_SMMA,PRICE_OPEN);
   CopyBuffer(ma_temp,0,0,1,ma_buffer);
   ma=ma_buffer[0];
   
   Alert("ma=", ma);

}

      


void start()
{
   trend1();
}

テストペアはGBP/NZDです。
ファイル:
ma_test.mq5  2 kb
 

問題はますます奇妙になってきています。2012年から上記のEAをテストすると、2013年からテストしたときとは若干異なるMAの結果(ジャーナルログで実際の値を見ることができます)が得られます。いずれもチャート上に表示される370SSMAに近いものではありません。

多分、EAをこのように動作させる私の初期化で何かですか?

スクリーンショットを含む。両方のスクリーンショットを比較すると、描かれた線が 異なるレベルであることに注意してください、それは同じEAです。

ファイル:
 

基本的な間違いのようだ:要素が時系列のようにインデックスされていない(逆順)。

これを修正するには、以下の関数を呼び出す 必要がある。

ArraySetAsSeries(ma_buffer,true);
 
figurelli:

基本的な間違いのようだ:要素が時系列のようにインデックスされていない(逆順)。

これを修正するには、この関数を呼び出す 必要があります。

これを追加すると、次のようになります。

cannot be used for static allocated array       ma_test.mq5     50      4

しかし、私はこの配列の1フレームしか使っていないのですが、これは問題でしょうか?また、なぜ警告が出るのですか?

この行を追加しても何も変わりません (警告とバックテストの両方が、追加しても効果がないことを示しています)

ドキュメントには、この行は定数でのみ使用するようにと書かれています。

[...]

const datetime &time[],

[...]

ArraySetAsSeries(time,true); 

私の ma_buffer は変数配列です。

 double ma_buffer[20];
 
angreeee:

を追加すると、次のようになります。

しかし、私はこの配列の1フレームしか使っていません。また、なぜ警告が出るのでしょうか?

この行を追加しても何も変わりません (警告とバックテストの両方が、追加しても効果がないことを示しています)

1フレームだけコピーしているのであれば正しいですし、これが根本的な原因ではありません(あなたの ma_buffer[20] の宣言がこの事実に私の注意をそらしました)。

しかし、私はあなたがInit()に下の行を移動し、ハンドルをグローバルにすることを提案します、これは本当に問題の源だからです(これを行った後、もう一度テストしてください)。

ma_temp=iMA(Symbol(),PERIOD_D1,370,0,MODE_SMMA,PRICE_OPEN);
 
figurelli:

1フレームだけコピーした場合は正しく、これは根本的な原因ではありません(あなたの ma_buffer[20] の宣言が、この事実に私の注意をそらせました)。

しかし、私はあなたがInit()に下の行を移動し、ハンドルをグローバルにすることをお勧めします、これは本当に問題の源だからです(これを行った後、もう一度テストしてください)。

私はあなたのガイドラインに従ってスクリプトを修正しましたが、問題はまだ残っています :(

今はこのような感じです。

#property copyright   "Grzegorz Korycki"
#property version     "1.0"
#property description "MA TEST"


#include <Trade/Trade.mqh>

   #define  MAGICMA  20131002

double Bid;
double Ask;

   int ma_temp;
   double ma_buffer[20];

   
double OnTester()
{
    double custommax = TesterStatistics(STAT_EQUITY_DDREL_PERCENT);
    return (custommax);
}

   CTrade  trade;
   

   void OnTick()
  {
   MqlTick last_tick;
   if(SymbolInfoTick(Symbol(),last_tick))
     {
      Bid = last_tick.bid;
      Ask = last_tick.ask;
     }
   start();
  }
  
int OnInit()
  {
   trade.SetExpertMagicNumber(MAGICMA);
   int deviation=99;
   trade.SetDeviationInPoints(deviation);
   trade.SetAsyncMode(false);
   ma_temp=iMA(Symbol(),PERIOD_D1,370,0,MODE_SMMA,PRICE_OPEN);


   return(0);
   }  
  
      
      
      
void trend1()
{

   double ma;
   CopyBuffer(ma_temp,0,0,1,ma_buffer);
   ma=ma_buffer[0];
   
   Alert("ma=", ma);
}

void start()
{
         trend1();

}

多分、誰かがそのようなMA値ジェネレータを作成する方法ドラフトEAを作成することができますし、私は両方を比較することができます - それをテストし、エラーを分離することができます。(誰かが数分の余裕がある場合)

これは非常に奇妙なので、問題が他のペアで同じであるか、それはこの1つのペアだけであるかどうか、私はすぐにチェックして 返信するつもりです。

理由: