目次 : 1. 本稿の概要 P02 (1) 本稿で実現する システム図 (2) 本稿の記載範囲 (3) 添付プログラムの組合せと基本構成 2. 添付プログラムによる動作例 P05 (1) セット1の使い方 (2) セット2の使い方 3. 添付プログラムのコード詳細 P19 (1) セット1 (2)

Similar documents
(C) 2011 amenbo the 3rd New MQL4(Build 600 以降 ); 基礎 ( その 2)OnTimer() を使う アメンボです New_MQL4 の特徴とはなんでしょう? 極論を言うと MQL5 から受け継いだ OOP つまり On***() 関

(C) 2011 amenbo the 3rd 擬似トレード提案 ( その 1) MT4/5 のストレテジー テスターのバックテスト機能は非常に強力ですが 幾つか不満があ ります その一つは 今表示されているリアルチャート上で EA を試したらどうなるかが良 く判らないことです アメンボが以前気に入

(C) 2011 amenbo the 3rd New MQL4(Build 600 以降 ); 基礎 ( その 1) インディケータを表示する アメンボです New_MQL4 では MQL5 類似の OOP(Object-oriented programming) が採用され

2.Win32API によるファイル アクセス 本稿では 読み書きするデータは テキスト ( 文字列 ) との前提で解説します ( 絶対パス指定による任意の場所のファイル アクセスを目指します ) (1) 疑問? user 32.dll はどこにある? と思った方 アメンボ以外にいませんか?? そう

1. イベント ハンドリング関数とトリガ 一覧 (MQL5 との比較 ) On****() 形式のハンドリング関数のこと (C) 2011 amenbo the 3rd New_MQL4 で使用可能な ハンドリング関数 を MQL5 と比較しながら 使用方法を解説します 機能サホ ート New MQ

スライド 1

1. On****() ハンドリング関数(MQL5 との比較 ) New_MQL4 で使用可能な ハンドリング関数 を MQL5 と比較しながら 使用方法を解説します 機能サホ ート New MQL4 のサホ ート範囲 確認 EA Indicator Script ハント リンク 関数 イヘ ント

arduino プログラミング課題集 ( Ver /06/01 ) arduino と各種ボードを組み合わせ 制御するためのプログラミングを学 ぼう! 1 入出力ポートの設定と利用方法 (1) 制御( コントロール ) する とは 外部装置( ペリフェラル ) が必要とする信号をマイ

Microsoft PowerPoint - lec10.ppt

(C) 2011 amenbo the 3rd MQL5; 翻訳まとめ OnBookEvent() の使い方 他 ( その 1) 翻訳のみ実施 本稿の翻訳対象は OnInit() OnDeinit() OnTimer() OnBookEvent() 4 関数です 注意 ; 本資

セットアップの流れ Graphtec Pro Studio を使用する SAi Cloud へのユーザー登録 1-1 SAi Cloud へのユーザー登録 Graphtec Pro Studio のインストール 1-2 Graphtec Pro Studio のインストール Cutting Mast

CubePDF ユーザーズマニュアル

nLiteによるドライバの統合 - フロッピーディスク不要のXPインストールCDの作成方法 -

目次 第 1 章概要....1 第 2 章インストールの前に... 2 第 3 章 Windows OS でのインストール...2 第 4 章 Windows OS でのアプリケーション設定 TP-LINK USB プリンターコントローラーを起動 / 終了するには

3.Cygwin で日本語を使いたい Cygwin で以下のコマンドを実行すると それ以降 メッセージが日本語になります export LANG=ja_JP.UTF-8 これは 文字コードを日本語の UTF-8 に設定することを意味しています UTF-8 は Cygwin で標準の文字コードで, 多

インテル(R) Visual Fortran コンパイラ 10.0

電子納品チェックシステム利用マニュアル

電子納品チェックシステム利用マニュアル

地図 SD カードを取り外す 最初に ナビゲーション本体から地図 SD カードを取り外します 本操作は地図 SD カードを初めて ROAD EXPLORER Updater に登録するときや パソコンにダウンロードしたデータを地図 SD カードに保存するときに実行してください 1 ナビゲーション本体

目次 第 1 章はじめに 本ソフトの概要... 2 第 2 章インストール編 ソフトの動作環境を確認しましょう ソフトをコンピュータにセットアップしましょう 動作を確認しましょう コンピュータからアンインストー

保存を行いたい場所 ( デスクトップ 等 ) を選択し 保存 (S) ボタンを押してください ファイル名 ファイル名は Jsas_TSKPrint.exe という初期値になっていますが 変更することができます 2 データのダウンロード ボタンを押すと 一括印刷用ソフトに取り込む停止及び警告認定者 (

保存を行いたい場所 ( デスクトップ 等 ) を選択し 保存 (S) ボタンを押してください ファイル名 ファイル名は Jsas_TKNPrint.exe という初期値になっていますが 変更することができます 2 データのダウンロード ボタンを押すと 指導面接用紙の一括印刷用ソフトに取り込む指導対象

数量的アプローチ 年 6 月 11 日 イントロダクション データ分析をマスターする 12 のレッスン ウェブサポートページ ( 有斐閣 ) 水落研究室 R http:

<4D F736F F D208D C8FEE95F18DEC90AC A B D836A B2E646F63>

Microsoft PowerPoint - kougi4.ppt

本書は INpMac v2.20(intime 5.2 INplc 3 Windows7/8/8.1に対応 ) の内容を元に記載しています Microsoft Windows Visual Studio は 米国 Microsoft Corporation の米国及びその他の国における登録商標です

ARCHITREND ZERO バージョンアップ/オプション追加編

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ

Studuinoソフトウェアのインストール

インテル® Parallel Studio XE 2019 Composer Edition for Fortran Windows : インストール・ガイド

Microsoft PowerPoint - kougi2.ppt

厚生労働省版ストレスチェック実施プログラムバージョンアップマニュアル (Ver2.2 から Ver.3.2) 目次 1. プログラム概要 バージョンアップ実施手順 要注意 zip ファイル解凍の準備 Windows によって PC が保護されました と

アドイン版 ********************************************* インストール手順書 *********************************************

目次 1. 回答作成手順 2 2. ツールの起動 3 3. 一般情報の入力 6 4. 成分表の入力 9 5. 依頼者情報の入力 エラーチェック XMLファイルの作成 動作設定 ( 任意 ) ( ご参考 ) 各種シートのボタン機能 ( ご参

目次 第 1 章はじめに 本ソフトの概要... 2 第 2 章インストール編 ソフトの動作環境を確認しましょう ソフトをコンピュータにセットアップしましょう 動作を確認しましょう コンピュータからアンインストー

スライド 1

Microsoft Word - VB.doc

無線LAN JRL-710/720シリーズ ファームウェアバージョンアップマニュアル 第2.1版

<4D F736F F D208AC888D B836A F C91808DEC837D836A B81698AC7979D8ED A E646F6

SetupVerup_dl_M

PowerPoint プレゼンテーション

1. 新規プロジェクト作成の準備新規プロジェクトのためのフォルダを用意して そこにプロジェクトを作成します [ 新しいフォルダー ] をクリックして希望のフォルダに新しいフォルダを作成します この例では TrST_F401N_BlinkLD2 というフォルダを作成しました TrST_F401N_Bl

Microsoft PowerPoint - C言語の復習(配布用).ppt [互換モード]

Mozilla Thunderbird アカウント設定手順 株式会社アマダアイリンクサービス

VPS マニュアル p. 1

(1) プログラムの開始場所はいつでも main( ) メソッドから始まる 順番に実行され add( a,b) が実行される これは メソッドを呼び出す ともいう (2)add( ) メソッドに実行が移る この際 add( ) メソッド呼び出し時の a と b の値がそれぞれ add( ) メソッド

<< 目次 >> 1 PDF コンバータのインストール ライセンスコードの入力 PDF にフォントを埋め込みたい場合の設定 PDF オートコンバータ EX で使用しない場合 PDF コンバータ単体で使用する場合の説明 PDF コンバータのアン

設定 1 Windows10 の規定ブラウザの変更手順について 1 Windows10 のスタートメニューから 設定 をクリックしてください 2 システム をクリックしてください -1-

情報処理演習 B8クラス

Windows2000/XPインストール手順

miChecker導入手順書

インテル® Parallel Studio XE 2019 Composer Edition for Fortran Windows 日本語版 : インストール・ガイド

プログラミング実習I

ふれんずらくらく流通図面マニュアル

Microsoft Word - HOBO雨量専用説明書_v1.1.doc

インストールマニュアル

サイボウズモバイル KUNAI Lite for Android マニュアル

Inet-Builder Client 操作説明書

Java講座

第 1 章 : はじめに RogueWave Visualization for C++ の Views5.7 に付属している Views Studio を使い 簡単な GUI アプリケーションの開発手順を紹介します この文書では Windows 8 x64 上で Visual Studio2010

WiFiの現状

目次 第 1 章はじめに 電子入札システムを使用するまでの流れ 1 第 2 章 Java ポリシーを設定する前に 前提条件の確認 2 第 3 章 Java のバージョンについて Java バージョン確認方法 Java のアンインストール ( ケース2の

ご利用のコンピュータを設定する方法 このラボの作業を行うには 事前設定された dcloud ラボを使用するか 自身のコンピュータをセットアップします 詳細については イベントの事前準備 [ 英語 ] とラボの設定 [ 英語 ] の両方のモジュールを参照してください Python を使用した Spar

建築業務管理システム 補足マニュアル Internet Explorer11 設定ガイド (Windows10 用 )

Microsoft PowerPoint - Borland C++ Compilerの使用方法(v1.1).ppt [互換モード]

KDDI ペーパーレスFAXサービス

Microsoft PowerPoint ï½žéł»å�’å–¥æœ�ㇷㇹㅃㅀ㇤ㅳㇹㅋㅼㅫ曉逃.ppt [äº™æ‘łã…¢ã…¼ã…›]

gengo1-11

Microsoft Word - Custom1_ABC伝票印刷ドライバー_導入ガイド

はじめに 面的評価支援システム操作マニュアル ( 別冊 ) 国土地理院数値地図 25000( 空間データ基盤 ) 変換編 は 国土地理院の HP よりダウンロードした数値地図 25000( 空間データ基盤 ) の地図データを 面的評価支援システム 用に変換するツールの使用方法についてまとめたものです

ATOK Syncの設定方法と使い方(Windows用)

. はじめに 動作環境の全ブラウザで 本書の設定を行ってください 本設定を行わない場合 システムが 正常に動作しない可能性がありますので 必ず設定をお願いいたします また 本書の中で 画 像に番号を付与している箇所以外の設定は お使いの環境のままでご使用ください 参考 : 動作環境の全ブラウザについ

機能仕様書フォーマット

フローチャート自動生成ツール yflowgen の使い方 目次 1 はじめに 本ツールの機能 yflowgen.exe の使い方 yflowgen.exe の実行方法 制限事項 生成したファイル (gml ファイル形式 ) の開

Microsoft PowerPoint - prog04.ppt

設定 1 USB キー証明書ソフトの更新手順 1 産科医療補償制度のホームページ ( へアクセスし 分娩機関の皆さまへ 加入手続き をクリックしてください 2 専用 Web システムの導入要件 をクリックしてくださ

[ ニュース ] タブ内容をチャート上に表示する amenbo the 3rd アメンボです 本稿では 前稿 ( ) で投稿した ListView_f.dll の応用を報告します [ ニュース ] タブの内容を読取って チャート上に表示させることを考

24th Embarcadero Developer Camp

Transcription:

MQL4 と外部アプリの連携 ;( その 1) amenbo the 3rd 2017.11.18 アメンボです 実に 1 年と 11 ヶ月ぶりの投稿です MQL4 への情熱を失った訳ではなく 色々と他に追いかけている ことがあり 謀殺されていたためです < 約 2 年前の投稿と 方針転換について > 2 年前の投稿 ; WebRequest() の使い方 ( その3); 実際のサイトにログインする 2015.12.26 <WebRequest() 関数を解析していく手順の全体像 ( 予定 )> これから解析 調査していく手順を 現状では 下記の様に予定しています ここで止まってた! ステップ1; 解析環境とツール類の整備 ( その1) 投稿済み ステップ2; WebRequest() 関数の解析 ;9 引数 ( その2) 投稿済み ステップ3; 実際に外部サイトをアクセスする 本稿 ステップ4; WebRequest() 関数の解析 ;7 引数 バージョン2 の解析 ステップ5; ターゲットから得られるタグ データの中から必要な情報を入手する ステップ6; 得られた情報をEAの判断条件に加える方法について考察する 方針転換 ; この 2 年弱の間にAIが急激に発展し 金融データ 処理の分野にも影響が及んできました アメンボのシリーズ再開に際し 上記 ステップ 4 以降の処理について 最早 MQL 言語 のみに頼るべきではないと判断して 大きく方針を変更致しました < 今後の展開 > 本シリーズで目指すもの大方針 ; 他言語 ( 例えば Python) と連携することで MQL 言語の機能を拡張します 特に注目のAIを活用する方策を探ることにしました [ 最終目標のイメージ図 ] MQL4 Python Script OnInit() 起動 スタート Market OnTick() トレード DLL < 繰り返し > スクレイピング等市場 社会データ収集と分析 DLL へ書込み Market Twitter など WEB 情報の全て OnDeinit() 停止 ストップ トレード実行 Market Twitter など WEB 情報分析 ( 重たい計算 分析も実行 ) 1/28

目次 : 1. 本稿の概要 P02 (1) 本稿で実現する システム図 (2) 本稿の記載範囲 (3) 添付プログラムの組合せと基本構成 2. 添付プログラムによる動作例 P05 (1) セット1の使い方 (2) セット2の使い方 3. 添付プログラムのコード詳細 P19 (1) セット1 (2) セット2 4. その他 P27 (1) shared_memory.dll について 添付コード類と DLL; AI&MQL4_01.zip として添付しています 解凍して使用してください 1. 本稿の概要 (1) 本稿で実現する システム図 再開 第 1 回目 の投稿は MQL4 アプリが外部 (Python) アプリから DLL 経由で受け取ったデータを MT4 チャート上に表示する例です MQL4 OnInit() 起動 Python Script スタート Market OnTick() < 繰り返し > Bitcoin 日経平均先物スクレイピング WEB 表示 DLL DLL へ書込み OnDeinit() 停止 ストップ 概要 ;Python でスクレイピングした ビットコイン 又は 日経平均先物 価格データを DLL(Dynamic Link Library) を介して MQL4 側に渡します ( ファイル経由で渡す方法もありますが 本稿では扱いません ) MT4(MQL4) 側は 受け取ったデータを表示します ( 本稿ではココまで ) 2/28

(2) 本稿の記載範囲 本稿では プログラムの詳細な解説は省略して 動作方法と結果のみを解説します 詳細な検討結果やプログラム コード解説 実施する場合の注意点 ( 制限事項 ) は 次投稿で行う予定です 次回以降の投稿内容について ; 本資料 [ 最終目標のイメージ図 ] を選択した経緯 および本稿で掲載 ( 添付 ) したコード (MQL4 Python アプリ ) の詳細に解説します ( 実は連携する外部アプリとしては Python 以外に R 言語も検討しました ) (3) 添付プログラムの組合せと基本構成セット内容 MQL4 Python 1 ビットコイン 版 Disp_option_1.mq4(EA) Scraping_try_1.py 2 日経平均先物 版 Disp_option_2.mq4(EA); 起動 終了 Scraping_try_2.py セット 1;MQL4 アプリには Python アプリの 起動 終了 機能を付けていません セット 2;MQL4 アプリに Python アプリの 起動 終了 機能を付けた例です 役割分担 ( 最終目標 ); MQL4 と Python Script で役割分担する Python Script= Market Twitter および WEB から参照可能な情報すべてを対象として 複雑な計算と分析を実行する 更に 分析結果の情報を DLL を介して MQL4 側に渡す MQL4= テクニカル分析 を行うと共に DLL のデータを組み合わせた 戦略でトレードを実行する 本稿では Python アプリは スクレイピングとその結果 の DLL への書き込み MQL4 アプリ (EA) は DLL から読み込んだデータを表示する ところまで です <セット1>の特徴 MQL4 アプリ : DLL からテ ータを読出し チャート上に表示する Python アプリ ; 2つのスレッドから構成されています ( 詳細は別途 次の投稿で解説予定 ) 1メイン スレッド ; スクレイピング スレッド の起動と終了を制御 2スクレイピング スレッド ; スクレイピングを実行し 結果を DLL へ書き込む 3/28

<セット2> MQL4 アプリ : 下記の3つの機能構成です 1Python プログラムの起動 2DLL からテ ータを読出し チャート上に表示する 3Python プログラムの終了 Python アプリ ; 2つのスレッドから構成されています ( 詳細は別途 次の投稿で解説予定 ) 1メイン スレッド ; スクレイピング スレッド の起動と終了を制御 2スクレイピング スレッド ; スクレイピングを実行し 結果を DLL へ書き込む 動作確認環境 ( 重要 ); 本稿作成に使用したソフト類のバージョンは以下です ( いずれも無料で入手できます ) MT4;version 4.00 Build 1090 MetaEditor;version 5.00 Buid 1601 (19 May 2017) Python; Python3.6.1 32 ビット版 Python 3.6.1 (v3.6.1:69c0db5, Mar 21 2017, 17:54:52) [MSC v.1900 32 bit (Intel)] Python 実行用のコンソール (2 種類で確認 ) 1 IPython コンソール (spyder3); IPython 5.3.0 2 コマンドプロンプト ;Microsoft Windows [Version 6.3.9600] (IPython コンソール (spyder3) は個人的な好みで選択しました ) MT4 自体が 32 ビット版 なので DLL を有効にするため Python も 32 ビット版 を選択します Puthon の導入は 各自ネット上から行ってください ( ネットには多くのダウンロードサイトや 参考資料があります ) 添付 DLL(shared_memory.dll); この DLL は以前からアメンボが公開している32bit 版のシェアード メモリ ( 共有メモリ ) 用 DLL です MT4 で [ ファイル ] [ データフォルダを開く ] [MQL4] [Libraries] と開いていき この中に shared_memory.dll を入れます ( コピーを入れればOK) 4/28

2. 添付アプリによる動作例 (1) セット1の使い方 コンソールとして IPython コンソール と コマンド プロンプト を使用する場合で解説します. ( 注 ) IPython コンソール コマンド プロンプト MT4(MQL4) の詳細な使い方は省略します (Python の開発環境として本稿では Spyder3 で解説しています 小生の好み ) A. 組合せ =[IPython コンソール ]+[MT4] ステップ 1; まず Python プログラムを立ち上げるため spyder3(ipython) を起動します Scraping_try_1.py プログラムを選択し 実行します 5/28

プログラムが動作し始めます 6/28

ステップ 2; 次に MT4 を立ち上げ 更に Disp_option_1.mq4(EA) を チャートに表示 します [OK] を選択 7/28

準備中 と 価格 表示を繰返します 8/28

Python 側の Scraping_try_1.py を終了するには ; Ipython コンソールで 77 を入力し Enter を押します ( 77 以外の値では終了しません ) 77 を入力 Return を押す 終了手順のプログラムが動作し 全ての スレッド が終了します 9/28

Python 側の Scraping_try_1.py を終了すると DLL 内のデータは 更新されないので MT4 側では常に同じデータを表示します Python の起動前に MT4 Disp_option_1.mq4(EA) を立ち上げると Python アプリが動き始めるまでは ゼロ 表示のままとなります 特記 ; 添付アプリでは bitfiyer bitflyer になるように修正済みです! ( やってしまった!!) 10/28

B. 組合せ=[ コマンド プロンプト ]+[MT4] ステップ1; 今回は MT4で Disp_option_1.mq4(EA) を立ち上げ済みの場合で解説します 準備中 と 0 円 表示を繰返します DLL にデータが設定されていないので 0 円 表示となります 11/28

ステップ2; コマンド プロンプトを開き 目的の Python プログラムのあるディレクトリーまで辿ります (Python のパスが通るディレクトリ ) 次に python Scraping_try_1.py と打ち込んで( スクレイピング ) プログラムを起動します ( 以下の例はアメンボの場合であることに ご注意!) プログラムが起動します 動作開始 12/28

MT4 側に戻ると 0 円以外の価格 と 準備中 の表示を繰り返しています 13/28

Python 側の Scraping_try_1.py を終了するには; 1まず コマンド プロンプト画面で [Enter] を押します ( 77 以外なら 何でも( 88 66 でも)OK) 2[input 77 で数量します>>>] が表示されたら 77 を入力し Enter を押します ( 77 以外の値では終了しません) スレッド終了プロセスが始まり やがてプログラムは終了します 終了すると コマンド入力待ち の状態が表示されます 終了プロセス MT4 側は 最後に DLL に書き込まれた 価格 を表示し続けます 14/28

(2) セット2の使い方 こちらの場合は MT4(MQL4) の Disp_option_2.mq4(EA) に Python アプリの 立上げ と 終了 を行う MQL4 コードを設定しています 従って Disp_option_2.mq4(EA) を起動( チャートに表示 ) させるだけで Python アプリによるスクレイピングと MT4( チャート画面 ) への価格表示を実行させることができます 1Python 側のソフトは自動で立上る 2スクレイピングを実行し その結果をチャート上に表示します 3EA を終了すると Python ソフトも自動で終了します MQL4 アプリを起動する ; [Disp_option_2.mq4] を選択 [OK] 15/28

MT4 の横 あるいは重なる様に コマンド プロンプト画面 が立上り 同時に Python アプリの Scraping_try_2.py が起動します コマンド プロンプト ; 16/28

MT4; 17/28

MQL4 アプリを終了する ; エキスパートアドバイザ Disp_option_2.mq4 を通常の方法で終了します すると コマンド プロンプトが Python アプリの Scraping_try_2.py と共に終了します 補足 ; コマンド プロンプト画面で 77 を入力することでも Python アプリを終了させることもできます 77 を入力 終了プロセス 18/28

3. 添付プログラムのコード詳細 セット内容 MQL4 Python 1 ビットコイン 版 Disp_option_1.mq4(EA) Scraping_try_1.py 2 日経平均先物 版 Disp_option_2.mq4(EA); 起動 終了 Scraping_try_2.py (1) セット 1 MQL4 コード ; Disp_option_1.mq4(EA) // Disp_option_1.mq4 // Copyright 2017, MetaQuotes Software Corp. // https://www.mql5.com #property copyright "Copyright 2017, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" #property strict // #import "shared_memory.dll" double set_a(); double write_a(double,int); double read_a(int); double close_a(); #import // Expert initialization function int OnInit() { //--- //DLL 初期化 set_a(); // ラベル オブジェクト 設定 ObjectsDeleteAll(); int pixcel_x=50,pixcel_y=50; ObjectCreate("price_1",OBJ_LABEL,0,0,0); ObjectSet("price_1",OBJPROP_XDISTANCE,pixcel_x); ObjectSet("price_1",OBJPROP_YDISTANCE,pixcel_y); // チェック用 printf("pixcel_x : pixcel_y = %f : %f",pixcel_x,pixcel_y); //--- return(init_succeeded); } // Expert deinitialization function void OnDeinit(const int reason) { //--- //DLL 解放 close_a(); // オブジェクト削除 ObjectDelete("price_1"); } 19/28

// Expert tick function void OnTick() { //--- // 準備中 を表示 string st1="dll 読込み準備中 "; ObjectSetText("price_1",st1,20,"MS ゴシック ",Blue); Sleep(200); //DLL から読み込んで表示する double op=read_a(1); string st2="bitflyer: ビットコインの best_bid 価格は "+op+" 円 です "; ObjectSetText("price_1",st2,20,"MS ゴシック ",Red); } Python コード ; Scraping_try_1.py # -*- coding: utf-8 -*- """ Created on Sat Oct 14 22:37:39 2017 Scraping_try_1.py Bit Coin の価格をスクレイピングして DLL に書き込む ( 無限ルーフ ) コンソールから 77 を打ち込むと 無限ルーフ から抜ける @author: kenken """ # ---------- 初期設定 --------------------------------------------------- # Bit coin スクレイピング import requests # ビットコイン用の url="https://api.bitflyer.jp/v1/ticker?product_code=btc_jpy" # DLL アクセス用 import sys import time from ctypes import * # DLL のロード ------------------------ lib=windll.loadlibrary('c:/users/kenken/appdata/roaming/metaquotes/terminal'+ '/FCCD626CCEAFA0C866593963E6A400F0/MQL4/Libraries'+ '/shared_memory.dll'); #DLL 中の関数呼び出し # 戻り値型 (restype) 引数型 (argtypes) を指定 lib.set_a.restype=c_double lib.set_a.argtype=none lib.close_a.restype=c_double lib.close_a.argtype=none lib.write_a.restype=c_double lib.write_a.argtypes=[c_double,c_int] lib.read_a.restype=c_double lib.read_a.argtype=c_int # DLL 関数 ; 初期設定 lib.set_a() #--------- マルチ スレッド用 ---------------- from winsound import Beep from time import sleep import threading # global 変数 の宣言 ; 異なるスレッド間で共有可能 flag1='99' 20/28

flag2='99' #------------ 初期設定終了 --------------------------------------------- print('\n',flush=true) print('start flag1: %d' %int(flag1),flush=true) print('start flag2: %d' %int(flag2),flush=true) def scrape(): global flag1,flag2 # 無限ルーフ ( ビットコイン価格のスクレイピング ) while 1: # 繰り返し ( ループ ) #------------------------------ bit_c=requests.get(url) json=bit_c.json() price2=float(json["best_bid"]) print(' ビットコインの bid 価格 =',price2) # DLL アクセス # 書込み a[1] を使用 lib.write_a(price2,1) Beep(2000,500) sleep(5) if flag1=='77': sleep(1) Beep(4000,500) Beep(2000,500) print('scrapr() 処理が終了しました ',flush=true) flag2='88' r_ret=lib.read_a(1) print('dll から読み出した値 %s,%5.2f'%(type(r_ret),r_ret)) # DLL 解放 lib.close_a() break else: pass def main(): global flag1,flag2 # scrape() を別スレッドとして起動する th=threading.thread(target=scrape) th.start() if flag1=='77': pass else: while 1: # 無限ルーフ ([77] 入力待ち ) input_line=input("input 77 で終了します >>> "+"\n") if input_line=='77': print('\n [77] が入力されました \n',flush=true) break else: pass flag1=input_line Beep(3000,500) sleep(1) while 1: print('main2() flag1 %d' %int(flag1),flush=true) print('main2() flag2 %d \n' %int(flag2),flush=true) if flag2=='88': print(' 処理が main2() へ戻りました ',flush=true) break else: print(' まだ flag2 が立ってません ',flush=true) 21/28

sleep(1) # スレッドを join して終了する th.join() #---------------------------- print('main2() flag1 %d' %int(flag1),flush=true) print('main2() flag2 %d' %int(flag2),flush=true) #================================== if name ==' main ': main() 注記 ; # DLL のロード ------------------------ lib=windll.loadlibrary('c:/users/kenken/appdata/roaming/metaquotes/terminal'+ '/FCCD626CCEAFA0C866593963E6A400F0/MQL4/Libraries'+ '/shared_memory.dll'); 上記の DLL 配置は アメンボの設定の場合ですので 各位の MT4 設定状況に よって変える必要があります 22/28

(2) セット 2 MQL4 コード ; Disp_option_2.mq4(EA) // Disp_option_2.mq4 // Copyright 2017, MetaQuotes Software Corp. // https://www.mql5.com #property copyright "Copyright 2017, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" #property strict // #define WM_CLOSE 0x0010 #define WM_SYSCOMMAND 0x0112 #define SC_CLOSE 0xF060 //=======Win32API========= // Win32API 使用宣言 #import "shell32.dll" int ShellExecuteW(int handle, int ipverb, string lpfile, string lpparamters, string lpdirectory, int ncmdshow); #import "user32.dll" int SendMessageW(int hwnd, int Msg, int wparam, int lparam); int PostMessageW(int hwnd,int Msg,int wparam,int lparam); int FindWindowW(string lpclassname,string lpwindowname); int DestroyWindow(int hwnd); // 共有メモリ使用宣言 #import "shared_memory.dll" double set_a(); double write_a(double,int); double read_a(int); double close_a(); #import // Expert initialization function int OnInit() { //--- //Python アプリを起動する // 起動 OK 品 open が暗黙のうちに "open" 数値 に変換される int ret=shellexecutew(null,"open","c:\\winpython\\winpython-32bit- 3.6.1.0Qt5\\python- 3.6.1\\python.exe","Scraping_try_2.py","C:\\Users\\kenken\\Documents\\Python Scripts",5); // PlaySound("alert.wav"); // 共有メモリのセットと オブジェクトの初期化 set_a(); ObjectsDeleteAll(); int pixcel_x=50,pixcel_y=50; ObjectCreate("price_1",OBJ_LABEL,0,0,0); ObjectSet("price_1",OBJPROP_XDISTANCE,pixcel_x); ObjectSet("price_1",OBJPROP_YDISTANCE,pixcel_y); // チェック用 printf("pixcel_x : pixcel_y = %f : %f",pixcel_x,pixcel_y); //--- 23/28

return(init_succeeded); } // Expert deinitialization function void OnDeinit(const int reason) { //--- //Python アプリの終了 //OnInit() で起動した ウインドウの名称 は "C:\\WinPython\\WinPython- 32bit-3.6.1.0Qt5\\python-3.6.1\\python.exe" int PP=PostMessageW(FindWindowW(NULL,"C:\\WinPython\\WinPython-32bit- 3.6.1.0Qt5\\python-3.6.1\\python.exe"), WM_SYSCOMMAND, SC_CLOSE, 0); PlaySound("alert2.wav"); //DLL 解放 close_a(); ObjectDelete("price_1"); } // Expert tick function void OnTick() { //--- // 準備中 を表示 string st1="dll 読込み準備中 ";//OK 品 ObjectSetText("price_1",st1,20,"MS ゴシック ",Blue); Sleep(200); //DLL から読み込んで表示する double op=read_a(1); //string st2="bitfiyer: ビットコインの best_bid 価格は "+op+" 円 です ";//OK 品 string st2=" 最新の日経平均先物は "+op+" 円 です "; ObjectSetText("price_1",st2,20,"MS ゴシック ",Red); } 注記 ; // 起動 OK 品 open が暗黙のうちに "open" 数値 に変換される int ret=shellexecutew(null,"open","c:\\winpython\\winpython-32bit- 3.6.1.0Qt5\\python- 3.6.1\\python.exe","Scraping_try_2.py","C:\\Users\\kenken\\Documents\\Python Scripts",5); //OnInit() で起動した ウインドウの名称 は "C:\\WinPython\\WinPython- 32bit-3.6.1.0Qt5\\python-3.6.1\\python.exe" int PP=PostMessageW(FindWindowW(NULL,"C:\\WinPython\\WinPython-32bit- 3.6.1.0Qt5\\python-3.6.1\\python.exe"), WM_SYSCOMMAND, SC_CLOSE, 0); 上記の設定は アメンボの Python 本体とアプリ 配置の場合ですので 各位の Python とそのアプリ 設定状況によって変える必要があります 24/28

Python コード ; Scraping_try_2.py # -*- coding: utf-8 -*- """ Created on Sat Oct 14 00:24:28 2017 Scraping_try_2.py 日経平均先物の価格をスクレイピングして DLL に書き込む ( 無限ルーフ ) コンソールから 77 を打ち込むと 無限ルーフ から抜ける @author: kenken """ # ---------- 初期設定 --------------------------------------------------- # スクレイピング用 -------------------- import urllib.request from bs4 import BeautifulSoup # 日経平均先物 url="https://stocks.finance.yahoo.co.jp/stocks/detail/?code=5040469.o" # DLL アクセス用 import sys import time from ctypes import * # DLL のロード ------------------------ lib=windll.loadlibrary('c:/users/kenken/appdata/roaming/metaquotes/terminal'+ '/FCCD626CCEAFA0C866593963E6A400F0/MQL4/Libraries'+ '/shared_memory.dll'); #DLL 中の関数呼び出し # 戻り値型 (restype) 引数型 (argtypes) を指定 lib.set_a.restype=c_double lib.set_a.argtype=none lib.close_a.restype=c_double lib.close_a.argtype=none lib.write_a.restype=c_double lib.write_a.argtypes=[c_double,c_int] lib.read_a.restype=c_double lib.read_a.argtype=c_int # DLL 関数 ; 初期設定 lib.set_a() #--------- マルチ スレッド用 ---------------- from winsound import Beep from time import sleep import threading # global 変数 の宣言 ; 異なるスレッド間で共有可能 flag1='99' flag2='99' #------------ 初期設定終了 --------------------------------------------- print('\n',flush=true) print('start flag1: %d' %int(flag1),flush=true) print('start flag2: %d' %int(flag2),flush=true) def scrape(): global flag1,flag2 # 無限ルーフ ( 日経平均先物のスクレイピング ) while 1: # 繰り返し ( ループ ) #------------------------------ res=urllib.request.urlopen(url) soup=beautifulsoup(res,'html.parser') stoksprice=soup.select('.stoksprice') print(" 日経平均先物のテキスト データ =",stoksprice[1].text) #------- 読み取りデータを数値に変換する --------- # 例 ;[19,985] の, が邪魔 price=stoksprice[1].text 25/28

price1=price.replace(",","") price2=float(price1) # DLLアクセス # 書込み a[1] を使用 lib.write_a(price2,1) Beep(2000,500) sleep(5) if flag1=='77': sleep(1) Beep(4000,500) Beep(2000,500) print('scrapr() 処理が終了しました ',flush=true) flag2='88' r_ret=lib.read_a(1) print('dll から読み出した値 %s,%5.2f'%(type(r_ret),r_ret)) # DLL 解放 lib.close_a() break else: pass def main(): global flag1,flag2 th=threading.thread(target=scrape) th.start() if flag1=='77': pass else: while 1: input_line=input("input 77 で終了します >>> "+"\n") if input_line=='77': print('\n [77] が入力されました \n',flush=true) break else: pass flag1=input_line Beep(3000,500) sleep(1) while 1: print('main2() flag1 %d' %int(flag1),flush=true) print('main2() flag2 %d \n' %int(flag2),flush=true) if flag2=='88': print(' 処理が main2() へ戻りました ',flush=true) break else: print(' まだ flag2 が立ってません ',flush=true) sleep(1) th.join() #---------------------------- print('main2() flag1 %d' %int(flag1),flush=true) print('main2() flag2 %d' %int(flag2),flush=true) #================================== if name ==' main ': main() 26/28

注記 ; # DLL のロード ------------------------ lib=windll.loadlibrary('c:/users/kenken/appdata/roaming/metaquotes/terminal'+ '/FCCD626CCEAFA0C866593963E6A400F0/MQL4/Libraries'+ '/shared_memory.dll'); 上記の DLL 配置は アメンボの設定の場合ですので 各位の MT4 設定状況に よって変える必要があります 4. その他 (1) shared_memory.dll について 従来から アメンボが公開している32ビット版の シェアード メモリ ( 共有メモリ ) 用の DLLです 過去に詳細内容を投稿済みですが 念のために ポイントを記載しておきます 機能概要 ; 共有メモリ上で 1 個のレジスタ (r) と 3 個の配列 (a b c) を MT4 のチャートに設定された 全ての EA インディケータ から 共有することが出来ます ただし 排他処理を入れていませんので取り扱いには注意が必要です ベースの作成技術は同じですが 使用する場面の違いを意識できるように レジスタと配列ではメモリ容量に差をつけました 共有メモリ( レジスタ 配列 ) を通して EA やインディケータはデータのやり取りを行うことが出来ます DLL の置場所 ; Liblaries フォルダ内に置きます DLL の呼出し方 ; 使う機能のみを #import で宣言すれば OK です 例えば 配列 a のみを使うのであれば 下記のコードを先頭かヘッダファイルに書いておけば充分です #import "shared_memory.dll" double set_a(); double write_a(double,int); double read_a(int); double close_a(); #import 27/28

関数機能一覧 ; レジスタ r 配列 a 配列 b 配列 c set_r() 関数 write_r( データ, 要素 No) データ ;double 型 要素 No;int 型 read_r( 要素 No) 要素 No;int 型 close_r() set_a() write_a( データ, 要素 No) データ ;double 型 要素 No;int 型 read_a( 要素 No) 要素 No;int 型 close_a() set_b() write_b( データ, 要素 No) データ;double 型 要素 No;int 型 read_b( 要素 No) 要素 No;int 型 close_b() set_c() write_c( データ, 要素 No) データ;double 型 要素 No;int 型 read_c( 要素 No) 要素 No;int 型 close_c() 機能 レジスタ r 領域を設定します使用する場合に宣言を実施 要素 No にデータ ( 数値 ) を書込む要素 No は 0~199 可能 ( レジスタ数は 200 個 ) 要素 No 中のデータを読出す レジスタ r を閉じる 配列 a 領域を設定します 要素 No にデータ ( 数値 ) を書込む要素 No は 0~1999 可能 ( 要素数は 2000 個 ) 要素 No 中のデータを読出す 配列 a を閉じる配列 b 領域を設定します要素 No にデータ ( 数値 ) を書込む要素 No は 0~1999 可能 ( 要素数は 2000 個 ) 要素 No 中のデータを読み出す 配列 b を閉じる配列 c 領域を設定します要素 No にデータ ( 数値 ) を書込む要素 No は 0~3999 可能 ( 要素数は 4000 個 ) 要素 No 中のデータを読出す 配列 c を閉じる 以 上 28/28