Questions sur le MQL4 - page 7

 
Quelque part sur le forum, les développeurs ont expliqué en détail le fonctionnement des init/deinit. Peut-être que quelqu'un pourrait fournir un lien ?
 
Bonjour à tous, voici une question :
J'ai créé une DLL en Delphi, je l'appelle depuis MT4. Tout fonctionne sauf les paramètres simples passés par référence. Dans Delphi, déclaré comme suit :

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) ;

J'appelle
int init() {
int x = 5 ;
Test2(x) ;
return(x) ;
}

quand on appelle, une référence à la variable integer devrait être dans la pile, mais null est là
alors comment passer un paramètre int par référence ?
Lors du passage de tableaux, la valeur du tableau est passée par référence

en utilisant
MetaEditor 4.00 build 183
MetaTrader 4.00 build 186

une autre question : si je passe une chaîne de caractères comme référence, quelle est la taille du tampon de la chaîne de caractères ?

une autre question :
Si je passe une chaîne de caractères comme résultat de la fonction, où la zone de mémoire pour la chaîne de caractères doit-elle être allouée ? Dois-je passer un pointeur vers une variable globale dans la DLL ? Dans ce cas, puis-je être sûr que la DLL ne sera pas appelée à partir de différents threads simultanément dans n'importe quel mode de metatrader ?

Merci d'avance
 
l'implémentation actuelle est telle que vous ne pouvez passer des paramètres que par référence dans un seul code source. l'exception est constituée par les tableaux. si vous passez un tableau à la dll, vous pouvez changer les valeurs de ses éléments et ces changements seront disponibles dans la fonction appelante. c'est-à-dire que vous pouvez passer un très petit tableau.
 
Comment implémenter ceci dans MQL4
au début de la journée définir deux ordres en attente
Une fois que l'un (n'importe lequel) s'est déclenché - le second est supprimé
Cinq minutes avant la fermeture de la barre (disons une quotidienne) pour fermer l'ordre déclenché (s'il n'a pas été fermé par SL ou TP)
Si aucun ordre en attente ne s'est déclenché, cinq minutes avant la fermeture de la barre supprimer les deux
Merci beaucoup
 
1) Si je passe la chaîne en tant que référence, quelle est la taille du tampon de réception de la chaîne ?

2) Si je passe la chaîne de caractères comme résultat de la fonction, où la zone de mémoire pour la chaîne de caractères doit-elle être allouée ? Dois-je passer un pointeur vers une variable globale dans la DLL ? Dans ce cas, je peux être sûr que la DLL ne sera pas appelée depuis différents threads simultanément dans n'importe quel mode du metatrader ?

Merci d'avance
 
Comment implémenter ceci dans MQL4 <br/ translate="no"> Au début de la journée, définir deux ordres en attente
Quand l'un (quelconque) est déclenché - le second est supprimé
Cinq minutes avant la fermeture de la barre (disons une quotidienne) pour fermer l'ordre déclenché (s'il n'a pas été fermé par SL ou TP)
Si aucun ordre en attente n'est déclenché, cinq minutes avant la fermeture de la barre les supprimer tous les deux
Merci d'avance

Vous placez des ordres en suspens au bon moment (c'est facile). Et vous commencez à vérifier les commandes. Dès qu'un ordre d'achat ou de vente apparaît, vous travaillez en supprimant l'ordre en attente (encore plus facile). Et puis, au moment opportun, travaillez à la clôture de tous les ordres (c'est facile).
 
Как в MQL4 реализовать такое
в начале дня устанавливаем два отложенных ордера
После того как один(любой) сработал - второй удаляется
За пять минут до закрытия бара(допустим дневного) закрыть сработавший (если он не был закрыт по SL или TP)
Если ни один отложенный ордер не соработал то за пять минут до закрытия бара удаляем их обоих
Заранее спасибо

C'est ainsi que vous le mettez en œuvre, vous placez des ordres en attente au bon moment (c'est facile). Et puis vous commencez à vérifier les commandes. Dès qu'un ordre d'achat ou de vente apparaît, vous travaillez en supprimant l'ordre en attente (c'est encore plus facile). Et ensuite, au bon moment, travaillez pour clôturer tous les ordres (c'est très facile).


J'ai demandé un code fonctionnel (peut-être que quelqu'un l'a implémenté).
Tout ce que j'ai fait n'a pas fonctionné... Le processus de suppression d'odrer est en quelque sorte confus.
Une autre question : parfois le prix se fige (pas de ticks) pendant quelques minutes, c'est-à-dire que nous ne pouvons pas fermer un ordre car le corps int start() n'est pas exécuté, bien que des ticks soient reçus pour d'autres symboles, est-il possible de passer la valeur Curetime de n'importe quel symbole avec des ticks ?
Pour faire simple, la valeur de Curetime ne gèle pratiquement pas.
 
Ce que vous voulez faire, c'est l'ABC. Si vous ne comprenez pas le fonctionnement des opérateurs de base, vous ne pouvez pas vous lancer dans le grand bain. Et vous pouvez fermer tous les ordres à partir de n'importe quel graphique. Vous pouvez le faire de cette façon :
 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()) ; 
     si(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) ; }
 
Ce que vous voulez faire, c'est l'ABC. Si vous ne comprenez pas le fonctionnement des opérateurs de base, vous ne pouvez pas vous lancer dans le grand bain. Et vous pouvez fermer tous les ordres à partir de n'importe quel graphique. Vous pouvez le faire de cette façon :<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()) ; 
     si(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) ; }



Et que fait ce fragment de code ?
Supprime les deux ordres en attente qui n'ont pas encore été déclenchés.
 
Vous lui avez demandé de détruire toutes les commandes cinq minutes avant la fermeture du bar, donc il va les détruire toutes. Il suffit de régler l'heure correctement. Et utiliser d'autres morceaux de code pour fermer les ordres inutiles. Ou bien, voulez-vous que le programme entier soit écrit pour vous ?