Vous manquez des opportunités de trading :
- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Inscription
Se connecter
Vous acceptez la politique du site Web et les conditions d'utilisation
Si vous n'avez pas de compte, veuillez vous inscrire
C'est très incorrect...
OrderSelect(BuyTicket || SellTicket, SELECT_BY_TICKET);
(BuyTicket || SellTicket) donnera comme résultat true ou false ... et dans ce cas, true ou false sera considéré comme un 1 ou un 0 ... et non pas comme un numéro de SellTicket ou de Buyticket ...
Stoploss = 40 . . . . lorsque vous utilisez un stoploss dans OrderSend, il s'agit d'un prix . . . et non d'un nombre de pips, le slippage est un nombre de pips . . . lisez la documentation : OrderSend
Je comprends ce que vous voulez dire, j'ai donc besoin d'une commande pour sélectionner l'ordre en utilisant OrderSelect... ou est-ce que OrderSelect dans ce cas est généralement erroné ?
Lisez la docs . . . OrderSelect est nécessaire pour sélectionner l'ordre avant de pouvoir utiliser les fonctions OrderLots, OrderTicket, OrderOpenPrice, etc, etc "Note : The order must be previously selected by the OrderSelect() function ".
Si vous n'avez pas besoin d'utiliser une information relative à un ordre existant, vous n'avez pas besoin d'OrderSelect. Si vous en avez besoin... eh bien vous en avez besoin.
Lisez la docs . . . OrderSelect est nécessaire pour sélectionner l'ordre avant de pouvoir utiliser les fonctions OrderLots, OrderTicket, OrderOpenPrice, etc, etc "Note : The order must be previously selected by the OrderSelect() function ".
Si vous n'avez pas besoin d'utiliser une information relative à un ordre existant, vous n'avez pas besoin de la fonction OrderSelect, mais si vous en avez besoin... alors vous en avez besoin.
Actuellement, je pense que j'aurais besoin de cette information, car s'il y a une position sur le marché, je dois la fermer et la remplacer par une autre. Je pensais que OrderSelect m'aiderait de cette façon. Mais si Orderselect ne concerne que les ordres ouverts et non la position active sur le marché, il n'est pas utile. Ai-je raison ?
Mais si OrderSelect ne m'aide pas, comment puis-je fermer les positions actives ?
salutations
Marc
nirvanamac:
Cela semble être en grande partie correct, mais je dois maintenant savoir pourquoi le programme n'exécute que l'ordre de vente @ 12 & 23... et pas les ordres d'achat... ?
C'est probablement le cas... et cela génère probablement une erreur que vous n'avez pas détectée....
Essayez...
Votre OrderClose est faux... vous ouvrez un Buy at Ask, pour fermer un Buy you Sell... vous Sell at Bid, vous ouvrez un Sell at Bid pour fermer un Sell you Buy... vous Buy at Ask.
Votre OrderClose est erroné... vous ouvrez un Buy at Ask, pour fermer un Buy vous Sell... vous Sell at Bid, vous ouvrez un Sell at Bid pour fermer un Sell vous Buy... vous Buy at Ask.
Merci beaucoup de m'avoir aidé... J'ai modifié le code avec vos conseils. Cela ressemble à ceci :
//+------------------------------------------------------------------+
//| Der Stundentrader.mq4 |
//| Der Marc |
//| Es gibt gar keine Internetseite |
//+------------------------------------------------------------------+
#property copyright "Der Marc"
#property link "Es gibt gar keine Internetseite"
//Wichtige Variablen
extern double Minlot=0.01 ;
extern int Digits2Round=2 ;
extern int PercentOfFreeDepo=1 ;
extern int Slippage=5 ;
extern int MagicNumber =1 ;
extern int TradeHour3=3 ;
extern int TradeHour4=4 ;
extern int TradeHour7=7 ;
extern int TradeHour10=10 ;
extern int TradeHour17=17 ;
extern int TradeHour18=18 ;
extern int TradeHour20=20 ;
extern int TradeHour12=12 ;
extern int TradeHour23=23 ;
extern int StopLoss=400 ;
//Variables globales
int BuyTicket ;
int SellTicket ;
double UsePoint ;
int UseSlippage ;
int openbuy = 0 ;
int opensell = 0 ;
//+------------------------------------------------------------------+
//| fonction d'initialisation de l'expert |
//+------------------------------------------------------------------+
int init()
{
UsePoint = PipPoint(Symbol()) ;
UseSlippage = GetSlippage(Symbol(), Slippage) ;
}
//+------------------------------------------------------------------+
//| fonction de démarrage expert |
//+------------------------------------------------------------------+
int start()
{
double FreeDepo=NormalizeDouble(AccountBalance()-AccountMargin(),Digits2Round) ;
double Risk=NormalizeDouble((FreeDepo*PercentOfFreeDepo/100),Digits2Round) ;
double Lot=NormalizeDouble(Risk/(StopLoss/0.0001)*0.1,Digits2Round) ;
//===================== Permet de déterminer la taille du lot et le risque ===================================
si ( Lot<Minlot )
{
Lot=Minlot ;
}
Comment( "\n", "Le risque acceptable est ",PercentOfFreeDepo,"% = ",Risk," of the free money ",FreeDepo," in lots = ",Lot) ;
for(int i = OrdersTotal() - 1 ; i >= 0 ; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if((OrderOpenTime()+3600) < TimeCurrent())
{
if (OrderType() == OP_BUY || OP_SELL)
{
bool Closed = OrderClose(OrderTicket(),OrderLots(), OrderClosePrice(), UseSlippage, Red) ;
openbuy = 0 ;
opensell = 0 ;
}
if (OrderType() == OP_SELL)
{
Closed = OrderClose(OrderTicket(),OrderLots(), OrderClosePrice(), UseSlippage, Red) ;
opensell = 0 ;
openbuy = 0 ;
}
}
}
}
//BuyOrder
if ((TradeHour3==Hour())||(TradeHour4==Hour())||(TradeHour7==Hour())||(TradeHour10==Hour())||(TradeHour17==Hour())||(TradeHour18==Hour())||(TradeHour20==Hour()) && openbuy == 0) //Signal Achat
{
openbuy=OrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage,Ask - StopLoss * Point,0, "time trader buy order ",MagicNumber,0,Blue) ;
if (openbuy < 0) Print("OrderSend OP_BUY failed, error : ", GetLastError() ) ;
}
//SellOrder
if ((TradeHour12==Hour())||(TradeHour23==Hour())&& opensell == 0) //Signal Sell
{
opensell=OrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,Bid + StopLoss * Point,0, "time trader sell order ",MagicNumber,0,Green) ;
if (opensell < 0) Print("OrderSend OP_SELL failed, error : ", GetLastError() ) ;
}
//----
return(0) ;
}
//+------------------------------------------------------------------+
//Fonction PipPoint
double PipPoint (string Currency)
{
int CalcDigits = MarketInfo(Currency, MODE_DIGITS) ;
if(CalcDigits == 2 || CalcDigits == 3) double CalcPoint = 0.01 ;
else if(CalcDigits == 4 || CalcDigits == 5) CalcPoint = 0.0001 ;
retour (CalcPoint) ;
}
//Fonction d'obtention du glissement
int GetSlippage(string Currency, int SlippagePips)
{
int CalcDigits = MarketInfo(Currency, MODE_DIGITS) ;
if(CalcDigits == 2 || CalcDigits == 4) double CalcSlippage = SlippagePips ;
else if(CalcDigits == 3 || CalcDigits == 5) CalcSlippage = SlippagePips * 10 ;
retourne (CalcSlippage) ;
}
Pendant l'exécution du backtest, il y a un message d'erreur ERR_INVALID_TICKET (4108).
Tous les ordres n'ont pas été exécutés
Se pourrait-il que l'erreur provienne du fait que le SL a été déclenché avant ?