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

 

去年、言語が変わってから、私のヴァーチャルのバージョンは機能しなくなった。だから、あなたのバージョンに戻した。
しかし、価格の変化を考慮した手数料が本当に恋しかった。
私の古いバージョンでは正確でしたが、文字列操作と商品ごとの価格照会で計算が遅くなりました。おそらく、この遅さから、自分のバージョンに追加したくなかったのでしょう。

今回、私はEURUSD、AUDUSD ...のような金融商品のためのシンプルで高速な計算を作りました。つまり、提示通貨==口座通貨の場合、計算は正しくなります。

#define COMMISSION_TO_PRICE 2 // умножить полученную комиссию на цену, например для EURUSD *=1.12345; 1 - комиссия берется только при входе, 2 - комиссия берется 2 раза и при входе и при выходе

手数料は単純にOpenPriceまたはClosePriceに掛けられます。USDJPYのような商品や入金通貨がUSD(T)でない場合、このオプションは(現在のオプションのように)正確ではないので、無効にすることができます。

#ifdef  ORDER_COMMISSION
 this.Commission = this.Lots * (ORDER_COMMISSION);
 #ifdef  COMMISSION_TO_PRICE
   this.Commission *= this.OpenPrice + (COMMISSION_TO_PRICE==2 ? this.ClosePrice : 0.0);
 #endif // 手数料を価格に
#endif// オーダー・コミッション

以下は私がEURUSDで得たものです:

DC:
仮想c *価格ごと
仮想価格なし

ご覧のように、オプションを追加した場合、140回の取引で手数料は18セントしか違わない。そして42ドルでそれなし。もちろん、あなたのバリアントで平均倍率を4ではなく、例えば4.305(テストの平均手数料)を選択することもできますが、それは各商品について手動で行い、再コンパイルする必要があります。

編集は大きくありません。このオプションをライブラリコードに追加することを望みます。あるいは、もっと普遍的なものを考えてください。


ファイル:
Order.mqh  36 kb
 
Forester #:

去年、言語が変わってから、私のヴァーチャルのバージョンは機能しなくなった。だから、あなたのバージョンに戻した。
しかし、価格の変化を考慮した手数料が本当に恋しかった。特に、テスト中に何度も価格が変化する暗号については。
私の古いバージョンでは正確でしたが、文字列操作と商品ごとの価格のクエリで計算が遅かったです。おそらくこの遅さから、あなたはこれを追加したくなかったのでしょう。

すべてのニュアンスに取得し、弱点/強みを評価するために多くの時間がかかりました。いい仕事ができなかった。

今回、私はEURUSD、AUDUSD ...のような楽器のためのシンプルで迅速な計算をしました。つまり、クォート通貨==アカウント通貨であれば、計算は正しくなります。

実際、この式は常に機能します。

Commission = 0.002%; // 片側につき

OrderCommission = (OrderOpenPrice + OrderClosePrice) * Commission * OrderLots * TickValue / TickSize;

もちろん、あなたのバリアントで平均倍率を4ではなく、例えば4.305(テストのための平均手数料)を選択することができますが、それは各商品のために手動で行われ、再コンパイルする必要があります。

別のバリアント。

input double inCommission = 0;
// .....
#define  ORDER_COMMISSION inCommission // OrderCommission() = OrderLots() * (ORDER_COMMISSION)), ダイナミックオプションを含む。

編集はそれほど大きくないので、このバリアントをライブラリ・コードに追加してほしい。あるいは、もっと普遍的なものを考えてください。

この編集が有用であり、行うべきだということにまったく同意します。部分クローズ(OrderClose)とCloseByをチェックすべきである。それをチェックするには、2つの異なる指示のポジションを同じティックでオープンし、部分クローズとCloseByクローズを一度に行うスクリプトを書けば十分です。私自身はまだ準備ができていません。もし、そのようなスクリプトを正しい結果とともに提供していただければ、訂正を早めます。

 
fxsaber #:

実際、この公式は常に機能している。

その方が楽だから、いつもやっているんだ。私はいつもやっているわけではない。7月以来初めて、また何かをテストすることにした。

OrderClosePrice
。おそらく、オープン時にのみ手数料を取るブローカー・センターがあると思いますが、そのようなブローカー・センターにとっては、手数料を考慮しない方がよいでしょう。ピプシングの場合、その差はわずかですが、大きなターゲットの場合は顕著になります。
 
fxsaber #:
この編集が有用であり、行うべきであるという点には全く同意する。部分決済(OrderCloseはロット全体ではない)とCloseByをチェックする必要がある。それをチェックするには、2つの異なる指示のポジションを同じティックでオープンし、部分クローズとCloseByクローズを一度に行うスクリプトを書けば十分です。私自身はまだ準備ができていません。もしそのようなスクリプトを正しい結果とともに送っていただければ、より早く修正します。
私はそこにコメントされていることをテストし、作業バージョンとして残しました。でも、今はすべて忘れてしまった。CloseBy - 私は使わない。私も時間がない。熱意がある限り、私は戦略を実行する。
 

バーチャルは不良債権限度額に手数料を上乗せする:


どうやらタイプチェックが必要なようだ
 
Forester #:

バーチャルは未実行の限度額に手数料を上乗せする:

どうやらタイプチェックが必要なようだ。
#define ORDER_COMMISSION -5 // OrderCommission() = OrderLots() * (ORDER_COMMISSION)), ダイナミックオプションを含む。
#include <fxsaber\Virtual\Virtual.mqh> //https://www.mql5.com/ja/code/22577

void OnStart()
{
  if (VIRTUAL::SelectByHandle(VIRTUAL::Create()))
  {
    VIRTUAL::NewTick();
    
    OrderDelete(OrderSend(_Symbol, OP_BUYLIMIT, 1, 0.01, 0, 0, 0));
    
    Print(VIRTUAL::ToString(1));
  }
}


結果。

#2 2025.11.25 19:23:11.105 buy limit 1.00 EURGBP.pro 0.01000 0.00000 0.00000 2025.11.25 19:23:11.105 0.87715 0.00 0.00 0.00 0 - 00:00:00


正しく動作した。どうやら、これらの編集には 追加のチェックが必要なようだ。

 
fxsaber #:

正しく機能している。どうやら、これらの編集には 追加の検証が必要なようだ。

その通りです。

ToClose()の中で、if (this.IsPosition()){の外に手数料の計算を追加しました。

修正しましたので、ファイルを添付します。

ファイル:
Order.mqh  37 kb
 

私は各ティックで バーチャルのエクイティとバランスを読み取り、チャートを作成している。今日までは目立たなかったが、今日は-66という巨大なスワップを付けた。

チャートはこんな感じ。



MT5の記録と同じはずだ。

最終的な利益は、ご覧の通り、手数料の丸め誤差(ポイントではなく、実際の手数料を適用した)とスワップの丸め誤差(MTがどのように丸めるのか、まだ理解できていない-round()経由ではない)により、数セント異なっている。

この計算のための今日のスワップの合計は-5208.97。チャート上のジャンプの大きさだけだ。計算中にスワップがエクイティとバランスに加算されるのではなく、最後に適用されるからこのようになるのだと思う。

OnTester()の中でVIRTUAL::CalcSwaps(...)を呼び出していますが、これはバーチャル取引でもできるのでしょうか?各ティックで行うにはコストがかかりすぎます。おそらく、毎日の最初に行うべきでしょう。もしかしたら、それはすでにプログラムされていて、デファインによって有効にされるべきかもしれません。私のバージョンでは、日ごとにスワップを作ったことを覚えています。もし過去にやったことがないのであれば、私のコードを送ることができます。

 
Aleksei Kuznetsov #:

もしかしたら、すでにプログラムされていて、ディファインで有効にする必要があるのかもしれない。私のバージョンでは、日ごとにスワップを作っていたのを覚えている。もし過去にやったことがないのなら、私のコードを送ることができる。

私はやっていません。しかし、Balance/Equity-Curveのプロット問題については、OnTesterで一度CalcSwapsを行い、その後に対応するBalance[]/Equity[]のワンパス調整を行います。これは超安価かつ正確です。

MT5ではスワップ履歴がないため、スワップ全体に欠陥があるように思えます。スワップ履歴がないため、MT5には欠陥があるように思えます。また、スワップを考慮すると、大きな履歴の場合、結果はひどく曲がってしまいます。週末に最適化したのに、平日に最適化したopt-filesの実行結果がまったく異なる値を示すことがあります。

それでも、MT5-testerはベンチマークではありません。