ライブラリ: JSONシリアライズとデシリアライズ(ネイティブMQL) - ページ 8

 
o_o:

ライブラリはMQL4とMQL5で動作します。

感謝の気持ちは、MQLのウェブリソースを使った実践的な仕事の例という形で受け取ります。)


こんにちは!

ライブラリをありがとうございます!

私は暗号通貨マイニングのためのプールに接続されたコンピュータの作業を監視するためにあなたのライブラリを使用しました。

プール(のウェブサイト)は、ステータスクエリに応答して、次のような形式で応答を返します:

/*

{"status": "OK",

"data":[

{"worker": "riga1", "lastSeen":1511432055, "currentHashrate":2746.6666666666665,"validShares":103,"invalidShares":0,"staleShares":null},

{"worker":"riga2","lastSeen":1511432068,"currentHashrate":3040,"validShares":114,"invalidShares":1,"staleShares":null},

{"worker":"riga3","lastSeen":1511432057,"currentHashrate":2426.6666666666665,"validShares":91,"invalidShares":0,"staleShares":null},

{"worker":"riga4","lastSeen":1511432055,"currentHashrate":2266.6666666666665,"validShares":85,"invalidShares":0,"staleShares":null},

{"worker":"riga5","lastSeen":1511432061,"currentHashrate":2666.6666666666665,"validShares":100,"invalidShares":0,"staleShares":null},

{"worker":"riga6","lastSeen":1511432050,"currentHashrate":2293.3333333333335,"validShares":86,"invalidShares":0,"staleShares":null},

{"worker":"riga7","lastSeen":1511432069,"currentHashrate":1013.3333333333334,"validShares":38,"invalidShares":0,"staleShares":null}]}

*/

RIGA1、RIGA2など。- これらはコンピュータであり、その "currentHashrate "が閾値を下回らないように監視する必要がある。

コードは非常にシンプルだ:

void Fly_API_Monitor()
{

int res=0; string url;  string cook=""; string ref=""; string res_header=""; 
char result[]; 
char data[];
string strRes="";
// Тут вписывается свой кошелек
string wallet="t1L8S ............";
ResetLastError();
url="https://api-zcash.flypool.org/miner/" + wallet + "/workers/monitor"; 
res=WebRequest("GET", url, cook, ref, 5000, data,0, result, res_header);
strRes=CharArrayToString(result,CP_ACP);
if (res !=-1)
{
//Print("No error");
//Print(strRes);
CJAVal dataM;
dataM.Deserialize(strRes);
string stat=dataM["status"].ToStr();
int i=0;
for(i=0; i< ArraySize(dataM["data"].m_e); i++) 
{ 
Print(dataM["data"].m_e[i]["worker"].ToStr()+「ハッシュレート: "+ dataM["data"].m_e[i]["currentHashrate"].ToStr());
}
}
else 
{
Print(「エラー+IntegerToString(GetLastError()));
Print(strRes);
}
}

のように出力する:

riga7 ハッシュレート:826.6666

riga6 ハッシュレート:2293.333

riga5 ハッシュレート:3200.

riga4 ハッシュレート: 1866.666

riga3 ハッシュレート:2800

riga2 ハッシュレート:2853.333

riga1 ハッシュレート:2933.333


 

ライブラリーの開発者には感謝するが、動作は非常に遅かった。通常、製品やコードを出す前に、プロファイリングを行うべきだが、この場合、ライブラリーは無料なので、文句を言う必要はない:

было:

        virtual CJAVal* AddBase(const CJAVal &item) { int c=ArraySize(m_e); ArrayResize(m_e, c+1); m_e[c]=item; m_e[c].m_parent=GetPointer(this); return GetPointer(m_e[c]); } // 追加
        virtual CJAVal* NewBase() { int c=ArraySize(m_e); ArrayResize(m_e, c+1); return GetPointer(m_e[c]); } // 追加

стало:

        virtual CJAVal* AddBase(const CJAVal &item) { int c=ArraySize(m_e); ArrayResize(m_e, c+1, 50000); m_e[c]=item; m_e[c].m_parent=GetPointer(this); return GetPointer(m_e[c]); } // 追加
        virtual CJAVal* NewBase() { int c=ArraySize(m_e); ArrayResize(m_e, c+1, 50000); return GetPointer(m_e[c]); } // 追加

そうでなければ、以前はこうだった(この画面のウェブ・リクエスト自体にかかった時間は16,718,439で、残りの処理はすべて):

そして調整後(矢印は同じウェブリクエストを示す):

ほぼ20倍速くなった。

 
Daniil Kurmyshev:

なぜ5万人なのか?

20,000,000でも100,000でもなく?

--

どのようなテストデータを使ったのですか?

 

合計で10000からであることが判明したデータに - 30000、この理由のために私は予備と50000を選んだ)が、以前は配列内の約280の値にこのライブラリを使用し、このバージョンでは、500で十分ですが、50000は確かにシステムのリソースを持っている人のためのものです。

 

ドキュメントによると、reservationパラメータは単にメモリの再割り当ての回数を減らすだけです。

パラメータ100 (1000, 10000)のテストサンプルを確認してください。

この場合、プロファイリング画面ではどのような速度向上が見られますか?

 
o_o:

ドキュメントによると、reservationパラメータは単にメモリの再割り当ての回数を減らすだけです。

パラメータ100 (1000, 10000)のテストサンプルを確認してください。

プロファイリング画面での速度向上はどうなりますか?


はい、その通りです。個人的に最適な再分配のパラメータをピックアップしたのですが、一番長い関数はデシリアライズです。プロファイリング、メモリ再配置パラメータ5000のスクリーンショットを添付します。


 

1.12

ArrayResizeに ステップ100を設定

ファイル:
JAson.mqh  31 kb
 
プロファイラーは 最適化されていないコードで動作することに注意してください。

したがって、非常に優れたオプティマイザを使用した後にリリースで再コンパイルすると、ボトルネックはまったく別のゾーンに移動します。

プロファイラのセミリリース最適化については、もう少し後で試してみる予定です。そこにはかなり多くの問題点があります。
削除済み  
このネイティブなMQLと高速ライブラリに感謝します。JSON配列やオブジェクトを操作するときに特別な、それらからデータを抽出する方法のドキュメントがあれば、より便利でしょう:
仮に:
[[0.88678,true],[0.88668,false]]
、これをDeserialize 後にMQL型にマッピングするにはどうすればよいですか?

 

スペシャリストの皆様へ私はまだオブジェクト指向プログラミングが得意ではありません。(私はまだオブジェクト指向プログラミングが得意ではないので、ライブラリ自体のコードやBTC-E取引所に特化した記事を理解することができません。 そのため、 )の投稿のように簡単な例をお願いしています。

私はWEX.NZ取引所の2つのパブリックapiを解析する必要があります。

https://wex.nz/api/3/info

{
  "server_time": 1519120845,
  "pairs": {
    "btc_usd": {
      "decimal_places": 3,
      "min_price": 0.1,
      "max_price": 500000,
      "min_amount": 0.001,
      "hidden": 0,
      "fee": 0.2
    },
    "btc_rur": {
...

ここから、私はすべての利用可能なペア(btc_usd、btc_rur、...)を配列に取得する必要があります(パラメータなしでペア名だけ、私は既知の名前でパラメータを取得することができます...)。


https://wex.nz/api/3/depth/btc_usd

{
  "btc_usd": {
    "asks": [
      [
        11550,
        0.00998
      ],
      [
        11559.9,
        0.01731136
      ],
...
      ]
    ],
    "bids": [
      [
        11506.031,
        1.756
      ],
      [
        11506.03,
        1.23
      ],
...
      ]
    ]
  }
}


そして、ここから2つの配列(asksとbids)に注文の価格と値を取得します。

助けていただけるとありがたいです!よろしくお願いします!