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

 
Rustam Bikbulatov:

Cette fonction écrit un numéro sur chaque commande, ou plutôt lot*100.

Maintenant, nous avons besoin d'une fonction inverse qui montre quel était le dernier nombre.

Essayez-le :

double value = StringToDouble(ObjectGetString(0,object_name,OBJPROP_TEXT)); 

Si l'objet contient du texte (et non des chiffres), vous devez ajouter StringSubstr() :

double value = StringToDouble( StringSubstr(ObjectGetString(0,object_name,OBJPROP_TEXT),begin_index,length));

begin_index - indice du caractère dans la chaîne, en commençant par zéro, length - longueur de la valeur numérique (combien de caractères le nombre occupe)... Je pense que oui.

 
Yevhenii Levchenko:

Essayez ça :

Si l'objet contient du texte (et non des chiffres), ajoutez StringSubstr() :

begin_index - indice du caractère dans la chaîne, en commençant par zéro, length - longueur de la valeur numérique (combien de caractères le nombre occupe)... Je pense que oui.

Au départ, il faut chercher tous ces chiffres sur le graphique. Ça ne marche pas comme ça. C'est le problème. Déjà vérifié.

 
Yevhenii Levchenko:

Essayez ça :

Si l'objet contient du texte (et non des chiffres), ajoutez StringSubstr() :

begin_index - indice du caractère dans la chaîne, en partant de zéro, length - longueur de la valeur numérique (combien de caractères le nombre occupe)... Je pense que oui.

   bool name;
        for(int i=0; i<ObjectsTotal(0,"LOTB"+OrderTicket(),OBJ_TEXT); i++)
     {
      name = ObjectSetString(0,"LOTB"+OrderTicket(),OBJ_TEXT,0);
      Comment("   ",name); 
   }

Similaire à celui-ci, mais il ne fonctionne pas. Il affiche zéro.

 
Rustam Bikbulatov:

Comme celui-là, mais il ne fonctionne pas. Il affiche zéro.

Voulez-vous fixer une valeur ou prendre une valeur ? La fonction ObjectSetString() définit une valeur de texte et renvoie une valeur bool. Ce n'est pas ça. Et dans la tête de la boucle, je pense que ce n'est pas la bonne... Où ObjectsTotal()... Je suis guidé par la référence mt4. Ou est-ce un code mt5 ?

 
Yevhenii Levchenko:

Avez-vous besoin de fixer une valeur ou de prendre une valeur ? La fonction ObjectSetString() définit une valeur de texte et renvoie une valeur bool. Ce n'est pas ça. Et dans la tête de la boucle, je pense que ce n'est pas la bonne... Où ObjectsTotal()... Je suis guidé par la référence mt4. Ou est-ce un code mt5 ?

Il s'agit de MT4.

 

Encore une fois, bonne journée à tous !

Je ne suis toujours pas satisfait de la question que j'ai posée ci-dessus, mais je demande de l'aide pour le code.

C'est le forum pour le trading, les systèmes de trading automatisés et les tests de stratégies.

Toutes les questions des débutants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes.

MrBrooklin, 2019.08.30 14:15

Bonjour à tous ! !!

Voici une partie du code du script pour Metatrader5 :

#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//---- показывать входные параметры
#property script_show_inputs
//---
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
CTrade         m_trade;                      // trading object
CSymbolInfo    m_symbol;                     // symbol info object
//+------------------------------------------------------------------+
//| Enum Stop or Limit                                               |
//+------------------------------------------------------------------+
enum ENUM_STOP_OR_LIMIT
  {
   stop=0,     // Buy stop and Sell stop
   limit=1     // Buy limit and Sell limit
  };
//--- input parameters
input ushort               InpUpGap          = 15;    // Gap for pending orders UP from the current price (in points)
input ushort               InpUpStep         = 30;    // Step between orders UP (in points)

input ushort               InpDownGap        = 15;    // Gap for pending orders DOWN from the current price (in points)
input ushort               InpDownStep       = 30;    // Step between orders DOWN (in points)

input ENUM_STOP_OR_LIMIT   InpPending        = stop;  // Type of pending orders

input uchar                InpUpQuantity     = 1;     // UP quantity orders
input uchar                InpDownQuantity   = 1;     // DOWN quantity orders

input double               InpLots           = 0.01;  // Lots
input ushort               InpStopLoss       = 50;    // Stop Loss (in points)
input ushort               InpTakeProfit     = 50;    // Take Profit (in points)
//---
ulong                      m_slippage=30;             // slippage

double                     ExtUpGap=0.0;
double                     ExtUpStep=0.0;

double                     ExtDownGap=0.0;
double                     ExtDownStep=0.0;

double                     ExtStopLoss=0.0;
double                     ExtTakeProfit=0.0;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   if(InpLots<=0.0)
     {
      Print("The \"Lots\" can't be smaller or equal to zero");
      return;
     }
//---
   if(!m_symbol.Name(Symbol())) // sets symbol name
      return;
   if(!RefreshRates())
      return;

   string err_text="";
   if(!CheckVolumeValue(InpLots,err_text))
     {
      Print(err_text);
      return;
     }

//---
   if(IsFillingTypeAllowed(SYMBOL_FILLING_FOK))
      m_trade.SetTypeFilling(ORDER_FILLING_FOK);
   else
      if(IsFillingTypeAllowed(SYMBOL_FILLING_IOC))
         m_trade.SetTypeFilling(ORDER_FILLING_IOC);
      else
         m_trade.SetTypeFilling(ORDER_FILLING_RETURN);

//---
   m_trade.SetDeviationInPoints(m_slippage);
   m_trade.SetAsyncMode(true);

//---
   ExtUpGap = m_symbol.Point() * InpUpGap;
   ExtUpStep = m_symbol.Point() * InpUpStep;

   ExtDownGap = m_symbol.Point() * InpDownGap;
   ExtDownStep = m_symbol.Point() * InpDownStep;

   ExtStopLoss = m_symbol.Point() * InpStopLoss;
   ExtTakeProfit = m_symbol.Point() * InpTakeProfit;

//--- start work
   double start_price_ask=m_symbol.Ask()-ExtUpGap;
   double start_price_bid=m_symbol.Bid()+ExtDownGap;

//--- set pending orders
   for(int i=0; i<InpUpQuantity; i++)
     {
      double price_ask = start_price_ask+i*ExtUpStep;
      double price_bid = start_price_bid+i*ExtUpStep;
      if(InpPending==stop)
        {
         double sl = (ExtStopLoss==0.0)   ? 0.0 : price_ask - ExtStopLoss;
         double tp = (ExtTakeProfit==0.0) ? 0.0 : price_ask + ExtTakeProfit;
         m_trade.BuyStop(InpLots,m_symbol.NormalizePrice(price_ask),m_symbol.Name(),
         m_symbol.NormalizePrice(sl),
         m_symbol.NormalizePrice(tp));
        }
      else
        {
         double sl = (ExtStopLoss==0.0)   ? 0.0 : price_bid + ExtStopLoss;
         double tp = (ExtTakeProfit==0.0) ? 0.0 : price_bid - ExtTakeProfit;
         m_trade.SellLimit(InpLots,m_symbol.NormalizePrice(price_bid),m_symbol.Name(),
         m_symbol.NormalizePrice(sl),
         m_symbol.NormalizePrice(tp));
        }
     }

   for(int i=0; i<InpDownQuantity; i++)
     {
      double price_ask = start_price_ask-i*ExtDownStep;
      double price_bid = start_price_bid-i*ExtDownStep;
      if(InpPending==limit)
        {
         double sl = (ExtStopLoss==0.0)   ? 0.0 : price_ask - ExtStopLoss;
         double tp = (ExtTakeProfit==0.0) ? 0.0 : price_ask + ExtTakeProfit;
         m_trade.BuyLimit(m_symbol.LotsMin(),m_symbol.NormalizePrice(price_ask),m_symbol.Name(),
         m_symbol.NormalizePrice(sl),
         m_symbol.NormalizePrice(tp));
        }
      else
        {
         double sl = (ExtStopLoss==0.0)   ? 0.0 : price_bid + ExtStopLoss;
         double tp = (ExtTakeProfit==0.0) ? 0.0 : price_bid - ExtTakeProfit;
         m_trade.SellStop(m_symbol.LotsMin(),m_symbol.NormalizePrice(price_bid),m_symbol.Name(),
         m_symbol.NormalizePrice(sl),
         m_symbol.NormalizePrice(tp));
        }
     }
  }

Le script doit placer soit des ordres à cours limité à une certaine distance du ask et du bid, soit des ordres stop. Les ordres limités en attente sont définis sans problème, mais pas les ordres stop. Aidez-moi à comprendre pourquoi les ordres Stop d'achat et Stop de vente en attente ne sont pas définis.

Cordialement, Vladimir.

Juste pour poursuivre avec une autre question : existe-t-il un moyen de tester le script lorsque le marché est fermé (par exemple, le week-end) ?

Sincèrement, Vladimir.

 
Artyom Trishkin:

De quelle liste ?

Et veuillez utiliser le stylet dans l'éditeur (Ctrl+<) :

Qu'est-ce qui doit être prélevé sur quoi ?

Pouvez-vous me donner un indice ?

 
MrBrooklin:

Encore une fois, bonne journée à tous !

Personne n'a répondu à la question que j'ai posée précédemment, mais je demande toujours de l'aide pour le code.

Une autre question : existe-t-il un moyen de tester le script lorsque le marché est fermé (par exemple, le week-end) ?

Sincèrement, Vladimir.

Non, le script ne fonctionnera pas sur un marché fermé - il ne passera pas d'ordres.

Pour comprendre les erreurs, essayez d'imprimer dans le journal la valeur du prix par rapport auquel vous calculez les niveaux de réglage et les valeurs de tous les niveaux de prix que vous envoyez à l'ordre de transaction.

 
Salut les gars. Fait d'écrire un lot à côté d'une commande ouverte.
for(int no1=0; no1<OrdersTotal(); no1++)
  {
   if(OrderSelect(no1,SELECT_BY_POS,MODE_TRADES))
     {
      if(OrderSymbol()==Symbol() && OrderType()== OP_BUY)
        {
         ObjectCreate("LOTB"+OrderTicket(),OBJ_TEXT,0,TimeCurrent(),OrderOpenPrice());
         ObjectSetText("LOTB"+OrderTicket(),OrderLots()*100,20,"Arial",clrWheat);
         ObjectSetInteger(0,"LOTB"+OrderTicket(),OBJPROP_ANCHOR,ANCHOR_RIGHT_UPPER);
        }
     }
  } 
Pouvez-vous me dire comment prendre le dernier texte de cette liste dans une autre partie du code ?
 
Rustam Bikbulatov:

Pouvez-vous me donner un indice ?

Vous devez trouver la dernière commande qui a été ouverte. Trouver son billet. Utilisez ensuite la liste des noms d'objets pour trouver l'occurrence d'une sous-chaîne avec le ticket trouvé de la dernière commande dans la ligne des noms d'objets. Dès que le ticket de la dernière commande se trouve dans le nom de l'objet, c'est l'objet graphique nécessaire. Il ne reste plus qu'à extraire ce dont vous avez besoin de cet objet graphique.

Raison: