Fragen zu MQL4 - Seite 7

 
Irgendwo im Forum haben die Entwickler ausführlich darüber geschrieben, wie init/deinit funktioniert. Vielleicht kann jemand einen Link zur Verfügung stellen?
 
Hallo zusammen, ich habe eine Frage:
Ich habe eine DLL in Delphi gemacht, ich rufe sie von MT4 aus auf. Alles funktioniert, außer einfachen Parametern, die als Referenz übergeben werden. In Delphi wie folgt deklariert:

procedure Test2(var i: integer); stdcall;
begin
if addr(i) = nil then ShowMessage('What the hell?');
end;

stop to call it as

#import "DLL1.dll"
void Test2(int& i);

Ich rufe
int init() {
int x = 5;
Test2(x);
return(x);
}

beim Aufruf sollte ein Verweis auf die Variable integer im Stack sein, aber null ist da
wie kann man also einen int-Parameter per Verweis übergeben?
Bei der Übergabe von Arrays wird der Array-Wert als Referenz übergeben

unter Verwendung von
MetaEditor 4.00 build 183
MetaTrader 4.00 build 186

eine weitere Frage: Wenn ich einen String als Referenz übergebe, wie groß ist der String-Puffer?

eine weitere Frage:
Wenn ich einen String als Funktionsergebnis übergebe, wo sollte der Speicherbereich für den String zugewiesen werden? Sollte ich einen Zeiger auf eine globale Variable in der DLL übergeben? In diesem Fall kann ich sicher sein, dass die DLL nicht von verschiedenen Threads gleichzeitig in jedem Modus von Metatrader aufgerufen werden?

Vielen Dank im Voraus
 
die derzeitige implementierung ist so, dass sie parameter nur per referenz innerhalb eines einzelnen quellcodes übergeben können. die ausnahme sind arrays. wenn sie ein array an die dll übergeben, können sie die werte seiner elemente ändern und diese änderungen werden in der aufrufenden funktion verfügbar sein. d.h. sie können ein sehr kleines array übergeben.
 
Wie implementiere ich dies in MQL4
zu Beginn des Tages zwei schwebende Aufträge
Sobald eine (beliebige) ausgelöst - die zweite entfernt wird
Fünf Minuten vor dem Schließen der Bar (sagen wir eine tägliche), um die ausgelöste schließen (wenn es nicht von SL oder TP geschlossen wurde)
Wenn keine schwebende Bestellung ausgelöst, fünf Minuten vor dem Schließen der Bar löschen sie beide
Vielen Dank
 
1) Wenn ich die Zeichenfolge als Referenz übergebe, wie groß ist der Empfangspuffer für die Zeichenfolge?

2) Wenn ich die Zeichenfolge als Funktionsergebnis übergebe, wo sollte der Speicherbereich für die Zeichenfolge zugewiesen werden? Sollte ich einen Zeiger auf eine globale Variable in der DLL übergeben? In diesem Fall kann ich sicher sein, dass die DLL nicht von verschiedenen Threads gleichzeitig in jedem Modus des Metatraders aufgerufen werden?

Vielen Dank im Voraus
 
Wie implementiere ich dies in MQL4 <br/ translate="no"> Zu Beginn des Tages zwei schwebende Aufträge
Wenn eine (beliebige) ausgelöst - die zweite gelöscht wird
Fünf Minuten vor dem Schließen der Bar (sagen wir eine tägliche) zu schließen, die ausgelöst (wenn es nicht von SL oder TP geschlossen wurde)
Wenn keine schwebende Bestellung ausgelöst, fünf Minuten vor dem Schließen der Bar löschen sie beide
Vielen Dank im Voraus

Sie setzen die ausstehenden Aufträge zum richtigen Zeitpunkt (das ist einfach). Und Sie fangen an, Bestellungen zu überprüfen. Sobald ein Kauf- oder Verkaufsauftrag auftaucht, arbeiten Sie sich durch die Entfernung des schwebenden Auftrags (noch einfacher). Und dann, zum richtigen Zeitpunkt, arbeiten Sie daran, alle Aufträge abzuschließen (das ist ganz einfach).
 
Как в MQL4 реализовать такое
в начале дня устанавливаем два отложенных ордера
После того как один(любой) сработал - второй удаляется
За пять минут до закрытия бара(допустим дневного) закрыть сработавший (если он не был закрыт по SL или TP)
Если ни один отложенный ордер не соработал то за пять минут до закрытия бара удаляем их обоих
Заранее спасибо

So setzen Sie es um: Sie stellen die ausstehenden Aufträge zum richtigen Zeitpunkt ein (das ist ganz einfach). Und dann fangen Sie an, die Aufträge zu prüfen. Sobald ein Kauf- oder Verkaufsauftrag erscheint, entfernen Sie den schwebenden Auftrag (dies ist noch einfacher). Und dann, zum richtigen Zeitpunkt, arbeiten, um alle Aufträge zu schließen (es ist sehr einfach).


Ich habe nach einem funktionierenden Code gefragt (vielleicht hat ihn jemand implementiert).
Alles, was ich gemacht habe, hat nicht funktioniert ... Der Vorgang des Odrerdelete ist irgendwie verwirrend.
Eine weitere Frage: manchmal friert der Preis (keine Ticks) für einige Minuten ein, d.h. wir können eine Order nicht schließen, da der int start()-Körper nicht ausgeführt wird, obwohl Ticks für andere Symbole empfangen werden, ist es möglich, den Curetime-Wert von jedem Symbol mit Ticks zu übergeben?
Einfach ausgedrückt, sollte der Curetime-Wert praktisch nicht einfrieren
 
Was Sie tun wollen, ist das ABC. Ohne zu verstehen, wie die grundlegenden Operatoren funktionieren, können Sie nicht ins kalte Wasser springen. Und Sie können alle Aufträge von jedem Chart aus schließen. Sie können es so machen:
 cnt=0; while(cnt<1) { if(OrdersTotal()<1)break; OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); cmd=OrderType(); for(z=0;z<3;z++) { RefreshRates(); if(cmd==2||cmd==3|cmd==4|cmd==5)result=OrderDelete(OrderTicket()); 
     if(cmd==0) result=OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),5,CLR_NONE); if(cmd==1) result=OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),5,CLR_NONE); if(result) break;Sleep(1000); } Sleep(10000); }
 
Was Sie tun wollen, ist das ABC. Ohne zu verstehen, wie die grundlegenden Operatoren funktionieren, kann man nicht in die Tiefe gehen. Und Sie können alle Aufträge von jedem Chart aus schließen. Sie können es so machen:<br/ translate="no">
 cnt=0; while(cnt<1) { if(OrdersTotal()<1)break; OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); 
    cmd=OrderType(); for(z=0;z<3;z++) { RefreshRates(); if(cmd==2||cmd==3||cmd==4||cmd==5)result=OrderDelete(OrderTicket()); 
     if(cmd==0) result=OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),5,CLR_NONE); if(cmd==1) result=OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),5,CLR_NONE); if(result) break;Sleep(1000); } Sleep(10000); }



Und was bewirkt dieses Codefragment?
Löscht die beiden ausstehenden Aufträge, die noch nicht ausgelöst wurden
 
Sie haben ihn gebeten, alle Bestellungen fünf Minuten vor Schließung der Bar zu vernichten, also wird er sie alle aufschreiben. Stellen Sie einfach die Uhrzeit richtig ein. Und verwenden Sie andere Teile des Codes, um unnötige Aufträge zu schließen. Oder möchten Sie, dass das gesamte Programm für Sie geschrieben wird?
Grund der Beschwerde: