1

JSONの URL から読み取るにはどうすればよいMQL5ですか?

たとえば、この単純な例JSON: https://api.myjson.com/bins/56z28

{ "employees": [ { "firstName": "John",
                   "lastName":  "Doe"
                   },
                 { "firstName": "Anna",
                   "lastName":  "Smith"
                   },
                 { "firstName": "Peter",
                   "lastName":  "Jones"
                   }
                 ]
  }
4

1 に答える 1

1

シンプルですが、制限があります。

MetaTrader Terminal 5 はコード実行環境であり、外部 URL ターゲット (許可された URL として明示的に構成されている場合) と、HTTP/HTTPSポートを介して両方のプロトコルを介して80/443それぞれ通信できます。

   string aCookieHOLDER = NULL,
          aHttpHEADERs;

   char   postBYTEs[],
          replBYTEs[];    
   int    aRetCODE;
   string aTargetURL = "https://api.myjson.com/bins/56z28";

                    /*  to enable access to the URL-> pointed server,
                        you should append "https://api.myjson.com/bins/56z28"
                        to the list of allowed URLs in
                        ( Main Menu -> Tools -> Options, tab "Expert Advisors" ):
                        */
   ResetLastError();                     // Reset the last error code
   int    aTIMEOUT = 5000;               // less than 1 sec. is NOT
                                         // enough for slow Internet connection
   aRetCODE = WebRequest( "GET",
                          aTargetURL,
                          aCookieHOLDER,
                          NULL,
                          aTIMEOUT,
                          postBYTEs,
                          0,
                          replBYTEs,
                          aHttpHEADERs
                          );
   if ( aRetCODE == EMPTY )             // Check errors
   {    Print( "Error in WebRequest(). Error code  = ", GetLastError() );    
     }
   else
   {    // Load was successfull, PROCESS THE STRING ... assumed to be a JSON
   }

コードに示されているように、この関数を使用するには、[オプション] ウィンドウの [Expert Advisors] タブにある許可された s のリストに、アプリオリにWebRequest()必要なすべての s (サーバー) のアドレスを追加する必要があります。サーバー ポートは、指定されたプロトコルに基づいて自動的に選択されます - " " および" " (無料のオプションではありません...)。URLURL80http://443https://

WebRequest()関数は同期的です。つまり、プログラムの実行を中断/ブロック (!) し、要求された URL からの応答を待ちます。応答を受信する際の遅延が大きくなる可能性があるため、インジケーターからの呼び出しには関数を使用できません。これは、インジケーターが 1 つのシンボルのすべてのインジケーターとチャートによって共有される共通のスレッドで実行されるためです。シンボルのチャートの 1 つでインジケーターのパフォーマンスが遅延すると、同じシンボルのすべてのチャートの更新が停止する場合があります (!!!!)。

Expert Advisorsこの関数は、およびからのみ呼び出すことができますscripts。これらは独自の実行スレッドで実行されるためです。から関数を呼び出そうとすると、Custom IndicatorエラーGetLastError()が返されます4060"Function is not allowed for call".

WebRequest() ストラテジーテスターでは実行できません。


悪いニュース?

これらすべてがプロジェクトにとって悪いニュースのように聞こえる場合でも、あきらめないでください。コードは DLL 関数を呼び出すことができるため、コードとスムーズに連携し、本番システムで上記の制限のいずれも含まないMQL、公平で分散型のノンブロッキング コミュニケーターを統合できます。MQL

于 2016-05-02T14:37:12.863 に答える