{
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 levantei a questão da reabertura das ordens. Pensei que tinha resolvido o problema porque tudo estava funcionando muito bem durante uma semana. Mas hoje eu encontrei um problema semelhante apenas com a abertura.
Um número muito grande de pedidos abertos na Finam, e 9 na Otkritie... embora em todos os casos apenas um pedido deveria ter sido aberto.
Aqui está um trecho de código da 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);
}
ou seja, podemos ver pelo código que se a operação for bem sucedida, a variávelOpenOrders aumenta, o que inicialmente é igual a 0
Se for maior que 0, não deve haver mais abertura do pedido, mas toda a pilha de pedidos é aberta com o comentário Ordem1.
Eu verifico se há uma resposta positiva na função que abre o pedido e se o bilhete de pedido foi recebido, mas por alguma razão esta função retorna falsa, mesmo que o pedido esteja realmente definido.
Você pode explicar o que está errado e como resolver este problema?
Mau legado forex.
Você deve verificaros resultados.ordem.
Se o pedido for feito, isso não significa que o negócio já tenha sido feito.
Mau legado forex.
Temos que verificar isso.ordem.
Se um pedido é feito, isso não significa que uma negociação já tenha sido executada.
Presumo que as informações sobre o negócio ainda não tenham chegado. Aqui (destacado em vermelho) você está confiando na sorte. E ela é uma senhora caprichosa :-))
{
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 que as informações sobre o negócio ainda não tenham chegado. Aqui (destacado em vermelho) você está confiando na sorte. E ela é uma senhora caprichosa :-))
{
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);
}
Você precisa registrar todas as negociações. Por exemplo, assim:
primeiro no "cabeçalho" conectamos a classe de comércio CTrade
CTrade m_trade; // trading object
e aqui está um exemplo de operação de compra:
{
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());
para que você possa obter dois erros: primeiro nível - a operação não passou na verificação básica e segundo nível - verificação do bilhete do comércio.
Então, se houver um problema, você pode usar os registros para resolvê-lo.
Acrescentado: isto é verdade para o modo de operação SYNC.
Agora os gurus aqui também lhe ensinarão ))
Объясните что не так, как решить данную проблему?
Com sua experiência, é indecoroso fazer tais perguntas aqui.
Você precisa registrar todas as negociações. Por exemplo, assim:
primeiro no "cabeçalho" conectamos a classe de comércio CTrade
CTrade m_trade; // trading object
e aqui está um exemplo de operação de compra:
{
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());
para que você possa obter dois erros: primeiro nível - a operação não passou na verificação básica e segundo nível - verificação do bilhete do comércio.
Então, se houver um problema, você pode usar os registros para resolvê-lo.
Acrescentado: o acima descrito é verdadeiro para o modo de operação SYNC.
res=OrderSend(Request,Results);
if(res)
{
if(Results.deal>0) return(true);
else return(false);
}
return(false);
Você precisa registrar todas as negociações. Por exemplo, assim:
primeiro no "cabeçalho" conectamos a classe de comércio CTrade
CTrade m_trade; // trading object
e aqui está um exemplo de operação de compra:
{
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());
para que você possa obter dois erros: primeiro nível - a operação não passou na verificação básica e segundo nível - verificação do bilhete do comércio.
Então, se houver um problema, você pode usar os registros para resolvê-lo.
Acrescentado: isto é verdade para o modo de operação SYNC.
Foi exatamente isso que eu fiz.
res=OrderSend(Request,Results);
if(res)
{
if(Results.deal>0) return(true);
else return(false);
}
return(false);
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso
Recentemente levantei um tópico sobre a reabertura de pedidos. Pensei que tinha resolvido o problema, pois tudo estava funcionando muito bem durante uma semana. Mas hoje eu encontrei um problema semelhante somente ao abrir.
Muitos pedidos foram abertos na Finam, e 9 na Otkritie... embora apenas um pedido devesse ter sido aberto em todos os casos.
Aqui está um trecho de código da 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);
}
ou seja, podemos ver pelo código que se a operação for bem sucedida, a variávelOpenOrders aumenta, o que inicialmente é igual a 0
Se for maior que 0, não deve haver mais abertura do pedido, mas toda a pilha de pedidos é aberta com o comentário Ordem1.
Eu verifico se há uma resposta positiva na função que abre o pedido e se o bilhete de pedido foi recebido, mas por alguma razão esta função retorna falsa, mesmo que o pedido esteja realmente definido.
Explicar o que está errado, como resolver este problema?