エラー、バグ、質問 - ページ 479

 
その後、servicedeskに書き込み、コードを同封してください。
 
sergeev:

その後、サービスデスクに書き込み、コードを添付してください。

はい、エキスパートコードを添付してサービスデスクに連絡するのがよいでしょう。

テスト後はすべて消去するので、コードの心配は無用です。私たちの主な、そして唯一の仕事は、エラーを見つけること です。

 

もうひとつ質問です。CopyTime関数を 使用しています。コール

CopyTime("EURUSD", PERIOD_MN1, D'2011.06.30', D'2011.08.01', Array)

は、なぜか値D'2011.08.01'を持つ1つの要素のみを返します。D'2011.07.01'はどこにあるんだ?そのコツとは?

追伸:Array[]は動的配列です。

 
marketeer:

もうひとつ質問です。CopyTime関数を 使用しています。コール

は、なぜか値D'2011.08.01'を持つ1つの要素のみを返します。D'2011.07.01'はどこにあるんだ?キャッチは?

追伸:配列Array[]は動的です。

はい、何らかの理由で最初の要素がスキップされます、servicedeskに書き込みます。

datetime Array[];
   CopyTime("EURUSD", PERIOD_MN1, D'2011.06.01', D'2011.08.01', Array); 
   for(int i=0;i<ArraySize(Array);i++)
     {
      Print(i," ",Array[i]);
     }

1 2011.08.01 00:00:00

0 2011.07.01 00:00:00

 
marketeer:

もうひとつ質問です。CopyTime関数を 使用しています。

同様のアプリケーションはすでにあります。

把握すること。

 

ここにも謎がある。バグが捕まらない......私のなのか端末のなのかわからない。

Expert Advisor が出した注文の数をカウントする些細なコードがあります。カウンターは、グローバル変数に格納されます。こんな感じです。

int Count;

int OnInit()
{
  Count = (int)GlobalVariableGet("Count");
  return(0);
}

void OnTick()
{
  // bla-bla-bla
  if(успешно отправлен ордер)
  {
    Count++;
    if(!MQL5InfoInteger(MQL5_TESTING))
    {
      if(GlobalVariableSet("Count", Count) == 0)
      {
        Print("GlobalVariableSet error ", GetLastError());
      }
    }
  }
}

このCountは、注文コメントで使用されます。その結果、次の注文数がすでにあるポジション数より(何個か)少なくなっていることに時々気づきます。ログにエラーはありません。

何か心当たりはありますか?例えば、グローバル 変数の最後の値が、ある条件下で終了するときにターミナルに保存されないために、同じような「消失」に遭遇した人がいるかもしれません(まあ、接続が失われた場合かもしれませんが - 1つのバージョンです)?

Документация по MQL5: Глобальные переменные терминала / GlobalVariableGet
Документация по MQL5: Глобальные переменные терминала / GlobalVariableGet
  • www.mql5.com
Глобальные переменные терминала / GlobalVariableGet - Документация по MQL5
 
marketeer:

ここで、もうひとつのパズルを紹介します。バグが捕まらない......私のなのか端末のなのかわからない。

こんな感じにしてみてください。グローバルではあまりやっていないですね。でも、ちゃんとカウントされるんですよ。

    int Amount_Orders = 0;

    for(count = 0; count < OrdersTotal(); count++)
       {  
        if(OrderSelect(OrderGetTicket(count))) 
          {
           int tp_ord = (ENUM_ORDER_TYPE)OrderGetInteger(ORDER_TYPE);  
           if(tp_ord == ORDER_TYPE_BUY_STOP  || tp_ord == ORDER_TYPE_SELL_STOP ||
              tp_ord == ORDER_TYPE_BUY_LIMIT || tp_ord == ORDER_TYPE_SELL_LIMIT)
           Amount_Orders++;  
          }
       }
 
tol64:

こんな感じにしてみてください。グローバルではあまりやっていないですね。でも、ちゃんとカウントされるんですよ。

私が抱えている問題は、グローバル変数に 書き込まれた値が失われること、つまり、(毎月のタイムアウトによる削除のように)完全にではなく、古いものが残ってしまうことです。もちろん、注文を再計算することもできますが、私のやり方でもうまくいくはずです。
 
papaklass:

開発者の皆様へ。

注文が有効期限 内に終了した場合、OnTrade では一切追跡されないということでしょうか?

追記:トレードイベントOnTradeのハンドラの目的が全く不明です。 ストップロスやテイクが捕まらない場合、保留中の注文がその有効期限までに閉じられた場合、捕まらないことになります。アルゴリズム実行中にすべてをダブルチェックする必要があるのです。この方法では、トレードイベントハンドラーに依存しながらも、それをダブルチェックしなければならないため、混乱が生じます。さらに、ダブルチェックの後、OnTrade()で処理されないイベントをキャッチします。 なぜ、それが必要なのでしょうか?しかし、今はテトリスで遊んだり、チャートにいろいろな無意味な絵を描いたりすることができます。開発者の皆さん、プラットフォームの取引部分を論理的に解決してください。

保留中の注文については、まだ一緒に仕事をしていないので、何とも言えません。

例えば、このような行をログに出力するのは、OnTrade ハンドラです。

2011.08.08 09:03:05 ChTestExp (EURUSD,H1) EURAUDによるロングポジションをストップロスで決済する。
2011.08.08:09:03:05 ChTestExp (EURUSD,H1) -----------------Deal #5263582 [sl 1.37819]です。
2011.08.08 09:03:05 ChTestExp (EURUSD,H1) oldDealsTotal=558 newDealsTotal=559
 
papaklass:

OnTrade()関数にPrint(__FUNCTION__)関数を設置する。そして、それをログに残すと

ストップロス発動 0.10 AUDUSD 0.89783 sl: 0.89544 tp: 0.90024 [#15 0.10 AUDUSD を 0.89544 で売る]。
取引 #7 売り 0.10 AUDUSD at 0.89544 完了 (注文 #15 に基づく)
取引成立 [#7 売り 0.10 AUDUSD at 0.89544].
注文実行 0.10 at 0.89544 [#15 sell 0.10 AUDUSD at 0.89544].

OnTrade()が動作したかどうか確認してくれますか?

すべての取引、その取引量、利益が計算され、それがすべて合計され、各シンボルごとにOnDeiniteに表示されるため、私はあなたが挿入しなくてもすべてが機能します。すべての合計パラメータ(取引数、利益)がテスターのレポートと正確に一致しているので、OnTrade()を疑う理由はない。

OnTrade()で処理されないのは、テスト終了時のポジションクローズ('end of test'コメント付き)とテスターでのストップアウトによるクローズ('so ...'コメント)の取引だけで、テストモードでは、OnDeinitで追加処理しなければならない。テスターログからの抜粋です。

2011.08.09 00:06:43 Core 1 log file "E:\Program FilesMetaTrader 5 ╱TesterAgent-127.0.1-3000╱logs╱20110809.log" written
2011.08.09 00:06:43 Core 1 EURUSD,H1: 13962 ms以内に888296ティック(275バー)が発生(履歴の総バー数6479、総時間16177ms)。
2011.08.09 00:06:43 Core 1 テスト間隔の8%でストップアウトが発生しました。
2011.08.09 00:06:43 Core 1 2011.01.18 10:11:00 Deinit end
2011.08.09 00:06:43 Core 1 2011.01.18 10:11:00 All Profit = -9072.04
2011.08.09 00:06:43 Core 1 2011.01.18 10:11:00 総取引数:17
.....
2011.08.09 00:06:43 Core 1 2011.01.18 10:11:00 --------------------------------------------------------------- (注)1.
2011.08.09 00:06:43 Core 1 2011.01.18 10:11:00 総利益 EURGBP = -4738.97
2011.08.09 00:06:43 Core 1 2011.01.18 10:11:00 今週の利益 EURGBP = 319.68
2011.08.09 00:06:43 Core 1 2011.01.18 10:11:00 GBPUSDの総利益 = -3775.86
2011.08.09 00:06:43 コア1 2011.01.18 10:11:00 今週の利益 GBPUSD = -1798.83
2011.08.09 00:06:43 Core 1 2011.01.18 10:11:00 総利益 EURUSD = -557.21
2011.08.09 00:06:43 Core 1 2011.01.18 10:11:00 今週の利益 EURUSD = 65.85
2011.08.09 00:06:43 Core 1 2011.01.18 10:11:00 Balance=927.96 Equite=927.96 Profit=0.00 MarginLevel=0.00。
2011.08.09 00:06:43 Core 1 2011.01.18 10:11:00 ---------------- Report-----------------------
2011.08.09 00:06:43 Core 1 2011.01.18 10:11:00 Balance=10000.00 Equite=927.96 Profit=0.00 MarginLevel=0.00。
2011.08.09 00:06:43 2011.01.18 10:11:00 Core 1 オープニングエラー:1 クロージングエラー:0 修正エラー:0 リクエスト:1
2011.08.09 00:06:43 Core 1 2011.01.18 10:11:00 実行時間: 0 分。14秒
2011.08.09 00:06:43 Core 1 2011.01.18 10:11:00 ChTestExp Expert AdvisorがEURUSDチャート、H1期間での作業を終了しました。
2011.08.09 00:06:43 Core 1 2011.01.18 10:11:00 Deinit Execution
2011.08.09 00:06:43 Core 1 2011.01.18 10:11:00 OnDeinit_UninitReason = 別の理由
2011.08.09 00:06:43 Core 1 OnTesterの結果 0
2011.08.09 00:06:43 Core 1 2011.01.18 10:11:00 order buy 1.65 at 1.59804 [#69 buy 1.65 GBPUSD at 1.59804 ]です。
2011.08.09 00:06:43 Core 1 2011.01.18 10:11:00 取引成立 [#68 1.65 GBPUSD at 1.59804] 買います。
2011.08.09 00:06:43 Core 1 2011.01.18 10:11:00 取引 #68 1.65 GBPUSD を 1.59804 で購入済 (注文 #69 に基づく)。
2011.08.09 00:06:43 Core 1 2011.01.18 10:11:00 1.59804でテスト終了のためポジションクローズ [sell 1.65 GBPUSD 1.57341182 tp: 1.57247].
2011.08.09 00:06:43 Core 1 2011.01.18 10:11:00 order buy 0.45 at 0.83931 [#68 buy 0.45 EURGBP at 0.83931].
2011.08.09 00:06:43 Core 1 2011.01.18 10:11:00 注文実行 [#67 buy 0.45 EURGBP at 0.83931].
2011.08.09 00:06:43 2011.01.18 10:11:00 取引番号67の買い 0.45 EURGBP at 0.83931 完了(取引番号68に基づく)。
2011.08.09 00:06:43 Core 1 2011.01.18 10:11:00 Position Stop triggered at 29.09% [sell 0.45 EURGBP 0.83930333 tp: 0.80463] ←クリックすると拡大します。
2011.08.09 00:06:43 Core 1 2011.01.17 14:39:39 EURUSDによるロングポジションはストップロスのクローズへ
2011.08.09 00:06:43 Core 1 2011.01.17 14:39:39 -----------------Deal #66 sl 1.32900

2011.08.09 00:06:43 Core 1 2011.01.17 14:39:39 oldDealsTotal=65 newDealsTotal=66

テスターレポートより

結果
ストーリーの質 100%
バーです。 275 ティキ 888296
当期純利益。 -9 072.04 利益合計 1 652.29 全損です。 -10 724.33
収益性。 0.15 期待されるペイオフ -533.65
リカバリーファクター。 -0.92 シャープレシオ -0.35

バランスシートのドローダウン。
絶対的なバランスシートの縮小。 9 072.04 バランスシート上の最大ドローダウン。 10 392.34 (91.80%) バランスシート別の相対的なドローダウン。 91.80% (10 392.34)
資金の引き出し
ファンドにおける絶対的なドローダウン。 9 072.04 資金の最大引き出し額 9 852.02 (91.39%) 資金の相対的なドローダウン。 91.39% (9 852.02)

総トレード数 17 ショートトレード(勝ち組の割合)。 10 (70.00%) ロングトレード(勝率)。 7 (85.71%)
総トレード数 67 利益が出ている取引(全取引のうち%)。 13 (76.47%) 損失取引(全体に占める割合)。 4 (23.53%)

最大の利益を上げた取引 263.25 最大の負けトレード -5 036.39

平均的な利益率の高い取引。 127.10 平均的な負けトレード。 -2 681.08

最大連続勝利数(利益)。 10 (1 320.30) 最大連続損失数(ロス)。 2 (-4 084.59)

最大継続利益数(勝利数)。 1 320.30 (10) 最大連続損失(損失数)。 -5 036.39 (1)

平均的な連続獲得賞金額。 4 平均連続損失額。 1


このように、独自に計算した値の合計が同じであることは、すべてが正しいことを意味します。ストップ高の例はわざと外したんです。