Ensuite, la question suivante, disons que l'étape est 25, alors comment organiser l'arrondi à un nombre divisible par 25, peut-être y a-t-il une fonction ?
Vladislav Andruschenko: Pas de code, pas de commentaires.
Oui, c'est bizarre. J'ai joint le fichier, mais je ne l'ai pas vérifié. C'est ma faute. Maintenant, je joins le code et l'extrait de code où le testeur donne une ligne avec [Invalid stops]. Je veux comprendre comment la structure de MqlTradeRequest fonctionne lors de la modification de la position. Dans mon cas, c'est lorsque le changement d'arrêt sur le SAR. Je n'arrive pas à me débarrasser du message [Arrêts non valides] du testeur. Outil d'épissure RTS.
//+------------------------------------------------------------------+//| Модификация Stop Loss открытой позиции |//+------------------------------------------------------------------+//--- объявление запроса и результатаMqlTradeRequest request;
MqlTradeResult result;
int total=PositionsTotal(); // количество открытых позиций Print("total = ",total," ");
//--- перебор всех открытых позицийfor(int i=0; i<total; i++)
{
if(PositionSelect(_Symbol)==true) // есть открытая позиция
{
//--- параметры ордераulong position_ticket=PositionGetTicket(i);// тикет позицииstring position_symbol=PositionGetString(POSITION_SYMBOL); // символ int digits=(int)SymbolInfoInteger(position_symbol,SYMBOL_DIGITS); // количество знаков после запятойulong magic=PositionGetInteger(POSITION_MAGIC); // MagicNumber позицииif(PositionSelect(position_symbol)) // если позицию удалось выделить, значит - позиция существует
{
//--- обнуление значений запроса и результатаZeroMemory(request);
ZeroMemory(result);
//--- установка параметров операции
request.action = TRADE_ACTION_SLTP; // тип торговой операции
request.position = position_ticket; // тикет позиции
request.symbol = position_symbol; // символ
request.sl= STP; // Stop Loss позиции
request.tp = 0; // Take Profit позиции//--- отсылаем ордерint number=OrderSend(request,result);
// анализируем код возврата торгового сервераif(result.retcode==10009 || result.retcode==10008) //Request is completed or order placed
{
Alert("Ордер Sell успешно помещен, тикет ордера # ",result.order," ");
}
else
{
Alert("Запрос на установку ордера Sell не выполнен - код ошибки:",GetLastError());
return;
}
}
}
}
Oui, c'est bizarre. J'ai joint le fichier, mais je ne l'ai pas vérifié. C'est ma faute. Je joins à présent le code et l'extrait de code où le testeur affiche une ligne avec [Invalid stops]. Je veux comprendre comment la structure de MqlTradeRequest fonctionne lors de la modification de la position. Dans mon cas, c'est lorsque le changement d'arrêt sur le SAR. Je n'arrive pas à me débarrasser du message [Arrêts non valides] du testeur. Outil d'épissure RTS.
Ce n'est pas ce fragment de code où il faut chercher une erreur, à première vue. Ce n'est que la triple sélection d'une seule et même position qui me dérange. C'est redondant.
Vous avez une erreur dans les arrêts incorrects, vous devriez probablement commencer votre recherche à partir de l'endroit où ces arrêts sont calculés.
Oui, c'est bizarre. J'ai joint le fichier, mais je ne l'ai pas vérifié. C'est ma faute. Je joins maintenant le code et l'extrait de code où le testeur donne une ligne avec [Invalid stops]. Je veux comprendre comment la structure de MqlTradeRequest fonctionne lors de la modification de la position. Dans mon cas, c'est lorsque le changement d'arrêt sur le SAR. Je n'arrive pas à me débarrasser du message [Arrêts non valides] du testeur. RTS Splice.
Pour une bonne compréhension, il est nécessaire de préciser quel type de compte hadge ou netting.
Si le type de compte est un compte
if(PositionSelect(_Symbol)==true) // есть открытая позиция
Vous avez choisi une position pour le symbole, mais ce n'est peut-être pas exactement ce que vous vouliez voir...
ulong position_ticket=PositionGetTicket(i);// тикет позиции
Mais maintenant nous choisissons la position exacte que nous voulions.
La fonction renvoie un ticket de la position par index dans la liste des positions ouvertes et sélectionne automatiquement cette position pour un travail ultérieur avec elle en utilisant les éléments suivants
Ensuite, essayez à nouveau de choisir la bonne position
if(PositionSelect(position_symbol)) // если позицию удалось выделить, значит - позиция существует
Encore une fois, la probabilité que vous ayez choisi la mauvaise position est très élevée.
Lors de la représentation indépendante des positions (ACCOUNT_MARGIN_MODE_RETAIL_HEDGING), plusieurs positions peuvent être ouvertes simultanément pour chaque symbole. Dans ce cas, PositionSelect sélectionnera la position avec le plus petit tick.
Pour vérifier comment la fonction OrderSend() se comporte dans ce cas, il faut le faire, mais il est préférable de le faire comme il se doit et si l'erreur ne disparaît pas, d'imprimer non seulement le code d'erreur, mais aussi le ticket de position, le prix de la position, le prix du nouveau stop et du take. C'est le minimum.
Pour une compréhension complète, vous devez préciser quel type de compte hadge ou netting.
Merci pour vos commentaires. Le type de compte est le netting. RTS Splice. C'est la partie délicate ? Une position sur un symbole. Vous pouvez choisir la voie que vous voulez, vous arriverez quand même à cette position. Ce ne sont pas des commandes en cours, n'est-ce pas ? C'est pourquoi je ne comprends pas encore plus - qu'est-ce qui ne va pas ? J'ai essayé toutes les variantes.
Merci pour les commentaires. Compensation par type de compte. RTS Instrument d'épissure. C'est la partie délicate ? Une position sur un symbole. Vous pouvez choisir la voie que vous voulez, vous arriverez quand même à cette position. Ce ne sont pas des commandes en cours, n'est-ce pas ? C'est pourquoi je ne comprends pas encore plus - qu'est-ce qui ne va pas ? J'ai essayé toutes les variantes.
Pour vérifier comment la fonction OrderSend() se comporte dans ce cas, il faut le faire et vérifier, mais il vaut mieux faire comme il faut et si l'erreur n'est pas levée imprimer non seulement le code d'erreur mais aussi le ticket de position, le prix de la position, le prix du nouveau stop et la prise. C'est le minimum.
Merci ! J'ai cherché et je ne l'ai pas trouvé...
Ensuite, la question suivante, disons que l'étape est 25, alors comment organiser l'arrondi à un nombre divisible par 25, peut-être y a-t-il une fonction ?
https://www.mql5.com/ru/docs/standardlibrary/tradeclasses/csymbolinfo/csymbolinfonormalizeprice
https://www.mql5.com/ru/docs/standardlibrary/tradeclasses/csymbolinfo/csymbolinfonormalizeprice
Merci, mais je n'utilise pas la bibliothèque commerciale standard.
Pas de code, pas de commentaires.
Oui, c'est bizarre. J'ai joint le fichier, mais je ne l'ai pas vérifié. C'est ma faute. Maintenant, je joins le code et l'extrait de code où le testeur donne une ligne avec [Invalid stops]. Je veux comprendre comment la structure de MqlTradeRequest fonctionne lors de la modification de la position. Dans mon cas, c'est lorsque le changement d'arrêt sur le SAR. Je n'arrive pas à me débarrasser du message [Arrêts non valides] du testeur. Outil d'épissure RTS.
Oui, c'est bizarre. J'ai joint le fichier, mais je ne l'ai pas vérifié. C'est ma faute. Je joins à présent le code et l'extrait de code où le testeur affiche une ligne avec [Invalid stops]. Je veux comprendre comment la structure de MqlTradeRequest fonctionne lors de la modification de la position. Dans mon cas, c'est lorsque le changement d'arrêt sur le SAR. Je n'arrive pas à me débarrasser du message [Arrêts non valides] du testeur. Outil d'épissure RTS.
Ce n'est pas ce fragment de code où il faut chercher une erreur, à première vue. Ce n'est que la triple sélection d'une seule et même position qui me dérange. C'est redondant.
Vous avez une erreur dans les arrêts incorrects, vous devriez probablement commencer votre recherche à partir de l'endroit où ces arrêts sont calculés.
Oui, c'est bizarre. J'ai joint le fichier, mais je ne l'ai pas vérifié. C'est ma faute. Je joins maintenant le code et l'extrait de code où le testeur donne une ligne avec [Invalid stops]. Je veux comprendre comment la structure de MqlTradeRequest fonctionne lors de la modification de la position. Dans mon cas, c'est lorsque le changement d'arrêt sur le SAR. Je n'arrive pas à me débarrasser du message [Arrêts non valides] du testeur. RTS Splice.
Pour une bonne compréhension, il est nécessaire de préciser quel type de compte hadge ou netting.
Si le type de compte est un compte
Vous avez choisi une position pour le symbole, mais ce n'est peut-être pas exactement ce que vous vouliez voir...
Mais maintenant nous choisissons la position exacte que nous voulions.
Ensuite, essayez à nouveau de choisir la bonne position
Encore une fois, la probabilité que vous ayez choisi la mauvaise position est très élevée.
Pour vérifier comment la fonction OrderSend() se comporte dans ce cas, il faut le faire, mais il est préférable de le faire comme il se doit et si l'erreur ne disparaît pas, d'imprimer non seulement le code d'erreur, mais aussi le ticket de position, le prix de la position, le prix du nouveau stop et du take. C'est le minimum.
Pour une compréhension complète, vous devez préciser quel type de compte hadge ou netting.
Merci pour vos commentaires. Le type de compte est le netting. RTS Splice. C'est la partie délicate ? Une position sur un symbole. Vous pouvez choisir la voie que vous voulez, vous arriverez quand même à cette position. Ce ne sont pas des commandes en cours, n'est-ce pas ? C'est pourquoi je ne comprends pas encore plus - qu'est-ce qui ne va pas ? J'ai essayé toutes les variantes.
Merci pour les commentaires. Compensation par type de compte. RTS Instrument d'épissure. C'est la partie délicate ? Une position sur un symbole. Vous pouvez choisir la voie que vous voulez, vous arriverez quand même à cette position. Ce ne sont pas des commandes en cours, n'est-ce pas ? C'est pourquoi je ne comprends pas encore plus - qu'est-ce qui ne va pas ? J'ai essayé toutes les variantes.
Forum sur le trading, les systèmes de trading automatisé et les tests de stratégie
Questions des débutants MQL5 MT5 MetaTrader 5
Alexey Viktorov, 2017.11.22 09:29
Pour vérifier comment la fonction OrderSend() se comporte dans ce cas, il faut le faire et vérifier, mais il vaut mieux faire comme il faut et si l'erreur n'est pas levée imprimer non seulement le code d'erreur mais aussi le ticket de position, le prix de la position, le prix du nouveau stop et la prise. C'est le minimum.
C'est pourquoi je ne comprends pas encore plus - QU'EST-CE QUI NE VA PAS ? ?? J'ai essayé toutes les options.
Insérez cette ligne à l'endroit où l'erreur se produit
Print(ToString(request) + ToString(result));Forum sur le trading, les systèmes de trading automatisés et les tests de stratégies de trading
Particularités du langage mql5, subtilités et astuces
fxsaber, 2017.02.25 16:27
Traduire les structures MqlTrade en une chaîne de caractères#define TOSTRING2(A) #A + " = " + EnumToString(A) + " (" + (string)(A) + ")\n"
string ToString( const MqlTradeTransaction &Trans )
{
return(TOSTRING(Trans.deal) + TOSTRING(Trans.order) + TOSTRING(Trans.symbol) +
TOSTRING2(Trans.type) + TOSTRING2(Trans.order_type) + TOSTRING2(Trans.order_state) +
TOSTRING2(Trans.deal_type) + TOSTRING2(Trans.time_type) +
TOSTRING(Trans.time_expiration) + TOSTRING(Trans.price) + TOSTRING(Trans.price_trigger) +
TOSTRING(Trans.price_sl) + TOSTRING(Trans.price_tp) + TOSTRING(Trans.volume) +
TOSTRING(Trans.position) + TOSTRING(Trans.position_by));
}
string ToString( const MqlTradeRequest &Request )
{
return(TOSTRING2(Request.action) + TOSTRING(Request.magic) + TOSTRING(Request.order) +
TOSTRING(Request.symbol) + TOSTRING(Request.volume) + TOSTRING(Request.price) +
TOSTRING(Request.stoplimit) + TOSTRING(Request.sl) + TOSTRING(Request.tp) +
TOSTRING(Request.deviation) + TOSTRING2(Request.type) + TOSTRING2(Request.type_filling) +
TOSTRING2(Request.type_time) + TOSTRING(Request.expiration) + TOSTRING(Request.comment) +
TOSTRING(Request.position) + TOSTRING(Request.position_by));
}
string ToString( const MqlTradeResult &Result )
{
return(TOSTRING(Result.retcode) + TOSTRING(Result.deal) + TOSTRING(Result.order) +
TOSTRING(Result.volume) + TOSTRING(Result.price) + TOSTRING(Result.bid) +
TOSTRING(Result.ask) + TOSTRING(Result.comment) + TOSTRING(Result.request_id) +
TOSTRING(Result.retcode_external));
}
#undef TOSTRING
#undef TOSTRING2
Insérez cette ligne à l'endroit où l'erreur se produit
Collé. Voici le résultat du testeur :
2017.11.22 18:22:51.127 2016.11.09 12:00:00 exchange buy 1.00 RTS Splice at 98080 sl : 94130 (98070 / 98080 / 98070)
2017.11.22 18:22:51.127 2016.11.09 12:00:00 deal #4 buy 1.00 RTS Splice at 98080 done (based on order #4)
2017.11.22 18:22:51.127 2016.11.09 12:00:00 transaction effectuée [#4 acheter 1.00 RTS Splice à 98080]
2017.11.22 18:22:51.127 2016.11.09 12:00:00 ordre exécuté acheter 1.00 à 98080 [#4 acheter 1.00 RTS Splice à 98080]
2017.11.22 18:22:53.561 2016.11.09 14:05:00:00 failed modify #4 buy 1.00 RTS Splice sl : 94130, tp : 0 -> sl : 94316, tp : 0 [Arrêts invalides]
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Request.action = TRADE_ACTION_SLTP (6)
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Request.magic = 0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Request.order = 0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Request.symbol = RTS Splice
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Request.volume = 0.0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Demande.prix = 0.0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Request.stoplimit = 0.0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Demande.sl = 94316.0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Demande.tp = 0.0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Demande.écart = 0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Request.type = ORDER_TYPE_BUY (0)
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Request.type_filling = ORDER_FILLING_FOK (0)
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Request.type_time = ORDER_TIME_GTC (0)
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Demande.expiration = 1970.01.01 00:00:00
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Request.comment =
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Request.position = 4
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Request.position_by = 0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Result.retcode = 10016
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Result.deal = 0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Result.order = 0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Volume.résultat = 0.0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Résultat.prix = 0.0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Result.bid = 0.0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Result.ask = 0.0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Result.comment = Arrêts non valides
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Result.request_id = 0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Result.retcode_external = 0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Alerte : Erreur de modification de position par TP et SL code d'erreur : 4756
Mettez-le dedans. Voici le résultat du testeur :
Mode serveur et mode testeur ?