他のタイムフレームに移動する際、インジケーターのグローバル変数の構造を変更するにはどうすればよいですか? - ページ 4

 
Nikolai Semko:
個人的には、ユニオン経由でリソースを利用しています。
構造体のアレイも、ファイルに書き込む ことなく、TF間で簡単に転送できる。

そのあたりを詳しく教えてください。ありがとうございます。

 
Mikhail Nazarenko:

そのあたりを詳しく教えてください。ありがとうございます。

今度、QBに書いておきますね。
実は、そのための授業がここにある。
そして、インジケータに2行を追加するだけです:

  • OnInit の前にこのクラスのインスタンスを作成し、TF 間で受け渡しする構造体の配列をリンクします。最初の初期化でない場合、構造体の配列は前のTFからのデータで満たされる。
  • OnDeinitで、このクラスの1つのメソッドを介して配列を保存します。

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に書いておきますね。
実は、そのための授業がここにある。
そして、インジケータでは、次の2行を追加するだけです:

  • OnInit の前にこのクラスのインスタンスを作成し、TF 間で受け渡しする構造体の配列をリンクします。最初の初期化でない場合、構造体の配列は前のTFからのデータで満たされる。
  • OnDeinitでは、このクラスの1つのメソッドで配列を保存します。

グローバル ターミナル変数を使って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の代わりにloopを使用していることです。この修正後、私のコードはパフォーマンスと可読性の点でほぼ完璧なものになります。

 
Nikolai Semko:

今見えている唯一のバグは、CopyArrayの代わりに、ところどころでループを使っていることです。この修正後、私のコードはパフォーマンスと 可読性の点でほぼ完璧な ものになります。

性能測定を書けば、比較できて面白いかもしれませんね。

 

:)

誰も「松葉杖」「車輪の再発明」「別端末へのデータ転送の困難さ」「MQL手段で解決しなければならない」...などと書かないのが不思議です。
メタクオーツに基づく解決策は松葉杖とモウベツなトンであることが判明した)