Die Forderungen richten sich natürlich nicht an Sie, sondern an die Inhaltsanbieter. Diese geben aus irgendeinem Grund keine Binärdaten, sondern Textdaten ))))
An dieser Tatsache können wir leider nichts ändern.
Die Forderungen richten sich natürlich nicht an Sie, sondern an die Inhaltsanbieter. Diese geben aus irgendeinem Grund keine Binärdaten, sondern Textdaten ))))
An dieser Tatsache können wir leider nichts ändern.
In diesem Artikel geht es um API und wie man sie nutzt. Kennen Sie eine API, die Sie mit binären Forex-Daten versorgt? Dann stellen Sie sie vor.
Nächster Punkt: Sie kritisieren, warum man einen normalen Computer zum Spielen von FIFA2024 verwenden sollte, wenn ein Quantencomputer schneller ist. Die Antwort ist einfach: Ich brauche diese Art von Rechenleistung nicht. Die Antwort auf dieses Argument lautet also, dass die meisten Daten, die in diesem Bereich in der API ausgetauscht werden, im Bereich von wenigen Megabyte liegen und es keinen Bedarf an Geschwindigkeit gibt. Außerdem verwenden alle Anbieter von Forex-Daten Standards wie XML, JSON...
Ich bin nicht gegen die Verwendung von JSON. Ich verwende es selbst, aber nur in der Entwicklungsphase, da man in PostMan oder WireShark immer eine gut lesbare Antwort sehen kann.
Ich wollte nur darauf hinweisen, dass in dem Artikel zu Unrecht das Binärformat nicht einmal erwähnt wurde. Außerdem ist das leistungsfähigere JSON-Binärformat (JSONB) jetzt auf dem Vormarsch.
Wenn ich Zugang zu einem Server habe, verwende ich für den Austausch zwischen Server und Client immer binäre Daten. Es gibt nur einen Grund, warum JSON überall verwendet wird: lesbar (für den Benutzer, aber nicht für den Computer). Damit es weniger dumme Fragen von Benutzern gibt.
Selbst bei Websockets, wo die übertragenen Daten in der Regel sehr klein sind, halte ich es für sinnvoll, binäre Daten zu verwenden. Zumindest weil es ein produktiveres System mit weniger Last auf der Server- und Client-Seite ist. Und wenn man Cloud-Technologien einsetzt, was in der heutigen, hart umkämpften Realität sinnvoll ist, spart man viel Geld für deren Bezahlung. Schließlich verbraucht die Serialisierung eine Menge Ressourcen und spart eine Menge Datenverkehr.
Nikolai Semko #: Ich bin nicht gegen die Verwendung von JSON. Ich verwende es selbst, aber nur in der Entwicklungsphase, da man in PostMan oder WireShark immer eine gut lesbare Antwort sehen kann.
Ich wollte nur darauf hinweisen, dass in dem Artikel zu Unrecht das Binärformat nicht einmal erwähnt wird. Außerdem ist das leistungsfähigere JSON-Binärformat (JSONB) jetzt auf dem Vormarsch.
Wenn ich Zugang zu einem Server habe, verwende ich für den Austausch zwischen Server und Client immer binäre Daten. Es gibt nur einen Grund, warum JSON überall verwendet wird: lesbar (für den Benutzer, aber nicht für den Computer). Um weniger dumme Fragen von Benutzern zu haben.
Selbst in Websockets, wo in der Regel nur sehr kleine Daten übertragen werden, halte ich die Verwendung von Binärdaten für sinnvoll. Zumindest weil es ein produktiveres System mit weniger Last auf der Server- und Client-Seite ist. Und wenn man Cloud-Technologien einsetzt, was in der heutigen, hart umkämpften Realität sinnvoll ist, spart man viel Geld für deren Bezahlung. Schließlich verbraucht die Serialisierung eine Menge Ressourcen und spart eine Menge Datenverkehr.
Vielen Dank, dass Sie sich die Zeit genommen haben, Ihre Gedanken mit uns zu teilen. Ich verstehe Ihren Standpunkt voll und ganz, und die Punkte, die Sie über die Verwendung von Binärformaten und JSONB angesprochen haben, sind sehr berechtigt. Sie haben Recht, dass JSON im Vergleich zu Binärformaten nicht so sehr für die Systemleistung optimiert ist, und das ist etwas, dessen sich viele Entwickler bewusst sind.
In dem von uns verfassten Artikel haben wir uns in erster Linie auf JSON konzentriert, weil 99 % der Finanzdatenanbieter, insbesondere im Forex-Bereich, diesen Standard für den Datenaustausch verwenden und viele Plattformen und Dienste Daten in diesem Format bereitstellen. Aus diesem Grund haben wir uns nicht mit anderen Standards befasst.
Nochmals vielen Dank, dass Sie uns Ihre Sichtweise mitgeteilt und auf dieses wichtige Detail hingewiesen haben.
Die Forderungen richten sich natürlich nicht an Sie, sondern an die Inhaltsanbieter. Diese geben aus irgendeinem Grund keine Binärdaten, sondern Textdaten ))))
An dieser Tatsache können wir leider nichts ändern.
Ja, ich verstehe das vollkommen. Außerdem sind wir verpflichtet, diesen Standard zu verwenden, weil fast alle Finanzdatenanbieter diese Methode verwenden.
Hallo, hier ist es. Ich habe darum gebeten, dass ich es in der mql5-Community poste =
//+------------------------------------------------------------------+//|ZIWOX API und technische Strategie.mq5 |//|Copyright 2024, ssabbaghi |//| https://www.mql5.com/de/users/ssabbaghi |//+------------------------------------------------------------------+#property copyright"Sara Sabbaghi"#property link"https://www.mql5.com/de/users/ssabbaghi"#property version"1.0"#property strict//---- Eingabeparameterinputstring APIKey = "xxxxaquisuakey" ; // Ihr eindeutiger API-Schlüsselinputstring SymbolPrefix = "" ; // Ihr Broker-Kontosymbol Präfixinputstring SymbolSuffiex = "m" ; // Ihr Broker-Kontosymbol Suffixinputint shortMAPeriod = 50 ; // Langsamer MA-Zeitrauminputint longMAPeriod = 200 ; // Schneller MA-Zeitrauminputdouble Lots = 0.01 ; // Statisches Auftragsvolumeninputint APICallInterval = 300 ; // Intervall zwischen API-Aufrufen in Sekunden (5 Minuten)// Bibliotecas CatBoost#include <JAson.mqh>
CJAVal JsonValue;
string OBJPREFIX = "ZXAPI" ,
SymbolRequest = "" ,
APIJSON[];
bool APIOK = false ;
datetime LastAPICallTime = 0 ; // Armazena o tempo da última chamada à API//+------------------------------------------------------------------+//| Experten-Initialisierungsfunktion|//+------------------------------------------------------------------+intOnInit ()
{
EventSetTimer ( 30 );
ArrayResize (APIJSON, 15 );
SymbolRequest = PureSymbol( Symbol (), SymbolSuffiex, SymbolPrefix); // Vorbereiten des tatsächlichen SymbolnamensComment ( "Wait a sec, to Get API data..." );
return ( INIT_SUCCEEDED );
}
//+------------------------------------------------------------------+//| Experten-Deinitialisierungsfunktion|//+------------------------------------------------------------------+voidOnDeinit ( constint reason)
{
Comment ( "" );
ObjectsDeleteAll ( 0 );
}
//+------------------------------------------------------------------+//| Experten-Tick-Funktion OnTick()|//+------------------------------------------------------------------+voidOnTick ()
{
if (!APIOK) return ;
double shortMA, longMA;
long ticket = - 1 ;
if (IsNewCandle())
{
shortMA = iMA ( Symbol (), PERIOD_CURRENT , shortMAPeriod, 0 , MODE_SMA , PRICE_CLOSE );
longMA = iMA ( Symbol (), PERIOD_CURRENT , longMAPeriod, 0 , MODE_SMA , PRICE_CLOSE );
// Prüfung auf Crossover-Signaleif ( int (APIJSON[ 3 ]) >= 60 ) // wenn die Hausseprognose höher als 60% ist
{
if (shortMA > longMA) // BUY trend
{
if ( OrdersTotal () == 0 ) {
MqlTradeRequest request;
MqlTradeResult result;
request.action = TRADE_ACTION_DEAL ; // TRADE_ACTION_DEAL für Kauf verwenden
request.symbol = Symbol ();
request.volume = Lots;
request.type = ORDER_TYPE_BUY ; // ORDER_BUY für den Kauf verwenden
request.price = SymbolInfoDouble ( Symbol (), SYMBOL_ASK );
request.sl = 0 ;
request.tp = 0 ;
request.deviation = 3 ;
request.comment = "Buy Order" ;
if (! OrderSend (request, result)) {
Print ( "Error opening buy order: " , GetLastError ());
}
}
}
}
if ( int (APIJSON[ 4 ]) >= 60 ) // wenn die Baisseprognose höher als 60% ist
{
if (shortMA < longMA) // Trend verkaufen
{
if ( OrdersTotal () == 0 )
{
MqlTradeRequest request;
MqlTradeResult result;
request.action = TRADE_ACTION_DEAL ; // TRADE_ACTION_DEAL für Verkauf verwenden
request.symbol = Symbol ();
request.volume = Lots;
request.type = ORDER_TYPE_SELL ; // ORDER_SELL für Verkauf verwenden
request.price = SymbolInfoDouble ( Symbol (), SYMBOL_BID );
request.sl = 0 ;
request.tp = 0 ;
request.deviation = 3 ;
request.comment = "Sell Order" ;
if (! OrderSend (request, result)) {
Print ( "Error opening sell order: " , GetLastError ());
}
}
}
}
}
}
//+------------------------------------------------------------------+//| OnTimer-Funktion für Experten|//+------------------------------------------------------------------+voidOnTimer ()
{
// Überprüft, ob die Zeitspanne, die seit dem letzten Aufruf der API verstrichen ist, größer ist als das definierte Intervall.if ( TimeCurrent () - LastAPICallTime >= APICallInterval)
{
string APIfilename = SymbolRequest + "_API_Data.json" ; // Dateiname des API-Speichers
APIOK = GetAPI(SymbolRequest, APIKey, APIfilename); // Abrufen der API-Daten und Speichern unter APIfilenameif (APIOK) JsonDataParse(APIfilename, APIJSON); // Lesen Sie die JSON-Daten und speichern Sie sie im Array API_DATAComment ((APIOK ? "API OK" : "API FAILED" ),
"\nAPI:\n" ,
"\nBullish Forecast: " , APIJSON[ 3 ],
"\nBearish Forecast: " , APIJSON[ 4 ],
"\nRetail traders Long: " , APIJSON[ 5 ],
"\nRetail traders Short: " , APIJSON[ 6 ],
"\nMarket Sentiment: " , APIJSON[ 14 ]
);
// Aktualisiert das Tempo des letzten API-Kontakts
LastAPICallTime = TimeCurrent ();
}
}
//+------------------------------------------------------------------+//| Neue Kerzenprüfungsfunktion|//+------------------------------------------------------------------+datetime NewCandleTime = TimeCurrent ();
bool IsNewCandle()
{
if (NewCandleTime == iTime ( Symbol (), 0 , 0 ))
returnfalse ;
else
{
NewCandleTime = iTime ( Symbol (), 0 , 0 );
returntrue ;
}
}
//+------------------------------------------------------------------+//| Reine Symbolfunktion|//+------------------------------------------------------------------+string PureSymbol( string symbol, string suffiex, string prefix)
{
string puresymbol = symbol;
if (prefix != "" || suffiex != "" )
{
StringReplace (puresymbol, suffiex, "" );
StringReplace (puresymbol, prefix, "" );
}
return puresymbol;
}
//+------------------------------------------------------------------+//| Fondsdaten von ziwox abrufen|//+------------------------------------------------------------------+datetime LastWebRequest = 0 ; // Verwendung dieser Datetime-Variable für die Begrenzung fehlgeschlagener Anfragen APIbool GetAPI( string symbolname, string apikey, string filename)
{
Print ( "Get API Update" );
bool NeedToUpdate = false ;
// Prüfen, ob die API-Datendatei verfügbar istif ( FileGetInteger (filename, FILE_EXISTS , true ) >= 0 )
{
// Prüfen Sie die letzte Aktualisierungszeit anhand der Zeit des Änderungsdatums der Dateiif ( TimeLocal () - ( datetime ) FileGetInteger (filename, FILE_MODIFY_DATE , true ) > 900 ) // Aktualisierung der Daten alle 15 Minuten
NeedToUpdate = true ;
}
else
NeedToUpdate = true ;
if (NeedToUpdate && TimeLocal () - LastWebRequest > 300 ) // Wiederholung einer fehlgeschlagenen API-Anfrage alle 5 Minuten
{
string cookie = NULL , headers;
char post[], result[];
int res;
string URL = "https://www.ziwox.com/terminal/services/API/V1/fulldata.php?expn=ziwoxuser&apikey=" + apikey + "&apitype=json&pair=" + symbolname;
ResetLastError ();
int timeout = 5000 ;
res = WebRequest ( "GET" , URL, cookie, NULL , timeout, post, 0 , result, headers);
if (res == - 1 )
{
LastWebRequest = TimeLocal ();
int error = GetLastError ();
if (error == 4060 )
Print ( "API data Webrequest Error " , error, " Check your webrequest on Metatrader Expert option." );
elseif (error == 5203 )
Print ( "HTTP request for " + symbolname + " Data failed!" );
elsePrint ( "Unknown HTTP request error(" + string (error) + ")! " + symbolname + " Data" );
returnfalse ;
}
elseif (res == 200 )
{
LastWebRequest = TimeLocal ();
string HTTPString = CharArrayToString (result, 0 , 0 , CP_UTF8 );
Print ( "HTTP request for " + symbolname + " Data successful!" );
Print (HTTPString);
if ( StringFind (HTTPString, "invalid api key" , 0 ) != - 1 ) {
Alert ( "Invalid API key" );
returnfalse ;
}
// Speichern Sie die API-Daten in einer gemeinsamen Ordnerdateiint filehandle = FileOpen (filename, FILE_READ | FILE_SHARE_READ | FILE_WRITE | FILE_SHARE_WRITE | FILE_BIN | FILE_COMMON );
if (filehandle != INVALID_HANDLE )
{
FileWriteArray (filehandle, result, 0 , ArraySize (result));
FileClose (filehandle);
}
}
}
returntrue ;
}
//+------------------------------------------------------------------+//| JSON Data Parse Funktion|//+------------------------------------------------------------------+void JsonDataParse( string filename, string &_APIJSON[])
{
for ( int arraIn = 0 ; arraIn < ArraySize (APIJSON); arraIn++) APIJSON[arraIn] = "" ;
if ( FileGetInteger (filename, FILE_EXISTS , true ) >= 0 )
{
int FileHandle = FileOpen (filename, FILE_READ | FILE_SHARE_READ | FILE_WRITE | FILE_SHARE_WRITE | FILE_BIN | FILE_COMMON );
char jsonarray[];
FileReadArray (FileHandle, jsonarray);
FileClose (FileHandle);
JsonValue.Clear();
JsonValue.Deserialize( CharArrayToString (jsonarray, 0 , 0 , CP_UTF8 ));
_APIJSON[ 0 ] = JsonValue[ 0 ][ "Symbol" ].ToStr();
_APIJSON[ 1 ] = JsonValue[ 0 ][ "Fundamental Bias" ].ToStr();
_APIJSON[ 2 ] = JsonValue[ 0 ][ "Fundamental Power" ].ToStr();
_APIJSON[ 3 ] = JsonValue[ 0 ][ "AI Bullish Forecast" ].ToStr();
_APIJSON[ 4 ] = JsonValue[ 0 ][ "AI Bearish Forecast" ].ToStr();
_APIJSON[ 5 ] = JsonValue[ 0 ][ "Retail Long Ratio" ].ToStr();
_APIJSON[ 6 ] = JsonValue[ 0 ][ "Retail Short Ratio" ].ToStr();
_APIJSON[ 7 ] = JsonValue[ 0 ][ "Retail Short Lot" ].ToStr();
_APIJSON[ 8 ] = JsonValue[ 0 ][ "Retail Short pos" ].ToStr();
_APIJSON[ 9 ] = JsonValue[ 0 ][ "Base COT NET" ].ToStr();
_APIJSON[ 10 ] = JsonValue[ 0 ][ "Base COT change" ].ToStr();
_APIJSON[ 11 ] = JsonValue[ 0 ][ "Quote COT NET" ].ToStr();
_APIJSON[ 12 ] = JsonValue[ 0 ][ "Quote COT change" ].ToStr();
_APIJSON[ 13 ] = JsonValue[ 0 ][ "COT chng Ratio" ].ToStr();
_APIJSON[ 14 ] = JsonValue[ 0 ][ "Risk Sentiment" ].ToStr();
}
}
//+------------------------------------------------------------------+
Version für MQL5 METATRADER 5 Ich habe Änderungen am Code vorgenommen, so dass es in Metatrader 5 funktionieren würde. Die Änderungen wurden auch in Bezug auf die Kodierung für bessere Bedingungen in der aktuellen kommerziellen Situation gemacht. Alle Änderungen dienten der Anpassung des Codes an Metatrader 5. Er ist funktionsfähig. Laden Sie einfach diese Datei herunter und führen Sie sie aus. Wenn nötig, die JAson.mqh Bibliothek, die im Originalcode unseres Begleiters zu finden ist. Mein Name ist Ney Borges. Ich komme aus Brasilien, Bundesstaat Goiás, Stadt Caldas Novas, mitten im Wald von Brasilien. Es war sehr schwierig, alleine zu lernen, ohne jemanden, der mir hilft, aber hier in der Gemeinschaft habe ich viel gelernt. Ich danke Ihnen.
Version für MQL5 METATRADER 5 Ich habe Änderungen am Code vorgenommen, so dass er in Metatrader 5 funktionieren würde. Die Änderungen wurden auch in Bezug auf die Kodierung für bessere Bedingungen in der aktuellen kommerziellen Situation gemacht. Alle Änderungen dienten der Anpassung des Codes an Metatrader 5. Er ist funktionsfähig. Laden Sie einfach diese Datei herunter und führen Sie sie aus. Wenn nötig, die JAson.mqh Bibliothek, die im Originalcode unseres Begleiters zu finden ist. Mein Name ist Ney Borges. Ich komme aus Brasilien, Bundesstaat Goiás, Stadt Caldas Novas, mitten im Wald von Brasilien. Es war sehr schwierig, alleine zu lernen, ohne jemanden, der mir hilft, aber hier in der Gemeinschaft habe ich viel gelernt. Ich danke Ihnen.
Ja, ich verstehe das vollkommen. Außerdem sind wir verpflichtet, diesen Standard zu verwenden, da fast alle Finanzdatenanbieter diese Methode anwenden.
Ney Borges #: Hallo, hier ist es, also, worum ich gebeten habe, ist, dass ich es in der mql5-Community poste =
Version für MQL5 METATRADER 5 Ich habe Änderungen am Code vorgenommen, so dass er in Metatrader 5 funktionieren würde. Die Änderungen wurden auch in Bezug auf die Kodierung für bessere Bedingungen in der aktuellen kommerziellen Situation gemacht. Alle Änderungen dienten der Anpassung des Codes an Metatrader 5. Er ist funktionsfähig. Laden Sie einfach diese Datei herunter und führen Sie sie aus. Wenn nötig, die JAson.mqh Bibliothek, die im Originalcode unseres Begleiters zu finden ist. Mein Name ist Ney Borges. Ich komme aus Brasilien, Bundesstaat Goiás, Stadt Caldas Novas, mitten im Wald von Brasilien. Es war sehr schwierig, alleine zu lernen, ohne jemanden, der mir hilft, aber hier in der Gemeinschaft habe ich viel gelernt. Ich danke Ihnen.
Version für MQL5 METATRADER 5 Ich habe Änderungen am Code vorgenommen, so dass er in Metatrader 5 funktionieren würde. Die Änderungen wurden auch in Bezug auf die Kodierung für bessere Bedingungen in der aktuellen kommerziellen Situation gemacht. Alle Änderungen dienten der Anpassung des Codes an Metatrader 5. Er ist funktionsfähig. Laden Sie einfach diese Datei herunter und führen Sie sie aus. Wenn nötig, die JAson.mqh Bibliothek, die im Originalcode unseres Begleiters zu finden ist. Mein Name ist Ney Borges. Ich komme aus Brasilien, Bundesstaat Goiás, Stadt Caldas Novas, mitten im Wald von Brasilien. Es war sehr schwierig, alleine zu lernen, ohne jemanden, der mir hilft, aber hier in der Gemeinschaft habe ich viel gelernt. Ich danke Ihnen.
Brasilien - Goiás - Caldas Novas - Ney Borges
Fiz algumas correçoes ao codigo para funcionar no MQL5 gostaria que por gentilesa verificasse e retornar, obrigado - Sara Sabaghi
//+------------------------------------------------------------------+//| Ney Borges versão mql5 de ZIWOX API and Technical Strategy.mq5 |//|Copyright 2024, ssabbaghi |//| https://www.mql5.com/de/users/ssabbaghi |//+------------------------------------------------------------------+#property copyright"Sara Sabbaghi"#property link"https://www.mql5.com/de/users/ssabbaghi"#property version"1.0"#property strict#property description"Experte für Redaktionsfunktionen für ZIWOX API"// Bibliotecas#include <JAson.mqh>
CJAVal JsonValue;
// Propriedades do Expert para permitir funções de rede//#property script_show_inputs//#property script_show_confirm//---- Eingabeparameterinputstring APIKey = "sua Key aqui xxxxxxxx"; // Ihr eindeutiger API-Schlüsselinputstring SymbolPrefix = ""; // Ihr Broker-Kontosymbol Präfixinputstring SymbolSuffiex = "m"; // Ihr Broker-Kontosymbol Suffixinputint shortMAPeriod = 50; // Langsamer MA-Zeitrauminputint longMAPeriod = 200; // Schneller MA-Zeitrauminputdouble Lots = 0.01; // Statisches Auftragsvolumeninputdouble BullishThreshold = 60.0; // Schwellenwert für Hausseprognoseinputdouble BearishThreshold = 60.0; // Schwellenwert für rückläufige Prognoseinputint APICallInterval = 300; // Intervall zwischen API-Aufrufen in Sekunden (5 Minuten)string OBJPREFIX = "ZXAPI",
SymbolRequest = "",
APIJSON[];
bool APIOK = false;
datetime LastAPICallTime = 0; // Armazena o tempo da última chamada à API//+------------------------------------------------------------------+//| Funktion zum Testen der HTTP-Verbindung|//+------------------------------------------------------------------+bool TestHTTPConnection()
{
string cookie=NULL,headers;
char post[],result[];
string url="https://www.ziwox.com";
ResetLastError();
int timeout=5000;
int res=WebRequest("GET",url,cookie,NULL,timeout,post,0,result,headers);
if(res==-1)
{
int error=GetLastError();
string msg = "Falha ao conectar, erro "+IntegerToString(error);
// Se for erro de permissão, mostra mensagem específicaif(error==4014)
msg = "Adicione "+url+" em Ferramentas -> Opções -> Expert Advisors -> Permitir WebRequest";
Print("DEBUG: ", msg);
return(false);
}
Print("DEBUG: Conexão HTTP testada com sucesso");
return(true);
}
//+------------------------------------------------------------------+//| Experten-Initialisierungsfunktion|//+------------------------------------------------------------------+intOnInit()
{
Print("=== Iniciando Expert Advisor ===");
// Verifica configurações básicasif(!TerminalInfoInteger(TERMINAL_TRADE_ALLOWED))
{
Print("AVISO: Algorithmic Trading não está permitido");
// Continua mesmo assim
}
if(!TerminalInfoInteger(TERMINAL_CONNECTED))
{
Print("AVISO: Das Terminal ist nicht mit dem Internet verbunden.);
// Continua mesmo assim
}
// Konfiguration von EAEventSetTimer(30);
ArrayResize(APIJSON, 15);
SymbolRequest = PureSymbol(Symbol(), SymbolSuffiex, SymbolPrefix);
// Die URL, die verwendet werden soll, wird vorbereitet und angezeigt.string cleanSymbol = SymbolRequest;
StringReplace(cleanSymbol, "m", "");
string apiUrl = StringFormat("https://www.ziwox.com/terminal/services/API/V1/fulldata.php?expn=ziwoxuser&apikey=%s&apitype=json&pair=%s",
APIKey, cleanSymbol);
Print("URL configurada: ", apiUrl);
Print("IMPORTANTE: Adicione a URL https://www.ziwox.com em:");
Print("Ferramentas -> Opções -> Expert Advisors -> Permitir WebRequest");
Comment("Iniciando EA...\n",
"URL que será usada:\n",
apiUrl,
"\n\nIMPORTANTE: Configure a URL nas opções do Expert Advisor");
// Testa conexão HTTP, mas não falha se der erroif(!TestHTTPConnection())
{
Print("AVISO: Teste de conexão HTTP falhou");
Print("O EA continuará tentando conectar...");
// Continua mesmo assim
}
Print("=== Inicialização concluída ===");
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+//| Experten-Deinitialisierungsfunktion|//+------------------------------------------------------------------+voidOnDeinit(constint reason)
{
Comment("");
ObjectsDeleteAll(0);
}
//+------------------------------------------------------------------+//| Experten-Tick-Funktion OnTick()|//+------------------------------------------------------------------+voidOnTick()
{
if (!APIOK) return;
double shortMA, longMA;
MqlTradeRequest request = {};
MqlTradeResult result = {};
if (IsNewCandle())
{
shortMA = iMA(Symbol(),PERIOD_CURRENT, shortMAPeriod, 0, MODE_SMA, PRICE_CLOSE);
longMA = iMA(Symbol(),PERIOD_CURRENT, longMAPeriod, 0, MODE_SMA, PRICE_CLOSE);
// Analyse von JSON-Daten für die Entscheidungsfindung bei Geschäftsabschlüssendouble aiBullishForecast = StringToDouble(APIJSON[3]); // Previsão de altadouble aiBearishForecast = StringToDouble(APIJSON[4]); // Previsão de baixa// Prüfung auf Crossover-Signaleif (aiBullishForecast >= BullishThreshold && shortMA > longMA) // Se a previsão de alta for maior que o limite
{
if (OrdersTotal() == 0) {
request.action = TRADE_ACTION_DEAL;
request.symbol = _Symbol;
request.volume = Lots;
request.type = ORDER_TYPE_BUY;
request.price = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
request.deviation = 3;
request.magic = 123456;
request.comment = "Buy Order";
request.type_filling = ORDER_FILLING_FOK;
if(!OrderSend(request, result))
Print("Error opening buy order: ", GetLastError());
}
}
if (aiBearishForecast >= BearishThreshold && shortMA < longMA) // Se a previsão de baixa for maior que o limite
{
if (OrdersTotal() == 0) {
request.action = TRADE_ACTION_DEAL;
request.symbol = _Symbol;
request.volume = Lots;
request.type = ORDER_TYPE_SELL;
request.price = SymbolInfoDouble(_Symbol, SYMBOL_BID);
request.deviation = 3;
request.magic = 123456;
request.comment = "Sell Order";
request.type_filling = ORDER_FILLING_FOK;
if(!OrderSend(request, result))
Print("Error opening sell order: ", GetLastError());
}
}
}
}
//+------------------------------------------------------------------+//| Função para verificar se a URL está permitida |//+------------------------------------------------------------------+bool IsURLAllowed()
{
string url = "https://www.ziwox.com";
string cookie=NULL, headers;
char post[], result[];
ResetLastError();
int res = WebRequest("GET", url, cookie, NULL, 5000, post, 0, result, headers);
if(res == -1)
{
int error = GetLastError();
if(error == 4014)
{
Comment("ATENÇÃO: URL não permitida\n",
"1. Vá em Ferramentas -> Opções -> Expert Advisors\n",
"2. Marque 'Permitir WebRequest para as URLs listadas abaixo'\n",
"3. Adicione a URL: ", url, "\n",
"4. Clique em OK");
returnfalse;
}
}
returntrue;
}
//+------------------------------------------------------------------+//| OnTimer-Funktion für Experten|//+------------------------------------------------------------------+voidOnTimer()
{
// Überprüfen Sie, ob eine URL zulässig ist, bevor Sie eine Bestellung aufgeben.if(!IsURLAllowed())
{
Print("DEBUG: URL não está permitida. Aguardando configuração...");
return;
}
if (TimeCurrent() - LastAPICallTime >= APICallInterval)
{
string APIfilename = SymbolRequest + "_API_Data.json";
// URL für die Anzeige in den Kommentaren vorbereitenstring cleanSymbol = SymbolRequest;
StringReplace(cleanSymbol, "m", "");
string apiUrl = StringFormat("https://www.ziwox.com/terminal/services/API/V1/fulldata.php?expn=ziwoxuser&apikey=%s&apitype=json&pair=%s",
APIKey, cleanSymbol);
// Mostra que está fazendo a chamadaComment("Fazendo chamada à API...\n",
"URL: ", apiUrl,
"\n\nAguarde...");
APIOK = GetAPI(SymbolRequest, APIKey, APIfilename);
if (APIOK) {
JsonDataParse(APIfilename, APIJSON);
Comment("=== API OK ===\n",
"URL: ", apiUrl, "\n",
"Última atualização: ", TimeToString(TimeCurrent(), TIME_DATE|TIME_SECONDS), "\n",
"\nDados recebidos:",
"\nSymbol: ", APIJSON[0],
"\nÚltimo Preço: ", APIJSON[1],
"\nViés Fundamental: ", APIJSON[2],
"\nPrevisão de Alta: ", APIJSON[3], "%",
"\nPrevisão de Baixa: ", APIJSON[4], "%",
"\nPosições Compradas: ", APIJSON[5],
"\nPosições Vendidas: ", APIJSON[6],
"\nTendência D1: ", APIJSON[7],
"\nRSI D1: ", APIJSON[8],
"\nPermitido Operar: ", APIJSON[9]
);
} else {
Comment("=== FALHA NA API ===\n",
"URL tentada: ", apiUrl, "\n",
"Hora: ", TimeToString(TimeCurrent(), TIME_DATE|TIME_SECONDS), "\n",
"\nVerifique:",
"\n1. Se a URL está permitida em Ferramentas -> Opções -> Expert Advisors -> WebRequest",
"\n2. Se sua conexão com a internet está funcionando",
"\n3. Se o símbolo está correto"
);
}
LastAPICallTime = TimeCurrent();
}
}
//+------------------------------------------------------------------+//| Função para verificar se é um novo candle |//+------------------------------------------------------------------+bool IsNewCandle()
{
staticdatetime lastCandleTime = 0;
datetime currentCandleTime = iTime(Symbol(), 0, 0);
if (currentCandleTime != lastCandleTime)
{
lastCandleTime = currentCandleTime;
returntrue;
}
returnfalse;
}
//+------------------------------------------------------------------+//| Reine Symbolfunktion|//+------------------------------------------------------------------+string PureSymbol(string symbol, string suffiex, string prefix)
{
string puresymbol = symbol;
if (prefix != "" || suffiex != "")
{
StringReplace(puresymbol, suffiex, "");
StringReplace(puresymbol, prefix, "");
}
return puresymbol;
}
//+------------------------------------------------------------------+//| Função para verificar configuração do WebRequest |//+------------------------------------------------------------------+bool CheckWebRequestSettings()
{
if(!TerminalInfoInteger(TERMINAL_DLLS_ALLOWED))
{
Print("ERRO: DLLs não estão permitidas!");
returnfalse;
}
if(!TerminalInfoInteger(TERMINAL_TRADE_ALLOWED))
{
Print("ERRO: Algorithmic Trading não está permitido!");
returnfalse;
}
if(!MQLInfoInteger(MQL_DLLS_ALLOWED))
{
Print("ERRO: DLLs não estão permitidas para este Expert!");
returnfalse;
}
returntrue;
}
//+------------------------------------------------------------------+//| Função para verificar conexão com o servidor |//+------------------------------------------------------------------+bool CheckServerConnection()
{
int socket = SocketCreate();
if(socket != INVALID_HANDLE)
{
// Verbinden Sie sich mit dem Server von ZIWOX (Port 80 für HTTP)if(SocketConnect(socket, "www.ziwox.com", 80, 1000))
{
Print("DEBUG: Conexão com servidor testada com sucesso");
// Verifica se está realmente conectadoif(SocketIsConnected(socket))
{
SocketClose(socket);
returntrue;
}
}
else
{
Print("DEBUG: Falha ao conectar com o servidor: ", GetLastError());
}
SocketClose(socket);
}
else
{
Print("DEBUG: Falha ao criar socket: ", GetLastError());
}
returnfalse;
}
//+------------------------------------------------------------------+//| Funktion zum Abrufen von Daten aus der API|//+------------------------------------------------------------------+bool GetAPI(string symbolname, string apikey, string filename)
{
if(!TestHTTPConnection())
{
Print("DEBUG: Falha no teste de conexão HTTP");
returnfalse;
}
string headers = "Content-Type: application/json\r\nAccept: application/json\r\n";
char post[], result[];
string cookie=NULL;
int res;
// Entfernen Sie das Suffix 'm' aus dem API-Symbol.string cleanSymbol = symbolname;
StringReplace(cleanSymbol, "m", "");
string URL = "https://www.ziwox.com/terminal/services/API/V1/fulldata.php";
string params = StringFormat("?expn=ziwoxuser&apikey=%s&apitype=json&pair=%s",
apikey, cleanSymbol);
Print("DEBUG: Preparando requisição...");
Print("DEBUG: URL completa: ", URL + params);
URL = URL + params;
string body = StringFormat("{\"apikey\":\"%s\",\"pair\":\"%s\"}", apikey, cleanSymbol);
StringToCharArray(body, post, 0, WHOLE_ARRAY, CP_UTF8);
Print("DEBUG: Body da requisição: ", body);
// Tenta fazer a requisiçãoPrint("DEBUG: Iniciando WebRequest...");
res = WebRequest("GET", URL, cookie, NULL, 5000, post, 0, result, headers);
Print("DEBUG: Código de resposta WebRequest: ", res);
if(res == -1)
{
int error = GetLastError();
Print("DEBUG: GetLastError retornou: ", error);
returnfalse;
}
if(res != 200)
{
Print("DEBUG: Resposta HTTP diferente de 200: ", res);
returnfalse;
}
string response = CharArrayToString(result, 0, WHOLE_ARRAY, CP_UTF8);
// Entfernen Sie ein Tag <pre> da respostaStringReplace(response, "<pre>", "");
StringReplace(response, "</pre>", "");
Print("DEBUG: Resposta recebida (primeiros 500 caracteres): ", StringSubstr(response, 0, 500));
Print("DEBUG: Tamanho total da resposta: ", StringLen(response));
if(StringFind(response, "invalid api key") >= 0)
{
Print("DEBUG: API Key inválida encontrada na resposta");
Alert("Invalid API key");
returnfalse;
}
// Tenta salvar a respostaPrint("DEBUG: Tentando salvar resposta no arquivo: ", filename);
int filehandle = FileOpen(filename, FILE_WRITE|FILE_BIN|FILE_COMMON);
if(filehandle != INVALID_HANDLE)
{
// Konvertiert eine Antwort in ein Array von Merkmalenchar responseArray[];
StringToCharArray(response, responseArray, 0, StringLen(response));
// Salva no arquivoFileWriteArray(filehandle, responseArray);
FileClose(filehandle);
Print("DEBUG: Arquivo salvo com sucesso");
returntrue;
}
Print("DEBUG: Falha ao salvar arquivo");
returnfalse;
}
//+------------------------------------------------------------------+//| Funktion zum Analysieren von JSON-Daten|//+------------------------------------------------------------------+void JsonDataParse(string filename, string &_APIJSON[])
{
for (int arraIn = 0; arraIn < ArraySize(APIJSON); arraIn++)
APIJSON[arraIn] = "";
if (FileGetInteger(filename, FILE_EXISTS, true) >= 0)
{
int FileHandle = FileOpen(filename, FILE_READ|FILE_BIN|FILE_COMMON);
if(FileHandle != INVALID_HANDLE)
{
char jsonarray[];
FileReadArray(FileHandle, jsonarray);
FileClose(FileHandle);
JsonValue.Clear();
string jsonString = CharArrayToString(jsonarray, 0, WHOLE_ARRAY, CP_UTF8);
Print("JSON Recebido: ", jsonString); // Fehlersucheif(JsonValue.Deserialize(jsonString))
{
_APIJSON[0] = JsonValue[0]["Symbol"].ToStr();
_APIJSON[1] = JsonValue[0]["Last Price"].ToStr();
_APIJSON[2] = JsonValue[0]["Base Fundamental Bias"].ToStr();
_APIJSON[3] = JsonValue[0]["AI Bullish Forecast"].ToStr();
_APIJSON[4] = JsonValue[0]["AI Bearish Forecast"].ToStr();
_APIJSON[5] = JsonValue[0]["Retail Long Ratio"].ToStr();
_APIJSON[6] = JsonValue[0]["Retail Short Ratio"].ToStr();
_APIJSON[7] = JsonValue[0]["D1 Trend"].ToStr();
_APIJSON[8] = JsonValue[0]["D1 RSI"].ToStr();
_APIJSON[9] = JsonValue[0]["Allow To Trade"].ToStr();
Print("Dados processados:");
Print("Symbol: ", _APIJSON[0]);
Print("Last Price: ", _APIJSON[1]);
Umstellung auf Binärformat. Die Größe der gleichen Daten beträgt jetzt 1,2 Mb. Das Parsen in die erforderlichen Arrays von Strukturen dauert jetzt 5 Millisekunden.
Das ist ein bisschen zu viel für Sie. Hier dauert es 12 ms, aber die Daten sind 80 MB groß.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
Erlauben Sie die Verwendung von Cookies, um sich auf der Website MQL5.com anzumelden.
Bitte aktivieren Sie die notwendige Einstellung in Ihrem Browser, da Sie sich sonst nicht einloggen können.
Sie sind angemeldet. Die Zwei-Faktor-Authentifizierung wurde deaktiviert. Richten Sie sie erneut ein und scannen Sie einen neuen QR-Code oder fahren Sie mit deaktivierter Zwei-Faktor-Authentifizierung fort.
Die Forderungen richten sich natürlich nicht an Sie, sondern an die Inhaltsanbieter. Diese geben aus irgendeinem Grund keine Binärdaten, sondern Textdaten ))))
An dieser Tatsache können wir leider nichts ändern.
Die Forderungen richten sich natürlich nicht an Sie, sondern an die Inhaltsanbieter. Diese geben aus irgendeinem Grund keine Binärdaten, sondern Textdaten ))))
An dieser Tatsache können wir leider nichts ändern.
weil sie Kompatibilität brauchen.
In diesem Artikel geht es um API und wie man sie nutzt. Kennen Sie eine API, die Sie mit binären Forex-Daten versorgt? Dann stellen Sie sie vor.
Nächster Punkt: Sie kritisieren, warum man einen normalen Computer zum Spielen von FIFA2024 verwenden sollte, wenn ein Quantencomputer schneller ist. Die Antwort ist einfach: Ich brauche diese Art von Rechenleistung nicht.
Die Antwort auf dieses Argument lautet also, dass die meisten Daten, die in diesem Bereich in der API ausgetauscht werden, im Bereich von wenigen Megabyte liegen und es keinen Bedarf an Geschwindigkeit gibt. Außerdem verwenden alle Anbieter von Forex-Daten Standards wie XML, JSON...
Ich bin nicht gegen die Verwendung von JSON. Ich verwende es selbst, aber nur in der Entwicklungsphase, da man in PostMan oder WireShark immer eine gut lesbare Antwort sehen kann.
Vielen Dank, dass Sie sich die Zeit genommen haben, Ihre Gedanken mit uns zu teilen. Ich verstehe Ihren Standpunkt voll und ganz, und die Punkte, die Sie über die Verwendung von Binärformaten und JSONB angesprochen haben, sind sehr berechtigt. Sie haben Recht, dass JSON im Vergleich zu Binärformaten nicht so sehr für die Systemleistung optimiert ist, und das ist etwas, dessen sich viele Entwickler bewusst sind.
In dem von uns verfassten Artikel haben wir uns in erster Linie auf JSON konzentriert, weil 99 % der Finanzdatenanbieter, insbesondere im Forex-Bereich, diesen Standard für den Datenaustausch verwenden und viele Plattformen und Dienste Daten in diesem Format bereitstellen. Aus diesem Grund haben wir uns nicht mit anderen Standards befasst.
Nochmals vielen Dank, dass Sie uns Ihre Sichtweise mitgeteilt und auf dieses wichtige Detail hingewiesen haben.
Die Forderungen richten sich natürlich nicht an Sie, sondern an die Inhaltsanbieter. Diese geben aus irgendeinem Grund keine Binärdaten, sondern Textdaten ))))
An dieser Tatsache können wir leider nichts ändern.
Ja, ich verstehe das vollkommen. Außerdem sind wir verpflichtet, diesen Standard zu verwenden, weil fast alle Finanzdatenanbieter diese Methode verwenden.
Version für MQL5 METATRADER 5 Ich habe Änderungen am Code vorgenommen, so dass es in Metatrader 5 funktionieren würde. Die Änderungen wurden auch in Bezug auf die Kodierung für bessere Bedingungen in der aktuellen kommerziellen Situation gemacht. Alle Änderungen dienten der Anpassung des Codes an Metatrader 5. Er ist funktionsfähig. Laden Sie einfach diese Datei herunter und führen Sie sie aus. Wenn nötig, die JAson.mqh Bibliothek, die im Originalcode unseres Begleiters zu finden ist. Mein Name ist Ney Borges. Ich komme aus Brasilien, Bundesstaat Goiás, Stadt Caldas Novas, mitten im Wald von Brasilien. Es war sehr schwierig, alleine zu lernen, ohne jemanden, der mir hilft, aber hier in der Gemeinschaft habe ich viel gelernt. Ich danke Ihnen.
Version für MQL5 METATRADER 5 Ich habe Änderungen am Code vorgenommen, so dass er in Metatrader 5 funktionieren würde. Die Änderungen wurden auch in Bezug auf die Kodierung für bessere Bedingungen in der aktuellen kommerziellen Situation gemacht. Alle Änderungen dienten der Anpassung des Codes an Metatrader 5. Er ist funktionsfähig. Laden Sie einfach diese Datei herunter und führen Sie sie aus. Wenn nötig, die JAson.mqh Bibliothek, die im Originalcode unseres Begleiters zu finden ist. Mein Name ist Ney Borges. Ich komme aus Brasilien, Bundesstaat Goiás, Stadt Caldas Novas, mitten im Wald von Brasilien. Es war sehr schwierig, alleine zu lernen, ohne jemanden, der mir hilft, aber hier in der Gemeinschaft habe ich viel gelernt. Ich danke Ihnen.
Brasilien - Goiás - Caldas Novas - Ney Borges
Falls nötig, können Sie die JAson.mqh-Bibliothek verwenden, die im Originalcode unseres Begleiters zu finden ist.
Was für eine schreckliche Art und Weise für den Google Übersetzer zu arbeiten.
Ohne die JAson-Bibliothek wird er natürlich nicht funktionieren.
Die Bibliothek ist nicht in seinem Code, sie ist hier, und der Autor hat das angegeben.
Ja, ich verstehe das vollkommen. Außerdem sind wir verpflichtet, diesen Standard zu verwenden, da fast alle Finanzdatenanbieter diese Methode anwenden.
Hallo, hier ist es, also, worum ich gebeten habe, ist, dass ich es in der mql5-Community poste =
Version für MQL5 METATRADER 5 Ich habe Änderungen am Code vorgenommen, so dass er in Metatrader 5 funktionieren würde. Die Änderungen wurden auch in Bezug auf die Kodierung für bessere Bedingungen in der aktuellen kommerziellen Situation gemacht. Alle Änderungen dienten der Anpassung des Codes an Metatrader 5. Er ist funktionsfähig. Laden Sie einfach diese Datei herunter und führen Sie sie aus. Wenn nötig, die JAson.mqh Bibliothek, die im Originalcode unseres Begleiters zu finden ist. Mein Name ist Ney Borges. Ich komme aus Brasilien, Bundesstaat Goiás, Stadt Caldas Novas, mitten im Wald von Brasilien. Es war sehr schwierig, alleine zu lernen, ohne jemanden, der mir hilft, aber hier in der Gemeinschaft habe ich viel gelernt. Ich danke Ihnen.
Version für MQL5 METATRADER 5 Ich habe Änderungen am Code vorgenommen, so dass er in Metatrader 5 funktionieren würde. Die Änderungen wurden auch in Bezug auf die Kodierung für bessere Bedingungen in der aktuellen kommerziellen Situation gemacht. Alle Änderungen dienten der Anpassung des Codes an Metatrader 5. Er ist funktionsfähig. Laden Sie einfach diese Datei herunter und führen Sie sie aus. Wenn nötig, die JAson.mqh Bibliothek, die im Originalcode unseres Begleiters zu finden ist. Mein Name ist Ney Borges. Ich komme aus Brasilien, Bundesstaat Goiás, Stadt Caldas Novas, mitten im Wald von Brasilien. Es war sehr schwierig, alleine zu lernen, ohne jemanden, der mir hilft, aber hier in der Gemeinschaft habe ich viel gelernt. Ich danke Ihnen.
Brasilien - Goiás - Caldas Novas - Ney Borges
Fiz algumas correçoes ao codigo para funcionar no MQL5 gostaria que por gentilesa verificasse e retornar, obrigado - Sara Sabaghi
Fiz algumas correçoes ao codigo para funcionar no MQL5 gostaria que por gentilesa verificasse e retornar, obrigado - Sara Sabaghi
Hallo Kumpel
Vielen Dank für das Teilen deines Codes. Ja, ich habe ihn getestet. Es funktioniert gut
Umstellung auf Binärformat. Die Größe der gleichen Daten beträgt jetzt 1,2 Mb. Das Parsen in die erforderlichen Arrays von Strukturen dauert jetzt 5 Millisekunden.
Das ist ein bisschen zu viel für Sie. Hier dauert es 12 ms, aber die Daten sind 80 MB groß.