Questions des débutants MQL5 MT5 MetaTrader 5 - page 799

 
Aleksey Vyazmikin:

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

Документация по MQL5: Стандартная библиотека / Торговые классы / CSymbolInfo / NormalizePrice
Документация по MQL5: Стандартная библиотека / Торговые классы / CSymbolInfo / NormalizePrice
  • www.mql5.com
Стандартная библиотека / Торговые классы / CSymbolInfo / NormalizePrice - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 

Merci, mais je n'utilise pas la bibliothèque commerciale standard.

 
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;
              }
           }
        }
     }
Dossiers :
SAR_SAR.mq5  27 kb
 
DCodec:

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.

 
DCodec:

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.

 
Alexey Viktorov:

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.

 
DCodec:

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.

N'y a-t-il pas de réponse à cette question ?

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.


 
DCodec:

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 TOSTRING(A)  #A + " = " + (string)(A) + "\n"
#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

 
fxsaber:

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

 
DCodec:

Mettez-le dedans. Voici le résultat du testeur :

Mode serveur et mode testeur ?

Raison: