Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 950

 
Rustam Bikbulatov:

Questa funzione scrive un numero su ogni ordine, o meglio lotto*100.

Ora abbiamo bisogno di una funzione inversa che mostri qual era l'ultimo numero

Provate:

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

Se l'oggetto contiene testo (non numerico), dovete aggiungere StringSubstr():

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

begin_index - indice del carattere nella stringa, partendo da zero, length - lunghezza del valore numerico (quanti caratteri occupa il numero)... Penso di sì

 
Yevhenii Levchenko:

Prova questo:

Se l'oggetto ha del testo (non numerico), aggiungete StringSubstr():

begin_index - indice del carattere nella stringa, partendo da zero, length - lunghezza del valore numerico (quanti caratteri occupa il numero)... Penso di sì

Beh, inizialmente dovreste cercare tutti questi numeri sul grafico. Semplicemente non funziona così. Questo è il problema, già controllato.

 
Yevhenii Levchenko:

Prova questo:

Se l'oggetto ha del testo (non numerico), aggiungere StringSubstr():

begin_index - indice del carattere nella stringa, partendo da zero, length - lunghezza del valore numerico (quanti caratteri occupa il numero)... Penso di sì

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

Simile a questo, ma non funziona, mostra zero.

 
Rustam Bikbulatov:

Come questo, ma non funziona, mostra zero.

Vuoi impostare un valore o prendere un valore? La funzione ObjectSetString() imposta un valore di testo e restituisce un valore bool. Non è questo. E nella testa del ciclo penso che non sia quello giusto... Dove ObjectsTotal()... Sono guidato dal riferimento mt4. O è il codice mt5?

 
Yevhenii Levchenko:

Dovete impostare un valore o prendere un valore? La funzione ObjectSetString() imposta un valore di testo e restituisce un valore bool. Non è questo. E nella testa del ciclo penso che non sia quello giusto... Dove ObjectsTotal()... Sono guidato dal riferimento mt4. O è il codice mt5?

Questo è MT4.

 

Ancora una volta, buona giornata a tutti!

Non sono ancora soddisfatto della domanda che ho posto sopra, ma chiedo aiuto per il codice.

Questo è il forum per il trading, i sistemi di trading automatico e il test delle strategie.

Qualsiasi domanda da principiante su MQL4 e MQL5, aiuto e discussione su algoritmi e codici

MrBrooklin, 2019.08.30 14:15

Buona giornata a tutti!!!

Ecco una parte del codice dello script per 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));
        }
     }
  }

Lo script dovrebbe piazzare sia ordini limite pendenti a una certa distanza da ask e bid, sia ordini stop. Gli ordini pendenti limite sono impostati senza problemi, ma quelli stop no. Per favore, aiutatemi a capire perché gli ordini pendenti Buy Stop e Sell Stop non sono impostati.

Cordiali saluti, Vladimir.

Solo per seguire con un'altra domanda: c'è un modo per testare lo script quando il mercato è chiuso (ad esempio nei fine settimana)?

Sinceramente, Vladimir.

 
Artyom Trishkin:

Da quale lista?

E per favore usa lo styler nell'editor (Ctrl+<):

Cosa dovrebbe essere preso da dove?

Puoi darmi un suggerimento?

 
MrBrooklin:

Ancora una volta, buona giornata a tutti!

Nessuno ha risposto alla domanda che ho posto prima, ma sto ancora chiedendo aiuto per il codice.

Un'altra domanda: c'è un modo per testare lo script quando il mercato è chiuso (ad esempio nei fine settimana)?

Sinceramente, Vladimir.

No, lo script non funziona in un mercato chiuso - non piazza ordini.

Per capire gli errori, prova a stampare nel log il valore del prezzo rispetto al quale stai calcolando i livelli di impostazione e i valori di tutti i livelli di prezzo che stai inviando all'ordine di compravendita.

 
Ciao ragazzi. Fatto scrivere un lotto accanto a un ordine aperto.
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);
        }
     }
  } 
Puoi dirmi come prendere l'ultimo testo di questa lista in un'altra parte del codice?
 
Rustam Bikbulatov:

Puoi darmi un suggerimento?

Devi trovare l'ultimo ordine che è stato aperto. Trova il suo biglietto. Poi usa l'elenco dei nomi degli oggetti per trovare l'occorrenza di una sottostringa con il biglietto trovato dell'ultimo ordine nella linea dei nomi degli oggetti. Non appena il biglietto dell'ultimo ordine si trova nel nome dell'oggetto, questo è l'oggetto grafico necessario. Tutto ciò che rimane è estrarre ciò di cui avete bisogno da questo oggetto grafico.