ライブラリ: Virtual - ページ 4 12345678 新しいコメント och 2021.01.06 12:33 #31 <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 2021.01.06 12:54 #32 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(""); } fxsaber 2021.01.06 13:02 #33 och:しかし、私によれば、実際のTSのバックテスター結果でわかるように、バランスは(初期預金-利益)であり、利益は(初期預金-損失+利益)であるべきです。つまり、残高は正しいのですが、Orders.mqhで定義されているように、利益は(残高-資本)にはなりません。実際のTSでAccountInfoDouble(ACCOUNT_PROFIT)が0を返す理由も理解できません。私は間違っていますか? ACCOUNT_PROFITは、現在のすべてのオープンポジションの利益の合計に等しい。 fxsaber 2021.01.06 13:05 #34 och:だから、この問題を解決するあまりエレガントな方法ではない: double deposit = TesterStatistics(STAT_INITIAL_DEPOSIT); double profit = TesterStatistics(STAT_PROFIT); och 2021.01.06 15:14 #35 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(""); } fxsaber 2021.01.06 16:08 #36 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を有効にすると、テスト終了時にこのレポートが自動的にブラウザに表示されます。 You Lin Lee 2021.01.16 17:41 #37 Automated-Trading : バーチャル : 作成者 : fxsaber こんにちは、ライブラリはmt4で動作しますか? ライブラリのインポート中にコンパイルエラーが発生しました。 ファイル: libraryerror.png 34 kb fxsaber 2021.01.16 23:16 #38 You Lin Lee:mt4用のライブラリはありますか?ライブラリをインポートする際、コンパイルエラーが発生します。 MQL4-bug です!ベーススレッドはこちら です。 fxsaber 2021.03.01 13:03 #39 取引、自動取引システム、取引戦略のテストに関するフォーラム 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)); } バーチャルでこの事実を実装することは、実際の環境でそれをスピードアップすることができます。 Aliakbar Kavosi 2021.09.22 07:29 #40 fxsaberさんへ、 このツールはとても便利です。このプログラムのMT4バージョンはありますか? 12345678 新しいコメント 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
fxsaberです、
迅速なご回答ありがとうございます。
ご指摘の通り、総取引回数の不一致は解決しました。コードの上に定義VIRTUAL_CLOSEALL_BYENDを使用してStop()を呼び出してみました。
また、IsNewBarテストも追加して、取引回数を少なくしました。
しかし私によれば、実際のTSのバックテスター結果でわかるように、残高は(初期預金-利益)であり、利益は(初期預金-損失+利益)であるべきです。
つまり、残高は正しいのですが、Orders.mqhで定義されているように、利益は(残高-資本)にはなりません。
実際のTSでAccountInfoDouble(ACCOUNT_PROFIT)が0を返す理由も理解できません。
私は間違っていますか?
fxsaberです、
迅速な返答をありがとう。
ご指摘のとおり、総取引回数の不一致は解決しましたので、コードの上に定義VIRTUAL_CLOSEALL_BYENDを使用してStop()を呼び出してみました。
また、IsNewBarテストも追加して、取引回数を少なくしました。
しかし、私によれば、実際のTSのバックテスター結果で見ることができるように、バランスは(初期預金-利益)であり、利益は(初期預金-損失+利益)であるべきです。
つまり、残高は正しいのですが、Orders.mqhで定義されているように、利益は(残高-資本)にはなりません。
実際のTSでAccountInfoDouble(ACCOUNT_PROFIT)が0を返す理由も理解できません。
私は間違っていますか?
だから、問題を解決するあまりエレガントな方法ではない:
しかし、私によれば、実際のTSのバックテスター結果でわかるように、バランスは(初期預金-利益)であり、利益は(初期預金-損失+利益)であるべきです。
つまり、残高は正しいのですが、Orders.mqhで定義されているように、利益は(残高-資本)にはなりません。
実際のTSでAccountInfoDouble(ACCOUNT_PROFIT)が0を返す理由も理解できません。
私は間違っていますか?
ACCOUNT_PROFITは、現在のすべてのオープンポジションの利益の合計に等しい。
だから、この問題を解決するあまりエレガントな方法ではない:
fxsaberです、
あなたのサポートと反応に改めて感謝します。
少しコードを更新し、TS環境の使用を分けてみました。
実環境と仮想環境での結果を理解しました。結果は予想通りです。
しかし、両方の環境を同時に使おうとしたときの結果は理解できない。
注文リストをCSVファイルとして抽出することは可能でしょうか?
よろしくお願いします、
och
両方の環境を同時に使おうとしたときの結果が理解できない。
ライブラリには多くの使用例がある。あなたは一般的なビューの例を見ています。
注文のリストをCSVファイルとして抽出することは可能でしょうか?
下の例では、入力パラメーターで取引環境を変更できます:リアルかバーチャルか。
下の行はHTMLレポートを作成します。DLLを有効にすると、テスト終了時にこのレポートが自動的にブラウザに表示されます。
バーチャル :
作成者 : fxsaber
こんにちは、ライブラリはmt4で動作しますか?
ライブラリのインポート中にコンパイルエラーが発生しました。
mt4用のライブラリはありますか?
ライブラリをインポートする際、コンパイルエラーが発生します。
MQL4-bug です!ベーススレッドはこちら です。
取引、自動取引システム、取引戦略のテストに関するフォーラム
MT5と戦闘パフォーマンスにおけるスピード
fxsaber、2021.03.01 12時19分。
バーチャルでこの事実を実装することは、実際の環境でそれをスピードアップすることができます。
fxsaberさんへ、
このツールはとても便利です。
このプログラムのMT4バージョンはありますか?