EA作成時に有線移動平均の問題が発生しました。
何が間違っているのでしょうか?
移動平均のコードの一部をスクリーンショットにしました。もう一つのスクリーンショットは、MAとMAインジケータの描画の違いをチャート(というか4種類全部)に投影しているところです。
水色は実はSmoothedの方で、テスターで生成されたMAには到底及びません。
生成されたMAに一番近いのはSimpleなのに、それにマッチしていない。
一体どうなっているのでしょうか?
また、どのような値が出たのでしょうか?どこにも表示されないのですが。
2つのウィンドウを比べてみてください。左側はStrategy Testerが生成したMAで、トレードの間に正確に入ります。右側にはすべてのタイプのMA370(SMA、EMA、SSMA、LWMA)がありますが、どれも左側の370にマッチしません。SSMAは水色のもので、バックテストで生成したMAの近くにあります。
現在の "ma "変数の値のデバッグ警告行を追加した別のスクリーンショットを添付します(ログに最後のMA値を表示し、右側にはチャート上でライトブルースムージング370MAの最後の値が "投げ "られます)。
チャート上のMAは終値を 参照し、コードのMAは始値を参照していることに気づきましたが、チャート上の移動平均を変更しても、視覚的に大きな変化はありませんでした。
別の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です。
問題はますます奇妙になってきています。2012年から上記のEAをテストすると、2013年からテストしたときとは若干異なるMAの結果(ジャーナルログで実際の値を見ることができます)が得られます。いずれもチャート上に表示される370SSMAに近いものではありません。
多分、EAをこのように動作させる私の初期化で何かですか?
スクリーンショットを含む。両方のスクリーンショットを比較すると、描かれた線が 異なるレベルであることに注意してください、それは同じEAです。
基本的な間違いのようだ:要素が時系列のようにインデックスされていない(逆順)。
これを修正するには、以下の関数を呼び出す 必要がある。
ArraySetAsSeries(ma_buffer,true);
これを追加すると、次のようになります。
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];
を追加すると、次のようになります。
しかし、私はこの配列の1フレームしか使っていません。また、なぜ警告が出るのでしょうか?
この行を追加しても何も変わりません (警告とバックテストの両方が、追加しても効果がないことを示しています)
1フレームだけコピーしているのであれば正しいですし、これが根本的な原因ではありません(あなたの ma_buffer[20] の宣言がこの事実に私の注意をそらしました)。
しかし、私はあなたがInit()に下の行を移動し、ハンドルをグローバルにすることを提案します、これは本当に問題の源だからです(これを行った後、もう一度テストしてください)。
ma_temp=iMA(Symbol(),PERIOD_D1,370,0,MODE_SMMA,PRICE_OPEN);
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つのペアだけであるかどうか、私はすぐにチェックして 返信するつもりです。

- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索
何が間違っているのでしょうか?
移動平均の コードの一部をスクリーンショットにしました。もう一つのスクリーンショットは、MAとMAインジケータをチャートに投影したときの違いを示しています(というか、4種類全部)。
水色は実はSmoothedの方で、テスターで生成されたMAには到底及びません。
生成されたMAに一番近いのはSimpleなのに、一致しない。
一体どうなっているのでしょうか?