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ì
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.
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ì
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?
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?
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 parametersinputushort InpUpGap = 15; // Gap for pending orders UP from the current price (in points)inputushort InpUpStep = 30; // Step between orders UP (in points)inputushort InpDownGap = 15; // Gap for pending orders DOWN from the current price (in points)inputushort InpDownStep = 30; // Step between orders DOWN (in points)input ENUM_STOP_OR_LIMIT InpPending = stop; // Type of pending ordersinputuchar InpUpQuantity = 1; // UP quantity ordersinputuchar InpDownQuantity = 1; // DOWN quantity ordersinputdouble InpLots = 0.01; // Lotsinputushort InpStopLoss = 50; // Stop Loss (in points)inputushort InpTakeProfit = 50; // Take Profit (in points)//---ulong m_slippage=30; // slippagedouble 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 |//+------------------------------------------------------------------+voidOnStart()
{
//---if(InpLots<=0.0)
{
Print("The \"Lots\" can't be smaller or equal to zero");
return;
}
//---if(!m_symbol.Name(Symbol())) // sets symbol namereturn;
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);
elseif(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 workdouble start_price_ask=m_symbol.Ask()-ExtUpGap;
double start_price_bid=m_symbol.Bid()+ExtDownGap;
//--- set pending ordersfor(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)?
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.
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.
Consenti l'uso dei cookie per accedere al sito MQL5.com.
Abilita le impostazioni necessarie nel browser, altrimenti non sarà possibile accedere.
Hai effettuato l'accesso. L'autenticazione a due fattori è stata disattivata. Configurala di nuovo e scansiona un nuovo codice QR, oppure continua con l'autenticazione a due fattori disattivata.
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:
Se l'oggetto contiene testo (non numerico), dovete 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ì
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.
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ì
Simile a questo, ma non funziona, mostra zero.
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?
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:
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.
Da quale lista?
E per favore usa lo styler nell'editor (Ctrl+<):
Cosa dovrebbe essere preso da dove?
Puoi darmi un suggerimento?
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.
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.