記事"MQL5 (MQL4)から MySQL データベースにアクセスする方法"についてのディスカッション - ページ 7 1234567891011121314...30 新しいコメント Eugeniy Lugovoy 2015.04.09 08:00 #61 OK、私はあなたがこの目的のためにエキスパート-アドバイザーを書いていることを見て、それは私が記事に掲載した勧告なしで書かれています。それでは、ステップバイステップで移動してみましょう: 1。1. DB=cMySqlConnect(Host,User,Password,Database,Port,Socket,ClientFlag); "の呼び出しは、OnTick()ではなく、OnInit()標準関数内で行う必要があります。標準関数の内部で行う必要があります。2. cMySqlConnectを 使用していますが 、これはDLLからインポートされた関数です。 関数を 使用する必要があります!3.OnDeinit() stundard 関数の中で MySqlDisconnect 関数を呼び出す必要があります。4.接続が成功したことを確認するために、OnTick() 標準関数内でデータベース接続識別子をチェックする必要があります。最終的には以下のようになります。... your code int DB = -1; // データベース識別子 ... your code int OnInit() { DB = MySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag); if (DB != -1) { // 接続は成功した! // ここでテーブル作成ロジックを定義する } return(INIT_SUCCEEDED); } void OnDeinit(const int reason) { MySqlDisconnect(DB); } void OnTick() { // 最初のコマンド。 if (DB==-1) return; // 接続がないときは何もしない // cMySqlConnectを呼び出さない場合のコード }You have to rebuild your code based on the requirements of project, as I see the currently there is no clear logic, everything messed up. yukai xie 2015.04.09 09:43 #62 elugovoy:OK、私はあなたがこの目的のためにエキスパート-アドバイザーを書いていることを見て、それは私が記事に掲載した勧告なしで書かれています。それでは、ステップバイステップで移動してみましょう: 1。1. DB=cMySqlConnect(Host,User,Password,Database,Port,Socket,ClientFlag); "の呼び出しは、OnTick()ではなく、OnInit()標準関数内で行う必要があります。標準関数の内部で行う必要があります。2. cMySqlConnectを 使用していますが 、これはDLLからインポートされた関数です。 関数を 使用する必要があります!3.OnDeinit() stundard 関数の中で MySqlDisconnect 関数を呼び出す必要があります。4.接続が成功したことを確認するために、OnTick() 標準関数内でデータベース接続識別子をチェックする必要があります。最後に、以下のようになります。 ありがとう、もう一度試して結果を返します。 yukai xie 2015.04.09 10:03 #63 elugovoy:OK、私はあなたがこの目的のためにエキスパート-アドバイザーを書いていることを見て、それは私が記事に掲載した勧告なしで書かれています。それでは、ステップバイステップで移動してみましょう: 1。1. DB=cMySqlConnect(Host,User,Password,Database,Port,Socket,ClientFlag); "の呼び出しは、OnTick()ではなく、OnInit()標準関数内で行う必要があります。標準関数の内部で行う必要があります。2. cMySqlConnectを 使用していますが 、これはDLLからインポートされた関数です。 関数を 使用する必要があります!3.OnDeinit() stundard 関数の中で MySqlDisconnect 関数を呼び出す必要があります。4.接続が成功したことを確認するために、OnTick() 標準関数内でデータベース接続識別子をチェックする必要があります。最終的にはこのようになります。ステップバイステップで変更しましたが、1つのmt4で4つ以上のシンボルでエキスパートを使用すると、問題はまだ存在します。0x0000000B in '.....MQLMySQL.dll'" と表示されます。コードは次のとおりです。<-- #インクルード <MQLMySQL.mqhint MySqlErrorNumber; // 最近の MySQL エラー番号string MySqlErrorDescription; // エラーの説明//+------------------------------------------------------------------+//| エキスパート初期化関数 //+------------------------------------------------------------------+int OnInit()OnInit(); int OnInit()EventSetTimer(timeSeconds);DB = MySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag); if( DB == -1 )if( DB == -1 ){Print("Database is not connected ..."); if( DB == -1 ) { print("Database is not connected .... "); }}return(INIT_SUCCEEDED); }.}//+------------------------------------------------------------------+//| エキスパート初期化関数//+------------------------------------------------------------------+void OnDeinit(const int reason){MySqlDisconnect(DB);EventKillTimer();ObjectsDeleteAll();}void OnTimer(){//Alert(TimeCurrent());OnTick();}//+------------------------------------------------------------------+//| エキスパート・ティック関数nbsp;//+------------------------------------------------------------------+void OnTick(){if( DB == -1 ){Alert("Database is not connected .... "); return; { Alert("Database is not connected ...")return; }.}if( IsExpertEnabled() && IsConnected() && AccountNumber() > 0 && DB != -1 ){int account = AccountNumber();string symbol = Symbol(); if( cmd !if( cmd != "" && cmd != NULL ){symbol = cmd; }.}symbolOrder = symbol + "_table";double spread = (Ask - Bid); } symbolOrder = symbol + "_table"; }.admission = spread*MathPow(10, Digits).//int DB = cMySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag);Query = "SELECT * FROM " + symbol + " where AccountNumber = " + (string)AccountNumber();//Print(Query);int Cursor1 = MySqlCursorOpen(DB, Query);if (Cursor1 >= 0){int Rows1 = MySqlCursorRows(Cursor1); int Cursor1 = MySqlCursorOpen(DB, Query); if (Cursor1 >= 0)int dataRows1 = Rows1;//Alert(dataRows);if( dataRows1 > 0 ){Query = "update " + symbol + " set Bid = " + (string)Bid + ", Ask = " + (文字列)アスク+ ", スプレッド = " + DoubleToStr(spread, Digits)+ ", Time = '" + TimeToString(TimeLocal(), TIME_DATE|TIME_SECONDS) + "' where AccountNumber) + "' where AccountNumber = ".+ (string)account; // + "' and Symbol = '" + symbol + "'.".MySqlExecute(DB, Query);MySqlCursorClose(Cursor1);}else if( dataRows1 == 0 ){Query = "CREATE TABLE IF NOT EXISTS " + symbol + " (id int NOT NULL AUTO_INCREMENT PRIMARY KEY, AccountNumber int, "+ "シンボル char(20), Bid double, Ask double, Spread double,"+ "メモ char(50), "+ ENGINE=MEMORY DEFAULT CHARSET=utf8 ";MySqlExecute(DB, Query);Query = "INSERT INTO " + symbol + "(AccountNumber, Symbol, Bid, Ask, Spread.メモ, 時間) VALUES ("+ (string)account + ", '" + symbol + "', "+(string)Bid+", "+ (string)Ask + "、"+ DoubleToStr(スプレッド、桁)+ ", '" + (文字列)AccountCompany()+ "', \'"+TimeToString(TimeLocal(), TIME_DATE|TIME_SECONDS)+""";)if(MySqlExecute(DB, Query) != true ){//Query = "DROP TABLE IF EXISTS `data_table`";//MySqlExecute(DB, Query);Query = "CREATE TABLE IF NOT EXISTS " + symbol + "(id intNOT NULL AUTO_INCREMENT PRIMARY KEY, AccountNumber int, "+ "シンボル char(20), Bid double, Ask double, Spreaddouble、"+ "メモ char(50), "+ ENGINE=MEMORY DEFAULT CHARSET=utf8 ";MySqlExecute(DB, Query);}}MySqlCursorClose(Cursor1); // カーソルを閉じるのを忘れない !}}}--> Discussion of article "How エキスパートアドバイザー - 雑多な質問 Coding Help Please ! yukai xie 2015.04.09 10:09 #64 elugovoy:OK、私はあなたがこの目的のためにエキスパート-アドバイザーを書いていることを見て、それは私が記事に掲載した勧告なしで書かれています。それでは、ステップバイステップで移動してみましょう: 1。1. DB=cMySqlConnect(Host,User,Password,Database,Port,Socket,ClientFlag); "の呼び出しは、OnTick()ではなく、OnInit()標準関数内で行う必要があります。標準関数の内部で行う必要があります。2. cMySqlConnectを 使用していますが 、これはDLLからインポートされた関数です。 関数を 使用する必要があります!3.OnDeinit() stundard 関数の中で MySqlDisconnect 関数を呼び出す必要があります。4.接続が成功したことを確認するために、OnTick() 標準関数内でデータベース接続識別子をチェックする必要があります。最終的には以下のようになる。問題は、1つのmt4で2つ以上のシンボルで使用できないことで、1つのシンボルで使用する場合は正常です。 4つ以上のシンボルで使用する場合は正常ですが、数分後に "OnTick() "という問題が表示されます。数分後、"Access violation read to 0x0000000B in '..MQLMySQL.db'"と表示される。.MQLMySQL.dll'」と表示されます。あなたは1つまたは2つのmt4で4つ以上のシンボルでdllを呼び出す1つの専門家を試すことができ、問題を見つけるかもしれません。dllはmemeoyの解放か衣服コレクションを必要とするか。 yukai xie 2015.04.09 11:15 #65 MFCは、終了時に、 CRTが静的デー タの破棄に続いてリークをダンプするのを待た ずに、リー クを早期にダンプします。このため、MFC が初期化される前にメモリを割り当てたオブジェクトや、MFCが終了した後に破棄されたオブジェクト に対して、ο 偽のリーク報告が発生します。nbsp; MFC が初期化される 前にメモリが割り当てられ 、MFC が 終了した後に破棄された オブジェクトのスプリアス・リーク・レポート 。 この現象は、 C++ランタイムDLLも使用するプログラムでMFC DLLを使用する場合によく発生します 。 Eugeniy Lugovoy 2015.04.09 14:36 #66 再びこんにちは。提供されたコードから察するに、あなたはMQLの初心者だと思います。申し訳ありませんが、あなたに教える時間はありません。申し訳ありません、あなたに教える時間はありませんが、私が開発したソフトウェアをテストする時間はあります。 ですから、ここにログを添付します。あなたのロジックに基づき、テスト用EAを構築しました:各テーブルは各通貨ペアに定義され、異なるアカウントのオンライン市場データを保持することができます。アクセス違反のエラーは一つも発生していません。 ログを見ても、"Access violation... "というエラーは一つも出ていません。問題はMQLMySQLライブラリにはありません。EAのテスト。//+------------------------------------------------------------------+ //|  DFTest.mq4 //|&Copyright 2014, MetaQuotes Software Corp. //|&||| http://www.mql5.com //+------------------------------------------------------------------+ #property copyright "Copyright 2014, MetaQuotes Software Corp." #property link "http://www.mql5.com" #property version "1.00" #property strict #include <MQLMySQL.mqh> input string Host = "localhost"; input string User = "root"; input string Password = "ioctrl"; input string Database = "mysql"; input int Port = 3306; input string Socket = ""; input int ClientFlag = 0; input int Timer = 1; // タイマー(秒)は現在使用されていない int DB; int OnInit() { SQLTrace = true; // すべてのクエリがデータベースに送信されることを確認する。 EventSetTimer(Timer); DB = MySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag); if( DB == -1 ) { Print("Database is not connected! Error: ", MySqlErrorDescription); return (INIT_FAILED); } // 存在しなければテーブルを作成する string cmd; cmd = "CREATE TABLE IF NOT EXISTS `" + Symbol() + "` (id int NOT NULL AUTO_INCREMENT PRIMARY KEY, AccountNumber int, " + "Symbol char(20), Bid double, Ask double, Spread double, " + "Memo char(50), " + "Time datetime) ENGINE=MEMORY DEFAULT CHARSET=utf8"; if (!MySqlExecute(DB, cmd)) { Print ("Table creation error: ",MySqlErrorDescription); return (INIT_FAILED); } return(INIT_SUCCEEDED); } void OnDeinit(const int reason) { MySqlDisconnect(DB); EventKillTimer(); } void OnTimer() { // OnTimerからOnTickを呼び出してはならない。 // これら2つの関数のターゲットは異なる } void OnTick() { int account; string symbol; double spread; string Query, cmd; int Cursor; int Rows; if (DB == -1) { Comment("Database is not connected ... "); return; } if ( IsExpertEnabled() && IsConnected() && AccountNumber() > 0 ) { account = AccountNumber(); symbol = "`"+Symbol()+"`"; // テーブル名として使用する場合は、MySQLデータベースのグッドプラクティスとして、引用符を使用する必要があります。 spread = (Ask - Bid); // admission = MarketInfo(symbol, MODE_SPREAD); Query = "SELECT * FROM " + symbol + " where AccountNumber = " + (string)account; Cursor = MySqlCursorOpen(DB, Query); if (Cursor >= 0) { Rows = MySqlCursorRows(Cursor); if ( Rows > 0 ) { cmd = "update " + symbol + " set Bid = "+(string)Bid + ", Ask = " + (string)Ask + ", Spread = " + DoubleToStr(spread, Digits) + ", Time = '" + TimeToString(TimeLocal(), TIME_DATE|TIME_SECONDS) +"' where AccountNumber = " + (string)account; } else { cmd = "INSERT INTO " + symbol + "(AccountNumber, Symbol, Bid, Ask, Spread, Memo, Time) VALUES (" + (string)account + ", \'" + symbol + "\', "+DoubleToStr(Bid,Digits)+","+ DoubleToStr(Ask,Digits) + "," + DoubleToStr(spread, Digits) + ", \'" + AccountCompany() +"\', \'"+TimeToString(TimeLocal(), TIME_DATE|TIME_SECONDS)+"\')"; } if (!MySqlExecute(DB, cmd)) { Print("Updating error: ",MySqlErrorDescription); Print (cmd); } MySqlCursorClose(Cursor); } } } これはライブラリを使用する正しいロジックです。最適化により、SELECT ステートメントを使用せず、UPDATE ステートメントだけを実行することもできます。100% の更新があるので、INSERT ステートメントを適用する。この回避策は、パフォーマンスを向上させ、ネットワークトラフィックを減らすことができます。最後に、 プロジェクトの ソースコード(DLLの開発を含む)が添付されていますので、ご自由に変更してください。もしMqlMySQL.DLLに問題があるようなら、デバッグして自分で修正することもできます。よろしくお願いします。ユージン ファイル: logs.zip 302 kb pedma 2015.05.17 03:35 #67 本当にありがとう。 あなたのコードは私をとても助け、私は多くの時間を節約することができます。私は正常にINSERT、SELECT、UPDATEとDELETEクエリを実行しようとしました。私は間違っていない場合は、 "カーソル "は、SELECTクエリにのみ必要ですか?= ペドマ//+------------------------------------------------------------------+ //|MySQL-006.mq4 //|著作権 2014, Eugene Lugovoy||ユージン・ルゴヴォイ //|http://fxcodexlab.comfxcodexlab.com||http://www. | 選択、挿入、更新、削除クエリ| //| によって修正された:ペドマ| //+------------------------------------------------------------------+ #property copyright "Copyright 2014, Eugene Lugovoy." #property link "http://www.fxcodexlab.com" #property version "1.00" #property strict #include <MQLMySQL.mqh> string INI; //+------------------------------------------------------------------+ //| スクリプト・プログラム開始機能| //+------------------------------------------------------------------+ void OnStart() { string Host, User, Password, Database, Socket; // データベースの認証情報 int Port,ClientFlag; int DB; // データベース識別子 Print (MySqlVersion()); INI = "C:\\This\\Must\\be\\Real\\Path\\To\\MyConnection.ini"; // INIファイルからデータベースの認証情報を読み込む Host = ReadIni(INI, "MYSQL", "Host"); User = ReadIni(INI, "MYSQL", "User"); Password = ReadIni(INI, "MYSQL", "Password"); Database = ReadIni(INI, "MYSQL", "Database"); Port = StrToInteger(ReadIni(INI, "MYSQL", "Port")); Socket = ReadIni(INI, "MYSQL", "Socket"); /// ClientFlag = StrToInteger(ReadIni(INI, "MYSQL", "ClientFlag")); ClientFlag = CLIENT_MULTI_STATEMENTS; Print ("Host: ",Host, ", User: ", User, ", Database: ",Database); // データベース接続を開く Print ("Connecting..."); DB = MySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag); if (DB == -1) { Print ("Connection failed! Error: "+MySqlErrorDescription); return; } else { Print ("Connected! DBID#",DB);} // SELECT文の実行 string Query0,Query1,Query2,Query3,Query4,Query5,Query6,Query7; int i,Cursor1,Cursor3,Cursor5,Cursor7,Rows,total; int vId; string vCode; datetime vStartTime; Query0 = "DROP TABLE IF EXISTS `test_table`"; MySqlExecute(DB, Query0); Query0 = "CREATE TABLE `test_table` (id int, code varchar(50), start_date datetime)"; if (MySqlExecute(DB, Query0)) { Print ("Table `test_table` created."); } else { Print ("Table `test_table` cannot be created. Error: ", MySqlErrorDescription); } //--- データの挿入 Query0 = "INSERT INTO `test_table` (id, code, start_date) VALUES ("+(string)AccountNumber()+",\'ACCOUNT\',\'"+TimeToStr(TimeLocal(), TIME_DATE|TIME_SECONDS)+"\')"; if (MySqlExecute(DB, Query0)) { Print ("Succeeded: ", Query0); } else { Print ("Error: ", MySqlErrorDescription); Print ("Query: ", Query0); } // マルチインサート Query0 = "INSERT INTO `test_table` (id, code, start_date) VALUES (1,\'EURUSD\',\'2014.01.01 00:00:01\');"; Query0 = Query0 + "INSERT INTO `test_table` (id, code, start_date) VALUES (2,\'EURJPY\',\'2014.01.02 00:02:00\');"; Query0 = Query0 + "INSERT INTO `test_table` (id, code, start_date) VALUES (3,\'USDJPY\',\'2014.01.03 03:00:00\');"; if (MySqlExecute(DB, Query0)) { Print ("Succeeded! 3 rows has been inserted by one query."); } else { Print ("Error of multiple statements: ", MySqlErrorDescription); } //--- クエリーを選択、カーソルが必要 ---- Query1 = "SELECT id, code, start_date FROM `test_table`"; Print ("SQL> ", Query1); Cursor1 = MySqlCursorOpen(DB, Query1); if (Cursor1 >= 0) { Rows = MySqlCursorRows(Cursor1); Print (Rows, " row(s) selected."); for (i=0; i<Rows; i++) { if (MySqlCursorFetchRow(Cursor1)) { vId = MySqlGetFieldAsInt(Cursor1, 0); // id vCode = MySqlGetFieldAsString(Cursor1, 1); // コード vStartTime = MySqlGetFieldAsDatetime(Cursor1, 2); // 開始時刻 Print ("ROW[",i,"]: id = ", vId, ", code = ", vCode, ", start_time = ", TimeToStr(vStartTime, TIME_DATE|TIME_SECONDS)); } total += vId; } //--- クエリーに基づいてデータを挿入する Query2 = "INSERT INTO `test_table` (id, code, start_date) VALUES ("+(string)total+",\'ABCDEF\',\'"+TimeToStr(TimeLocal(), TIME_DATE|TIME_SECONDS)+"\'); "; if (MySqlExecute(DB, Query2)) { Print ("Succeeded! 1 new row has been inserted."); } else { Print ("Error inserting data based on SELECT query : ", MySqlErrorDescription); } //--- MySqlCursorClose(Cursor1); // カーソルを閉じるのを忘れないように! } else { Print ("Cursor1 opening failed. Error: ", MySqlErrorDescription); } //--- セレクト用の新しいカーソル Query3 = "SELECT id, code, start_date FROM `test_table`"; Print ("SQL> ", Query3); Cursor3 = MySqlCursorOpen(DB, Query3); if (Cursor3 >= 0) { Rows = MySqlCursorRows(Cursor3); Print (Rows, " row(s) selected."); for (i=0; i<Rows; i++) { if (MySqlCursorFetchRow(Cursor3)) { vId = MySqlGetFieldAsInt(Cursor3, 0); // id vCode = MySqlGetFieldAsString(Cursor3, 1); // コード vStartTime = MySqlGetFieldAsDatetime(Cursor3, 2); // 開始時刻 Print ("ROW[",i,"]: id = ", vId, ", code = ", vCode, ", start_time = ", TimeToStr(vStartTime, TIME_DATE|TIME_SECONDS)); } } //--- データを更新する Query4 = "UPDATE `test_table` SET id=8,code='PQRXYZ',start_date=\'"+TimeToStr(TimeLocal(), TIME_DATE|TIME_SECONDS)+"\' WHERE code='ABCDEF'; "; if (MySqlExecute(DB, Query4)) { Print ("Succeeded! last row has been updated (code ABCDEF => PQRXYZ & new id=8."); } else { Print ("Error updating data of last row : ", MySqlErrorDescription); } //--- MySqlCursorClose(Cursor3); // カーソルを閉じるのを忘れないように! } else { Print ("Cursor3 opening failed. Error: ", MySqlErrorDescription); } //--- 新しいカーソルが必要である。 Query5 = "SELECT id, code, start_date FROM `test_table`"; Print ("SQL> ", Query5); Cursor5 = MySqlCursorOpen(DB, Query5); if (Cursor5 >= 0) { Rows = MySqlCursorRows(Cursor5); Print (Rows, " row(s) selected."); for (i=0; i<Rows; i++) { if (MySqlCursorFetchRow(Cursor5)) { vId = MySqlGetFieldAsInt(Cursor5, 0); // id vCode = MySqlGetFieldAsString(Cursor5, 1); // コード vStartTime = MySqlGetFieldAsDatetime(Cursor5, 2); // 開始時刻 Print ("ROW[",i,"]: id = ", vId, ", code = ", vCode, ", start_time = ", TimeToStr(vStartTime, TIME_DATE|TIME_SECONDS)); } } //--- クエリーの削除 Query6 = "DELETE FROM `test_table` WHERE id=3; "; if (MySqlExecute(DB, Query6)) { Print ("Succeeded! 1 row (id=3) has been deleted."); } else { Print ("Error deleting 1 row : ", MySqlErrorDescription); } //--- MySqlCursorClose(Cursor5); // カーソルを閉じるのを忘れないように! } else { Print ("Cursor3 opening failed. Error: ", MySqlErrorDescription); } //--- 削除後の結果を表示するには、別のカーソルが必要である。 Query7 = "SELECT id, code, start_date FROM `test_table`"; Print ("SQL> ", Query7); Cursor7 = MySqlCursorOpen(DB, Query7); if (Cursor7 >= 0) { Rows = MySqlCursorRows(Cursor7); Print (Rows, " row(s) selected."); for (i=0; i<Rows; i++) { if (MySqlCursorFetchRow(Cursor7)) { vId = MySqlGetFieldAsInt(Cursor7, 0); // id vCode = MySqlGetFieldAsString(Cursor7, 1); // コード vStartTime = MySqlGetFieldAsDatetime(Cursor7, 2); // 開始時刻 Print ("ROW[",i,"]: id = ", vId, ", code = ", vCode, ", start_time = ", TimeToStr(vStartTime, TIME_DATE|TIME_SECONDS)); } } //--- MySqlCursorClose(Cursor7); // カーソルを閉じるのを忘れないように! } else { Print ("Cursor3 opening failed. Error: ", MySqlErrorDescription); } //----- 最後に MySqlDisconnect(DB); Print ("Disconnected. Script done!"); } //+------------------------------------------------------------------+ Eugeniy Lugovoy 2015.05.17 14:03 #68 pedma:本当にありがとう。 あなたのコードは私をとても助け、私は多くの時間を節約することができます。私は正常にINSERT、SELECT、UPDATEとDELETEクエリを実行しようとしました。私は間違っていない場合は、 "カーソル "は、SELECTクエリにのみ必要ですか?= ペドマその通りです!カーソルはデータの選択にのみ使用されます。なぜなら、データベースからMQL変数にデータを受け取る必要があるからです。私のソリューションがお役に立てて何よりです。幸運を祈る、ユージン James Beach 2015.06.05 11:12 #69 こんにちは、ユージーン、私が販売する予定のEAに統合されたリモートトレードコピーの作成を考えているのですが、今でも有償の開発プロジェクトを されているのでしょうか?私はUpworkで見て、あなたは最近フリーランサーのプロジェクトを完了したように見えません。あなたが作成したライブラリを使って自分でやってみましたが、あまりうまくいきませんでした。でも、あなたのようなプログラミング能力のある人にとっては簡単なことなんでしょうね!ありがとうございました、ジェームス Eugeniy Lugovoy 2015.06.09 23:07 #70 James Beach:こんにちは、ユージーン、私が販売する予定のEAに統合されたリモートトレードコピーの作成を考えているのですが、今でも有償の開発プロジェクトをされているのでしょうか?私はUpworkで見て、あなたは最近フリーランサーのプロジェクトを完了したように見えません。あなたが作成したライブラリを使って自分でやってみましたが、あまりうまくいきませんでした。でも、あなたのようなプログラミング能力のある人にとっては簡単なことなんでしょうね!ありがとうございました、ジェームスこんにちは、ジェームス、私は現在Upworkで1つの大きなプロジェクトだけを 担当しています。だから、最近はあまり自由な時間がありません。リブについて何かお困りですか?何かお手伝いできることはありますか? 1234567891011121314...30 新しいコメント 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
OK、私はあなたがこの目的のためにエキスパート-アドバイザーを書いていることを見て、それは私が記事に掲載した勧告なしで書かれています。
それでは、ステップバイステップで移動してみましょう: 1。
1. DB=cMySqlConnect(Host,User,Password,Database,Port,Socket,ClientFlag); "の呼び出しは、OnTick()ではなく、OnInit()標準関数内で行う必要があります。標準関数の内部で行う必要があります。
2. cMySqlConnectを 使用していますが 、これはDLLからインポートされた関数です。 関数を 使用する必要があります!
3.OnDeinit() stundard 関数の中で MySqlDisconnect 関数を呼び出す必要があります。
4.接続が成功したことを確認するために、OnTick() 標準関数内でデータベース接続識別子をチェックする必要があります。
最終的には以下のようになります。
OK、私はあなたがこの目的のためにエキスパート-アドバイザーを書いていることを見て、それは私が記事に掲載した勧告なしで書かれています。
それでは、ステップバイステップで移動してみましょう: 1。
1. DB=cMySqlConnect(Host,User,Password,Database,Port,Socket,ClientFlag); "の呼び出しは、OnTick()ではなく、OnInit()標準関数内で行う必要があります。標準関数の内部で行う必要があります。
2. cMySqlConnectを 使用していますが 、これはDLLからインポートされた関数です。 関数を 使用する必要があります!
3.OnDeinit() stundard 関数の中で MySqlDisconnect 関数を呼び出す必要があります。
4.接続が成功したことを確認するために、OnTick() 標準関数内でデータベース接続識別子をチェックする必要があります。
最後に、以下のようになります。
OK、私はあなたがこの目的のためにエキスパート-アドバイザーを書いていることを見て、それは私が記事に掲載した勧告なしで書かれています。
それでは、ステップバイステップで移動してみましょう: 1。
1. DB=cMySqlConnect(Host,User,Password,Database,Port,Socket,ClientFlag); "の呼び出しは、OnTick()ではなく、OnInit()標準関数内で行う必要があります。標準関数の内部で行う必要があります。
2. cMySqlConnectを 使用していますが 、これはDLLからインポートされた関数です。 関数を 使用する必要があります!
3.OnDeinit() stundard 関数の中で MySqlDisconnect 関数を呼び出す必要があります。
4.接続が成功したことを確認するために、OnTick() 標準関数内でデータベース接続識別子をチェックする必要があります。
最終的にはこのようになります。
ステップバイステップで変更しましたが、1つのmt4で4つ以上のシンボルでエキスパートを使用すると、問題はまだ存在します。0x0000000B in '.....MQLMySQL.dll'
" と表示されます。
コードは次のとおりです。
<--
#インクルード <MQLMySQL.mqh
int MySqlErrorNumber; // 最近の MySQL エラー番号
string MySqlErrorDescription; // エラーの説明
//+------------------------------------------------------------------+
//| エキスパート初期化関数
//+------------------------------------------------------------------+
int OnInit()
OnInit(); int OnInit()
EventSetTimer(timeSeconds);
DB = MySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag); if( DB == -1 )
if( DB == -1 )
{
Print("Database is not connected ..."); if( DB == -1 ) { print("Database is not connected .... "); }
}
return(INIT_SUCCEEDED); }.
}
//+------------------------------------------------------------------+
//| エキスパート初期化関数
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
MySqlDisconnect(DB);
EventKillTimer();
ObjectsDeleteAll();
}
void OnTimer()
{
//Alert(TimeCurrent());
OnTick();
}
//+------------------------------------------------------------------+
//| エキスパート・ティック関数nbsp;
//+------------------------------------------------------------------+
void OnTick()
{
if( DB == -1 )
{
Alert("Database is not connected .... "); return; { Alert("Database is not connected ...")
return; }.
}
if( IsExpertEnabled() && IsConnected() && AccountNumber() > 0 && DB != -1 )
{
int account = AccountNumber();
string symbol = Symbol(); if( cmd !
if( cmd != "" && cmd != NULL )
{
symbol = cmd; }.
}
symbolOrder = symbol + "_table";
double spread = (Ask - Bid); } symbolOrder = symbol + "_table"; }.
admission = spread*MathPow(10, Digits).
//int DB = cMySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag);
Query = "SELECT * FROM " + symbol + " where AccountNumber = " + (string)AccountNumber();
//Print(Query);
int Cursor1 = MySqlCursorOpen(DB, Query);
if (Cursor1 >= 0)
{
int Rows1 = MySqlCursorRows(Cursor1); int Cursor1 = MySqlCursorOpen(DB, Query); if (Cursor1 >= 0)
int dataRows1 = Rows1;
//Alert(dataRows);
if( dataRows1 > 0 )
{
Query = "update " + symbol + " set Bid = " + (string)Bid + ", Ask = " + (文字列)アスク
+ ", スプレッド = " + DoubleToStr(spread, Digits)
+ ", Time = '" + TimeToString(TimeLocal(), TIME_DATE|TIME_SECONDS) + "' where AccountNumber) + "' where AccountNumber = ".
+ (string)account; // + "' and Symbol = '" + symbol + "'.".
MySqlExecute(DB, Query);
MySqlCursorClose(Cursor1);
}
else if( dataRows1 == 0 )
{
Query = "CREATE TABLE IF NOT EXISTS " + symbol + " (id int NOT NULL AUTO_INCREMENT PRIMARY KEY, AccountNumber int, "
+ "シンボル char(20), Bid double, Ask double, Spread double,"
+ "メモ char(50), "
+ ENGINE=MEMORY DEFAULT CHARSET=utf8 ";
MySqlExecute(DB, Query);
Query = "INSERT INTO " + symbol + "(AccountNumber, Symbol, Bid, Ask, Spread.メモ, 時間) VALUES ("
+ (string)account + ", '" + symbol + "', "+(string)Bid+", "+ (string)Ask + "、"
+ DoubleToStr(スプレッド、桁)
+ ", '" + (文字列)AccountCompany()
+ "', \'"+TimeToString(TimeLocal(), TIME_DATE|TIME_SECONDS)+""";)
if(MySqlExecute(DB, Query) != true )
{
//Query = "DROP TABLE IF EXISTS `data_table`";
//MySqlExecute(DB, Query);
Query = "CREATE TABLE IF NOT EXISTS " + symbol + "(id intNOT NULL AUTO_INCREMENT PRIMARY KEY, AccountNumber int, "
+ "シンボル char(20), Bid double, Ask double, Spreaddouble、"
+ "メモ char(50), "
+ ENGINE=MEMORY DEFAULT CHARSET=utf8 ";
MySqlExecute(DB, Query);
}
}
MySqlCursorClose(Cursor1); // カーソルを閉じるのを忘れない !
}
}
}
-->
OK、私はあなたがこの目的のためにエキスパート-アドバイザーを書いていることを見て、それは私が記事に掲載した勧告なしで書かれています。
それでは、ステップバイステップで移動してみましょう: 1。
1. DB=cMySqlConnect(Host,User,Password,Database,Port,Socket,ClientFlag); "の呼び出しは、OnTick()ではなく、OnInit()標準関数内で行う必要があります。標準関数の内部で行う必要があります。
2. cMySqlConnectを 使用していますが 、これはDLLからインポートされた関数です。 関数を 使用する必要があります!
3.OnDeinit() stundard 関数の中で MySqlDisconnect 関数を呼び出す必要があります。
4.接続が成功したことを確認するために、OnTick() 標準関数内でデータベース接続識別子をチェックする必要があります。
最終的には以下のようになる。
問題は、1つのmt4で2つ以上のシンボルで使用できないことで、1つのシンボルで使用する場合は正常です。 4つ以上のシンボルで使用する場合は正常ですが、数分後に "OnTick() "という問題が表示されます。数分後、"Access violation read to 0x0000000B in '..MQLMySQL.db'"と表示される。.MQLMySQL.dll'」と表示されます。
あなたは1つまたは2つのmt4で4つ以上のシンボルでdllを呼び出す1つの専門家を試すことができ、問題を見つけるかもしれません。
dllはmemeoyの解放か衣服コレクションを必要とするか。
CRTが静的デー タの破棄に続いてリークをダンプするのを待た ずに、リー クを早期にダンプします。このため、MFC が初期化される前にメモリを割り当てたオブジェクトや、MFCが終了した後に破棄されたオブジェクト に対して、ο 偽のリーク報告が発生します。nbsp;
MFC
が初期化される 前にメモリが割り当てられ 、MFC が 終了した後に破棄された オブジェクトのスプリアス・リーク・レポート 。
この現象は、
C++ランタイムDLLも使用するプログラムでMFC DLLを使用する場合によく発生します 。
再びこんにちは。
提供されたコードから察するに、あなたはMQLの初心者だと思います。
申し訳ありませんが、あなたに教える時間はありません。
申し訳ありません、あなたに教える時間はありませんが、私が開発したソフトウェアをテストする時間はあります。 ですから、ここにログを添付します。
あなたのロジックに基づき、テスト用EAを構築しました:各テーブルは各通貨ペアに定義され、異なるアカウントのオンライン市場データを保持することができます。
アクセス違反のエラーは一つも発生していません。 ログを見ても、"Access violation... "というエラーは一つも出ていません。
問題はMQLMySQLライブラリにはありません。
EAのテスト。
これはライブラリを使用する正しいロジックです。
最適化により、SELECT ステートメントを使用せず、UPDATE ステートメントだけを実行することもできます。100% の更新があるので、INSERT ステートメントを適用する。
この回避策は、パフォーマンスを向上させ、ネットワークトラフィックを減らすことができます。
最後に、 プロジェクトの ソースコード(DLLの開発を含む)が添付されていますので、ご自由に変更してください。
もしMqlMySQL.DLLに問題があるようなら、デバッグして自分で修正することもできます。
よろしくお願いします。
ユージン
本当にありがとう。
あなたのコードは私をとても助け、私は多くの時間を節約することができます。私は正常にINSERT、SELECT、UPDATEとDELETEクエリを実行しようとしました。私は間違っていない場合は、 "カーソル "は、SELECTクエリにのみ必要ですか?
= ペドマ
本当にありがとう。
あなたのコードは私をとても助け、私は多くの時間を節約することができます。私は正常にINSERT、SELECT、UPDATEとDELETEクエリを実行しようとしました。私は間違っていない場合は、 "カーソル "は、SELECTクエリにのみ必要ですか?
= ペドマ
その通りです!
カーソルはデータの選択にのみ使用されます。なぜなら、データベースからMQL変数にデータを受け取る必要があるからです。
私のソリューションがお役に立てて何よりです。
幸運を祈る、
ユージン
こんにちは、ユージーン、
私が販売する予定のEAに統合されたリモートトレードコピーの作成を考えているのですが、今でも有償の開発プロジェクトを されているのでしょうか?
私はUpworkで見て、あなたは最近フリーランサーのプロジェクトを完了したように見えません。
あなたが作成したライブラリを使って自分でやってみましたが、あまりうまくいきませんでした。でも、あなたのようなプログラミング能力のある人にとっては簡単なことなんでしょうね!
ありがとうございました、
ジェームス
こんにちは、ユージーン、
私が販売する予定のEAに統合されたリモートトレードコピーの作成を考えているのですが、今でも有償の開発プロジェクトをされているのでしょうか?
私はUpworkで見て、あなたは最近フリーランサーのプロジェクトを完了したように見えません。
あなたが作成したライブラリを使って自分でやってみましたが、あまりうまくいきませんでした。でも、あなたのようなプログラミング能力のある人にとっては簡単なことなんでしょうね!
ありがとうございました、
ジェームス
こんにちは、ジェームス、
私は現在Upworkで1つの大きなプロジェクトだけを 担当しています。だから、最近はあまり自由な時間がありません。リブについて何かお困りですか?何かお手伝いできることはありますか?