当转移到另一个时间框架时,我如何改变指标中的全局变量结构? - 页 4

 
Nikolai Semko:
就个人而言,我通过工会使用资源。
即使是结构的阵列也很容易在TF之间转移,而不需要写到文件 中。

你能否详细说明一下。谢谢你。

 
Mikhail Nazarenko:

你能详细说明一下吗?谢谢你。

有机会我会把它写在QB里。
实际上,这里是它的班级。
而你只需要在指标中添加两行:

  • 在OnInit之前创建这个类的一个实例,链接你的结构数组,在TF之间传递。如果不是第一次初始化,结构数组将被前一个TF的数据填满。
  • 在OnDeinit,通过这个类中的一个方法保存你的数组。

template <typename T>
class CStructArr {
 private:
   union StructUint {
      T st;
      uint u[1+sizeof(T)/4];
   };
   string            Name;
   uint              Var[];
   int               w;
   int               h;
   StructUint        su;
   int               size;

 public:
   CStructArr(const string name,T &var[]);
   ~CStructArr();
   bool              Set(T &var[]);
   //bool              Save();
   T                 value[];
};
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
template <typename T>
CStructArr::CStructArr(const string name,T &var[]) {
   //ulong tt=GetMicrosecondCount();
   size = ArraySize(var);
   w=1+size*sizeof(T)/4;
   ArrayResize(Var,w);
   h=1;
   Name="::"+name+ IntegerToString(ChartGetInteger(0,CHART_WINDOW_HANDLE));
   if(ResourceReadImage(Name,Var,w,h)) {
      size = 4*(w-1)/sizeof(T);
      ArrayResize(value,size);
      ArrayResize(var,size);
      for (int j=0; j<size; j++) {
         for(int i=0; i<sizeof(T)/4; i++) su.u[i]=Var[j*sizeof(T)/4+i];
         value[j]=su.st;
         var[j]=value[j];
      }
   } else {
      for (int j=0; j<size; j++) {
         su.st=var[j];
         for(int i=0; i<sizeof(T)/4; i++) Var[j*sizeof(T)/4+i]=su.u[i];
         value[j]=var[j];
      }
      if(!ResourceCreate(Name,Var,w,1,0,0,0,COLOR_FORMAT_XRGB_NOALPHA)) printf("Error create Resource: "+DoubleToString(GetLastError(),0));
   }
   //tt=GetMicrosecondCount()-tt;
   //Print("!!!!!!!!  =  "+string(tt));
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
template <typename T>
CStructArr::~CStructArr() {
   if(_UninitReason!=REASON_RECOMPILE && _UninitReason!=REASON_CHARTCHANGE) ResourceFree(Name);
}
//+------------------------------------------------------------------+
template <typename T>
bool CStructArr::Set(T &var[]) {
   size = ArraySize(var);
   ArrayResize(value,size);
   w=1+size*sizeof(T)/4;
   ArrayResize(Var,w);
   for (int j=0; j<size; j++) {
      su.st=var[j];
      for(int i=0; i<sizeof(T)/4; i++) Var[j*sizeof(T)/4+i]=su.u[i];
      value[j]=var[j];
   }
   if(!ResourceCreate(Name,Var,w,1,0,0,0,COLOR_FORMAT_XRGB_NOALPHA)) {
      printf("Error create Resource: "+DoubleToString(GetLastError(),0));
      return(false);
   } else return(true);
}
//+------------------------------------------------------------------+
在我看来,使用全局 终端变量在TF之间传递参数是一个非常笨拙的解决方案。
 
Nikolai Semko:

有机会我会把它写在QB里。
实际上,这里是它的班级。
而在该指标中,你只需要添加两行:

  • 在OnInit之前创建这个类的一个实例,并绑定你的结构数组,在TF之间传递。如果不是第一次初始化,结构数组将被前一个TF的数据填满。
  • 在OnDeinit中,通过这个类中的一个方法保存你的数组。

我认为使用全局 终端变量在TF之间传递参数是一个非常歪曲的解决方案。

谢谢,这都是有道理的。

 
Nikolai Semko:

事实上,这里是它的班级。

乍一看,实现T[]<->uint[]的转换并不理想。
 
fxsaber:
乍一看,实现T[]<->uint[]的转换并不理想。

很久以前就写过这段代码。这可能是。
不过,那里没有什么值得优化的地方。也许只是在一些小事情上。
总之,这门课可以在我最新的市场免费产品中试用。

如果你能建议一个更好的实现方法,我将不胜感激。

 
Nikolai Semko:

如果你能建议一个更好的实现方法,我将不胜感激。

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

图书馆:TradeTransactions

fxsaber, 2019.03.15 07:36

// Быстрый кастинг массивов.
#include <fxsaber\TradeTransactions\Convert.mqh> // https://www.mql5.com/ru/code/22166

void OnStart()
{
  MqlTick Ticks[];

  MqlRates Rates[];  
  CopyRates(_Symbol, PERIOD_CURRENT, 0, 10, Rates); // Получили котировки.
  CONVERT::ArrayToArray(Rates, Ticks);              // Кастинг MqlRates[] -> MqlTick[].

  MqlRates Rates2[];    
  CONVERT::ArrayToArray(Ticks, Rates2);             // Кастинг MqlTick[] -> MqlRates[].
  ArrayPrint(Rates2);                               // Убедились, что все корректно.
}
附加的文件:
Convert.mqh  4 kb
 
Mikhail Nazarenko:
当转移到另一个时间框架时,如何转移指标中的全局变量、结构、对象?在谷歌上搜索了一下,没能找到。

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

图书馆:TradeTransactions

fxsaber, 2018.12.17 23:48

你可以通过资源部交易任何东西。

// Пример обмена любыми данными (включая строковые массивы).

#include <fxsaber\TradeTransactions\ResourceData.mqh> // https://www.mql5.com/ru/code/22166

#define  PRINT(A) Print(#A + " = " + (string)(A));

void OnStart()
{    
  // Произвольные данные для примера
  string Str[] = {"123", "Hello World!"};
  double Num = 5;
  MqlTick Tick = {0};
  Tick.bid = 1.23456;

  const RESOURCEDATA<uint> Resource; // Ресурс для обмена данными
  CONTAINER<uint> Container;         // Создаем контейнер - все будет храниться в массиве простого типа (в примере выбран uint)
  
  // Заполняем контейнер разными данными
  Container[0] = Str;
  Container[1] = Num;
  Container[2] = Tick;
    
  // Распечатаем типы хранимых в контейнере данных
  for (int i = 0; i < Container.GetAmount(); i++)
    PRINT(Container[i].GetType())

  Resource = Container.Data;  // Отправили данные на обмен
  
  CONTAINER<uint> Container2; // Сюда будем получать данные
  
  Resource.Get(Container2.Data); // Получили данные
      
  // Получим данные в исходном виде
  string Str2[];
  Container[0].Get(Str2);                // Получили массив
  ArrayPrint(Str2);

  PRINT(Container[1].Get<double>())      // Получили число
  PRINT(Container[2].Get<MqlTick>().bid) // Получили структуру  
}
 
fxsaber:

不幸的是,不是赤裸裸的。我不会去研究你们的圣经。
我已经试图研究你的代码,发现我还不够成熟。:))

总之,如果你打开所有的内嵌程序,你的代码在源代码和可执行性方面都会更长。

另外,有几次烧了,当时我用了你的解放军,后来发现刹车的源头有很长一段时间,直到被拆掉。在那之后,我放弃了。

使用你的代码的主要困难是调试的高度复杂性,因为每一步都有新的类、定义或宏。
而且我还抽出时间进行测试,因为我明白,我的算法几乎不可能大大加快。
我现在看到的唯一一个错误是在某些地方使用循环而不是CopyArray。在这次修复之后,我的代码在性能和可读性方面将几乎完美。

 
Nikolai Semko:

我现在看到的唯一错误是,我在一些地方使用了循环,而不是CopyArray。在这次修复之后,我的代码在性能 和可读性方面将几乎完美

如果你写一份绩效评估,比较一下会很有意思。

 

:)

奇怪的是,没有人写 "拐杖"、"重塑车轮"、"数据传输到另一个终端的困难"、"问题必须通过MQL手段解决"......。
事实证明,基于metaquotes的解决方案是拐杖和mauvais ton)