![MQL5 - Linguaggio delle strategie di trading integrato nel client terminal MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Ti stai perdendo delle opportunità di trading:
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Registrazione
Accedi
Accetti la politica del sito e le condizioni d’uso
Se non hai un account, registrati
Recentemente ho sollevato un argomento sulla riapertura degli ordini. Pensavo di aver risolto il problema, dato che tutto funzionava molto bene per una settimana. Ma oggi ho riscontrato un problema simile solo all'apertura.
Si sono aperti molti ordini su Finam, e 9 su Otkritie...anche se solo un ordine avrebbe dovuto aprirsi in tutti i casi.
Ecco uno snippet di codice dall'EA
{
Coment="Open Sell "+string(OpenOrders+1);
ret=OpenSellPosition(_Symbol,volume,Coment,Sleeppage,Filling);
}
if(ret)
{
OpenOrders++;
PriceLastOpen=price;
}
bool OpenSellPosition(string symbol, double volume, string comment="", ulong deviation=10, ENUM_ORDER_TYPE_FILLING filling=ORDER_FILLING_FOK)
{
MqlTradeRequest Request;
MqlTradeResult Results;
ZeroMemory(Request);
ZeroMemory(Results);
Request.price=SymbolInfoDouble(_Symbol,SYMBOL_BID);
Request.action=TRADE_ACTION_DEAL;
Request.type=ORDER_TYPE_SELL;
Request.symbol=symbol;
Request.volume=volume;
Request.deviation=deviation;
Request.comment=comment;
Request.type_filling=filling;
bool res=false;
res=OrderSend(Request,Results);
if(res)
{
if(Results.deal>0) return(true);
else return(false);
}
return(false);
}
cioè possiamo vedere dal codice che se l'operazione ha successo, aumenta la variabileOpenOrders, che inizialmente è uguale a 0
Se è superiore a 0, non dovrebbe esserci un'ulteriore apertura dell'ordine, ma l'intera pila di ordini viene aperta con il commento Ordine1.
Controllo se c'è una risposta positiva nella funzione che apre l'ordine e se il biglietto d'ordine è stato ricevuto, ma per qualche motivo questa funzione restituisce falso, anche se l'ordine è effettivamente impostato.
Spiegare cosa c'è di sbagliato, come risolvere questo problema?
do
{
n++;
}
while(!PositionSelectByTicket(tradeResult.deal) && n < 5);
Ho anche notato che non c'è nessun controllo OrderCheck(Request, checkResult), il che è male.
Oh, e anche in ordine di mercato - prezzo = 0
Request.price=SymbolInfoDouble(_Symbol,SYMBOL_BID); lascia perdere
{
MqlTradeRequest request={0};
MqlTradeResult result={0};
order_ticket=0;
request.action = TRADE_ACTION_DEAL;
request.magic = 9876543211;
request.symbol = Symbol();
request.volume = 1;
request.price = 0;
request.type=ORDER_TYPE_BUY;
request.comment="Sync mode";
request.type_filling=ORDER_FILLING_FOK;
request.type_time=ORDER_TIME_DAY;
if(OrderSend(request,result))
{
if((result.retcode==TRADE_RETCODE_DONE) || (result.retcode==TRADE_RETCODE_PLACED))
{
if(result.order>0)
{
order_ticket=result.order;
Print(__FUNCTION__," Order sent in sync mode");
return(true);
}
else
{
Print(__FUNCTION__," Error order sent in sync mode! Retcode = ",result.retcode);
}
}
else
{
Print(__FUNCTION__," Error order sent in sync mode! Retcode = ",result.retcode);
}
}
else
{
Print(__FUNCTION__," Order not sent in sync mode.");
}
return(false);
}
const MqlTradeRequest &request,
const MqlTradeResult &result)
{
switch(trans.type)
{
case TRADE_TRANSACTION_HISTORY_ADD:
if((order_ticket > 0) && (trans.order == order_ticket))
{
//Вот здесь и смотрим что произошло
}
break;
}
}
Inoltre, è possibile controllare l'apertura della posizione provando a selezionarla. Ed è meglio provare più volte
do
{
n++;
}
while(!PositionSelectByTicket(tradeResult.deal) && n < 5);
Ho anche notato che non c'è nessun controllo OrderCheck(Request, checkResult), il che è male.
E se la posizione esistesse già?
O se c'è già una posizione ma l'ordine non viene riempito completamente?
Inoltre, si può controllare l'apertura della posizione provando a selezionarla. E diversi tentativi sono migliori.
do
{
n++;
}
while(!PositionSelectByTicket(tradeResult.deal) && n < 5);
Inoltre ho notato che non c'è nessun controllo OrderCheck(Request, checkResult) e questo è male.
Bene, forse inseriròOrderCheck(Request, checkResult)
Grazie
Ma non mi piace particolarmente un tale ciclo
Oh, e anche in ordine di mercato - prezzo = 0
Request.price=SymbolInfoDouble(_Symbol,SYMBOL_BID); lascia perdere
{
MqlTradeRequest request={0};
MqlTradeResult result={0};
order_ticket=0;
request.action = TRADE_ACTION_DEAL;
request.magic = 9876543211;
request.symbol = Symbol();
request.volume = 1;
request.price = 0;
request.type=ORDER_TYPE_BUY;
request.comment="Sync mode";
request.type_filling=ORDER_FILLING_FOK;
request.type_time=ORDER_TIME_DAY;
if(OrderSend(request,result))
{
if((result.retcode==TRADE_RETCODE_DONE) || (result.retcode==TRADE_RETCODE_PLACED))
{
if(result.order>0)
{
order_ticket=result.order;
Print(__FUNCTION__," Order sent in sync mode");
return(true);
}
else
{
Print(__FUNCTION__," Error order sent in sync mode! Retcode = ",result.retcode);
}
}
else
{
Print(__FUNCTION__," Error order sent in sync mode! Retcode = ",result.retcode);
}
}
else
{
Print(__FUNCTION__," Order not sent in sync mode.");
}
return(false);
}
const MqlTradeRequest &request,
const MqlTradeResult &result)
{
switch(trans.type)
{
case TRADE_TRANSACTION_HISTORY_ADD:
if((order_ticket > 0) && (trans.order == order_ticket))
{
//Вот здесь и смотрим что произошло
}
break;
}
}
E riguardo al prezzo.... sì, sono più abituato a MT4, e lì devi sempre mettere il prezzo...
Ripetere
Oltre a questo, si dovrebbe anche controllare lo stato dell'ordine e se è già apparso nella storia o no.
Lo scambio non funziona con le posizioni, solo con gli ordini.
Avresti ragione se dovessi mettere ordini pendenti, ma io lavoro per mercato, e qui il biglietto si ottiene conResults.deal
Non capisco cosa significa il tuo sorriso?
Non mi aspettavo di sentirti dire questo. Quali pause, o stai scherzando?
Cattiva eredità forex.
...
E se la posizione esistesse già?
O c'è già una posizione ma l'ordine non è stato riempito completamente?