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

 

Expert Advisor をテストしているとき、偶然にもテスターのSleep() 関数が 正しく動作していないと思われるものに出会いました。ポイントは次の通りです。

エキスパートアドバイザーは、合計利益が指定されたものよりも高い場合、23:00にすべてのポジションを閉じます(CloseAll()関数)。次のポジションが閉じられた後、Sleep(10000)により10秒間の遅延が導入されます。

以下は、ログにある内容です。

FP 0 PriceChannel_multi (2) (EURUSD,H1) 04:31:04 CloseAll Profit: 3030.66
JD 0 トレード 04:31:04 即売り 0.80 EURAUD at 1.56474 (1.56474 / 1.56558 / 1.56474)
JH 0 トレード 04:31:04 取引 #85 売り 0.80 EURAUD at 1.56474 完了 (注文 #85 に基づく)
HL 0 トレード 04:31:04 ディール実行 [#85 売り 0.80 EURAUD at 1.56474].
HI 0 Trade 04:31:04 order executed sell 0.80 EURAUD at 1.56474 [#85 sell 0.80 EURAUD at 1.56474].
QE 0 PriceChannel_multi (2) (EURUSD,H1) 04:31:04 position by EURAUD to be closed.
PN 0 PriceChannel_multi (2) (EURUSD,H1) 04:31:0423:0:0
FG 0 PriceChannel_multi (2) (EURUSD,H1) 04:31:04 Sleep 10 cek.
RO 0 PriceChannel_multi (2) (EURUSD,H1) 04:31:0423:0:0
QD 0トレード 04:31:04 買い1.00 USDJPY at 90.444 (90.417 / 90.444 / 90.417)
NS 0 トレード 04:31:04 ディール#86 buy 1.00 USDJPY at 90.444 完了 (オーダー#86に基づく)
MJ 0 トレード 04:31:04 ディール実行 [#86 buy 1.00 USDJPY at 90.444].
JS 0 Trade 04:31:04 order executed buy 1.00 at 90.444 [#86 buy 1.00 USDJPY at 90.444].
JL 0 PriceChannel_multi (2) (EURUSD,H1) 04:31:04 USDJPYのポジションがクローズされることになりました。
JI 0 PriceChannel_multi (2) (EURUSD,H1) 04:31:0423:0:0
PN 0 PriceChannel_multi (2) (EURUSD,H1) 04:31:04 Sleep 10 cek.
DF 0 PriceChannel_multi (2) (EURUSD,H1) 04:31:0423:0:0
QN 0トレード 04:31:04 買い 0.80 AUDUSD at 0.90001 (0.89967 / 0.90001 / 0.89967)
IH 0トレード 04:31:04 ディール#87 buy 0.80 AUDUSD at 0.90001 done (based on order #87)
KQ 0 トレード 04:31:04 ディール実行 [#87 buy 0.80 AUDUSD at 0.90001].
RL 0 Trade 04:31:04 order executed buy 0.80 at 0.90001 [#87 buy 0.80 AUDUSD at 0.90001]です。
EG 0 PriceChannel_multi (2) (EURUSD,H1) 04:31:04 AUDUSDによるポジションがクローズされることになりました。
LP 0 PriceChannel_multi (2) (EURUSD,H1) 04:31:0423:0:0
JI 0 PriceChannel_multi (2) (EURUSD,H1) 04:31:04 Sleep 10 cek.

NQ 0 PriceChannel_multi (2) (EURUSD,H1) 04:31:0423:0:0

見ての通り、ラグの前後は同じ時間になっています。しかし、TimeCurrent() == 0の場合のみ発生します。

そうでない場合は、スリップは問題なく動作します。例えば、こんな感じです。

MD 0 PriceChannel_multi (2) (EURUSD,H1) 04:30:39 CloseAll Profit: 3382.28
KQ 0トレード 04:30:39 ET 0.70 EURUSD at 1.44090 (1.44090 / 1.44108 / 1.44090)
IE 0 トレード 04:30:39 取引 #27 売り 0.70 EURUSD at 1.44090 完了 (注文 #27 に基づく)
CI 0 トレード 04:30:39 ディール実行 [#27 sell 0.70 EURUSD at 1.44090].
EL 0 Trade 04:30:39 order executed sell 0.70 at 1.44090 [#27 sell 0.70 EURUSD at 1.44090]である。
DH 0 PriceChannel_multi (2) (EURUSD,H1) 04:30:39
JR 0 PriceChannel_multi (2) (EURUSD,H1) 04:30:3923:0:7
MK 0 PriceChannel_multi (2) (EURUSD,H1) 04:30:39 Sleep 10 cek.
EP 0 PriceChannel_multi (2) (EURUSD,H1) 04:30:3923:0:15
DE 0 Trade 04:30:39 ET 0.80 AUDUSD at 0.91951 (0.91951 / 0.91993 / 0.91951)
CJ 0 トレード 04:30:39 取引 #28 売り 0.80 AUDUSD at 0.91951 完了 (注文 #28 に基づく)
HR 0 トレード 04:30:39 ディール実行 [#28 sell 0.80 AUDUSD at 0.91951].
HH 0 Trade 04:30:39 order executed sell 0.80 AUDUSD at 0.91951 [#28 sell 0.80 AUDUSD at 0.91951]である。
LS 0 PriceChannel_multi (2) (EURUSD,H1) 04:30:39 AUDUSD to be closed
QL 0 PriceChannel_multi (2) (EURUSD,H1) 04:30:3923:0:15
ED 0 PriceChannel_multi (2) (EURUSD,H1) 04:30:39 10 cek Sleep.
LO 0 PriceChannel_multi (2) (EURUSD,H1) 04:30:3923:0:25
DD 0トレード 04:30:39 買い 0.60 EURAUD at 1.56727 (1.56632 / 1.56727 / 1.56632)
LN 0 トレード 04:30:39 ディール#29 buy 0.60 EURAUD at 1.56727 完了 (オーダー#29に基づく)
FK 0 トレード 04:30:39 ディール実行 [#29 buy 0.60 EURAUD at 1.56727].
IR 0 トレード 04:30:39 注文実行 0.60 at 1.56727 [#29 buy 0.60 EURAUD at 1.56727].
RM 0 PriceChannel_multi (2) (EURUSD,H1) 04:30:39 position by EURAUD to be closed.
FE 0 PriceChannel_multi (2) (EURUSD,H1) 04:30:3923:0:25
GN 0 PriceChannel_multi (2) (EURUSD,H1) 04:30:39 Sleep 10 cek.

QE 0 PriceChannel_multi (2) (EURUSD,H1) 04:30:3923:0:35

ポジションを閉じるためのコードです。

if(m_trade[j].PositionClose(m_symbol[j].Name()))
           {
            PosCloseCount--;
            printf("Position by %s to be closed",m_symbol[j].Name());
            MqlDateTime  dt_struct;
            TimeCurrent(dt_struct);
            printf("%u:%u:%u",dt_struct.hour,dt_struct.min,dt_struct.sec);
            Sleep(10000);
            Print("Sleep 10 cek.");
            TimeCurrent(dt_struct);
            printf("%u:%u:%u",dt_struct.hour,dt_struct.min,dt_struct.sec);
           }

CloseAll関数呼び出し。

   MqlDateTime  dt_struct;
   TimeCurrent(dt_struct);
   if(dt_struct.hour==2 3 && m_account.Profit()>InpProfitToClose)
     {
      Trade=false;Print("CloseAll Profit: ",m_account.Profit());
      while(PositionsTotal()>0)
         CloseAll();

という条件に変更すると

if(dt_struct.hour==23 && dt_struct.min>0 && m_account.Profit()>InpProfitToClose)
はエラーになりません。
Документация по MQL5: Общие функции / Sleep
Документация по MQL5: Общие функции / Sleep
  • www.mql5.com
Общие функции / Sleep - Документация по MQL5
 
joo:
では、私のメッセージは無駄ではない、ということですね。

はい、StringToTimeの 動作を修正しました。 ありがとうございます。

 
Valmars:

Expert Advisor をテストしているとき、偶然にもテスターのSleep() 関数が 正しく動作していないと思われるものに出会いました。ポイントは次の通りです。

とても興味深いです。見てみよう。
 
ニュース "タブを開くと...- それは間違ったニュースです。何か見落としているのでしょうか?
 
x100intraday:
ニュース」タブを開くとそこには...- それは間違ったニュースです。何か見落としているのでしょうか?

ニュースを受信したい言語を設定する。


 
Rosh:

ニュースを受信したい言語を設定する。


違うんです。なんだかmt5フォーラムの「ニュース」が散りばめられていて、FXのニュースとは全く関係ないですね。最近プロオートのアップデートだけでなく、mt5のディストリビューションを新たにダウンロードしてインストール、もう1週間近く経ちます。平日は「ニュース」タブに入らなかったのでどうだったのかわかりませんが、今発見しました。

変な金融ニュース

 
x100intraday:

違うんです。なんだかmt5フォーラムの「ニュース」がちりばめられていて、FXのニュースとは関係ないですね。最近はプロ自動アップロードだけでなく、mt5のディストリビューションを再度ダウンロードしてインストールしています、もう1週間近く経ちますね。平日は「ニュース」タブに入らなかったのでどうだったのかわからないが、今発見した。

これは、外為ニュースを見逃す代わりに、MQL5.comのニュースを放送する私たちのデモサーバーです(私たちには、他の人のニュースを無料で配信する権利がありません)。

表示させたくない場合は、右クリックメニューのニュースカテゴリーの項目にある該当するボックスのチェックを外してください。

 

自動更新後、以前動作していたEAが、時系列をコピーできないというメッセージを出すようになった。EAをアンロード し、再度ロードすることで問題は解決しました。質問:自動アップデートのこの結果は常に予期されるものなのでしょうか、それともターミナルエラーで、今後解消されるものなのでしょうか?

Документация по MQL5: Программы MQL5 / Выполнение программ
Документация по MQL5: Программы MQL5 / Выполнение программ
  • www.mql5.com
Программы MQL5 / Выполнение программ - Документация по MQL5
 
Yedelkin:

自動更新後、以前動作していたEAが、時系列をコピーできないというメッセージを出すようになった。EAをアンロード し、再度ロードすることで問題は解決しました。質問:自動アップデートのこの結果は常に予期されるものなのでしょうか、それともターミナルエラーで、今後解消されるものなのでしょうか?

詳細(ログ、スクリーンショットなど)を教えてください。

これなくして、十分な答えを出すことはできません。

 
Renat:

詳細な情報(ログ、スクリーンショットなど)を提供してください。

これがないと、合理的な回答ができないのです。

OKです。MQサーバーのデモ口座、ログファイルを添付(2010729.log)、自動更新開始時刻は20時54分、22時36分にExpert Advisorを自分で削除し、1分後にアップロードしたものです。

EAでは簡単な型チェックがあります。

if(CopyHigh(Symbol(),0,0,bars,high)<bars || CopyClose(Symbol(),0,0,bars,close)<bars || CopyLow(Symbol(),0,0,bars,low)<bars || CopyTime(Symbol(),0,0,bars,time)<bars)
  {
   Print("Can't copy timeseries!");
   return;
  }

したがって、自動更新のメッセージの後に行った(ファイル20100729copy.log)。 一般的に、これは前に発生しているが、何とか注意を払うことはありませんでした。

Expert Advisor を再読み込みすると、チャート上の建値と逆指値の ラインも消えています。

今お話されたことに、何か付け加えてもよろしいでしょうか?