ライブラリ: MT4Orders - ページ 80

 
fxsaber #:

最新版を お試しください。コピーペースト

fxsaberさん、ありがとうございます。確認には時間がかかりそうですが、今のところメモリ使用量は減っていないようです。

興味本位ですが、OrderSwap()はどこで定義されているのでしょうか?コードに見当たらないようです。

 
pcdeni #:

今のところ、メモリ使用量は減っていないようだ。

問題を再現するにはデータが必要です。ラコニックコードと問題が発生した取引口座への投資アクセス。多分プライベート・メッセージで。

興味本位ですが、OrderSwap()はどこで定義されていますか?コードには見当たりません。

MT4_ORDERFUNCTION(Swap, double, ::PositionGetDouble(POSITION_SWAP), 0, true)
 



このライブラリ/コードをEAに組み込んでも、何年も問題は起きませんでした。 今、MT5 EAをコンパイルしていると、このコードから3つのエラーが返されます。

'=' - 予期しないトークン MT4Orders.mqh 192 25
')' - 予期しないトークン MT4Orders.mqh 192 68
'*=' - 予想される名前 MT4Orders.mqh 194 13

私のEAでは、

もインクルードしています。
<stderror.mqh> をインクルードする。
#include <stdlib_mq5.mqh>
#import"kernel32.dll"



ライブラリ単体ではエラーもなく、いつものように問題なくコンパイルできます。EAをコンパイルしようとしたときだけ、エラーが出ます。

#define  ORDER_SELECT (-2)

   static int GetDigits( double Price )
  {
    int Res = 0;

    while ((bool)(Price = ::NormalizeDouble(Price - (int)Price, 8)))   // <- LINE 192 だから、これは明らかに問題だ。
    {
      Price *= 10; // LINE 194

      Res++;
    }

    return(Res);
  }

私の EAで 不審な点を 見つけました:
union Price
  {
   uchar             buffer[8];
   double            close;
  };

ということは、このユニオンのプライス名は、GetDigits関数のプライス名を上書きするのでしょうか? これが問題なのでしょうか?
 
Filip Valkovic #:

このユニオンのプライス名は、GetDigits 関数のプライス名を上書きするのですか?

これが原因です。

 
手数料計算のエラーを特定するのを手伝ってください。そのためには、利用可能な取引口座でこのスクリプトを実行してください。
// MT4/MT5-Styleを介した手数料/スワップ/利益の合計の計算と比較。

#define  MT4ORDERS_BYPASS_MAXTIME 1000000 // 取引環境の同期を待つ最大時間(単位:µs
#include <MT4Orders.mqh>

#define  TOSTRING(A) (#A + " = " + DoubleToString(A, 2))
#define  PRINT(A, B) Print(TOSTRING(A) + ", " + TOSTRING(B) + ", " + (string)!NormalizeDouble((A) - (B), 2))

// MT4スタイル
void Calc_MT4( double &Commission, double &Swap, double &Profit )
{
  Commission = 0;
  Swap = 0;
  Profit = 0;
  
  for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && (OrderType() <= OP_SELL))
    {
      Commission += OrderCommission();
      Swap += OrderSwap();
      Profit += OrderProfit();
    }
}

// MT5-スタイル
void Calc_MT5( double &Commission, double &Swap, double &Profit )
{
  Commission = 0;
  Swap = 0;
  Profit = 0;
  
  if (HistorySelect(0, INT_MAX))  
    for (int i = HistoryDealsTotal() - 1; i >= 0; i--)
    {
      const ulong Ticket = HistoryDealGetTicket(i);
      
      if (HistoryDealGetInteger(Ticket, DEAL_TYPE) <= DEAL_TYPE_SELL)
      {
        Commission += HistoryDealGetDouble(Ticket, DEAL_COMMISSION);
        Swap += HistoryDealGetDouble(Ticket, DEAL_SWAP);
        Profit += HistoryDealGetDouble(Ticket, DEAL_PROFIT);
      }
    }
}

void OnStart()
{
  if (PositionsTotal())
    MessageBox("The script works when there are no open positions.");
  else
  {
    double Commission_MT4, Swap_MT4, Profit_MT4;
    double Commission_MT5, Swap_MT5, Profit_MT5;
    
    Calc_MT4(Commission_MT4, Swap_MT4, Profit_MT4); // MT4スタイル
    Calc_MT5(Commission_MT5, Swap_MT5, Profit_MT5); // MT5-スタイル
    
    PRINT(Commission_MT4, Commission_MT5);
    PRINT(Swap_MT4, Swap_MT5);
    PRINT(Profit_MT4, Profit_MT5);
  }
}


次のような結果が得られます。

Commission_MT4 = -15591.12, Commission_MT5 = -15591.12, true
Swap_MT4 = -5948.77, Swap_MT5 = -5948.77, true
Profit_MT4 = 34851.13, Profit_MT5 = 34851.13, true


万が一、ハイライトされたスペースに偽が あれば、教えてください。ありがとうございました。

 
2023.01.02 13:23:28.780 fxsaber_test (EURCHF,H1)        Commission_MT4 = -2875.33, Commission_MT5 = -2875.29, false
2023.01.02 13:23:28.835 fxsaber_test (EURCHF,H1)        Swap_MT4 = -1051.56, Swap_MT5 = -1051.56, true
2023.01.02 13:23:28.835 fxsaber_test (EURCHF,H1)        Profit_MT4 = 7198.08, Profit_MT5 = 7198.08, true
 
Enrique Dangeroux #:

本当にその線でコンパイルしたのか?

取引、自動取引システム、取引戦略のテストに関するフォーラム

ライブラリ: MT4Orders

fxsaber, 2023.01.02 12:24 pm.

#define  MT4ORDERS_BYPASS_MAXTIME 1000000 // 取引環境の同期を待つ最大時間(単位:µs
telegramからのEX5は偽を与える?
 
コピーペーストで1対1にコンパイル。ただし、Swap = 0の後にセミコロンがない。
 
fxsaber #:

電報のEX5が嘘に?

これが、ソースのバージョン不一致を除外する最も確実な方法でしょう。

 
EX5のプライベートメッセージに 書き込んでください。