ライブラリ: Virtual - ページ 4

 
<br/ translate="no">。

fxsaberです、

迅速なご回答ありがとうございます。

ご指摘の通り、総取引回数の不一致は解決しました。コードの上に定義VIRTUAL_CLOSEALL_BYENDを使用してStop()を呼び出してみました。

また、IsNewBarテストも追加して、取引回数を少なくしました。


// 現実と仮想の取引環境でTSを立ち上げる

//テスターが実際のストラテジーとして取引できるようにする必要がある。
#include <MT4Orders.mqh>               // https://www.mql5.com/ru/code/16006
#define  VIRTUAL_TESTER                 // 仮想取引環境での立ち上げ
#define  VIRTUAL_CLOSEALL_BYEND
#include <fxsaber\Virtual\Virtual.mqh> // 仮想取引環境


input double Lots  = 1;
input int Interval = 100;  // 生涯ポジション
input bool Example = true; // どのサンプルコードを選ぶか

datetime bartime;

//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
bool och_NewBar(string _symbol, ENUM_TIMEFRAMES _timeframe, datetime& _lasttime)
{

if(::iTime(_symbol,_timeframe,0) != _lasttime)
  {
   _lasttime=::iTime(_symbol,_timeframe,0);
   return (true);
  }
else
   return (false);
}

// リバーシブルTC
void System()
{
  
  if (!OrderSelect(OrdersTotal() - 1, SELECT_BY_POS))
    OrderSend(_Symbol, OP_BUY, Lots, SymbolInfoDouble(_Symbol, SYMBOL_ASK), 100, 0, 0); // ポジションがなければオープン
  else if (TimeCurrent() - OrderOpenTime() > Interval) // ポジションが指定された時間より長く生きている場合
  {
    // 位置を反転
    OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 100);
    OrderSend(_Symbol, 1 - OrderType(), Lots, OrderClosePrice(), 100, 0, 0);
  }
  //PrintFormat("%s-Line#%d::HistoryOrders.Total() = %d", __FUNCTION__, __LINE__, OrdersHistoryTotal());
}

int handle = VIRTUAL::Create(); // 仮想取引環境のハンドルを作成。0 - 実際の取引環境

void OnTick()
{
  //static const int handle = VIRTUAL::Create(); // 仮想取引環境のハンドルを作成。0 - 実際の取引環境

  if (!och_NewBar(_Symbol, _Period, bartime)) return;
  
  if (Example)
  {
    if (VIRTUAL::SelectByHandle()) // 実際の取引環境を選ぶ
      System();                    // 選択した取引環境(リアル)でTSを起動

    if (VIRTUAL::SelectByHandle(handle)) // 仮想取引環境の選択
    {
      VIRTUAL::NewTick();      // 仮想取引環境にティックを追加
      System();                // 選択した取引環境(仮想)でTSを起動。
    }
  }
  else // 同じアクションの代替記録。
    // 利用可能なすべての取引環境に目を通す
    for (int i = 0; i <= VIRTUAL::Total(); i++)
      if (VIRTUAL::SelectByIndex(i)) // 適切な取引環境の選択
      {
        VIRTUAL::NewTick(); // 選択した取引環境にティックを追加

        System(); // 選択した取引環境でTSを起動
      }

  Comment(VIRTUAL::ToString()); // 仮想取引環境の状況をチャートに表示
}

void OnDeinit(const int reason)
{
  VIRTUAL::SelectByHandle();
  PrintFormat("(%s-%s)::%s - Initial deposit=%.2f, Balance=%.2f, Equity=%.2f, Profit=%G, Trades=%d", _Symbol, EnumToString(_Period), "Real", 0,AccountBalance(), AccountEquity(), AccountProfit(), OrdersHistoryTotal());
  VIRTUAL::SelectByHandle(handle);
  VIRTUAL::Stop();
  PrintFormat("(%s-%s)::%s - Initial deposit=%.2f, Balance=%.2f, Equity=%.2f, Profit=%G, Trades=%d", _Symbol, EnumToString(_Period), "Virtual", 0,AccountBalance(), AccountEquity(), AccountProfit(), OrdersHistoryTotal());
                                                                        
  Comment("");
}


しかし私によれば、実際のTSのバックテスター結果でわかるように、残高は(初期預金-利益)であり、利益は(初期預金-損失+利益)であるべきです。

つまり、残高は正しいのですが、Orders.mqhで定義されているように、利益は(残高-資本)にはなりません。

 double AccountProfit( void ) const
  {
    return(::NormalizeDouble(this.Equity - this.Balance, 2));
  }

実際のTSでAccountInfoDouble(ACCOUNT_PROFIT)が0を返す理由も理解できません。

  static double VirtualAccountProfit( void )
  {
    return(VIRTUAL::SelectOrders ? VIRTUAL::SelectOrders.AccountProfit() : ::AccountInfoDouble(ACCOUNT_PROFIT));
  }

私は間違っていますか?




 
och:

fxsaberです、

迅速な返答をありがとう。

ご指摘のとおり、総取引回数の不一致は解決しましたので、コードの上に定義VIRTUAL_CLOSEALL_BYENDを使用してStop()を呼び出してみました。

また、IsNewBarテストも追加して、取引回数を少なくしました。



しかし、私によれば、実際のTSのバックテスター結果で見ることができるように、バランスは(初期預金-利益)であり、利益は(初期預金-損失+利益)であるべきです。

つまり、残高は正しいのですが、Orders.mqhで定義されているように、利益は(残高-資本)にはなりません。

実際のTSでAccountInfoDouble(ACCOUNT_PROFIT)が0を返す理由も理解できません。

私は間違っていますか?





だから、問題を解決するあまりエレガントな方法ではない:

void OnDeinit(const int reason)
{
  //--- 実際のTSの数値を計算する
  VIRTUAL::SelectByHandle();
  OrderSelect(1, SELECT_BY_TICKET, MODE_HISTORY);
  double deposit = OrderProfit();
  double profit = AccountBalance() - deposit;
  PrintFormat("(%s-%s)::%s - Initial deposit=%.2f, Balance=%.2f, Equity=%.2f, Profit=%G, Trades=%d", _Symbol, EnumToString(_Period), "Real", deposit,AccountBalance(), AccountEquity(), profit, OrdersHistoryTotal());
  
  //--- 仮想TSの数値を計算する
  VIRTUAL::SelectByHandle(handle);
  VIRTUAL::Stop();
  OrderSelect(1, SELECT_BY_TICKET, MODE_HISTORY);
  deposit = OrderProfit();
  profit = AccountBalance() - deposit;
  PrintFormat("(%s-%s)::%s - Initial deposit=%.2f, Balance=%.2f, Equity=%.2f, Profit=%G, Trades=%d", _Symbol, EnumToString(_Period), "Virtual", deposit,AccountBalance(), AccountEquity(), profit, OrdersHistoryTotal());
                                                                        
  Comment("");
}
  
 
och:

しかし、私によれば、実際のTSのバックテスター結果でわかるように、バランスは(初期預金-利益)であり、利益は(初期預金-損失+利益)であるべきです。

つまり、残高は正しいのですが、Orders.mqhで定義されているように、利益は(残高-資本)にはなりません。

実際のTSでAccountInfoDouble(ACCOUNT_PROFIT)が0を返す理由も理解できません。

私は間違っていますか?

ACCOUNT_PROFITは、現在のすべてのオープンポジションの利益の合計に等しい。

 
och:

だから、この問題を解決するあまりエレガントな方法ではない:

  double deposit = TesterStatistics(STAT_INITIAL_DEPOSIT);
  double profit = TesterStatistics(STAT_PROFIT);
 

fxsaberです、

あなたのサポートと反応に改めて感謝します。

少しコードを更新し、TS環境の使用を分けてみました。

実環境と仮想環境での結果を理解しました。結果は予想通りです。

しかし、両方の環境を同時に使おうとしたときの結果は理解できない。

注文リストをCSVファイルとして抽出することは可能でしょうか?

よろしくお願いします、

och

// 現実と仮想の取引環境でTSを立ち上げる

//テスターが実際のストラテジーとして取引できるようにする必要がある。
#include <MT4Orders.mqh>               // https://www.mql5.com/ru/code/16006
#define  VIRTUAL_TESTER                 // 仮想取引環境での立ち上げ
//#define VIRTUAL_CLOSEALL_BYEND
#include <fxsaber\Virtual\Virtual.mqh> // 仮想取引環境

enum ENUM_TRADING_TYPE{
   TRADING_TYPE_REAL,         // 本物の環境を使う
   TRADING_TYPE_VIRTUAL,      // 仮想環境の使用
   TRADING_TYPE_BOTH          // 両方使う
};

input double               Lots  = 1;
input int                  Interval = 100;                     // 生涯ポジション
//入力 bool Example = true;// どのサンプルコードを選択するか
input ENUM_TRADING_TYPE    Trading_type = TRADING_TYPE_REAL;   // トランキング・タイプ

datetime bartime;

//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
bool och_NewBar(string _symbol, ENUM_TIMEFRAMES _timeframe, datetime& _lasttime)
{

if(::iTime(_symbol,_timeframe,0) != _lasttime)
  {
   _lasttime=::iTime(_symbol,_timeframe,0);
   return (true);
  }
else
   return (false);
}

// リバーシブルTC
void System()
{
  
  if (!OrderSelect(OrdersTotal() - 1, SELECT_BY_POS))
    OrderSend(_Symbol, OP_BUY, Lots, SymbolInfoDouble(_Symbol, SYMBOL_ASK), 100, 0, 0); // ポジションがなければオープン
  else if (TimeCurrent() - OrderOpenTime() > Interval) // ポジションが指定された時間より長く生きている場合
  {
    // 位置を反転
    OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 100);
    OrderSend(_Symbol, 1 - OrderType(), Lots, OrderClosePrice(), 100, 0, 0);
  }
  //PrintFormat("%s-Line#%d::HistoryOrders.Total() = %d", __FUNCTION__, __LINE__, OrdersHistoryTotal());
}

int handle = VIRTUAL::Create(); // 仮想取引環境のハンドルを作成。0 - 実際の取引環境

void OnTick()
{
  //static const int handle = VIRTUAL::Create(); // 仮想取引環境のハンドルを作成。0 - 実際の取引環境

  if (!och_NewBar(_Symbol, _Period, bartime)) return;
  
  //if (例)
  {
    switch(Trading_type){
      case TRADING_TYPE_REAL     :    if (VIRTUAL::SelectByHandle())       // 実際の取引環境を選ぶ
                                          System();                        // 選択した取引環境(リアル)でTSを起動
                                      break;
                                        
      case TRADING_TYPE_VIRTUAL  :    if (VIRTUAL::SelectByHandle(handle)) // 仮想取引環境の選択
                                        {
                                          VIRTUAL::NewTick();              // 仮想取引環境にティックを追加
                                          System();                        // 選択した取引環境(仮想)でTSを起動。
                                        }
                                      break;
                                      
      case TRADING_TYPE_BOTH     :    if (VIRTUAL::SelectByHandle())       // 実際の取引環境を選ぶ
                                          System();                        // 選択した取引環境(リアル)でTSを起動
                                      break;
                                        
                                      if (VIRTUAL::SelectByHandle(handle)) // 仮想取引環境の選択
                                        {
                                          VIRTUAL::NewTick();              // 仮想取引環境にティックを追加
                                          System();                        // 選択した取引環境(仮想)でTSを起動。
                                        }
                                      break;
    }
  }
// else // 同じアクションの代替記録。
// // 利用可能なすべての取引環境を調べる
// for (int i = 0; i <= VIRTUAL::Total(); i++)
// if (VIRTUAL::SelectByIndex(i))// 適切な取引環境を選択
// {
// VIRTUAL::NewTick(); // 選択された取引環境にティックを追加
//
// System(); // 選択した取引環境でTSを起動
//      }

  Comment(VIRTUAL::ToString()); // 仮想取引環境の状況をチャートに表示
}

void OnDeinit(const int reason)
{
  double deposit, profit;
  //--- 実際のTSの数値を計算する
  if (Trading_type != TRADING_TYPE_VIRTUAL){
     VIRTUAL::SelectByHandle();
     OrderSelect(1, SELECT_BY_TICKET, MODE_HISTORY);
     deposit = TesterStatistics(STAT_INITIAL_DEPOSIT);
     profit = TesterStatistics(STAT_PROFIT);
     PrintFormat("(%s-%s)::%s - Initial deposit=%.2f, Balance=%.2f, Equity=%.2f, Profit=%G, Trades=%d", _Symbol, EnumToString(_Period), "Real", deposit,AccountBalance(), AccountEquity(), profit, OrdersHistoryTotal());
  }
  
  if (Trading_type != TRADING_TYPE_REAL){
     //--- 仮想TSの数値を計算する
     VIRTUAL::SelectByHandle(handle);
     VIRTUAL::Stop();
     deposit = TesterStatistics(STAT_INITIAL_DEPOSIT);
     profit = TesterStatistics(STAT_PROFIT);
     PrintFormat("(%s-%s)::%s - Initial deposit=%.2f, Balance=%.2f, Equity=%.2f, Profit=%G, Trades=%d", _Symbol, EnumToString(_Period), "Virtual", deposit,AccountBalance(), AccountEquity(), profit, OrdersHistoryTotal());
  }                                                                      
  Comment("");
}
 
och:

両方の環境を同時に使おうとしたときの結果が理解できない。

ライブラリには多くの使用例がある。あなたは一般的なビューの例を見ています。

注文のリストをCSVファイルとして抽出することは可能でしょうか?

下の例では、入力パラメーターで取引環境を変更できます:リアルかバーチャルか。

#include <MT4Orders.mqh>               // https://www.mql5.com/ru/code/16006

#define  VIRTUAL_TESTER                 // 仮想取引環境での立ち上げ
#define  VIRTUAL_CLOSEALL_BYEND
#include <fxsaber\Virtual\Virtual.mqh> // 仮想取引環境

input double                inLots  = 1 ;
input int                   inInterval = 100 ;                     // 生涯ポジション

//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
bool och_NewBar( string _symbol, ENUM_TIMEFRAMES _timeframe )
{
static datetime _lasttime = 0;

if (:: iTime (_symbol,_timeframe, 0 ) != _lasttime)
  {
   _lasttime=:: iTime (_symbol,_timeframe, 0 );
   return ( true );
  }
else
   return ( false );
}

// リバーシブルTC
void System()
{
  
   if (! OrderSelect ( OrdersTotal () - 1 , SELECT_BY_POS))
     OrderSend ( _Symbol , OP_BUY, inLots, SymbolInfoDouble ( _Symbol , SYMBOL_ASK ), 100 , 0 , 0 ); // ポジションがなければオープン
   else if ( TimeCurrent () - OrderOpenTime() > inInterval) // ポジションが指定された時間より長く生きている場合
  {
     // 位置を反転
    OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 100 );
     OrderSend ( _Symbol , 1 - OrderType(), inLots, OrderClosePrice(), 100 , 0 , 0 );
  }
   //PrintFormat("%s-Line#%d::HistoryOrders.Total() = %d", __FUNCTION__, __LINE__, OrdersHistoryTotal());
}

void OnTick ()
{
   if (!och_NewBar( _Symbol , _Period)) return ;
   
   System();
}

#define  REPORT_TESTER             // В тестере будут автоматически записываться отчеты
// REPORT_INTERACTIVE_CHARTS // #define REPORT_INTERACTIVE_CHARTS。
#define  REPORT_BROWSER            // Создание отчета с запуском браузера - требует разрешения DLL.
#include <Report.mqh> // https://www.mql5.com/ru/code/ 22577


下の行はHTMLレポートを作成します。DLLを有効にすると、テスト終了時にこのレポートが自動的にブラウザに表示されます。

 
Automated-Trading :

バーチャル

作成者 : fxsaber

こんにちは、ライブラリはmt4で動作しますか?

ライブラリのインポート中にコンパイルエラーが発生しました。

ファイル:
 
You Lin Lee:

mt4用のライブラリはありますか?

ライブラリをインポートする際、コンパイルエラーが発生します。

MQL4-bug です!ベーススレッドはこちら です。

 

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

MT5と戦闘パフォーマンスにおけるスピード

fxsaber、2021.03.01 12時19分。

// Quick SymbolInfoTick.
bool SymbolInfoTickFast( const string &Symb, MqlTick &Tick )
{
  return((Symb == _Symbol) ? SymbolInfoTick(_Symbol, Tick)
                           : SymbolInfoTick(Symb, Tick));
}

バーチャルでこの事実を実装することは、実際の環境でそれをスピードアップすることができます。

 

fxsaberさんへ、

このツールはとても便利です。

このプログラムのMT4バージョンはありますか?