記事"MQL5 (MQL4)から MySQL データベースにアクセスする方法"についてのディスカッション - ページ 19

 
MySQLのDBコードページUTF8で非英語の単語を保存できるように、このプロジェクトを ローカルで修正しました。
 
Amy Liu:
このプロジェクトをローカルで修正し、MySQL DBのコードページUTF8で非英語の単語を保存できるようにした。

Amyさん、こんにちは。自分でやる時間がなかったんだ。もしよろしければ、コミュニティとソースを共有していただけますか?

 

皆さん、こんにちは!

残念ながら、私はこのプロジェクトをサポートしたり、コミュニティで時間を過ごす時間がありません。

でも、ここにいる何人かの経験豊かな人たちが、他の人たちを助けてくれるのを見て、本当にうれしく思っています。

私のライブラリを使い、その機能を 拡張し、あなた自身の経験を得ることに感謝します。

皆さんのプロジェクトに幸あれ!


よろしくお願いします、

ユージン

 
dragossh:

こんにちは、エウゲニー・ルゴヴォイ、

まずは、このプロジェクトのために時間を割いてくれてありがとう。

可能であればリアルタイムで、取引口座のすべてのオープン/クローズ取引をMySQLテーブルにインポート/更新する方法を何週間も探していました。

よろしくお願いします。

ドラゴス

こんにちは、Dragos!

もちろん、このライブラリを使用してEAを構築し、Mysqlデータベースにデータを挿入して最新の状態に保つことができます(リアルタイム更新に近い)。

注意していただきたいのは、MT4/5の決済注文は、履歴タブに表示されているときのみプログラムで利用可能です。そのため、Historyに直近3日間のフィルターを設定すると、その期間に処理された取引のみにアクセスできます。

これはこのライブラリに依存しているわけではなく、MQL-MT4のインフラストラクチャに過ぎません。

ありがとうございます、

ユージン

 

アクセス違反 read to 0x000003B0 in '゙MQL4↩libraries゙MQLMySQL.dll'.

どこを掘ればいいのか教えてください。

OS win 10, mariadb 5.5.59
 

ユージーン、

今回も素晴らしい出来でした。

好奇心旺盛なあなたや他の誰かが、ストラテジーテスターで これを動作させようとしましたか?スクリプトをライブ環境のインディーに展開したところ、すべてOKでしたが、バックテスト環境ではうまくいきませんでした。


ジョージ

 
Eugeniy Lugovoy:

こんにちは、エイミー。素晴らしいよ。自分でやる時間がなかったんだ。もしよろしければ、コミュニティでソースを共有してもらえますか?

Eugeniyさん、こんにちは、

返事が遅くなってごめんなさい。あなたのコードで私がやったことは以下の通りです。MultiByteToWideCharを 使用するようにcMySqlGetRowField 関数を 修正しただけです。元のコードは比較のためにコメントされています。

// フィールドの値の文字列表現を返す
// MySqlCursorFetchRow() の後に呼び出す必要があります。
// pCursorID - CURSOR IDENTIFIER
// pField - SELECTリストのフィールド番号(0から始まる) - 0,1,2 など。
MT4_EXPFUNC wchar_t* __stdcall cMySqlGetRowField(int pCursorID, unsigned int pField)
{
        SCOPE_LOCK_MUTEX(g_mutex.get());
        ClearCursorErrors(pCursorID);
        if ((pCursorID >= 0) && (pCursorID < MAX_CURSORS) && (Cursors[pCursorID].Id!=-1))
        {
                if ((pField >= 0) && (pField < mysql_num_fields(Cursors[pCursorID].RecordSet)))
                {
                        // 预算-缓冲区中宽字节的长度
                        int unicodeLen = MultiByteToWideChar(CP_UTF8, 0, Cursors[pCursorID].CurrentRow[pField], -1, nullptr, 0);
                        if (unicodeLen<=1024)
                        {
                                // 开始向缓冲区转换字节
                                MultiByteToWideChar(CP_UTF8, 0, Cursors[pCursorID].CurrentRow[pField], -1, Cursors[pCursorID].Value, unicodeLen);
                                return(Cursors[pCursorID].Value);
                        }
                        //sprintf_s(Cursors[pCursorID].Value, "%s", Cursors[pCursorID].CurrentRow[pField]);
                        //swprintf(Cursors[pCursorID].Value, 1024, L"%S", Cursors[pCursorID].CurrentRow[pField]);
                        //return (Cursors[pCursorID].Value);
                }
                else
                {
                        Cursors[pCursorID].CursorErrorNumber = -4;
            swprintf(Cursors[pCursorID].CursorErrorDescription, 32, L"Wrong number of field.\x00");
                }
        }
        else
        {
                CursorErrorNumber = -5;
                swprintf(CursorErrorDescription, 32, L"Wrong CURSOR identifier.\x00");
        }
        return (WideNull);
}
 

こんにちは:

ある端末でExpert Advisorが動作しているときは何の問題もないのですが、別の端末で同じExpert Advisorを実行すると、常に以下のエラーが表示されます:

Cursor #0 closing error:-5: CURSOR identifier が間違っています。

何が問題なのでしょうか?

 
Dmitry Melnichenko:

同僚の皆さん、こんにちは:

ある端末でExpert Advisorが動作しているときは何の問題もないのですが、別の端末で同じExpert Advisorを実行すると、常にこのようなエラーが表示されます:

Cursor #0 closing error:-5: CURSOR identifier が間違っています。

何が問題なのでしょうか?

別の認証情報で接続してみてください。つまり、MySQL 用の別のログイン/パスで接続します。つまり、データベースに対して適切な権限を持つ別のログインを作成します。

そして、トランザクションモードで作業してください。


 
Maxim Kuznetsov:

別の認証情報で接続してみてください。つまり、MySQL に別のログイン名/パスで接続します。つまり、データベースへの適切な権限を持つ別のログインを作成します。

にログインし、トランザクショナルモードで作業します。


新しいユーザを作成し、彼の認証情報で接続してみましたが、役に立ちませんでした!