Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 1028

 

Pourquoi l'EA ne peut-il pas modifier le prix de l'ordre en suspens (stop de vente) à un prix plus rentable ?


Voici la fonction qui définit si le prix ouvert d'un ordre en attente doit être déplacé

if(orders_total > 0 && position_total == 0)
     {
      OrderGetTicket(0)
      if(OrderGetInteger(ORDER_TYPE) == ORDER_TYPE_BUY_STOP)
        {
         if(OrderGetDouble(ORDER_PRICE_OPEN) - SymbolInfoDouble(_Symbol,SYMBOL_ASK) > ((double)(dist+1)) * _Point) Mode_Order("M",SymbolInfoDouble(_Symbol,SYMBOL_ASK) + ((double)dist * _Point));
        }
      else if(OrderGetInteger(ORDER_TYPE) == ORDER_TYPE_SELL_STOP)
        {
         if(SymbolInfoDouble(_Symbol,SYMBOL_BID) - OrderGetDouble(ORDER_PRICE_OPEN) > ((double)(dist+1)) * _Point) Mode_Order("M",SymbolInfoDouble(_Symbol,SYMBOL_BID) - ((double)dist * _Point));
        };
     };


... et voici la fonction qui déplace déjà le prix ouvert de l'ordre en attente

void Mode_Order(string act, double price)
  {
   
   MqlTradeRequest request; ZeroMemory(request);
   MqlTradeResult  result;  ZeroMemory(result);
   
   request.symbol = _Symbol;
   
   if(act == "S")
     {
      request.action   = TRADE_ACTION_SLTP;
      request.position = PositionGetTicket(0);
      request.sl       = (PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY ? PositionGetDouble(POSITION_PRICE_OPEN) - ((double)stop * _Point) : PositionGetDouble(POSITION_PRICE_OPEN) + ((double)stop * _Point));
      request.tp       = (PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY ? PositionGetDouble(POSITION_PRICE_OPEN) + ((double)profit * _Point) : PositionGetDouble(POSITION_PRICE_OPEN) - ((double)profit * _Point));
     }
   else
     {
      request.action   = TRADE_ACTION_MODIFY;
      request.position = OrderGetTicket(0);
      request.price    = NormalizeDouble(price,_Digits);
     };
   
   if(!OrderSend(request,result)) Print("Не удалось изменить параметры ордера. Код ошибки "+(string)result.retcode);
   
  }
 
Alexandr Sokolov:

Pourquoi l'EA ne peut-il pas modifier le prix de l'ordre en suspens (stop de vente) à un prix plus rentable ?


Voici la fonction qui définit le besoin de déplacer le prix ouvert d'un ordre en attente


... Et voici la fonction qui déplace déjà le prix ouvert de l'ordre en attente

Cette commande est-elle la seule ? La modification SLTP fonctionne-t-elle ? Si non, les prises et les arrêts doivent être normalisés.

dist1 est égal à quoi ? Ici, l'ordre doit être défini au lieu de la position.

request.position = OrderGetTicket(0);
 
Aleksey Mavrin:

L'ordre est-il le seul ? La modification du SLTP fonctionne-t-elle ? Si ce n'est pas le cas, vous devez normaliser la prise et l'arrêt.

dist1 est égal à quoi ? Nous devrions définir l'ordre au lieu de la position

Merci beaucoup ! Je ne l'avais pas remarqué, cela semble être une bagatelle - mais cela ne fonctionne pas sans cela.


... L'ordre est le seul, tout fonctionne, le seul problème a été de déplacer l'ordre en attente

 
Alexandr Sokolov:

Merci beaucoup ! Je n'avais pas remarqué cela, c'est apparemment une petite chose - mais cela ne fonctionne pas sans cela.


... L'ordre est le seul, tout fonctionne, le seul problème était de déplacer l'ordre en attente

1. S'il vous plaît 2. Hmm, je vais quand même le normaliser, contre le péché. Votre prix est obtenu à partir de l'entier multiplié par un double normalisé, dans le cas général on obtient apparemment aussi un double normalisé, mais j'ai lu quelque part que pas toujours, quelques fois par an on peut obtenir

quelque chose comme 1,13250000000000000000001

et puis les ennuis, au bon moment, quand la tendance la plus puissante ne fonctionne pas, et l'hypothèque à nouveau, bonjour))))

Je peux me tromper, mais moi-même je rassure et normalise toujours.

 
Aleksey Mavrin:

1. S'il vous plaît 2. Hmmm, je normalise de toute façon pour l'amour du péché. Vous obtenez le prix d'un ensemble multiplié par un double normalisé, dans le cas général vous obtenez apparemment un double normalisé aussi, mais j'ai lu quelque part que pas toujours, quelques fois par an vous pourriez obtenir

quelque chose comme 1,13250000000000000000001

et puis les ennuis, au bon moment, quand la tendance la plus puissante ne fonctionne pas, et l'hypothèque à nouveau, bonjour))))

Je peux me tromper, mais moi-même je rassure et normalise toujours.

Les opérations mathématiques sur deux nombres normalisés donnent des résultats non normalisés.

Afin d'obtenir un résultat normalisé d'opérations mathématiques avec des nombres réels, vous devez renvoyer la valeur normalisée de ces opérations mathématiques.

Norm(1.11111) + Norm(2.22222) = NoNorm(res)

Norm(1.11111 + 2.22222) = Norm(res)

 

@ Artyom Trishkin

J'ai joint le code avec ce thème.

J'ai trouvé son code dans la base de code. Il y a eu un problème lors de la modification du code.

La partie entrée comporte les entrées suivantes :

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
input eTradeType                                    Inp_element_12357534       = TRADETYPE_BUY;                        // First Trade Type
input double                                        Inp_element_3632865        = 0.01;                                 // Start Lot
input double                                        Inp_element_12844407       = 1.0;                                  // Lot Multiplier
input #ifdef __MQL4__ int #else long #endif          Inp_element_2542795        = 400;                                  // Grid Step, points
input #ifdef __MQL4__ int #else long #endif          Inp_element_3135636        = 100;                                  // Target, points
input #ifdef __MQL4__ int #else long #endif          Inp_element_3634918        = 7373;                                 // Magic
sinput string                                       Inp_element_3640359        = "Grid EA";                            // Comment
//+------------------------------------------------------------------+

Je veux que ce paramètre change pendant l'exécution du programme : input #ifdef __MQL4__ INT #else long #endif Inp_element_2542795 = 400 // Grille de pas, points.

Veuillez me dire ce que je peux faire pour modifier ce paramètre à chaque fois que je l'exécute.

Dossiers :
Manage.mq5  859 kb
 
jaffer wilson :

@ Artyom Trishkin

J'ai joint le code avec ce thème.

J'ai trouvé son code dans la base de code. Il y a eu un problème lors de la modification du code.

La partie entrée comporte les entrées suivantes :

Je veux que ce paramètre change pendant l'exécution du programme : input #ifdef __MQL4__ INT #else long #endif Inp_element_2542795 = 400 // Grille de pas, points.

Veuillez me dire ce que je peux faire pour modifier ce paramètre à chaque fois que je l'exécute.

Honnêtement, la question n'est pas claire.

Voulez-vous modifier le paramètre d'entrée Inp_element_2542795 chaque fois que vous démarrez le conseiller ?

Eh bien, changez-le dans les paramètres du conseiller quand il démarre. Ou, si le conseiller est déjà en cours d'exécution, et que vous souhaitez modifier ce paramètre, appuyez sur F7 - la fenêtre des paramètres du conseiller apparaîtra, et vous pourrez y modifier ce paramètre.

 
Artyom Trishkin:

Honnêtement, la question n'est pas claire.

Voulez-vous modifier le paramètre d'entrée Inp_element_2542795 chaque fois que vous démarrez le conseiller ?

Eh bien, changez-le dans les paramètres du conseiller quand il démarre. Ou, si le conseiller est déjà en cours d'exécution, et que vous souhaitez modifier ce paramètre, appuyez sur F7 - la fenêtre des paramètres du conseiller apparaîtra, et vous pourrez y modifier ce paramètre.

Laissez-moi être clair. Je suppose que le problème est la traduction. En fait, il s'agit d'une valeur d'entrée, et je ne comprends pas où cette valeur est utilisée pour le calcul. Je ne veux pas que l'on utilise chaque fois 400 points. Je veux continuer à changer les valeurs. Je veux changer les valeurs pour un calcul approprié. Pouvez-vous m'aider à faire des changements pour que la valeur devienne dynamique pendant l'exécution du programme ?

 
jaffer wilson :

Laissez-moi clarifier les choses. Je pense que le problème vient de la traduction. Il s'agit en fait d'une valeur d'entrée. et je ne comprends pas où cette valeur est utilisée pour calculer. Je ne veux pas que l'on utilise 400 points à chaque fois. Je veux continuer à changer les valeurs. Je veux modifier les valeurs pour un calcul approprié. Pouvez-vous m'indiquer où je peux apporter des modifications pour que la valeur devienne dynamique pendant l'exécution du programme ?

Créez une nouvelle variable globale. Donnez-lui la valeur du paramètre d'entréeInp_element_2542795:

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
cRunner *Runner;
long g_element_2542795=0;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit(void)
  {
//===============
   g_element_2542795=Inp_element_2542795;
//===============
/* DEBUG MACROS' START */ TRACEERRORS_START
//===============
 
//===============
   Runner=new cRunner;
//===============
 

et remplacer toute l'entrée de la chaîne Inp_element_2542795 par cette nouvelle variable g_element_2542795 en utilisant Ctrl + H

 

Bonjour !

Je suis en train d'apprendre MQL5, donc je demande de l'aide.

Il y a une classe -https://www.mql5.com/ru/code/18721(Vlad Karputova). Merci à Vladimir.

Il calcule le profit (en points, en monnaie de dépôt, en swap et en commission), mais il n'a pas de filtre pour Magik.

J'ai ajouté un filtre pour Magik (je ne suis pas sûr qu'il soit correct, donc je ne veux pas le poster avec des erreurs).

J'ai le résultat.

Search deals with POSITION_IDENTIFIER 53821539
DEAL_ENTRY_IN, DEAL_TYPE_SELL, price 1.11164, Deal_Symbol EURUSD, Deal_Magic  222, volume 0.03, commission -0.05, swap 0.00, profit 0.00
DEAL_ENTRY_OUT, DEAL_TYPE_BUY, price 1.11170, Deal_Symbol EURUSD, Deal_Magic  0, volume 0.03, commission -0.05, swap 0.00, profit -0.18
Profit in points -6.0, commission -0.10, swap 0.00, profit -0.18

Search deals with POSITION_IDENTIFIER 53821617
DEAL_ENTRY_IN, DEAL_TYPE_SELL, price 1.11159, Deal_Symbol EURUSD, Deal_Magic  222, volume 0.03, commission -0.05, swap 0.00, profit 0.00
DEAL_ENTRY_OUT, DEAL_TYPE_BUY, price 1.11172, Deal_Symbol EURUSD, Deal_Magic  0, volume 0.03, commission -0.05, swap 0.00, profit -0.39
Profit in points -13.0, commission -0.10, swap 0.00, profit -0.39

Search deals with POSITION_IDENTIFIER 53821750
DEAL_ENTRY_IN, DEAL_TYPE_SELL, price 1.11163, Deal_Symbol EURUSD, Deal_Magic  222, volume 0.03, commission -0.05, swap 0.00, profit 0.00
DEAL_ENTRY_OUT, DEAL_TYPE_BUY, price 1.11169, Deal_Symbol EURUSD, Deal_Magic  0, volume 0.03, commission -0.05, swap 0.00, profit -0.18
Profit in points -6.0, commission -0.10, swap 0.00, profit -0.18

Search deals with POSITION_IDENTIFIER 53847372
DEAL_ENTRY_IN, DEAL_TYPE_SELL, price 1.10971, Deal_Symbol EURUSD, Deal_Magic  222, volume 0.03, commission -0.05, swap 0.00, profit 0.00
DEAL_ENTRY_OUT, DEAL_TYPE_BUY, price 1.11002, Deal_Symbol EURUSD, Deal_Magic  0, volume 0.03, commission -0.05, swap 0.00, profit -0.93
Profit in points -31.0, commission -0.10, swap 0.00, profit -0.93

Search deals with POSITION_IDENTIFIER 53848455
DEAL_ENTRY_IN, DEAL_TYPE_SELL, price 1.10997, Deal_Symbol EURUSD, Deal_Magic  222, volume 0.03, commission -0.05, swap 0.00, profit 0.00
DEAL_ENTRY_OUT, DEAL_TYPE_BUY, price 1.10741, Deal_Symbol EURUSD, Deal_Magic  0, volume 0.03, commission -0.05, swap 0.00, profit 7.68
Profit in points 256.0, commission -0.10, swap 0.00, profit 7.68

Search deals with POSITION_IDENTIFIER 53856130
DEAL_ENTRY_IN, DEAL_TYPE_SELL, price 1.10735, Deal_Symbol EURUSD, Deal_Magic  222, volume 0.03, commission -0.05, swap 0.00, profit 0.00
DEAL_ENTRY_OUT, DEAL_TYPE_BUY, price 1.10769, Deal_Symbol EURUSD, Deal_Magic  0, volume 0.03, commission -0.05, swap 0.00, profit -1.02
Profit in points -34.0, commission -0.10, swap 0.00, profit -1.02
All_Profit in points 166.0, All_commission -0.60, All_swap 0.00, All_profit 4.98
All_Profit in points 0.0, All_commission 0.00, All_swap 0.00, All_profit 0.00

Les résultats pour la classe originale et la classe avec le filtre de Magik coïncident. Mais, il y a un point ici.

1. Pourquoi les métiers OUT n'ont aucune magie.

Si j'ai incorrectement corrigé la classe (ajout d'un magik), veuillez apporter la modification requise à la classe originale et la poster.

(Et il serait bon de passer un symbole à la classe en tant que paramètre).

Merci pour votre aide.

HistoryPositionInfo version 2
HistoryPositionInfo version 2
  • www.mql5.com
Новое в версии 2: функция GetProfitInPoints осталась, но рекомендуется теперь использовать новую функцию GetProfit: Функция GetProfit возвращает для восстановленной позиции, кроме прибыли в пунктах: комиссию, своп и прибыль в деньгах. Класс CHistoryPositionInfo предназначен для получения прибыли позиции в пунктах, комиссии, свопа и прибыли в...
Raison: