記事"MQLのソケットの使用およびシグナルプロバイダになる方法"についてのディスカッション - ページ 7

削除済み  
Wemerson Guimaraes:

このコードはMQL4で動作しますか?

MQLのStartServer 関数でDLLのbind() 関数を呼び出すと、以下のメッセージが表示されます:



 

またまた超便利な記事!

このオプションはファイルやDBよりもずっと便利だ。

ありがとう。)

 
Wemerson Guimaraes:

こんにちは、MT4で正常に動作します。


ありがとう。信じられないコードだ!

こんにちは、これをMQL4に変更しようとしていますが、signalclientのTrade.mqh要件のために問題が発生しています。どのようにされましたか?

できれば、MT4のバージョンも教えていただけると、私のような初心者の助けになります。

よろしくお願いします。


削除済み  

取引のコピーを 開始し、各取引シンボルのチャートにExpert Advisor(サーバー/クライアント)を置き、多通貨Expert Advisorに対応させたところ、Expert Advisorは夕方から夜、朝にかけて多くの取引を発生させましたが、コピーされた取引量に応じていくつかの取引が失われました。

つまり、最低限、サーバーとクライアントのポジション・ボリュームの中間的な同期の必要性を定期的にチェックする機能を追加する必要があります。

また、端末を緊急リロードした後、サーバーは何らかの理由でポジションがゼロになったというメッセージをクライアントに送信し(実際はそうではない)、クライアントは従順にポジションをクローズする。このような観察結果である。

事例をもとにシグナルのサービスを作ってみます。

S.Y:

Очевидно, что данные примеры сервера, рассылающие любому клиенту информацию, не являются оптимальными. К примеру, вы наверняка захотите ограничить доступ к своей информации.  Значит, как минимум, к обязательным требованиям необходимо отнести:

  • クライアントの認証(ログイン/パスワード);
  • パスワード保護(ログインまたはIPを禁止/ブロック)。

これはどのように実装することができますか?これについての知識はゼロです(ローカルマシン上でサーバー/クライアントを実行しても、サーバーに接続されたままになっているクライアントがあります)。

 
Aleksandr Volotko:

これはどのように実装できるのでしょうか?これに関する知識はゼロです(ローカルマシンでサーバー/クライアントを実行しても、サーバーに接続されたままのクライアントもあります)。

https://www.mql5.com/en/code/15534

Adding password protection to your Indicator / Expert Advisor
Adding password protection to your Indicator / Expert Advisor
  • 投票: 19
  • 2016.05.25
  • Claude Beaudoin
  • www.mql5.com
Several methods of protecting your code have been proposed over the past, but were either too simple (less secure), required re-compilation of your code for each new customer (ok if you only plan on having a dozen or so customers) or far too complicated involving a remote host to validate the client terminal. Here I propose a simple password...
削除済み  
fxsaber:


ありがとう、調べてみるよ。

削除済み  
Aleksandr Volotko:

さて、端末を緊急リロードした後、サーバーはなぜかクライアントに「ポジションがゼロになった」というメッセージを送り(実際は違うのだが)、クライアントは従順にポジションをクローズする。そんな観測もある。

端末が起動したが、まだ取引サーバーに接続しておらず、ソケットが一気に立ち上がり、サーバーからクライアントにポジション不足の情報が送信され、クライアントが持っているポジションをカバーするか、クライアントがサーバーからポジションの情報を受信し、自分のポジションを見るまで - 利用可能なボリュームをバックアップして、それらを開くために急ぐかのどちらかであるため、ポジションに関する様々な誤解が発生すると私は理解しています。端末と取引サーバーの接続を事前にチェックすることで、このような誤解を解くことができると理解しています。

そうでなければ、ソケットの安定性は満足しています。

追加:

真実ではないポジションの ゼロボリュームと サーバーのメッセージから1いまいましいtakkiスリップは、私はこれがどのように発生し、これらのゼロが取られる場所を理解していません。

2018.02.10 17:42:49.549 signalclient (USDCHF,M15)       connect OK
2018.02.10 17:42:49.555 signalclient (USDCAD,M15)       connect OK
2018.02.10 17:42:49.555 signalclient (NZDUSD,M15)       connect OK
2018.02.10 17:42:49.555 signalclient (USDJPY,M15)       connect OK
2018.02.10 17:42:49.581 signalclient (AUDUSD,M15)       connect OK
2018.02.10 17:42:49.582 signalclient (GBPUSD,M15)       connect OK
2018.02.10 17:42:49.596 signalclient (EURUSD,M15)       connect OK
2018.02.10 17:42:50.562 signalclient (USDCHF,M15)       received msg from server: <<USDCHF|0.00>>
2018.02.10 17:42:50.562 signalclient (NZDUSD,M15)       received msg from server: <<NZDUSD|0.00>>
2018.02.10 17:42:50.562 signalclient (NZDUSD,M15)       server position: NZDUSD|0.00
2018.02.10 17:42:50.562 signalclient (USDJPY,M15)       received msg from server: <<USDJPY|0.00>>
2018.02.10 17:42:50.562 signalclient (USDCHF,M15)       server position: USDCHF|0.00
2018.02.10 17:42:50.562 signalclient (USDCAD,M15)       received msg from server: <<USDCAD|0.00>>
2018.02.10 17:42:50.562 signalclient (USDJPY,M15)       server position: USDJPY|0.00
2018.02.10 17:42:50.562 signalclient (USDCAD,M15)       server position: USDCAD|0.00
2018.02.10 17:42:50.574 signalclient (USDCAD,M15)       full close position
2018.02.10 17:42:50.575 signalclient (USDJPY,M15)       nothing change
2018.02.10 17:42:50.575 signalclient (NZDUSD,M15)       full close position
2018.02.10 17:42:50.577 signalclient (USDCHF,M15)       nothing change
2018.02.10 17:42:50.593 signalclient (AUDUSD,M15)       received msg from server: <<AUDUSD|0.00>>
2018.02.10 17:42:50.593 signalclient (AUDUSD,M15)       server position: AUDUSD|0.00
2018.02.10 17:42:50.594 signalclient (GBPUSD,M15)       received msg from server: <<GBPUSD|0.00>>
2018.02.10 17:42:50.594 signalclient (GBPUSD,M15)       server position: GBPUSD|0.00
2018.02.10 17:42:50.600 signalclient (GBPUSD,M15)       full close position
2018.02.10 17:42:50.601 signalclient (AUDUSD,M15)       full close position
2018.02.10 17:42:50.609 signalclient (EURUSD,M15)       received msg from server: <<EURUSD|0.00>>
2018.02.10 17:42:50.609 signalclient (EURUSD,M15)       server position: EURUSD|0.00
2018.02.10 17:42:50.613 signalclient (EURUSD,M15)       nothing change
2018.02.10 17:42:50.701 signalclient (USDCAD,M15)       CTrade::OrderSend: market sell 3.54 USDCAD [market closed]
2018.02.10 17:42:50.701 signalclient (NZDUSD,M15)       CTrade::OrderSend: market sell 2.50 NZDUSD [market closed]
2018.02.10 17:42:50.705 signalclient (GBPUSD,M15)       CTrade::OrderSend: market sell 0.10 GBPUSD [market closed]
2018.02.10 17:42:50.705 signalclient (AUDUSD,M15)       CTrade::OrderSend: market buy 1.27 AUDUSD [market closed]

もしクローズド・マーケットでなければ、ポジションは何らかの理由で崩壊していただろう。

H.Y.:そして、それは時々起こることで、一度ターミナルをリロードすると、すべてが正常で、あるべきようになり、別の時にはすべてがゼロにクローズされます...。

アレクセイ(@o_o)、どこを掘ればいいか知ってたら教えて。

その後ターミナルを再起動したところ、何の問題もなく、全ては当然のように動きました...。

2018.02.10 17:51:17.896 signalclient (EURUSD,M15)       close socket
2018.02.10 17:51:17.896 signalclient (AUDUSD,M15)       close socket
2018.02.10 17:51:17.896 signalclient (USDJPY,M15)       close socket
2018.02.10 17:51:17.898 signalclient (USDCAD,M15)       close socket
2018.02.10 17:51:17.899 signalclient (NZDUSD,M15)       close socket
2018.02.10 17:51:17.900 signalclient (GBPUSD,M15)       close socket
2018.02.10 17:51:17.901 signalclient (USDCHF,M15)       close socket
2018.02.10 17:52:02.337 signalclient (AUDUSD,M15)       connect OK
2018.02.10 17:52:02.340 signalclient (USDCHF,M15)       connect OK
2018.02.10 17:52:02.340 signalclient (USDCAD,M15)       connect OK
2018.02.10 17:52:02.432 signalclient (EURUSD,M15)       connect OK
2018.02.10 17:52:02.481 signalclient (GBPUSD,M15)       connect OK
2018.02.10 17:52:02.481 signalclient (NZDUSD,M15)       connect OK
2018.02.10 17:52:02.665 signalclient (USDJPY,M15)       connect OK
2018.02.10 17:52:03.350 signalclient (AUDUSD,M15)       received msg from server: <<AUDUSD|-1.27>>
2018.02.10 17:52:03.350 signalclient (USDCHF,M15)       received msg from server: <<USDCHF|0.00>>
2018.02.10 17:52:03.350 signalclient (USDCHF,M15)       server position: USDCHF|0.00
2018.02.10 17:52:03.350 signalclient (USDCAD,M15)       received msg from server: <<USDCAD|3.54>>
2018.02.10 17:52:03.350 signalclient (AUDUSD,M15)       server position: AUDUSD|-1.27
2018.02.10 17:52:03.350 signalclient (USDCAD,M15)       server position: USDCAD|3.54
2018.02.10 17:52:03.360 signalclient (AUDUSD,M15)       nothing change
2018.02.10 17:52:03.360 signalclient (USDCAD,M15)       nothing change
2018.02.10 17:52:03.360 signalclient (USDCHF,M15)       nothing change
2018.02.10 17:52:03.444 signalclient (EURUSD,M15)       received msg from server: <<EURUSD|0.00>>
2018.02.10 17:52:03.444 signalclient (EURUSD,M15)       server position: EURUSD|0.00
2018.02.10 17:52:03.449 signalclient (EURUSD,M15)       nothing change
2018.02.10 17:52:03.492 signalclient (GBPUSD,M15)       received msg from server: <<GBPUSD|0.10>>
2018.02.10 17:52:03.492 signalclient (NZDUSD,M15)       received msg from server: <<NZDUSD|2.50>>
2018.02.10 17:52:03.492 signalclient (NZDUSD,M15)       server position: NZDUSD|2.50
2018.02.10 17:52:03.492 signalclient (GBPUSD,M15)       server position: GBPUSD|0.10
2018.02.10 17:52:03.498 signalclient (NZDUSD,M15)       nothing change
2018.02.10 17:52:03.498 signalclient (GBPUSD,M15)       nothing change
2018.02.10 17:52:03.679 signalclient (USDJPY,M15)       received msg from server: <<USDJPY|0.00>>
2018.02.10 17:52:03.679 signalclient (USDJPY,M15)       server position: USDJPY|0.00
2018.02.10 17:52:03.683 signalclient (USDJPY,M15)       nothing change
 

シンボルごとにオープンしているロット数を決定するサーバーのディグ

MQLのポジション要求関数などのエラーチェックを追加する。

ゼロを返したのがMQLであって、ソケットがバカだったのではないことを確認するために、そこにプリントアウトを追加する。

削除済み  

OnInit()からOnTrade()を削除しました。

H.Y.:まだ終わっていません。でも、トレードサーバーとの端末接続を何度かチェックすることで、問題は解決したようです。

 

みなさん、こんにちは、


MQL5でコンパイルしているのですが、エラーが出続けます:

cannot cast 'sockaddr_in' to 'ref_sockaddr'

というエラーが出続けます:

ref_sockaddr ref=(ref_sockaddr)addrin;

EDIT:

興味のある方のために、ある構造体から別の構造体へフィールドを手動でコピーすることで解決しました。

以下がそのコードです:

...
  // 動作しない
  // ref_sockaddr ref = (ref_sockaddr) addrin;
  // 私のWA - WORKING
  ref_sockaddr ref = {0};
  sockaddrIn2RefSockaddr( addrin, ref );
...

// ------------------------ 
// struct sockaddr_in を struct ref_sockaddr にキャストする。
// ------------------------
void sockaddrIn2RefSockaddr( sockaddr_in& sai, ref_sockaddr& rsa ) {
  // 家族
  rsa.ref[ 0] = (char) (( sai.sin_family      ) & 0xff );
  rsa.ref[ 1] = (char) (( sai.sin_family >> 8 )) ;
  // ポート
  rsa.ref[ 2] = (char) (( sai.sin_port        ) & 0xff) ;
  rsa.ref[ 3] = (char) (( sai.sin_port >>  8  ) );
  // アドレス
  rsa.ref[ 4] = (char) (( sai.sin_addr        ) & 0xff );
  rsa.ref[ 5] = (char) (( sai.sin_addr >>  8  ) & 0xff );
  rsa.ref[ 6] = (char) (( sai.sin_addr >> 16  ) & 0xff );
  rsa.ref[ 7] = (char) (( sai.sin_addr >> 24  ) & 0xff );
  rsa.ref[ 8] = (char) (( sai.sin_addr >> 32  ) & 0xff );
  rsa.ref[ 9] = (char) (( sai.sin_addr >> 40  ) & 0xff );
  rsa.ref[10] = (char) (( sai.sin_addr >> 48  ) & 0xff );
  rsa.ref[11] = (char) (( sai.sin_addr >> 56  ) & 0xff );
  // ゼロ
  rsa.ref[12] = 0;
  rsa.ref[13] = 0;
  rsa.ref[14] = 0;
  rsa.ref[15] = 0;
}
いくつかのWSAエラー・コードでは コンパイル・エラーが多発したので、winsock.hから手動でインポートする必要があった:
WSAErrorDescript