コーディングの方法は? - ページ 306

 

こんにちは。

私は関数で 本当にどこにも行かなかった、私はそれらを無駄に数え切れないほどチェックしたので、私のコードの各段階でたくさんのPrint()メッセージを書くことに決めました、それがクローンアウトする前にどこまで到達するかを見るために。実際、GetLots関数のようにはいかず、私の売買条件をチェックするときに失敗します。奇妙なことに、私はコードのこの部分を変更していませんが、何かが間違っています - しかし、少なくとも私は今どこに焦点を当てるべきかを知っている

 

皆さん、こんにちは。

本日早朝に私のコードをテストし、比較的うまくいきました。コードやバックテストの 基準(日付など)を変更せずに、1時間後にバックテストを行ったところ、結果が全く違っていました。なぜこのようなことが起こったのでしょうか?例えば、MT4の接続性?

 

...

バックテストを実行する際に、ジャーナルタブを開いて、そこにエラーが書き込まれているかどうかを確認してください。注文の実行 時のエラーは、不安定な結果を引き起こす原因の一つである可能性があります。また、買いと売りの基準が「ソリッド」であるかどうかもチェックしてください:つまり、それらは同じポイントから出発するのです。

crsnape@btinternet.com:
こんにちは、今日早速自分のコードをテストしてみましたが、比較的うまくいきました。しかし、1時間後にバックテストを行ったところ、結果が全く違っていました。なぜこのようなことが起こったのでしょうか?例えば、MT4の接続性?
 

日記にエラーは出ない。最初のエントリはこれです。

2012.07.22 15:35:37 H4 Period EA EURUSD,H4: 正常にロードされました。

続いて、これらの膨大なリストがあります。

2012.07.22 15:47:07 TestGenerator: unmatched data error (volume limit 56304 at 2012.07.19 12:00 exceeded)

となって、最後に

2012.07. 22 15:47:07 H4期間EA入力。MagicNumber=42; RiskRewardRatio=3; D1SlowMAPeriod=200; D1FastMAPeriod=50; FastMACDPeriod=12; SlowMACDPeriod=26; SignalPeriod=9; DNCPeriod=120; SL_Period=10.である。

しかし、その後、何もありません。

私のテストは04.01.2012 - 21.07.2012に行われました。

 

...

では、エントリー条件に問題があります(あなたのEAは注文を開こうとしなかった)。

crsnape@btinternet.com:
ジャーナルには何のエラーも出ません。最初のエントリーはこれです。

2012.07.22 15:35:37 H4 Period EA EURUSD,H4: ロードに成功しました。

続いて、膨大なリストが表示されます。

2012.07. 22 15:47:07 TestGenerator: unmatched data error (volume limit 56304 at 2012.07.19 12:00 exceeded)

となって、最後に

2012.07. 22 15:47:07 H4期間EA入力。MagicNumber=42; RiskRewardRatio=3; D1SlowMAPeriod=200; D1FastMAPeriod=50; FastMACDPeriod=12; SlowMACDPeriod=26; SignalPeriod=9; DNCPeriod=120; SL_Period=10.である。

しかし、その後、何もありません。

私の検査は2012年1月4日から2012年7月21日まで行われました。
 

そうです、以前はポジションを入力していたので、不思議です。私のコードには最初から最後までprint()が書かれていますが、ジャーナルには何も書き込まれず、私のコードの一番最初の部分さえも記録されないのです。現在のバーで前のポジションがすでにオープンされているかどうかをチェック するためのこれさえもありません。

if ((GlobalVariableGet (barsGV) == 0)|| (GlobalVariableGet (barsGV) < Bars))

{

GlobalVariableSet(HasOrderedGV,false);

GlobalVariableSet(barsGV,Bars);

//--- ロングポジション(買い)の可能性をチェック

if (GlobalVariableGet (HasOrderedGV) == false)

{

Print("TEST")。

if (...エントリー条件...)

 

...

もしあなたのEAが注文を出そうとしたら、ジャーナルに書かれるはずです(エラーかどうかは問題ではありません。)

しかし、何も書かれていないということは、あなたのEAが実際に注文を出そうとする段階に至らなかったということであり、EAで満たさなければならない一連の条件が、実際に注文を出す段階に至らなかった場合にのみ起こり得ることです。だから、条件を明確にする必要があるのです。一番簡単な条件から試してみて、それが実行されることを確認し、条件を追加していく。そうすることで、注文を出すことができないステップを特定することができるようになります。

crsnape@btinternet.com:
そうなんです、以前はポジションをエントリーしていたので不思議なんです。私のコードには最初から最後までいくつかのprint()が書かれていますが、私のコードの一番最初の記録でさえ、ジャーナルには全く何も書き込まれません。前のポジションが現在のバーで既にオープンされているかどうかをチェックするこのコードでさえも。

if ((GlobalVariableGet (barsGV) == 0)|| (GlobalVariableGet (barsGV) < Bars))

{

GlobalVariableSet(HasOrderedGV,false);

GlobalVariableSet(barsGV,Bars);

//--- ロングポジション(買い)の可能性をチェック

if (GlobalVariableGet (HasOrderedGV) == false)

{

Print("TEST")。

if (...入力条件...)
 

特に赤い線は、私のジャーナルがこの時点で印刷を停止しているので、この時点で失敗しているのだと思います。

//--- グローバル変数

文字列 HasOrderedGV = "has_ordered_GV";

文字列 barsGV = "bars_GV";

//--- H4タイムブロックに注文済みかどうか判断する

if ((GlobalVariableGet (barsGV) == 0)|| (GlobalVariableGet (barsGV) < Bars))

{

GlobalVariableSet(HasOrderedGV,false);

GlobalVariableSet(barsGV,Bars);

}

Print("現在のバーに対して既に注文が入っているかどうかを判断する", HasOrderedGV);

//--- ロングポジション(買い)の可能性を確認 する

if (GlobalVariableGet (HasOrderedGV) == false)

{

私はオンラインでこのコードのビットを見つけ、私の中でそれを使用しました。しかし、ちょうど今、それが動作するかどうか疑問に思っています。グローバル変数barsGVは文字列として宣言されていますが、最初の行でそれを0に参照しています。これは正しいのでしょうか?

 

...

このコードは、最初に実行したときは問題なく動作します。

0は次の理由でテストされます。

double GlobalVariableGet([/TD] [TD]string name)

"既存のグローバル変数の値を返すか、エラーが発生した場合は0を返す"

グローバル変数の値を 取得するときのエラーは、そのグローバル変数がまだ作成されていないときでしょう。しかし、最初に実行したときは、このコードは問題ありません。問題は以下の通りです:テストを実行し、テストの終了時にbarsGVが5000に設定されたとします。ここでEAを再度実行すると、バーは常にbarsGV値(5000のまま)より小さくなっています。これ(コード)は別の書き方をしなければなりません。次のようなものを使ってください。

GlobalVariableSet(barsGV,0)。

のようにすれば、連続したテストでもうまくいくはずです。しかし、これは、EAを起動するときに、現在のバーでオープンした注文がなかったことを人為的に「装う」ことになり、エラーとなる可能性があります。グローバル変数を使ってその目的のために注文をカウントするよりも、現在のバーでオープンした注文をカウントする関数を使う方がずっとよいでしょう(複数の理由から)。

________________________________________________

PS: グローバル変数を使用すると、EAの複数のインスタンスを使用することができなくなります(各グローバル変数は他のコードから見えます。EA,スクリプト,インジケータ...どのコードからも見えるので、名前がユニークでない場合、同じグローバル変数を同時に読み、設定するEAが混在する危険性がある)

crsnape@btinternet.com:
私は、ifコマンドの後にさらにいくつかのPrint()を置きましたが、私はこの時点で失敗していると思います、特に私のジャーナルがこのポイントの後に印刷を停止するので赤い線。

//--- グローバル変数

文字列 HasOrderedGV = "has_ordered_GV";

文字列 barsGV = "bars_GV";

//--- H4タイムブロックに注文済みかどうか判断する

if ((GlobalVariableGet (barsGV) == 0)|| (GlobalVariableGet (barsGV) < Bars))

{

GlobalVariableSet(HasOrderedGV,false);

GlobalVariableSet(barsGV,Bars);

}

Print("現在のバーに対して既に注文が入っているかどうかを判断する", HasOrderedGV);

//--- ロングポジション(買い)の可能性を確認する

if (GlobalVariableGet (HasOrderedGV) == false)

{

ネットでこのコードを見つけ、自分のものにしました。しかし、それがうまくいくかどうか今考えています。グローバル変数barsGVは文字列として宣言されていますが、最初の行でそれを0に参照しています。これは正しいのでしょうか?
 

あ~、なるほどね。Global Variablesはメモリに値を保存しますから。つまり、バックテストが 終了して5000になったら、バックテストを再実行してもメモリに保存されるので、BarsGVが5000以下にならないからと言って、falseを返すことはないのですね。いやはや、奥が深いです。

また、エラーが発生した場合、HasOrderedGVをfalseに設定し、残りのコードを続行できるようにするのですか?

私はあなたを正しく理解しましたか?

ところで、これは許されるのでしょうか?

GlobalVariableSet(HasOrderedGV, false)です。

なぜなら、MQL4 Bookにはこう書いてあるからです。

datetime GlobalVariableSet([/TD] [TD]文字列 名,double 値)

私のインスタンスの2番目の値は、doubleではなくboolですか?