{
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);
}
Recentemente ho sollevato la questione della riapertura degli ordini. Pensavo di aver risolto il problema perché tutto funzionava molto bene per una settimana. Ma oggi ho riscontrato un problema simile solo con l'apertura.
Un numero molto elevato di ordini si è aperto su Finam, e 9 su Otkritie... anche se in tutti i casi si sarebbe dovuto aprire un solo ordine.
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.
Puoi spiegare cosa c'è di sbagliato e come risolvere questo problema?
Cattiva eredità forex.
Dovresti controllare irisultati.ordine.
Se l'ordine viene effettuato, non significa che l'affare sia già stato fatto.
Cattiva eredità forex.
Dobbiamo controllare.ordine.
Se viene piazzato un ordine, non significa che un'operazione sia già stata eseguita.
Presumo che l'informazione sull'accordo non sia ancora arrivata. Qui (evidenziato in rosso) ci si affida alla fortuna. Ed è una signora capricciosa :-))
{
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);
}
Presumo che l'informazione sull'accordo non sia ancora arrivata. Qui (evidenziato in rosso) ci si affida alla fortuna. Ed è una signora capricciosa :-))
{
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);
}
È necessario registrare tutte le transazioni. Per esempio, così:
prima nella "testata" colleghiamo la classe CTrade trade
CTrade m_trade; // trading object
e qui c'è un esempio di operazione Buy:
{
if(m_trade.ResultDeal()==0)
Print("Buy -> false. Result Retcode: ",m_trade.ResultRetcode(),
", description of result: ",m_trade.ResultRetcodeDescription());
else
Print("Buy -> true. Result Retcode: ",m_trade.ResultRetcode(),
", description of result: ",m_trade.ResultRetcodeDescription());
}
else
Print("Buy -> false. Result Retcode: ",m_trade.ResultRetcode(),
", description of result: ",m_trade.ResultRetcodeDescription());
quindi si possono ottenere due errori: primo livello - l'operazione non ha superato il controllo di base e secondo livello - controllo del biglietto di scambio.
Poi, se c'è un problema, puoi usare i log per capirlo.
Aggiunto: quanto sopra è vero per il modo di funzionamento SYNC.
Ora i guru qui insegneranno anche a te ))
Объясните что не так, как решить данную проблему?
Con la tua esperienza, è sconveniente fare queste domande qui.
È necessario registrare tutte le transazioni. Per esempio, così:
prima nell'"intestazione" colleghiamo la classe CTrade trade
CTrade m_trade; // trading object
ed ecco un esempio di operazione Buy:
{
if(m_trade.ResultDeal()==0)
Print("Buy -> false. Result Retcode: ",m_trade.ResultRetcode(),
", description of result: ",m_trade.ResultRetcodeDescription());
else
Print("Buy -> true. Result Retcode: ",m_trade.ResultRetcode(),
", description of result: ",m_trade.ResultRetcodeDescription());
}
else
Print("Buy -> false. Result Retcode: ",m_trade.ResultRetcode(),
", description of result: ",m_trade.ResultRetcodeDescription());
quindi si possono ottenere due errori: primo livello - l'operazione non ha superato il controllo di base e secondo livello - controllo del biglietto di scambio.
Poi, se c'è un problema, puoi usare i log per capirlo.
Aggiunto: quanto sopra è vero per il modo di funzionamento SYNC.
res=OrderSend(Request,Results);
if(res)
{
if(Results.deal>0) return(true);
else return(false);
}
return(false);
È necessario registrare tutte le transazioni. Per esempio, così:
prima nella "testata" colleghiamo la classe CTrade trade
CTrade m_trade; // trading object
e qui c'è un esempio di operazione Buy:
{
if(m_trade.ResultDeal()==0)
Print("Buy -> false. Result Retcode: ",m_trade.ResultRetcode(),
", description of result: ",m_trade.ResultRetcodeDescription());
else
Print("Buy -> true. Result Retcode: ",m_trade.ResultRetcode(),
", description of result: ",m_trade.ResultRetcodeDescription());
}
else
Print("Buy -> false. Result Retcode: ",m_trade.ResultRetcode(),
", description of result: ",m_trade.ResultRetcodeDescription());
in modo da ottenere due errori: primo livello - l'operazione non ha superato il controllo di base e secondo livello - controllo del biglietto di scambio.
Poi, se c'è un problema, puoi usare i log per capirlo.
Aggiunto: quanto sopra è vero per il modo di funzionamento SYNC.
È esattamente quello che ho fatto.
res=OrderSend(Request,Results);
if(res)
{
if(Results.deal>0) return(true);
else return(false);
}
return(false);

- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Accetti la politica del sito e le condizioni d’uso
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?