Sì, è strano. Ho allegato il file, ma non l'ho controllato. Colpa mia. Ora sto allegando sia il codice che l'estratto di codice dove il tester dà una linea con [Invalid stops]. Voglio capire come funziona la struttura di MqlTradeRequest quando si modifica la posizione. Nel mio caso è quando si cambia la fermata del SAR. Non riesco a sbarazzarmi del messaggio [Invalid stops] del tester. Strumento di giunzione RTS.
//+------------------------------------------------------------------+//| Модификация Stop Loss открытой позиции |//+------------------------------------------------------------------+//--- объявление запроса и результатаMqlTradeRequest request;
MqlTradeResult result;
int total=PositionsTotal(); // количество открытых позиций Print("total = ",total," ");
//--- перебор всех открытых позицийfor(int i=0; i<total; i++)
{
if(PositionSelect(_Symbol)==true) // есть открытая позиция
{
//--- параметры ордераulong position_ticket=PositionGetTicket(i);// тикет позицииstring position_symbol=PositionGetString(POSITION_SYMBOL); // символ int digits=(int)SymbolInfoInteger(position_symbol,SYMBOL_DIGITS); // количество знаков после запятойulong magic=PositionGetInteger(POSITION_MAGIC); // MagicNumber позицииif(PositionSelect(position_symbol)) // если позицию удалось выделить, значит - позиция существует
{
//--- обнуление значений запроса и результатаZeroMemory(request);
ZeroMemory(result);
//--- установка параметров операции
request.action = TRADE_ACTION_SLTP; // тип торговой операции
request.position = position_ticket; // тикет позиции
request.symbol = position_symbol; // символ
request.sl= STP; // Stop Loss позиции
request.tp = 0; // Take Profit позиции//--- отсылаем ордерint number=OrderSend(request,result);
// анализируем код возврата торгового сервераif(result.retcode==10009 || result.retcode==10008) //Request is completed or order placed
{
Alert("Ордер Sell успешно помещен, тикет ордера # ",result.order," ");
}
else
{
Alert("Запрос на установку ордера Sell не выполнен - код ошибки:",GetLastError());
return;
}
}
}
}
Sì, è strano. Ho allegato il file, ma non l'ho controllato. Colpa mia. Ora sto allegando sia il codice che un estratto di codice dove il tester dà una linea con [Invalid stops]. Voglio capire come funziona la struttura di MqlTradeRequest quando si modifica la posizione. Nel mio caso è quando si cambia la fermata del SAR. Non riesco a sbarazzarmi del messaggio [Invalid stops] del tester. Strumento di giunzione RTS.
Questo non è quel frammento di codice dove dovremmo cercare un errore, a prima vista. È solo la tripla selezione di una stessa posizione che mi preoccupa. È ridondante.
Hai un errore nelle fermate errate, dovresti probabilmente iniziare la tua ricerca dal luogo in cui queste fermate sono calcolate.
Sì, è strano. Ho allegato il file, ma non l'ho controllato. Colpa mia. Ora sto allegando sia il codice che un estratto di codice dove il tester dà una linea con [Invalid stops]. Voglio capire come funziona la struttura di MqlTradeRequest quando si modifica la posizione. Nel mio caso è quando si cambia la fermata del SAR. Non riesco a sbarazzarmi del messaggio [Invalid stops] del tester. Giunzione RTS.
Per una piena comprensione è necessario specificare che tipo di account hadge o netting
Se il tipo di conto è statoge
if(PositionSelect(_Symbol)==true) // есть открытая позиция
Avete scelto una posizione per il simbolo, ma potrebbe non essere esattamente quello che volevate vedere...
ulong position_ticket=PositionGetTicket(i);// тикет позиции
Ma ora abbiamo scelto la posizione esatta che volevamo.
La funzione restituisce un biglietto di una posizione per indice nella lista delle posizioni aperte e seleziona automaticamente questa posizione per lavorare ulteriormente con essa usando
Poi, prova di nuovo a scegliere la posizione giusta
if(PositionSelect(position_symbol)) // если позицию удалось выделить, значит - позиция существует
Di nuovo, la probabilità di aver scelto la posizione sbagliata è molto alta
Quando si rappresentano le posizioni in modo indipendente (ACCOUNT_MARGIN_MODE_RETAIL_HEDGING), diverse posizioni possono essere aperte simultaneamente per ogni simbolo. In questo caso, PositionSelect selezionerà la posizione con il tick più piccolo.
Per controllare come si comporta la funzione OrderSend() in questo caso, dovreste farlo, ma è meglio farlo come dovrebbe essere e se l'errore non scompare, stampare non solo il codice di errore, ma anche il ticket di posizione, il prezzo della posizione, il prezzo del nuovo stop e take. Questo è il minimo.
Per una piena comprensione è necessario specificare che tipo di account hadge o netting
Grazie per i vostri commenti. Il tipo di conto è il netting. Giunzione RTS. È questa la parte difficile? Una posizione su un simbolo. Puoi scegliere come vuoi, arriverai comunque a quella posizione. Questi non sono ordini pendenti, vero? Ecco perché non capisco ancora di più - cosa c'è che non va? Ho provato tutte le varianti.
Grazie per i commenti. Netting del tipo di conto. Strumento di giunzione RTS. È questa la parte difficile? Una posizione su un simbolo. Puoi scegliere come vuoi, arriverai comunque a quella posizione. Questi non sono ordini pendenti, vero? Ecco perché non capisco ancora di più - cosa c'è che non va? Ho provato tutte le varianti.
Per controllare come si comporta la funzione OrderSend() in questo caso, è necessario farlo e controllare, ma è meglio fare come dovrebbe e se l'errore non è andato stampare non solo il codice di errore, ma anche il biglietto di posizione, prezzo di posizione, prezzo del nuovo stop e prendere. Questo è il minimo.
Grazie! Ho cercato e non l'ho trovato...
Poi la prossima domanda, diciamo che il passo è 25, allora come organizzare l'arrotondamento a un numero divisibile per 25, forse c'è una funzione?
https://www.mql5.com/ru/docs/standardlibrary/tradeclasses/csymbolinfo/csymbolinfonormalizeprice
https://www.mql5.com/ru/docs/standardlibrary/tradeclasses/csymbolinfo/csymbolinfonormalizeprice
Grazie, ma non sto usando la libreria commerciale standard.
Nessun codice, nessun commento.
Sì, è strano. Ho allegato il file, ma non l'ho controllato. Colpa mia. Ora sto allegando sia il codice che l'estratto di codice dove il tester dà una linea con [Invalid stops]. Voglio capire come funziona la struttura di MqlTradeRequest quando si modifica la posizione. Nel mio caso è quando si cambia la fermata del SAR. Non riesco a sbarazzarmi del messaggio [Invalid stops] del tester. Strumento di giunzione RTS.
Sì, è strano. Ho allegato il file, ma non l'ho controllato. Colpa mia. Ora sto allegando sia il codice che un estratto di codice dove il tester dà una linea con [Invalid stops]. Voglio capire come funziona la struttura di MqlTradeRequest quando si modifica la posizione. Nel mio caso è quando si cambia la fermata del SAR. Non riesco a sbarazzarmi del messaggio [Invalid stops] del tester. Strumento di giunzione RTS.
Questo non è quel frammento di codice dove dovremmo cercare un errore, a prima vista. È solo la tripla selezione di una stessa posizione che mi preoccupa. È ridondante.
Hai un errore nelle fermate errate, dovresti probabilmente iniziare la tua ricerca dal luogo in cui queste fermate sono calcolate.
Sì, è strano. Ho allegato il file, ma non l'ho controllato. Colpa mia. Ora sto allegando sia il codice che un estratto di codice dove il tester dà una linea con [Invalid stops]. Voglio capire come funziona la struttura di MqlTradeRequest quando si modifica la posizione. Nel mio caso è quando si cambia la fermata del SAR. Non riesco a sbarazzarmi del messaggio [Invalid stops] del tester. Giunzione RTS.
Per una piena comprensione è necessario specificare che tipo di account hadge o netting
Se il tipo di conto è statoge
Avete scelto una posizione per il simbolo, ma potrebbe non essere esattamente quello che volevate vedere...
Ma ora abbiamo scelto la posizione esatta che volevamo.
Poi, prova di nuovo a scegliere la posizione giusta
Di nuovo, la probabilità di aver scelto la posizione sbagliata è molto alta
Per controllare come si comporta la funzione OrderSend() in questo caso, dovreste farlo, ma è meglio farlo come dovrebbe essere e se l'errore non scompare, stampare non solo il codice di errore, ma anche il ticket di posizione, il prezzo della posizione, il prezzo del nuovo stop e take. Questo è il minimo.
Per una piena comprensione è necessario specificare che tipo di account hadge o netting
Grazie per i vostri commenti. Il tipo di conto è il netting. Giunzione RTS. È questa la parte difficile? Una posizione su un simbolo. Puoi scegliere come vuoi, arriverai comunque a quella posizione. Questi non sono ordini pendenti, vero? Ecco perché non capisco ancora di più - cosa c'è che non va? Ho provato tutte le varianti.
Grazie per i commenti. Netting del tipo di conto. Strumento di giunzione RTS. È questa la parte difficile? Una posizione su un simbolo. Puoi scegliere come vuoi, arriverai comunque a quella posizione. Questi non sono ordini pendenti, vero? Ecco perché non capisco ancora di più - cosa c'è che non va? Ho provato tutte le varianti.
Forum sul trading, sistemi di trading automatico e test di strategia
Domande dai principianti MQL5 MT5 MetaTrader 5
Alexey Viktorov, 2017.11.22 09:29
Per controllare come si comporta la funzione OrderSend() in questo caso, è necessario farlo e controllare, ma è meglio fare come dovrebbe e se l'errore non è andato stampare non solo il codice di errore, ma anche il biglietto di posizione, prezzo di posizione, prezzo del nuovo stop e prendere. Questo è il minimo.
Ecco perché non capisco ancora di più - COSA c'è che non va? Ho provato tutte le opzioni.
Inserisci questa linea dove si verifica l'errore
Print(ToString(request) + ToString(result));Forum sul trading, sistemi di trading automatico e test di strategie di trading
Peculiarità del linguaggio mql5, sottigliezze e trucchi
fxsaber, 2017.02.25 16:27
Tradurre le strutture MqlTrade in una stringa#define TOSTRING2(A) #A + " = " + EnumToString(A) + " (" + (string)(A) + ")\n"
string ToString( const MqlTradeTransaction &Trans )
{
return(TOSTRING(Trans.deal) + TOSTRING(Trans.order) + TOSTRING(Trans.symbol) +
TOSTRING2(Trans.type) + TOSTRING2(Trans.order_type) + TOSTRING2(Trans.order_state) +
TOSTRING2(Trans.deal_type) + TOSTRING2(Trans.time_type) +
TOSTRING(Trans.time_expiration) + TOSTRING(Trans.price) + TOSTRING(Trans.price_trigger) +
TOSTRING(Trans.price_sl) + TOSTRING(Trans.price_tp) + TOSTRING(Trans.volume) +
TOSTRING(Trans.position) + TOSTRING(Trans.position_by));
}
string ToString( const MqlTradeRequest &Request )
{
return(TOSTRING2(Request.action) + TOSTRING(Request.magic) + TOSTRING(Request.order) +
TOSTRING(Request.symbol) + TOSTRING(Request.volume) + TOSTRING(Request.price) +
TOSTRING(Request.stoplimit) + TOSTRING(Request.sl) + TOSTRING(Request.tp) +
TOSTRING(Request.deviation) + TOSTRING2(Request.type) + TOSTRING2(Request.type_filling) +
TOSTRING2(Request.type_time) + TOSTRING(Request.expiration) + TOSTRING(Request.comment) +
TOSTRING(Request.position) + TOSTRING(Request.position_by));
}
string ToString( const MqlTradeResult &Result )
{
return(TOSTRING(Result.retcode) + TOSTRING(Result.deal) + TOSTRING(Result.order) +
TOSTRING(Result.volume) + TOSTRING(Result.price) + TOSTRING(Result.bid) +
TOSTRING(Result.ask) + TOSTRING(Result.comment) + TOSTRING(Result.request_id) +
TOSTRING(Result.retcode_external));
}
#undef TOSTRING
#undef TOSTRING2
Inserisci questa linea dove si verifica l'errore
Incollato. Ecco il risultato del tester:
2017.11.22 18:22:51.127 2016.11.09 12:00:00 exchange buy 1.00 RTS Splice at 98080 sl: 94130 (98070 / 98080 / 98070)
2017.11.22 18:22:51.127 2016.11.09 12:00:00 deal #4 buy 1.00 RTS Splice at 98080 done (based on order #4)
2017.11.22 18:22:51.127 2016.11.09 12:00:00 deal performed [#4 buy 1.00 RTS Splice at 98080]
2017.11.22 18:22:51.127 2016.11.09 12:00:00 ordine eseguito comprare 1,00 a 98080 [#4 comprare 1,00 RTS Splice a 98080]
2017.11.22 18:22:53.561 2016.11.09 14:05:00:00 failed modify #4 buy 1.00 RTS Splice sl: 94130, tp: 0 -> sl: 94316, tp: 0 [Stop non valido]
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Request.action = TRADE_ACTION_SLTP (6)
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Request.magic = 0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Request.order = 0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Request.symbol = RTS Splice
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Request.volume = 0.0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Request.price = 0.0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Request.stoplimit = 0.0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Richiesta.sl = 94316.0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Request.tp = 0.0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Request.deviation = 0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Request.type = ORDER_TYPE_BUY (0)
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Request.type_filling = ORDER_FILLING_FOK (0)
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Request.type_time = ORDER_TIME_GTC (0)
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Request.expiration = 1970.01.01 00:00:00
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Request.comment =
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Request.position = 4
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Request.position_by = 0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Risultato.retcode = 10016
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Risultato.deal = 0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Risultato.ordine = 0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Risultato.volume = 0.0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Risultato.prezzo = 0.0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Risultato.offerta = 0.0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Risultato.ask = 0.0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Result.comment = Invalid stops
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Result.request_id = 0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Risultato.retcode_external = 0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Allarme: errore di modifica della posizione da parte di TP e codice errore SL: 4756
Mettilo dentro. Ecco il risultato del tester:
Modalità server e tester?