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

 
fxsaber:

パフォーマンス測定を書けば、比較できて面白いかもしれませんね。

なるほど。どうぞ。
私のパートはこちらです。
私はボールから次のテストインジケータを提案します(黄色でマークされたものは、TF間の配列構造の保存と復元を担当しています):
最初に呼び出されると、ウィンドウ内のランダムノードの配列(デフォルトでは100)が生成され、ベジェ曲線で接続されます。
TF を変更した場合、時刻と価格に連動するノードは保存され、変更されない。
より良い計量化のためには、ノード数を 1000 にするのが良い。

#property indicator_chart_window
#include <Canvas\iCanvas.mqh> //https://www.mql5.com/ru/code/22164
#include <CVar\StructArr.mqh>
#define  SIZE 100

struct Node {
   datetime time;
   double price;
};
Node line[];

ulong t0 = GetMicrosecondCount();
CStructArr<Node> Var("Bezier",line);
ulong t1=GetMicrosecondCount()-t0;

int OnInit() {
   if (ArraySize(line) == 0) GenerateLine();
   else {
      Print("Востановление данных - " + string(t1)+ " микросекунд");
      Print("Время uint[] -> T[] - " + string(Var.uint_to_t)+ " микросекунд");
   }
   DrawBezier(line);
   return(INIT_SUCCEEDED);
}

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[]) {
   return(rates_total);
}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void GenerateLine() {
   ArrayResize(line,SIZE);
   for (int i = 0; i<SIZE; i++) {
      line[i].time = Canvas.TimePos(double(rand() % W.Width));
      line[i].price = Canvas.Price(rand() % W.Height);
   }
   t0 = GetMicrosecondCount();
   Var.Set(line);
   t0 = GetMicrosecondCount()-t0;
   Print("Сохранение данных - " + string(t0)+ " микросекунд");
   Print("Время T[] -> uint[] - " + string(Var.t_to_uint)+ " микросекунд");
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void DrawBezier(Node &arr[]) {
   int size = ArraySize(arr);
   if (size>1) {
      Canvas.Erase(0x00FFFFFF);
      int X[],Y[];
      ArrayResize(Y,size);
      ArrayResize(X,size);
      for(int i=0; i<size; i++) {
         X[i] = (int)Canvas.X(line[i].time);
         Y[i] = (int)Canvas.Y(line[i].price);
      }
      Canvas.PolylineSmooth(X,Y,0xFFFF00FF,3);
      Canvas.Update();
   }
}
//+------------------------------------------------------------------+

2021.07.11 04:41:02.705 TestVar (EURUSD,M6)     Сохранение данных - 15 микросекунд
2021.07.11 04:41:02.705 TestVar (EURUSD,M6)     Время T[] -> uint[] - 4 микросекунд
2021.07.11 04:42:03.085 TestVar (EURUSD,M10)    Востановление данных - 317 микросекунд
2021.07.11 04:42:03.085 TestVar (EURUSD,M10)    Время uint[] -> T[] - 4 микросекунд
2021.07.11 04:42:10.012 TestVar (EURUSD,M12)    Востановление данных - 878 микросекунд
2021.07.11 04:42:10.012 TestVar (EURUSD,M12)    Время uint[] -> T[] - 4 микросекунд
2021.07.11 04:42:44.235 TestVar (EURUSD,M30)    Востановление данных - 1061 микросекунд
2021.07.11 04:42:44.235 TestVar (EURUSD,M30)    Время uint[] -> T[] - 8 микросекунд
2021.07.11 04:43:20.556 TestVar (EURUSD,M20)    Востановление данных - 303 микросекунд
2021.07.11 04:43:20.556 TestVar (EURUSD,M20)    Время uint[] -> T[] - 4 микросекунд
2021.07.11 04:43:25.339 TestVar (EURUSD,M15)    Востановление данных - 443 микросекунд
2021.07.11 04:43:25.339 TestVar (EURUSD,M15)    Время uint[] -> T[] - 5 микросекунд


をSIZE=1000とした場合。

2021.07.11 05:01:32.602 TestVar (EURUSD,M5)     Сохранение данных - 41 микросекунд
2021.07.11 05:01:32.602 TestVar (EURUSD,M5)     Время T[] -> uint[] - 26 микросекунд
2021.07.11 05:01:36.541 TestVar (EURUSD,M6)     Востановление данных - 586 микросекунд
2021.07.11 05:01:36.541 TestVar (EURUSD,M6)     Время uint[] -> T[] - 64 микросекунд
2021.07.11 05:01:38.317 TestVar (EURUSD,M10)    Востановление данных - 648 микросекунд
2021.07.11 05:01:38.317 TestVar (EURUSD,M10)    Время uint[] -> T[] - 35 микросекунд
2021.07.11 05:01:40.534 TestVar (EURUSD,M12)    Востановление данных - 567 микросекунд
2021.07.11 05:01:40.534 TestVar (EURUSD,M12)    Время uint[] -> T[] - 36 микросекунд
2021.07.11 05:01:42.814 TestVar (EURUSD,M15)    Востановление данных - 449 микросекунд
2021.07.11 05:01:42.814 TestVar (EURUSD,M15)    Время uint[] -> T[] - 44 микросекунд
2021.07.11 05:01:45.015 TestVar (EURUSD,M20)    Востановление данных - 728 микросекунд
2021.07.11 05:01:45.015 TestVar (EURUSD,M20)    Время uint[] -> T[] - 59 микросекунд
2021.07.11 05:01:47.536 TestVar (EURUSD,M30)    Востановление данных - 2349 микросекунд
2021.07.11 05:01:47.536 TestVar (EURUSD,M30)    Время uint[] -> T[] - 45 микросекунд
ファイル:
TestVar.mq5  6 kb
StructArr.mqh  3 kb
 

MQLでは、グローバルな インジケータ変数に対する何らかのポインタがあれば最高です。これらは、インジケーターのインストール時に一度だけ初期化されます。

例えば、
intglobal Var;

。この場合、これらのリソースはすべて必要ないでしょう。夢を見るのはやめて、前に進みましょう。

 
Nikolai Semko:

これが私の作品です。

        array out of range in 'iCanvas.mqh' (114,55)
 
Mikhail Nazarenko:

MQLでは、グローバルな インジケータ変数に対する何らかのポインタがあれば最高です。これらは、インジケーターのインストール時に一度だけ初期化されます。

例えば、
intglobal Var;

。この場合、これらのリソースはすべて必要ないでしょう。夢を見るのはやめて、前に進みましょう。

PersistentStorageの他に、ServerSideStorage(ちょっとしたものでもサーバーサイドに保存する)、AuthorOwnedCloud(一部のデータを作者が管理できるようにする)などがあればいいのですが...21世紀のものですね :-)...

夢よ、もういい...。

 
Nikolai Semko:

TFが変わっても、時間や価格に連動するノードは保持され、変化しない。

これはアレイキャストの統計的な指標となるのでしょうか?

 
Taras Slobodyanik:

:)

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


MQのこのソリューションはどこにあるのでしょうか?
 

fxsaber:

  array out of range in 'iCanvas.mqh' (114,55)



最新版 1.43
https://www.mql5.com/ru/code/22164 古いバージョンのようです。

ファイル:
iCanvas.mqh  52 kb
 
fxsaber:

これはアレイキャストの統計的な指標となるのでしょうか?

誰もあなたが自分で調整することを止めはしません。

HH
あと、文字列の話は勘弁してください。
この種のタスクでは、これらは無関係です。そのため、私のクラスには実装されていませんし、私の構造体は文字列型を 含むことができません。
クラスで実装されていますよね。しかし、私たちは別のことを話しているのです。

 
PapaYozh:

MQのこのソリューションはどこにあるのでしょうか?

そう、もちろん、こうした解決策はまったく存在しないのです。

そこでユーザーは、FileWriteStructや GlobalVariableSetといった「松葉杖型自転車」を考案した。
そして、最も松葉づえのいらない解決策は、もちろん、変数をリソースに書き込むことと、構造体をグローバル変数に書き込むことである)

 
Nikolai Semko:


最新版 1.43
https://www.mql5.com/ru/code/22164 古いバージョンのようです。

エラーが発生したバージョンです。