汎用クラスライブラリ - バグ、説明、質問、使用上の特徴、提案 - ページ 16

 
fxsaber

面白いですね。そして、ここで質問です。今の実装が気に入らなくて、手を加えたんです。曲がっているに決まっている。オリジナルのバイブルを入手するにはどうすればよいですか?

こちら-1702年から

ファイル:
Generic.zip  44 kb
 
アルチョム・トリシキン

こちら-1702年から

ありがとうございました。開発者に質問します。ストレートにこだわる私としては...。

 

例2:ネット口座で複数のEAを取引する場合

ネットポジショニングは、同じシンボルで同時に複数のExpert Advisorを取引する人にとっては、頭の痛い問題です。両方のEAがヘッジにあるが、ネットポジションの不在が本当に彼らが市場にないことを示すものではないことを理解する必要がある状況に対処するために、複雑なコードを生成します。一つの解決策は、各専門家の総ポジションに対する貢献度を計算することである。そのためには、履歴全体を分析し、それぞれのユニークなメディジーにどのような契約数が属しているかを計算する必要があります。0.0であれば専門家は市場から退場、マイナスであれば専門家はショート、プラスであればロングとなります。実際には、CHashMapを使用して、すべての取引をマジックオーダーで分解し、その数量を加算するだけなので、非常に簡単なことです。以下に、ごく簡単なコード(プロトタイプ)をスケッチしてみました。

//+------------------------------------------------------------------+
//|                                                 NettoByMagic.mq5 |
//|                        Copyright 2017, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#include <Generic\HashMapGen.mqh>

CHashMap<ulong, double> PositionsByMagic;
int prev_deals = 0;
//+------------------------------------------------------------------+
//| Добавляет новый объем и его меджик                               |
//+------------------------------------------------------------------+
void AddVolume(ulong magic, double volume)
{
   double cur_volume = 0.0;
   if(PositionsByMagic.TryGetValue(magic, cur_volume))
      PositionsByMagic.TrySetValue(magic, cur_volume+volume);
   else
      PositionsByMagic.Add(magic, volume);
}
//+------------------------------------------------------------------+
//| Добавляет новые сделки в словарь                                 |
//+------------------------------------------------------------------+
void ParseDeals()
{
   HistorySelect(0, TimeCurrent());
   for(int i = prev_deals; i < HistoryDealsTotal(); i++)
   {
      ulong ticket = HistoryDealGetTicket(i);
      if(HistoryDealGetString(ticket, DEAL_SYMBOL)!= Symbol())
         continue;
      ENUM_DEAL_TYPE deal_type = (ENUM_DEAL_TYPE)HistoryDealGetInteger(ticket, DEAL_TYPE);
      double volume = 0.0;
      if(deal_type == DEAL_TYPE_BUY)
         volume = HistoryDealGetDouble(ticket, DEAL_VOLUME);
      else if(deal_type == DEAL_TYPE_SELL)
         volume = HistoryDealGetDouble(ticket, DEAL_VOLUME)*(-1);
      else
         continue;
      ulong magic = HistoryDealGetInteger(ticket, DEAL_MAGIC);
      AddVolume(magic, volume);
   }
   prev_deals = HistoryDealsTotal();
}
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnTick()
{
   ParseDeals();
   for(int i = 0, k = 0; i < PositionsByMagic.Count(); i++)
   {
      ulong magic = PositionsByMagic.GetKeyAt(i);
      double valume = PositionsByMagic.GetValueAt(i);
      if(k == 10)
         break;
   }
}
//+------------------------------------------------------------------+

注目!簡略化のため、コードは現在のシンボルのネットボリュームのみを計算します。また、現在の実装のCHashMapには列挙型のイテレータがないので、急遽、そのようなイテレータを作りました。変更後のCHashMapは添付ファイルのとおりです。

ファイル:
HashMapGen.mqh  25 kb
 
fxsaber

テスターの速度は、取引に重要なのでしょうか?そうであれば、HashMapはTSの開発・実行速度を上げるので、取引にも影響する。

テスター、最適化とトレーディングは別物です。

1と同じアイデアが取引され、最適化されていますが、実装が劇的に異なる場合があり、それはあまりにも議論の余地のないものです。しかし、データの保存や抽出、少なくともオプティマイザのためのこれらの効率的なアルゴリズムを使用する必要があるタスクの具体例は、取引のために以来、誰もが例を与えることができますか?

 
アレクセイ・オレシキン

自動売買システムで取引しようと思ったら、少なくともオプティマイザには、こうしたデータの保存と検索に関する効率的なアルゴリズムが必要となるようなタスクの例は、取引には存在しないので、挙げることはできない。

トレーディング、自動売買システム、ストラテジーテストに関するフォーラム

汎用クラスライブラリ - バグ、説明、問題、使用例、提案

fxsaber さん 2017.12.08 22:46

より現実的なテスターケース(2000トレード、1,000,000シングルヒストリーアクセス)の場合、結果は以下のようになります。

2017.12.05 00:00:00   Time[Print(SumProfit(Deals,GetDealProfitFull))] = 122969
2017.12.05 00:00:00   Time[SetHashMap()] = 816
2017.12.05 00:00:00   4829800340.792288
2017.12.05 00:00:00   Time[Print(SumProfit(Deals,GetDealProfitHashClear))] = 23852
2017.12.05 00:00:00   Time[HistorySelect(0,INT_MAX)] = 1
2017.12.05 00:00:00   4829800340.792288
2017.12.05 00:00:00   Time[Print(SumProfit(Deals,GetDealProfitClear))] = 114427

1パスあたり約100msの短縮を実現例えば、10,000回のフルパスでOptimizeを実行した場合、Hashバリアントは15分早く 終わります。

 
ワシリー・ソコロフ

例2:ネット口座で複数のEAを取引する場合

フォゲット
prev_deals = HistoryDealsTotal();


良い例です!本当に便利です。

 
fxsaber
フォゲット

良い例です確かに便利です。

修正しました。

 

他人のものを使って依存するニュアンスを整理するよりも、自分で作った方が楽なバイクがある。

ジェネリックはそういうバイクではありません。早く正確に書けない。完成させればいいだけの話なのだが。

 
fxsaber

素晴らしい理論的な例です実際に、何千ものトレードを運用したことがある人はいますか?

p.s.私は、それがガラクタであり、誰も必要としていないことを証明したいわけではありません。リアルトレードのための価値を理解しようとしている。私は理論家では全くなく、純粋な実践者なのです。

 
アレクセイ・オレシキン

実際に、何千回もトレードした人はいるのでしょうか?

オン・フォート・エブリファースト