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

 
Aleksey Sergan:



このコードを実行してください:Multicurrency iMA Trend 2.

設定(Symbols パラメータ)で "EURUSD,GBPUSD "を指定します。

私の構成では

MetaTrader 5 x64 build 2009 started (MetaQuotes Software Corp.)
Windows 10 (build 17763) x64, IE 11, UAC, Intel Core i3-3120 M  @ 2.50 GHz, Memory: 3518 / 8077 Mb, Disk: 86 / 415 Gb, GMT+2
C:\Users\barab\AppData\Roaming\MetaQuotes\Terminal\D0E8209F77C8CF37AD8BF550E51FF075

は、すべてのSLがシンボル価格で終了しました。つまり、価格の重複誤差がないことです。

 
Vladimir Karputov:

このコードを実行してください:Multicurrency iMA Trend 2.

設定(Symbols パラメータ)で "EURUSD,GBPUSD "を指定します。

私の構成では

は、すべてのSLがシンボル価格で終了しました。つまり、価格の重複誤差がないことです。

ありがとうございます。エラーはローカライズされています。以下に投稿します。

 
Andrey Barinov:

は、2つの間違いがあります。

№1.あなたのミスです。コードのどこかにGBPUSDの価格を使ってEURUSDのポジションにSLを設定しています。端末は何も抵抗がないはずです。

№2.端末のバグEURUSDの流れで、その時に存在しない価格でこのSLが発動した場合、GBPUSDの価格を使用します。

アンドレイ・バリノフ

https://www.mql5.com/ru/docs/constants/structures/mqltraderequest

修正要求を送信する際、位置フィールドはシンボルよりも優先されるようです。req.positionを 印刷する

そう、あなたの言う通り、私の間違いは論理的なものであることが判明したのです。

を構造体に組み込む。

MqlTradeRequest m_request;

m_request.position = #3

m_request.symbol = GBPUSD

m_request.sl = 1.60704

GBPUSD #4 の実際のポジション数

OrderSend が実行されると、テスターはポジション#3 に対応するシンボル、eurusd にストップを設定します。

テスターのバグ

- m_request.position と m_request.symbol が一致するかどうかのチェックに失敗しました。

- は買いポジション、シンボルeurusd(現在の価格は1.30935)のストップを1.60704に設定します。

- は、実際の価格は1.30935ですが、次のティックで1.60704にストップを設定します。

皆さん、ありがとうございました。プラットフォームの開発者がこの投稿を見ることを期待しています。

 
Aleksey Sergan:

そう、あなたの言う通り、私の間違いは論理的なものであることが判明したのです。

構造で。

MqlTradeRequest m_request;

m_request.position = #3

m_request.symbol = GBPUSD

m_request.sl = 1.60704

GBPUSD #4 の実際のポジション数

OrderSend が実行されると、テスターはポジション#3 に対応するシンボル、eurusd にストップを設定します。

テスターのバグ

- m_request.position と m_request.symbol が一致するかどうかのチェックに失敗しました。

- は買いポジション、シンボルeurusd(現在の価格は1.30935)のストップを1.60704に設定します。

- は、実際の価格は1.30935ですが、次のティックで1.60704にストップを設定します。

皆さん、ありがとうございました。プラットフォームの開発者がこの投稿を見ることを期待しています。

1.60704の買いポジションのストップを現在値1.30935で実行することはエラーではありません。しかし、現在の価格1.30935で1.60704のレベルに買いストップを設定することはエラーです。

 

ビルド2007

機能です。

bool GetDialLastProfit (string symbol, datetime startDate, datetime endDate, long magic, double &profit, double &lot)
{
  HistorySelect (startDate, endDate);
  int deals = HistoryDealsTotal ();
  ulong ticket;

  for (int i = deals - 1; i >= 0; i--)
  //for (int i = 0; i < deals; i++)
  {
    ticket = HistoryDealGetTicket (i);
    if (ticket != 0)
    {
      if (HistoryDealGetInteger(ticket, DEAL_MAGIC) == magic)
      {
        profit = HistoryDealGetDouble (ticket, DEAL_PROFIT);
        
        //if (!HistoryDealGetDouble(ticket, DEAL_PROFIT, profit))
        //  return false;
        
        lot    = HistoryDealGetDouble (ticket, DEAL_VOLUME);
        
        return (true);
      }
    }
  }

  return (false);
}

取引の 財務結果をprofit変数に出力することになっているが、常に0.0となり、lot変数の値は常に正しい。

エラーは出ていませんか?- それとも私のやり方が悪いのでしょうか?

 
Andrey Dik:

ビルド2007

機能です。

取引の 財務結果をprofit変数に出力することになっているが、常に0.0となり、lot変数の値は常に正しい。

エラーは出ていませんか?- それとも私のやり方が悪いのでしょうか?

DEAL_ENTRY_OUTまたはINOUTを確認する必要があります。INのトレードは利益0

 
Andrey Barinov:

DEAL_ENTRY_OUTまたはINOUTを監視する必要があります。INのトレードは利益0

まあ、リストの最後から1番目が取られているのだから、OUTのはずなのだが

 
Andrey Dik:

まあ、リストの最後から1番目ですから、OUTのはずです。

endDateにTimeCurrent() を渡している場合は、TimeCurrent()+60などに置き換えてください。それが助けになるはずです。

 
Andrey Barinov:

endDateにTimeCurrent()を渡す場合は、TimeCurrent()+60などに置き換えてください。これは役に立つはずです。

いや、まだ0.0なんですけどね。

 
Andrey Dik:

いや、まだ0.0なんですけどね。

そして、デバッグする。トランザクションチケットを印刷し、そこで実際に何が選択されたかをテスターで確認する。取引形態による フィルタを追加する。