Forse dovremmo modificare un po' la funzione di Aleksey Vazhmikin e aggiungere una struttura per controllare l'apertura di una posizione su una nuova barra in questo modo:
struct open_bar {
bool IsPositionOpened; // Flagint bn; // Bar Numberdatetime bot; // Bar Open Timedouble bop; // Bar Open Price
};
open_bar BarOpen;
//+------------------------------------------------------------------------------------------------------------------+//| Возвращает TRUE, если появился новый бар на текущем ТФ//+------------------------------------------------------------------------------------------------------------------+bool isNewBar()
{
datetime tm[];
staticdatetime prevBarTime=0;
if(CopyTime(_Symbol,0,0,1,tm)<0)
{
Print("%s CopyTime error = %d",__FUNCTION__,GetLastError());
}
else
{
if(prevBarTime!=tm[0])
{
prevBarTime=tm[0];
BarOpen.IsPositionOpened=false;
BarOpen.bn++;
BarOpen.bot=iTime(NULL,PERIOD_CURRENT,0);
BarOpen.bop=iOpen(NULL,PERIOD_CURRENT,0);
returntrue;
}
returnfalse;
}
returntrue;
}
E poi alza il flag di controllo nell'Expert Advisor quando una posizione viene aperta con successo:
BarOpen.IsPositionOpened=true;
E controllarlo prima di aprire un'altra posizione. È più affidabile?
Grazie per tutto il vostro aiuto. Ho studiato tutto in dettaglio. Ho un ritardo di 5 secondi dopo ogni richiesta di scambio, ma ancora non aiuta. Il problema è solo su ICMarkets demo MT5 hedge. Aggiungerò i controlli e l'output dei risultati del polling di stato. La situazione è aggravata dal fatto che non riesco a riprodurre il problema con me stesso e il cliente lo ha regolarmente, anche se ci colleghiamo allo stesso server.
Grazie per tutto il vostro aiuto. Ho studiato tutto in dettaglio. Ho un ritardo di 5 secondi dopo ogni richiesta di scambio, ma ancora nessun aiuto. Il problema è solo su ICMarkets demo MT5 hedge. Aggiungerò i controlli e l'output dei risultati del polling di stato. La situazione è aggravata dal fatto che non riesco a riprodurre il problema con me stesso e il cliente lo ha regolarmente, anche se ci colleghiamo allo stesso server.
Penso che abbia qualcosa a che fare con la qualità della connessione del client, ad esempio un grande ping. Hai un ritardo di 5 secondi, ma non c'è, come ho capito dal tuo codice. Cosa restituisce la classe m_trade? Numero del biglietto? O vero o falso? Avete un controllo del risultato restituito da questo oggetto, ma immaginate che a causa di un ritardo nella connessione con il server una risposta positiva non sia stata ancora ricevuta. Quale sarà il risultato dell'esecuzione dell'istruzione if? Probabilmente, sarà falso e di conseguenza il vostro ciclo passerà a una seconda iterazione dopo 5 secondi. E alla fine il server risponderà, ma la seconda iterazione sarà già iniziata e verrà inviata una seconda richiesta per aprire una posizione simile. Il fatto che ci sia un certo delta nel tempo di apertura dell 'ordine è dimostrato dal fatto che entrambi gli ordini sono spostati nel grafico, il che significa che sono stati eseguiti in tempi e prezzi diversi.
La situazione è aggravata dal fatto che non riesco a riprodurre il problema con me stesso, ma con il cliente si verifica regolarmente, anche se ci colleghiamo allo stesso server.
Controlla sulla barra, una posizione per simbolo. Molto probabilmente vi sbarazzerete del problema.
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(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.SellStop(InpLots,m_symbol.NormalizePrice(price_bid),m_symbol.Name(),
m_symbol.NormalizePrice(sl),
m_symbol.NormalizePrice(tp));
}
}
}
Sono sorte delle domande:
1. Lo script dovrebbe impostare o ordini limite pendenti a una certa distanza da ask e bid, o ordini stop. Gli ordinipendenti limite sono impostati senza problemi, ma quelli stop no. Per favore, aiutatemi a scoprire perché gli ordini pendenti Buy Stop e Sell Stop non vengono impostati.
2. C'è la possibilità di testare lo script quando il mercato è chiuso (per esempio nei fine settimana)?
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.
E come si controlla se una posizione non è ancora stata aperta su questa barra?
Forse dovremmo modificare un po' la funzione di Aleksey Vazhmikin e aggiungere una struttura per controllare l'apertura di una posizione su una nuova barra in questo modo:
E poi alza il flag di controllo nell'Expert Advisor quando una posizione viene aperta con successo:
BarOpen.IsPositionOpened=true;E controllarlo prima di aprire un'altra posizione. È più affidabile?
La seconda posizione si apre immediatamente dopo la prima, nello stesso secondo, i tick differiscono di uno.
https://www.mql5.com/en/forum/271445
https://www.mql5.com/en/forum/308940
https://www.mql5.com/en/forum/271445
https://www.mql5.com/en/forum/308940
Grazie per tutto il vostro aiuto. Ho studiato tutto in dettaglio. Ho un ritardo di 5 secondi dopo ogni richiesta di scambio, ma ancora non aiuta. Il problema è solo su ICMarkets demo MT5 hedge. Aggiungerò i controlli e l'output dei risultati del polling di stato. La situazione è aggravata dal fatto che non riesco a riprodurre il problema con me stesso e il cliente lo ha regolarmente, anche se ci colleghiamo allo stesso server.
Salve signore e signori! C'è qualcuno di Simferopol?
Quindi pensi che questo ti aiuterà in qualche modo a imparare MQL5 :). Questo è un forum di programmazione MQL5, non un club di appuntamenti.
Quindi pensi che questo ti aiuterà in qualche modo ad imparare MQL5 :). Questo è un forum di programmazione MQL5, non un club di appuntamenti.
Grazie per tutto il vostro aiuto. Ho studiato tutto in dettaglio. Ho un ritardo di 5 secondi dopo ogni richiesta di scambio, ma ancora nessun aiuto. Il problema è solo su ICMarkets demo MT5 hedge. Aggiungerò i controlli e l'output dei risultati del polling di stato. La situazione è aggravata dal fatto che non riesco a riprodurre il problema con me stesso e il cliente lo ha regolarmente, anche se ci colleghiamo allo stesso server.
Penso che abbia qualcosa a che fare con la qualità della connessione del client, ad esempio un grande ping. Hai un ritardo di 5 secondi, ma non c'è, come ho capito dal tuo codice. Cosa restituisce la classe m_trade? Numero del biglietto? O vero o falso? Avete un controllo del risultato restituito da questo oggetto, ma immaginate che a causa di un ritardo nella connessione con il server una risposta positiva non sia stata ancora ricevuta. Quale sarà il risultato dell'esecuzione dell'istruzione if? Probabilmente, sarà falso e di conseguenza il vostro ciclo passerà a una seconda iterazione dopo 5 secondi. E alla fine il server risponderà, ma la seconda iterazione sarà già iniziata e verrà inviata una seconda richiesta per aprire una posizione simile. Il fatto che ci sia un certo delta nel tempo di apertura dell 'ordine è dimostrato dal fatto che entrambi gli ordini sono spostati nel grafico, il che significa che sono stati eseguiti in tempi e prezzi diversi.
La situazione è aggravata dal fatto che non riesco a riprodurre il problema con me stesso, ma con il cliente si verifica regolarmente, anche se ci colleghiamo allo stesso server.
Controlla sulla barra, una posizione per simbolo. Molto probabilmente vi sbarazzerete del problema.
Controlla sulla barra, una posizione per simbolo. Probabilmente vi sbarazzerete del problema.
C'è un altro intoppo. In questa situazione è più facile riscrivere in stile MT4 che inventarsi una stampella.
Buona giornata a tutti!
Ecco una parte del codice dello script per Metatrader5:
Sono sorte delle domande:
1. Lo script dovrebbe impostare o ordini limite pendenti a una certa distanza da ask e bid, o ordini stop. Gli ordinipendenti limite sono impostati senza problemi, ma quelli stop no. Per favore, aiutatemi a scoprire perché gli ordini pendenti Buy Stop e Sell Stop non vengono impostati.
2. C'è la possibilità di testare lo script quando il mercato è chiuso (per esempio nei fine settimana)?
Sinceramente, Vladimir.