FC2ブログ
にほんブログ村 為替ブログ システムトレード 自作EA派へ にほんブログ村 為替ブログ ユーロドルへ

ほったらかしのメタトレードで資産1億円を目指す

今月から楽天のアフェリエイトをやっています。
サイトを経由するだけで、購入金額の1%が懐に入ってきます。
ぜひぜひ、皆様もお試しくださいね。

今月から楽天のアフェリエイトをやっています。
サイトを経由するだけで、購入金額の1%が懐に入ってきます。
ぜひぜひ、皆様もお試しくださいね。

07 | 2019/08 | 09
- - - - 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

最強EA 9.2

無料ダウンロード

update

梅田に行ってきました。

さて、コーディングの続きです。

やはりファイル入出力する方が、早いという結論になりました。
参考ソースがありました。

https://www.mql5.com/en/forum/140679


今日中にプログラム完成させます。




update

とりあえず、プログラムを組んだが、文字列データはグローバル変数に入りませんでした。

しかたなく、DATATIMEと、ON/OFFフラグだけを保持して、あとはテキストデータ化して
ファイル入出力を使うしかないのかなあ・・・

ひとまず、知恵袋に投げて、いまから家族で梅田に買い物に行きます。

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q12212915032



今日は山行計画は中止にしました。

来週から9月なんですねえ (早いねうぇ)

9月目標としては、
・ バイナリOPのデータ抽出マクロの完成 
・ データの統計処理による勝率計算
・ トレードパターンの抽出
・ AIバイナリトレードの完成

ここまで取り付けたいと思います。




今回のメタトレード側の処理としては、
WEBサーバーを仕込んで置き、クライアントからリクエストが来たら、
それをトリガーにして、ティックデータを排出させるにあたり、
スクリプトとインジケーターの2つを使おうとしている。

関連記事
https://www.mql5.com/ja/articles/1393

プログラム構成としては、WEBサーバーをスクリプトにして無限に走らせておき、
EAはステータスの状態を、グローバル変数で判断して、リクエストが来ている状態なら、
csvファイルを新規にオープンして、一定時間だけ、ティックを書き出して、クローズするというのが良さそうだ。


-----------------------------------------
http://googolyenfx.blog18.fc2.com/blog-entry-110.html

Global variables
グローバル変数の制御を担う関数群

クライアント端末のグローバル変数はMQL4プログラムのグローバルスコープ(プログラム内のどこからでも参照可能)において宣言された変数と重複してはならない。

グローバル変数は最後の参照から4週間、クライアント端末内に保存され、その後自動的に削除される。
グローバル変数への参照とは、新しい値を設定することや読み込むことだけではない。

クライアント端末のグローバル変数は、クライアント端末内で起動しているすべてのMQL4プログラムから同時に参照できる。

スポンサーサイト





2019/08/31 17:16|MT4連携TB:0CM:0
update

ようやく、送信メッセージが送れました。

はまっていた箇所としては、CHATWORKSのSEND TIMEを
ストリングとして処理をするところ

最初はエポックタイムを、変換してから送ろうとしたけど、
やめました。

仕方なく、エポックタイムはメタトレード側で処理をします。

という訳で、PYTHON側のコードは終了いたしました。


あとはメタトレードで、受けた通貨ペアのログを取り、1分足のCSVを排出するところを、明日やります。

さっき、めっちゃ雨降ってきたよ~


#!/usr/bin/python
# -*- coding: utf-8 -*-
import json
from zmq import Context, REQ
from flask import Flask, request
import re
import pdb
from datetime import datetime



def mains(msg):
context = Context()
print("Connecting to hello world server...")
socket = context.socket(REQ)
socket.connect("tcp://localhost:5555")
for i in range(1):
socket.send(msg.encode('shift-jis'))
message = socket.recv()
print("Received reply %s [ %s ]" % (i, message))

def jsonConversion(jsonStr):
data = json.loads(jsonStr)
return data

app = Flask(__name__)

@app.route("/", methods=['POST'])
def webhook():
msg = request.get_data()
res = jsonConversion(msg)
res2 = res['webhook_event']['body']
result = re.match(r'[A-Z]{3}[\/][A-Z]{3}\s[A-Z]{3,}',res2)

if result != None:
res3 = res['webhook_event']['send_time']
mains(result.group(0)+' '+str(res3))
else:
print("not found!")
return msg

if __name__ == "__main__":
app.run()




update

何とか正規表現については、クリアできたようだ・・・

しかしながら、正規表現後のクラスが、ZEROMQのSENDエラーになってしまう・・・

誰かヘルプもらえないだろうか…

TypeError: <re.Match object; span=(0, 7), match=b'USD/JPY'> does not provide a buffer interface.




シグナルサイトから配信されるWEBHOOKには、
必要な情報となる、通貨ペアと、ポジション以外にも、
いろんな文章が文字列で乗っている。

基本的には、PYTHONでWEBHOOKメッセージに対して、
必要な情報を洗い出す(スクレイビング)処理が必要になる。


そこで正規表現を使おうとしているが、さっそく躓いている。

こんな時に役立つのが、teratailである。

さっそく、下記の投稿をした。

https://teratail.com/questions/208809


ちなみに、このサイトはITエンジニアが回答をくれるのだが、
質問の仕方がまずいと、かなりダメダシされるので、
ちょっと質問したいだけでも、相当量の情報を出す必要がある。

(もちろん、情報が多ければ、多いほど、それに対するアドバイスも
濃厚になるので、手間冴え惜しまなければ、質問内容は吟味した方がよい)


というわけで、今週末までの、スクレイビング処理を完成させて、
メタトレード側に、通貨ペア情報を送信するところを
仕上げなければならない。


ああ、完成はまだ先かなあ。。。



2019/08/28 21:38|MT4連携TB:0CM:0
ようやくプログラミングが進みました。

いろいろ、つまずいた点がありましたので報告します。


python側


#!/usr/bin/python
# -*- coding: utf-8 -*-
import json
from zmq import Context, REQ
from flask import Flask, request
import pdb

def mains(msg):
context = Context()
print("Connecting to hello world server...")
socket = context.socket(REQ)
socket.connect("tcp://localhost:5555")
# pdb.set_trace()
for i in range(10):
socket.send(msg)
message = socket.recv()
print("Received reply %s [ %s ]" % (i, message))

def jsonConversion(jsonStr):
data = json.loads(jsonStr)
return data

app = Flask(__name__)

@app.route("/", methods=['POST'])
def webhook():
msg = request.get_data()
res = jsonConversion(msg)

res2 = res['webhook_event']['body'].encode()
mains(res2)
return msg

if __name__ == "__main__":
app.run()



metatrade側


#include <Zmq/Zmq.mqh>

void OnStart()
{
string port = "5555";
uchar data[];

Context context("helloworld");
Socket socket(context,ZMQ_REP);
socket.bind(StringFormat("tcp://*:%s" ,port));

while(true)
{
ZmqMsg request;

socket.recv(request);
ArrayResize(data,request.size());
request.getData(data);
string msg = CharArrayToString(data);

Sleep(1000);

csv_out(msg);
// Send reply back to client
socket.send("msg");
}
}
//+------------------------------------------------------------------+

void csv_out(string &msg)
{

Print(msg);
}







python側は、WEBHOOKを受けるサーバー機能と、
MQL4にzeroMQでメッセージを送るクライアント機能
中継サーバーのような恰好になっている。

サーバーは、FLASKというWEBフレームワークを使っている。

FLASKは、ちょうどWEBページのフォルダ構造を
プログラムで書くような格好になっている。

関数定義されている名前には、まったく意味がないことに驚いた。
(スクリプト言語なので、@app.routeの次の行が実行されるのが
約束事のようになっている)

WEBHOOKのメッセージを受け取るには、
requestライブラリにある、get_dataメソッドを使う必要がある。

これはmetatrade側も同様であるが、
ソケットを繋いでも、戻ってくるのは、リクエストオブジェクト自体であり、
メッセージを引き出すには、getDATAメソッドを使う必要がある。

次に、送られるメッセージは文字列では無くて、バイナリデータというものである。
この辺りは、文字列-バイナリ変換しなければならないのである。

PYTHON側で言えば、encode()、decode()のメソッド
Metatrade側で言えば、CharArrayToString()関数となる。

とりあえず、手当たり次第にググったソースを真似して作ったわけだが・・・
このあたり、自分自身もプログラマとしての知識不足を実感する。

参考ソース







2019/08/23 05:06|MT4連携TB:0CM:0
昨日は通信の仕方について、学ばなければならないと認識。

キーワードとしては、IOTなどで言われている、分散ネットワークのことらしいが・・・

https://www.hulft.com/special-column/iot-architecture_01/iot-architecture_05


https://cloud-textbook.com/60/

もうだるだる。。。

しかしながら、我が社もIOT部門などもあり、



実はソフトウェア開発をやっている。

なので、これらの勉強は、いずれ身になる可能性があり
情報は仕入れておこうと思う。

--------------------------------
分類
キュー・メッセージングについて、下記の分類があります。

PTP (Peer To Peer) モデル または キューモデルPTP モデルは、1本のキューがあり、送信側と受信側が 1対1 の形になっているものです。
Pub/Sub (パブ・サブ) モデルPub/Sub モデルは、Publish/Subscribe のことで、 送信側と受信側のレイヤがわかれており、1対1 もできますし、1対多 にすることもできます。 「出版-購読型モデル」と言うこともあるようです。
さらに別の切り口として、PULL・PUSH があります。

PULL受信側が、新しいメッセージを取りに来るタイプ。 例えば1秒に1回とか、1分に1回などの頻度でメッセージを取りに来るので、その分のタイムラグが発生します。
PUSH新しいメッセージがあると (比較的) すぐに受信側に送りつけるタイプです。
例えば Amazon SQS は、PTP モデルであり、PULL のみです。 Google Pub/Sub は、Pub/Sub モデルであり、PULL と PUSH 両方が可能です。
---------------------------------

ちなみにzeroMQのマニュアルに記載されていたのは

-----------------------------------
第 1 章「基礎」で最初の 3 つは既に見てきました。そして排他的ペアのパターンは後の章で
やります。zmq_socket() の man ページはパターンについて詳しく説明していますのでよく
理解できるまで何度か読み返すだけの価値はあります。以下は接続と bind を行う際に有効な
ソケットペアの組み合わせです。(どちら側でも bind 出来ます)
• PUB と SUB
• REQ と REP
• REQ と ROUTER
• DEALER と REP
• DEALER と ROUTER
• DEALER と DEALER
• ROUTER と ROUTER
• PUSH と PULL
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

今回のシステム開発は、通信ができれば何でもよさそうなので、
この辺はパスして、次のコーディングに進むことにする。
(システム完成までの貴重な時間を、1日ロスしてしまう。)


今後のスケジュールをザクっと書く

・PYTHON-MT4 メッセージ通信仕様の確認
・LOCALHOSTでのHEBHOOK受審(python側)
・MT4へのメッセージ送信(通貨ペア、HI/LOシグナル) (python側)
・MT4でのメッセージ受信
・MT4、該当通貨ペアでの分足データのCSV出力

ここまでを今月中に完成することを目指したい



2019/08/22 07:14|MT4連携TB:0CM:0
今日から、いきなりサンプルソースを見ながら、プログラミングを開始している。

まずは、PYTHONとMT4の通信仕様の確認から。

正直、この手のジャンルは、まったくの無知状態。


まずはTCPとは何?
というところから、つまずいている。


とりあえず、パソコンの通信状態というのは、
何らかソフトで見れるらしい。

調べて入れたソフトがこれ。
https://forest.watch.impress.co.jp/library/software/tcpmonitor_p/


立ち上げておくと、通信ポートの状態が確認できる(らしい)



ひとまず、今日のところは、PYTHON側から下記のソースで
メッセージ送信できることは確認した


from zmq import Context, REQ

def Main():
context = Context()
print("Connecting to hello world server...")
socket = context.socket(REQ)
socket.connect("tcp://localhost:5555")

for i in range(10):
socket.send(b"sell usd")
message = socket.recv()
print("Received reply %s [ %s ]" % (i, message))

if __name__ == '__main__':
Main()


これまでのpythonの知識から、
軽くコードの説明をする。

最初のfromというのは、いわゆるライブラリのインストールである。
当然ながら、ライブラリを入れることが必要で、それはPIPというコマンドを
DOSで実行する。

cmd ⇒ pip install zmq

これでサクッとダウンロードされる

次に、pythonのプログラムの書き方であるが、
今回はメインだけのプログラムなので、
最初に、mainの中身を書いておき、
一番下の行で、mainを起動する。

ちょっと見ると、何がどうかは分からないと思うが
この構成は、丸暗記すればいい

とりあえず、このソースを走らせると、
TCPのポート、5555が解放される。

ちなみに、ローカルホストというのは、
自分のPC自体の名前を指す。

socket.send(文字列) で、ポートにメッセージを送る
socket.recv()で、メッセージを受け取る

文字列に b がついているのは、
pytonのバイナリ表現を示す、表記方法である。


次にMT側

MT側の導入は、少々てこずった。

やはり、こちらもライブラリを的確な場所に置くことが重要である。


//+------------------------------------------------------------------+
//| HelloWorldServer.mq5 |
//| Copyright 2016, Li Ding |
//| dingmaotu@hotmail.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Li Ding"
#property link "dingmaotu@hotmail.com"
#property version "1.00"

#include Zmq/Zmq.mqh '<>必要
//+------------------------------------------------------------------+
//| Hello World server in MQL |
//| Binds REP socket to tcp://*:5555 |
//| Expects "Hello" from client, replies with "World" |
//+------------------------------------------------------------------+
void OnStart()
{
Context context("helloworld");
Socket socket(context,ZMQ_REP);

socket.bind("tcp://*:5555");

while(true)
{
ZmqMsg request;

// Wait for next request from client

// MetaTrader note: this will block the script thread
// and if you try to terminate this script, MetaTrader
// will hang (and crash if you force closing it)

Print(socket.recv(request));
Sleep(1000);

ZmqMsg reply("World");
// Send reply back to client
socket.send(reply);
}
}
//+------------------------------------------------------------------+


動かしてみて気づいたのであるが、
送られてきたメッセージは、
TRUEという中身になっていた。

どうやらsocket.recvの内容が、
フラグになっていて、これはたぶん通信の
仕様をZMQ_REPにしているところが怪しい。

とりあえず、ソケットの種類が結構あるらしくて、
今回の選んだものは、単なるtrue/falseのフラグだけのような気がする。

これからは、ZMQのマニュアルを見て勉強することにする。

とりあえず、メタトレード側については、
かなりGITHUBの説明を見て、ちゃんとライブラリを入れることが大事

ようやく、動作確認まで出来たので、一安心した。

2019/08/21 06:51|MT4連携TB:0CM:0
ZeroMQについて、学んだことをまとめていく。

参考サイト
https://www.infoq.com/jp/news/2010/09/introduction-zero-mq/

ZeroMQソケットのペア

ZeroMQは,数多くのプログラミング言語とアプリケーションが使う高性能のソケットフレームワークである.これは,TCP等のさまざまな低レベル輸送を利用することができる複数タイプの接続とのソケットのインタフェースを提供する.2つのソケットの接続は,2つのプロセスが簡単に交信する手段を提供する.

ZMQソケットを開き,これを自動的に見付けられたポートに繋げる.

ソケットをオープン : socketA = SocketOpen[Automatic, "ZMQ"]
別のソケットをオープン : socketB = SocketConnect[socketA["DestinationPort"], "ZMQ"]
ソケットAからBにメッセージを書く :  WriteString[socketA, "This is a message from socketA!"]
メッセージを読む : ByteArrayToString[SocketReadMessage[socketA]]

コンセントに差すようなイメージなのかな・・・

https://qiita.com/gwappa/items/9677e1ea4adcf2d457f4

いろいろあるが、メタトレードのMQL言語と、ローカルホストに送られてくるWEBHOOKを
リンクして、チャートデータを取得したいのが今回の目的である。


とりあえず、MQL言語側を作る必要があって、
こちらはデータを返す側になるので、WEBサーバーといったところか

ローカルホスト側がクライアントになるので、
まずクライアント⇒サーバーへ、トリガのメッセージを送ればいい

情報としては、通貨ペアだけでいいだろう


返す方は、データを丸ごとを送るのは大変なので、
データをCSVで落として、そのリンク先URLを返せばいいだろう・・・


とりあえず、通信ができることが先決なので、
双方のソースコードを探すこととする。

4:00-4:30 今日も30分だけ、ITの勉強をしている。

部屋が蒸し暑くて、身体が痒い
日曜に御在所に行ったのであるが、久々の登山で
身体が活性化されたのだろうか・・・

仕事も始まって、中国語の勉強、ITの勉強など、
またまた時間を作るのが大変である。

さて、いまから中国語テキストを30分やって、
もうひと眠りするかなあ。。。



2019/08/20 04:10|MT4連携TB:0CM:0
ブログを放置して1年半、その間に色んな事があった。

まず父の介護、死去、そして遺産・・・

18年の夏は悲惨だった。
パーキンソン病の父の入退院の繰り返し、自宅介護、どこの介護施設にするのか、などなど

ほぼ疲れ切った夏だったが、なんとか先行きの病院まで手配され、
父とは盆明けに最後の会話をした。
(会話といっても、その時点でほとんど意思表示することも難しい状態で
唯一、病院のベットで親父に目と目で話しかけたぐらいで・・・)

10月になり出張中に、父が危ないとの連絡が入った。
その日の晩には、実はもう息を引き取っていた。

この瞬間に感じたことは、悲しみではなく、安堵であった。

お葬式も無事に終え、その後、父からの遺産が入ったため、
それから1年になるが、トレードなどしなくても結構、潤っていたのが現実だ。

証券なども引き継ぎ、それこそ車の買い替えや、家のリフォームなど、
いままでトレードで一発当てないと手が届かなかったことに、
簡単に届くことができた。

それから12月になり、仕事で中国への出張が続いた。
そこで感じたことは、25年前に中国語を勉強すべく
北京大学に短期留学をした経験があるが、
その知識を今になって、再度勉強しなおすという
少々時間がかかったが、自己投資というものが、こういう形でリターンにつながるなんて
思ってもみなかった。

そこから半年、中国語の勉強をしまくった。ヘッドホン型のウォークマン、翻訳機なども
余ったお金で買いまくり、中国出張の折には、GOPROなどのアクションカメラも
新調して、ずいぶん無駄な買い物をしたものだ。。。

ようやく、自分の中に、このままの浪費ではだめだという感情が目覚め、
なんとかトレードで復帰を図ろうと考え出した。

その矢先、とある情報商材への投資を試みてみたが、やはり人生、そうは甘くはない。

そんなこんなで、このブログにやっと舞い戻ってきた。


今年は、仕事の面でも一息がついて、夏休みを優雅に過ごしている。

毎年の猛暑でうんざりするが、PCに関しても新しくhttps://www.gpd-direct.jp/p2max
クラウドファウンディングに応募し、やっと納得のできるものが手に入りそうである。

明日で盆休みは終わるが、連休最後は家族を連れて、山に行くことにした。

しばらく中国一色だった自分も、少し頭の切り替えができた気がする。

そして、最近は中国語の勉強から、プログラム言語の勉強にちょっとシフトしている。
しかしながら、これは一時的なものであって、今後のIT系に進むにしても、
中国というものとは切っては切れない関係だと考えている。

人間というものは不思議だが、難関なものに立ち向かえば立ち向かうほど、
モチベーションが上がり、生きがいを得たような気持になる。

まだまだ人生やらなければならないことがある。

そんなことを決意した今日この頃である。


2019/08/17 21:59|MT4連携TB:0CM:0

motochan

Author:motochan
人に感謝されることをやっていく。誰かに喜ばれること。先に歩いて、道を作っていくこと。喜ばれることを、生きがいにしていく。時代は、後でついてくるもの。自分で感じたことを、自分がやっていく。世の中にないものは、自分で考えていく。理想とするものは、自分が自ら考える。自己の満足が、他人の満足につながる。


詳細はコチラ>>

Copyright(C) 2006 テクニカル講座上級の部屋 All Rights Reserved.
Powered by FC2ブログ. template designed by 遥かなるわらしべ長者への挑戦.