borilunad: Victor, vous, Renat, en général ont souligné à juste titre, Alexey a montré la dernière vérification nécessaire, et plus tôt vérifier toutes les vérifications nécessaires pour chaque paramètre avec toutes les nuances pour éviter l'ambiguïté de la signification et sans manquer aucune condition !
Quel bien cela ferait-il ? Parce que je réinitialise la valeur _LastError dans chaque fonction. Ce n'est pas comme si elle était constamment suspendue dans la mémoire...
hoz: A quoi cela sert-il ? Parce que je réinitialise _LastError dans chaque fonction. Ce n'est pas comme si elle était constamment suspendue dans la mémoire...
Désolé, vous êtes victime de vos fonctions et de vos contrôles ! Affichez les informations sur le graphique par intérêt, et n'imprimez les contrôles d'erreurs qu'après les fonctions de trading!
Nous pouvons clairement voir que la valeur de l'erreur est réinitialisée.
Ensuite, il obtient les informations sur le marché. Si la modification est dans le testeur... alors... ...puis j'exécute le test proposé par Alexei, et... si la modification est infructueuse... écrire un journal et imprimer dans le journal...
En général, nous pouvons voir qu'il n'y a pas d'erreurs entre ResetLastError()... Il n'y a rien à redire.
Journal :
020:24:082013.08.2600:00 Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::fOrderModify: Вошли в функцию
020:24:082013.08.2600:00 Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::fOrderModify: До проверки на FREEZELEVEL и STOPLEVEL тикета № 2020:24:082013.08.2600:00 Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::fOrderModify: Тикет № 2; OOP = 1.34048; SL = 1.34125; TP = 1.33362020:24:082013.08.2600:00 Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::CheckLevelsBLOCK: Вошли в функцию
020:24:082013.08.2600:00 Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::CheckLevelsBLOCK: Тикет № 2; fd_NewOpenPrice = 1.34048; fd_NewSL = 1.34125; fd_NewTP = 1.33362020:24:082013.08.2600:00 Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::CheckLevelsBLOCK: fi_Type > 2 = true020:24:082013.08.2600:00 Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::CheckLevelsBLOCK: Тикет № 2; fd_NewOpenPrice = 1.34048; fd_NewSL = 1.34125; fd_NewTP = 1.33362020:24:082013.08.2600:00 Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::CheckLevelsBLOCK: Вышли из функции
020:24:082013.08.2600:00 Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::fOrderModify: После проверки на FREEZELEVEL и STOPLEVEL тикета № 2020:24:082013.08.2600:00 Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::fOrderModify: Тикет № 2; OOP = 1.34048; SL = 1.34125; TP = 1.33362220:24:082013.08.2600:00 Kevin Martens_Moi_Myrei EURUSD,M15: modify #2 sell limit 0.10 EURUSD at 1.34048 sl: 1.34125 tp: 1.33362 ok
320:24:082013.08.2600:00 Kevin Martens_Moi_Myrei EURUSD,M15: OrderModify error 1
Je vous entends. Ça n'a pas aidé. Voici un morceau de code de ma méthode de modification :
Vous pouvez clairement voir que la valeur d'erreur est réinitialisée à cet endroit.
Ensuite, il obtient les informations sur le marché. Si la modification est dans le testeur... alors... Je fais le test proposé par Alexei, et... si la modification n'aboutit pas, alors... écrire un journal et imprimer dans le journal...
En général, nous pouvons voir qu'il n'y a pas d'erreurs entre ResetLastError()... Il n'y a rien à redire.
Journal :
Vous devez enregistrer les valeurs précédentes de OOP, SL et TP avant le changement pour voir si elles sont les mêmes que les nouvelles, alors la cause de l'erreur #1 sera également plus claire.
Laissez-moi vous expliquer. La modification a lieu dans la méthode fOrderModify(). À l'entrée de cette méthode fOrderModify(), les valeurs actuelles des paramètres de l'ordre et les nouvelles valeurs prévues sont imprimées au début du corps. Vous pouvez le voir :
Le Bid est toujours inférieur au SellLimit, donc la ligne if(New_OOP < Bid) ne sera jamais vraie... ...respectivement, la modification est mise en œuvre sans encombre.
Pourquoi ne pas créer également un tableau d'erreurs ? Il est écrit noir sur blanc dans la documentation que la variable _LastError stocke le numéro de la dernière erreur. Et elle est réinitialisée par la fonction ResetLastError(). S'il n'y a pas d'autres erreurs entre les appels de _LastError, _LastError stocke la valeur de la dernière erreur. Il n'y avait plus d'erreurs dans mon code. Eh bien, ce n'est pas la question.
Vous avez tout à fait tort. La dernière erreur est bien réinitialisée dans de nombreuses fonctions importantes. Cela fonctionne aussi dans WinAPI.
C'est pourquoi vous devez enregistrer le code d'erreur dans une variable locale dès qu'il se produit et ne pas essayer de l'utiliser après avoir effacé cette variable système dix fois dans un grand nombre de vos fonctions intermédiaires.
Comment puis-je me débarrasser de cette putain d'erreur ? J'en ai marre. Je vérifie chaque paramètre d'entrée de la fonction. Pour moi, en ce moment, c'est comme ça :
Autrement dit, si le paramètre n'a pas été modifié, il n'est pas nécessaire de le modifier. Je n'ai jamais fait ça avant, mais j'ai décidé de...
Les paramètres sont ensuite transmis à la méthode de modification de l'ordre comme suit :
Aucune sortie dans le journal :
Donc, le journal nous notifie, comme une modification : OK, mais alors une erreur. Aucun des paramètres n'a changé.
L'ordonnance est en cours. Nous pouvons donc changer le prix d'ouverture, de stop et de prise. Et cela, d'après ce que j'ai compris, ne contredisait pas la documentation.
Qui a rencontré quelque chose comme ça ? Comment le résoudre ?
Et vous n'essayez pas de modifier les ordres en attente si aucun des paramètres n'est modifié.
Si vous n'avez pas de compte, veuillez vous inscrire
Autorisez l'utilisation de cookies pour vous connecter au site Web MQL5.com.
Veuillez activer les paramètres nécessaires dans votre navigateur, sinon vous ne pourrez pas vous connecter.
Vous êtes connecté. L'authentification à deux facteurs a été désactivée. Configurez-la à nouveau et scannez un nouveau code QR, ou continuez avec l'authentification à deux facteurs désactivée.
Victor, vous, Renat, en général ont souligné à juste titre, Alexey a montré la dernière vérification nécessaire, et plus tôt vérifier toutes les vérifications nécessaires pour chaque paramètre avec toutes les nuances pour éviter l'ambiguïté de la signification et sans manquer aucune condition !
A quoi cela sert-il ? Parce que je réinitialise _LastError dans chaque fonction. Ce n'est pas comme si elle était constamment suspendue dans la mémoire...
Il faut encore vérifier que si aucun des 3 paramètres n'a changé, alors OrderModify n'a pas besoin d'être touché non plus.
Je vous entends. Ça n'a pas aidé. Voici un morceau de code de ma méthode de modification :
Nous pouvons clairement voir que la valeur de l'erreur est réinitialisée.Ensuite, il obtient les informations sur le marché. Si la modification est dans le testeur... alors... ...puis j'exécute le test proposé par Alexei, et... si la modification est infructueuse... écrire un journal et imprimer dans le journal...
En général, nous pouvons voir qu'il n'y a pas d'erreurs entre ResetLastError()... Il n'y a rien à redire.
Journal :
Je vous entends. Ça n'a pas aidé. Voici un morceau de code de ma méthode de modification :
Vous pouvez clairement voir que la valeur d'erreur est réinitialisée à cet endroit.Ensuite, il obtient les informations sur le marché. Si la modification est dans le testeur... alors... Je fais le test proposé par Alexei, et... si la modification n'aboutit pas, alors... écrire un journal et imprimer dans le journal...
En général, nous pouvons voir qu'il n'y a pas d'erreurs entre ResetLastError()... Il n'y a rien à redire.
Journal :
C'est comme ça...
Dans le conseiller expert, j'appelle la méthode de la classe comme ceci :
Voici la partie de la classe qui nous intéresse :
Voici le morceau de bois que nous voulons :
Laissez-moi vous expliquer. La modification a lieu dans la méthode fOrderModify(). À l'entrée de cette méthode fOrderModify(), les valeurs actuelles des paramètres de l'ordre et les nouvelles valeurs prévues sont imprimées au début du corps. Vous pouvez le voir :
Cette pièce est dans le journal :
Vous pouvez voir que les paramètres sont tous différents. Il ne devrait y avoir aucun problème.C'est comme ça...
Dans le conseiller expert, j'appelle la méthode de la classe comme ceci :
Voici la partie de la classe qui nous intéresse :
Voici le morceau de bois que nous voulons :
Je ne comprends pas quel est le rapport avec l'offre, si l'ordre est en attente ?
Le Bid est toujours inférieur au SellLimit, donc la ligne if(New_OOP < Bid) ne sera jamais vraie... ...respectivement, la modification est mise en œuvre sans encombre.
Pourquoi ne pas créer également un tableau d'erreurs ? Il est écrit noir sur blanc dans la documentation que la variable _LastError stocke le numéro de la dernière erreur. Et elle est réinitialisée par la fonction ResetLastError(). S'il n'y a pas d'autres erreurs entre les appels de _LastError, _LastError stocke la valeur de la dernière erreur. Il n'y avait plus d'erreurs dans mon code. Eh bien, ce n'est pas la question.
Vous avez tout à fait tort. La dernière erreur est bien réinitialisée dans de nombreuses fonctions importantes. Cela fonctionne aussi dans WinAPI.
C'est pourquoi vous devez enregistrer le code d'erreur dans une variable locale dès qu'il se produit et ne pas essayer de l'utiliser après avoir effacé cette variable système dix fois dans un grand nombre de vos fonctions intermédiaires.
Désolé, SellLimit nécessite une dist :
pas si (New_OOP < Bid) continuer; maissi (New_OOP-dist*Point < Bid) continuer;
Comment puis-je me débarrasser de cette putain d'erreur ? J'en ai marre. Je vérifie chaque paramètre d'entrée de la fonction. Pour moi, en ce moment, c'est comme ça :
Autrement dit, si le paramètre n'a pas été modifié, il n'est pas nécessaire de le modifier. Je n'ai jamais fait ça avant, mais j'ai décidé de...
Les paramètres sont ensuite transmis à la méthode de modification de l'ordre comme suit :
Aucune sortie dans le journal :
Donc, le journal nous notifie, comme une modification : OK, mais alors une erreur. Aucun des paramètres n'a changé.
L'ordonnance est en cours. Nous pouvons donc changer le prix d'ouverture, de stop et de prise. Et cela, d'après ce que j'ai compris, ne contredisait pas la documentation.
Qui a rencontré quelque chose comme ça ? Comment le résoudre ?