通用类库 - 错误、说明、问题、使用功能和建议 - 页 16

 
fxsaber:

有趣的是。这里有一个问题。我不喜欢目前的实施方式,并对其进行了调整。当然,它是歪的。我怎样才能得到圣经原文?

这里--从1702年开始

附加的文件:
Generic.zip  44 kb
 
阿尔乔姆-特里什金

这里--从1702年开始

谢谢你!我将把这个问题交给开发人员。由于我是一个有点直肠子的人...

 

例2:在一个净账户上交易多个EA

对于那些同时在同一个符号上交易多个专家顾问的人来说,净定位是一个令人头痛的问题。为了处理两个EA都处于对冲状态的情况,但需要了解没有净头寸并不真正表明他们不在市场中,产生了一个复杂的代码。一个解决方案是计算每个专家对总职位的贡献。要做到这一点,我们需要分析整个历史,并计算出哪些合同数属于每个独特的Medgie。如果这个数字是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的速度。

测试员,优化和交易是不同的事情。

一个相同的想法是交易和优化,但实施起来会有很大的不同,这也是无可争议的。但有一个具体的例子,即有必要使用这些高效的算法进行数据存储和提取的任务,至少对优化器来说是这样,因为对于交易来说,谁能举出一个例子?

 
阿列克谢-奥列什金

如果我想用自动交易系统进行交易,我将无法举出任何需要这些高效的数据存储和检索算法的任务的例子,至少对优化器来说 是这样,因为交易没有这种算法 ?

关于交易、自动交易系统和策略测试的论坛

通用类库 - 错误、描述、问题、用例和建议

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

每个通道几乎节省100毫秒!比如说,我们对10000个完整的通过进行优化,哈希变体最终会快15分钟

 
瓦西里-索科洛夫

例2:在一个净账户上交易多个EA

遗忘
prev_deals = HistoryDealsTotal();


一个好的例子!真的很方便。

 
fxsaber:
遗忘

好榜样!确实很方便。

纠正了。

 

有的自行车自己制造比理清使用别人的自行车的细微差别并依赖他们更容易。

通用型不是那种自行车。你不可能快速而正确地写出来。这将只是一个完成它的问题。

 
fxsaber:

很好的理论例子!在实践中,有没有人操作过成千上万的交易?

p.s. 我不是要证明它是垃圾,没有人需要它。我正在努力理解对真实交易的价值。我根本就不是一个理论家,而是一个纯粹的实践者。

 
阿列克谢-奥列什金

在实践中,有没有人做过成千上万的交易?

关于堡垒的每一个第一。