{
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);
}
J'ai récemment soulevé la question de la réouverture des commandes. Je pensais avoir résolu le problème car tout a très bien fonctionné pendant une semaine. Mais aujourd'hui, j'ai rencontré un problème similaire uniquement à l'ouverture.
Un très grand nombre d'ordres ont été ouverts sur Finam, et 9 sur Otkritie... alors que dans tous les cas, un seul ordre aurait dû être ouvert.
Voici un extrait de code de l'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);
}
c'est-à-dire que nous pouvons voir dans le code que si l'opération est réussie, la variableOpenOrders augmente, qui est initialement égale à 0
S'il est supérieur à 0, il ne devrait pas y avoir d'ouverture supplémentaire de l'ordre, mais la pile entière d'ordres est ouverte avec le commentaire Ordre1.
Je vérifie s'il y a une réponse positive dans la fonction d'ouverture de la commande et si le ticket de commande a été reçu, mais pour une raison quelconque, cette fonction renvoie faux, même si la commande est effectivement établie.
Pouvez-vous expliquer ce qui ne va pas et comment résoudre ce problème ?
Mauvais héritage du forex.
Vous devriez vérifier lesrésultats.l'ordre.
Si la commande est passée, cela ne signifie pas que l'affaire est déjà conclue.
Mauvais héritage du forex.
Nous devons vérifier.l'ordre.
Si un ordre est passé, cela ne signifie pas qu'une transaction a déjà été exécutée.
Je suppose que l'information sur l'accord n'est pas encore arrivée. Ici (surligné en rouge), vous comptez sur la chance. Et c'est une dame capricieuse :-))
{
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);
}
Je suppose que l'information sur l'accord n'est pas encore arrivée. Ici (surligné en rouge), vous comptez sur la chance. Et c'est une dame capricieuse :-))
{
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);
}
Vous devez enregistrer toutes les transactions. Par exemple, comme ceci :
Tout d'abord, dans l'en-tête, nous connectons la classe de commerce CTrade.
CTrade m_trade; // trading object
et voici un exemple de l'opération 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());
vous pouvez donc obtenir deux erreurs : premier niveau - l'opération n'a pas passé le contrôle de base et deuxième niveau - contrôle du ticket de l'opération.
Ensuite, s'il y a un problème, vous pouvez utiliser les journaux pour le résoudre.
Ajouté : ce qui précède est vrai pour le mode de fonctionnement SYNC.
Maintenant, les gourous d'ici vont vous apprendre aussi ;))
Объясните что не так, как решить данную проблему?
Avec votre expérience, il est inconvenant de poser de telles questions ici.
Vous devez enregistrer toutes les transactions. Par exemple, comme ceci :
Tout d'abord, dans l'en-tête, nous connectons la classe de commerce CTrade.
CTrade m_trade; // trading object
et voici un exemple de l'opération 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());
vous pouvez donc obtenir deux erreurs : premier niveau - l'opération n'a pas passé le contrôle de base et deuxième niveau - contrôle du ticket de l'opération.
Ensuite, s'il y a un problème, vous pouvez utiliser les journaux pour le résoudre.
Ajouté : ce qui précède est vrai pour le mode de fonctionnement SYNC.
res=OrderSend(Request,Results);
if(res)
{
if(Results.deal>0) return(true);
else return(false);
}
return(false);
Vous devez enregistrer toutes les transactions. Par exemple, comme ceci :
Tout d'abord, dans l'en-tête, nous connectons la classe de commerce CTrade.
CTrade m_trade; // trading object
et voici un exemple de l'opération 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());
vous pouvez donc obtenir deux erreurs : premier niveau - l'opération n'a pas passé le contrôle de base et deuxième niveau - contrôle du ticket de l'opération.
Ensuite, s'il y a un problème, vous pouvez utiliser les journaux pour le résoudre.
Ajouté : ceci est vrai pour le mode de fonctionnement SYNC.
C'est exactement ce que j'ai fait.
res=OrderSend(Request,Results);
if(res)
{
if(Results.deal>0) return(true);
else return(false);
}
return(false);
- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Vous acceptez la politique du site Web et les conditions d'utilisation
J'ai récemment soulevé un sujet sur la réouverture des commandes. Je pensais avoir résolu le problème, car tout a fonctionné sans problème pendant une semaine. Mais aujourd'hui, j'ai rencontré un problème similaire uniquement à l'ouverture.
Beaucoup d'ordres ont été ouverts sur Finam, et 9 sur Otkritie... alors qu'un seul ordre aurait dû être ouvert dans tous les cas.
Voici un extrait de code de l'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);
}
c'est-à-dire que nous pouvons voir dans le code que si l'opération est réussie, la variableOpenOrders augmente, qui est initialement égale à 0
S'il est supérieur à 0, il ne devrait pas y avoir d'ouverture supplémentaire de l'ordre, mais la pile entière d'ordres est ouverte avec le commentaire Ordre1.
Je vérifie s'il y a une réponse positive dans la fonction d'ouverture de la commande et si le ticket de commande a été reçu, mais pour une raison quelconque, cette fonction renvoie faux, même si la commande est effectivement établie.
Expliquez ce qui ne va pas, comment résoudre ce problème ?