erreur 4756

 

mon ea fait une erreur 4756

pouvez vous m'aider merci

 //+------------------------------------------------------------------+
//|                                                    ErlyBird6.mq5 |
//|                        Copyright 2012, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2012, MetaQuotes Software Corp."
#property link       "http://www.mql5.com"
#property version   "1.00"

string name, oldnameHTop,oldnameHBottom,oldnameVstart,oldnameVstop;

input int       MA_Period= 8 ;       // Moving Average Period
input int       StopLoss= 100 ;       // Stop Loss
input int       TakeProfit= 100 ;   // Take Profit
input int       Trigger= 5 ;
input double    Lot= 1 ;
input int       EA_Magic= 12345 ;   // EA Magic Number


int maHandle;   // handle for our Moving Average indicator
int     Sommerzeit     =   87 ;   // DayOfYear Beginn Sommerzeit
int     Winterzeit     =   297 ;   // DayOfYear Beginn Winterzeit
int   TimeSelect;
int STP, TKP;   // To be used for Stop Loss & Take Profit values


double maVal[]; // Dynamic array to hold the values of Moving Average for each bars
double hg[],lw[],p_close;
double High[],  Low[];
double Top,Bottom;

   MqlRates rates[];
   MqlDateTime Time;

 MqlTick latest_price;     // To be used for getting recent/latest price quotes
 MqlTradeRequest mrequest;   // To be used for sending our trade requests
 MqlTradeResult mresult;     // To be used to get our trade results
     // Initialization of mrequest structure
  

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+


int OnInit ()
  {


//--- Get the handle for Moving Average indicator
   maHandle= iMA ( _Symbol , _Period ,MA_Period, 0 , MODE_EMA , PRICE_CLOSE );
//--- What if handle returns Invalid Handle
   if ( maHandle< 0 )
     {
       Alert ( "Error Creating Handles for indicators - error: " , GetLastError (), "!!" );
       return (- 1 );
     }



//--- Let us handle currency pairs with 5 or 3 digit prices instead of 4
   STP = StopLoss;
   TKP = TakeProfit;
   if ( _Digits == 5 || _Digits == 3 )
     {
      STP = STP* 10 ;
      TKP = TKP* 10 ;
     }
   

   return ( 0 );
  }

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//--- destroy timer
   EventKillTimer ();
      
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
   // Do we have enough bars to work with
   if ( Bars ( _Symbol , _Period )< 60 ) // if total bars is less than 60 bars
     {
       Alert ( "We have less than 60 bars, EA will now exit!!" );
       return ;
     }  

// We will use the static Old_Time variable to serve the bar time.
// At each OnTick execution we will check the current bar time with the saved one.
// If the bar time isn't equal to the saved time, it indicates that we have a new tick.

   static datetime Old_Time;
   datetime New_Time[ 1 ];
   bool IsNewBar= false ;

// copying the last bar time to the element New_Time[0]
   int copied= CopyTime ( _Symbol , _Period , 0 , 1 ,New_Time);
   if (copied> 0 ) // ok, the data has been copied successfully
     {
       if (Old_Time!=New_Time[ 0 ]) // if old time isn't equal to new bar time
        {
         IsNewBar= true ;   // if it isn't a first call, the new bar has appeared
         if ( MQL5InfoInteger ( MQL5_DEBUGGING )) Print ( "We have new bar here " ,New_Time[ 0 ], " old time was " ,Old_Time);
         Old_Time=New_Time[ 0 ];             // saving bar time
        }
     }
   else
     {
       Alert ( "Error in copying historical times data, error =" , GetLastError ());
       ResetLastError ();
       return ;
     }

//--- EA should only check for new trade if we have a new bar
   if (IsNewBar== false )
     {
       return ;
     }
 
//--- Do we have enough bars to work with
   int Mybars= Bars ( _Symbol , _Period );
   if (Mybars< 60 ) // if total bars is less than 60 bars
     {
       Alert ( "We have less than 60 bars, EA will now exit!!" );
       return ;
     } 
  
     ArraySetAsSeries (rates, true );
     copied= CopyRates ( _Symbol , 0 , 0 , 60 ,rates);
   
     TimeToStruct (rates[ 0 ].time, Time);
     if (  Time.day_of_year>=Sommerzeit &&   Time.day_of_year<=Winterzeit) TimeSelect= 11 ; else TimeSelect= 10 ;  
     
     if (  Time.hour==TimeSelect &&  Time.min== 0 )   //draw vertical line at TimeSelect
          {
             ObjectDelete ( 0 ,oldnameVstart);  
            name = "VerticalStart" + TimeToString (rates[ 0 ].time, TIME_DATE|TIME_SECONDS);
             ObjectCreate ( 0 ,name, OBJ_VLINE , 0 ,rates[ 0 ].time, 0 ); 
             ObjectSetInteger ( 0 ,name, OBJPROP_COLOR , clrRed );
            oldnameVstart= name;       
          }
      
    
         if (  Time.hour==TimeSelect+ 5 &&  Time.min== 0 )   //draw vertical line at TimeSelect+5
           {
            
             ObjectDelete ( 0 ,oldnameVstop);      
            name = "VerticalEnd" + TimeToString (rates[ 0 ].time, TIME_DATE|TIME_SECONDS);
             ObjectCreate ( 0 , name, OBJ_VLINE , 0 ,rates[ 0 ].time, 0 );
             ObjectSetInteger ( 0 , name, OBJPROP_COLOR , clrDarkViolet );
            oldnameVstop= name;   
            
             ArraySetAsSeries (hg, true );
             ArraySetAsSeries (lw, true );
           
             CopyHigh ( _Symbol , _Period , TimeCurrent (), 5 ,hg);
             CopyLow ( _Symbol , _Period , TimeCurrent (), 5 ,lw);
       
             
             Top = NormalizeDouble (rates[ ArrayMaximum (hg, 0 , WHOLE_ARRAY )].high, _Digits );  
             Bottom = NormalizeDouble (rates[ ArrayMinimum (lw, 0 , WHOLE_ARRAY )].low, _Digits );
          
           
             // draw horizontal line at the top of  5 last  candles 
             ObjectDelete ( 0 , oldnameHTop);
            name = "HorizontalTop" + TimeToString (rates[ 0 ].time, TIME_DATE|TIME_SECONDS);
        
             ObjectCreate ( 0 ,name, OBJ_HLINE , 0 ,rates[ 0 ].time,Top);
             ObjectSetInteger ( 0 ,name , OBJPROP_COLOR , clrGreenYellow );
            oldnameHTop= name;
         
         
             // draw horizontal line at the bottom of  5 last  candles 
             ObjectDelete ( 0 ,oldnameHBottom);
            name = "HorizontalBottom" + TimeToString (rates[ 0 ].time, TIME_DATE|TIME_SECONDS);
        
             ObjectCreate ( 0 ,name, OBJ_HLINE , 0 ,rates[ 0 ].time,Bottom);
             ObjectSetInteger ( 0 ,name , OBJPROP_COLOR , clrCrimson );
            oldnameHBottom= name;
 
     ZeroMemory (mrequest);       
         
 // the MA-8 values arrays
   ArraySetAsSeries (maVal, true );
 
   if ( CopyBuffer (maHandle, 0 , 0 , 3 ,maVal)< 0 )
     {
       Alert ( "Error copying Moving Average indicator buffer - error:" , GetLastError ());
       ResetLastError ();
       return ;
     }
 
 
 
 //--- Get the last price quote using the MQL5 MqlTick Structure
   if (! SymbolInfoTick ( _Symbol ,latest_price))
     {
       Alert ( "Error getting the latest price quote - error:" , GetLastError (), "!!" );
       return ;
     }
 
 
/**********************************           BUY POSITION    ************************************************/             
 
   //--- Declare bool type variables to hold our Buy Conditions
   // bool Buy_Condition_1=(rates[0].close > Top);  
     //bool Buy_Condition_1=(latest_price.ask >Top);
    
    
         // any opened Buy position?
         if (isTrade_BUY())
           {
             Alert ( "We already have a Buy Position!!!" );
             return ;     // Don't open a new Buy Position
           }
         ZeroMemory (mrequest);
         ZeroMemory (mresult); 
         mrequest.action = TRADE_ACTION_PENDING ;   // immediate order execution
         mrequest.price = NormalizeDouble (Top+Trigger* _Point , _Digits );           // latest ask price
         mrequest.sl = NormalizeDouble (latest_price.ask - STP* _Point , _Digits ); // Stop Loss
         mrequest.tp = NormalizeDouble (latest_price.ask + TKP* _Point , _Digits ); // Take Profit
       //  mrequest.sl = 0;
       //  mrequest.tp =0;
         mrequest.symbol = _Symbol ;                                             // currency pair
         mrequest.volume = Lot;                                                 // number of lots to trade
         mrequest.magic = EA_Magic;                                             // Order Magic Number
         mrequest.type = ORDER_TYPE_BUY_STOP ;                                   // Buy Order
         mrequest.type_filling = ORDER_FILLING_RETURN ;                             // Order execution type
         mrequest.deviation= 100 ;                                                 // Deviation from current price
         //--- send order
         OrderSend (mrequest,mresult);
       // get the result code
         if (mresult.retcode== 10009 || mresult.retcode== 10008 ) //Request is completed or order placed
           {
             Alert ( "A Buy order has been successfully placed with Ticket#:" ,mresult.order, "!!" );
           }
         else
           {
             Alert ( "The Buy order request could not be completed -error:" , GetLastError ());
             ResetLastError ();           
             return ;
           }
   
      
 /**********************************          SELL POSITION    ************************************************/             
         if (isTrade_SELL())
           {
             Alert ( "We already have a Sell position!!!" );
             return ;     // Don't open a new Sell Position
           }
         ZeroMemory (mrequest);
         ZeroMemory (mresult); 
         mrequest.action= TRADE_ACTION_PENDING ;                               // immediate order execution
         mrequest.price = NormalizeDouble (Bottom-Trigger* _Point , _Digits );             // latest Bid price
         mrequest.sl = NormalizeDouble (latest_price.bid + STP* _Point , _Digits ); // Stop Loss
         mrequest.tp = NormalizeDouble (latest_price.bid - TKP* _Point , _Digits ); // Take Profit
         mrequest.symbol = _Symbol ;                                           // currency pair
         mrequest.volume = Lot;                                               // number of lots to trade
         mrequest.magic = EA_Magic;                                           // Order Magic Number
         mrequest.type= ORDER_TYPE_SELL_STOP ;                                     // Sell Order
         mrequest.type_filling = ORDER_FILLING_RETURN ;                           // Order execution type
         mrequest.deviation= 100 ;                                             // Deviation from current price
         //--- send order
         OrderSend (mrequest,mresult);
         // get the result code
         if (mresult.retcode== 10009 || mresult.retcode== 10008 ) //Request is completed or order placed
           {
             Alert ( "A Sell order has been successfully placed with Ticket#:" ,mresult.order, "!!" );
           }
         else
           {
             Alert ( "The Sell order request could not be completed -error:" , GetLastError ());
             ResetLastError ();
             return ;
           }
          
          
           }

  DeleteAllOrdersPending();
   
    }
   
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer ()
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Trade function                                                   |
//+------------------------------------------------------------------+
void OnTrade ()
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Tester function                                                  |
//+------------------------------------------------------------------+
double OnTester()
  {
//---
   double ret= 0.0 ;
//---

//---
   return (ret);
  }
//+------------------------------------------------------------------+
bool isTrade_BUY()
  {
   if ( PositionSelect ( _Symbol )== true && PositionGetInteger ( POSITION_TYPE )== POSITION_TYPE_BUY ) // we have an opened position
       {
         return ( true );
        }
  
    
   else 
     {
     return ( false );
     }
  
  }
/////////////////////////////////////////////////////////////////////////////////////


bool isTrade_SELL()
  {
   if ( PositionSelect ( _Symbol )== true && PositionGetInteger ( POSITION_TYPE )== POSITION_TYPE_SELL ) // we have an opened position
       {
         return ( true );
        }
  
    
   else 
     {
     return ( false );
     }
  
  }
  
////////////////////////////////////////////////////////////////////////////////////// 
 void DeleteAllOrdersPending()
   {
    
     if (isTrade_SELL()||isTrade_BUY())
     {  
    
     int i;
   // in this loop we're checking all pending orders
       for (i= 0 ;i< OrdersTotal ();i++)
         {
         // choosing each order and getting its ticket
         ulong ticket= OrderGetTicket (i);
           // processing orders with "our" symbols only
           if ( OrderGetString ( ORDER_SYMBOL )== Symbol ())
             {
             // processing Buy Stop orders
             if ( OrderGetInteger ( ORDER_TYPE )== ORDER_TYPE_BUY_STOP )
                {
                 mrequest.action= TRADE_ACTION_REMOVE ;
                 // putting the ticket number to the structure
                 mrequest.order=ticket;
                 // sending request to trade server
                 OrderSend (mrequest,mresult);
                }
        
         // processing Sell Stop orders
             if ( OrderGetInteger ( ORDER_TYPE )== ORDER_TYPE_SELL_STOP )
               {
               // we will delete this pending order
               mrequest.action= TRADE_ACTION_REMOVE ;
               // putting the ticket number to the structure
               mrequest.order=ticket;
               // sending request to trade server
               OrderSend (mrequest,mresult);
                    
               }
           } 
       } //boucle for
      } //if
    }    
 
dan5:

mon ea fait une erreur 4756

pouvez-vous m'aider, merci

2013.03.10 11:19:18 2012.01.04 15:00:00 failed buy stop 1.00 EURUSD at 1.30505 sl : 1.28375 tp : 1.30375 [Invalid stops]
Documentation on MQL5: Standard Constants, Enumerations and Structures / Trade Constants / Order Properties
Documentation on MQL5: Standard Constants, Enumerations and Structures / Trade Constants / Order Properties
  • www.mql5.com
Standard Constants, Enumerations and Structures / Trade Constants / Order Properties - Documentation on MQL5
 

CopyHigh(_Symbol,_Period,TimeCurrent(),5,hg);

Top = NormalizeDouble(rates[ArrayMaximum(hg,0,WHOLE_ARRAY)].high,_Digits); 

- conceptionmal comprise .
Choisissez parmi les valeurs du double maximum et utilisez-le à la place de l'indice entier.

 
dan5:

mon ea fait une erreur 4756

Pouvez-vous m'aider, merci

L'erreur 4756 est "Trade request sending failed". Si vous avez une erreur lors de l'envoi de l'ordre, vérifiez le code de retour de MqlTradeResult.

         //--- send order
         OrderSend(mrequest,mresult);
         // get the result code
         if(mresult.retcode==10009 || mresult.retcode==10008) //Request is completed or order placed
           {
            Alert("An order has been successfully placed with Ticket#:",mresult.order,"!!");
           }
         else
           {
            Alert("The order request could not be completed -error:",GetLastError()," with trade return code ",mresult.retcode);
            ResetLastError();
            return;
           }

SelonKonstantin83ci-dessus, vous avez une erreur d'arrêt invalide, ce qui signifie que vous devez placer un ordre en attente en dehors deSymbolInfoIntegerSYMBOL_TRADE_STOPS_LEVEL etSYMBOL_TRADE_FREEZE_LEVEL.

 
phi.nuts:

L'erreur 4756 est "Trade request sending failed". Si vous avez une erreur lors de l'envoi de l'ordre, vérifiez le code de retour de MqlTradeResult.

SelonKonstantin83ci-dessus, vous avez une erreur d'arrêt invalide, ce qui signifie que vous devez placer l'ordre en attente en dehors deSymbolInfoIntegerSYMBOL_TRADE_STOPS_LEVEL etSYMBOL_TRADE_FREEZE_LEVEL.

Les arrêts non valides sont-ils également renvoyés pour un courtier de type ECN ?
 
RaptorUK:
Les arrêts invalides sont-ils également renvoyés pour un courtier de type ECN ?
Bien sûr, vous savez que la réponse est non. Mais pourquoi demander cela ?
 
phi.nuts:
Bien sûr, vous savez que la réponse est non. Mais pourquoi demander cela ?
Pourquoi supposez-vous que je sais que la réponse est non ? Des stops invalides(erreur 130) sont renvoyés sur mql4 lorsque le SL ou le TP sont envoyés avec OrderSend() à un courtier ECN, donc je demandais si la même chose est vraie avec mql5. Quelle erreur est renvoyée ?
Documentation on MQL5: Standard Constants, Enumerations and Structures / Codes of Errors and Warnings / Compilation Errors
Documentation on MQL5: Standard Constants, Enumerations and Structures / Codes of Errors and Warnings / Compilation Errors
  • www.mql5.com
Standard Constants, Enumerations and Structures / Codes of Errors and Warnings / Compilation Errors - Documentation on MQL5
 
RaptorUK:
Pourquoi supposez-vous que je sais que la réponse est non ? Des arrêts invalides(erreur 130) sont retournés sur mql4 lorsque le SL ou le TP sont envoyés avec OrderSend() à un courtier ECN, donc je demandais si la même chose est vraie avec mql5. Quelle erreur est retournée ?
Vraiment ? c'est intéressant. Je dois le vérifier plus tard ;D.
 
phi.nuts:
Vraiment ? C'est intéressant. Je dois le vérifier plus tard ;D.
J'ai enquêté un peu en essayant de trouver mon chemin avec mql5. Si le comportement du testeur de stratégie est similaire à ce qui serait retourné par un courtier, alors il semble que SL & TP sont ignorés lorsqu'ils sont envoyés pour un symbole dontENUM_SYMBOL_TRADE_EXECUTION est l'exécution d'échange ou l'exécution de marché et aucune erreur n'est retournée. Donc les choses sont assez différentes par rapport à mql4.
 
RaptorUK:
J'ai enquêté un peu en essayant de trouver mon chemin avec mql5. Si le comportement du testeur de stratégie est similaire à ce qui serait renvoyé par un courtier, il semble que le SL et le TP soient ignorés lorsqu'ils sont envoyés pour un symbole dontENUM_SYMBOL_TRADE_EXECUTION estexécution en bourse ouexécution sur le marché et qu'aucune erreur ne soit renvoyée. Les choses sont donc assez différentes par rapport à mql4.

J'ai trouvé quelque chose d'autre concernant les Stops invalides. J'ai un EA simple qui place une transaction avec SL & TP à moins que le Symbole soit une exécution de Bourse ou de Marché, alors il envoie la transaction avec SL & TP non défini et envoie ensuite une seconde requête à (TRADE_ACTION_SLTP) pour définir le SL & TP.

Cela fonctionne bien dans le testeur de stratégie, alors aujourd'hui je l'ai essayé sur un compte de démonstration et je n'ai cessé d'obtenir des Stops invalides (erreur 10016). J'ai donc vérifié le niveau des Stops et le niveau de gel, ils sont tous deux à 0, j'ai essayé différents niveaux de SL & TP, rien n'a fonctionné. Je pouvais définir manuellement les mêmes SL & TP pour une position existante sans aucun problème... alors j'ai ajouté un test pour ne placer les SL & TP que si la position pouvait être sélectionnée... et plus de Stops Invalides, plus de demande de transaction TRADE_ACTION_SLTP non plus :-(

J'ai donc ajouté ce code entre l'exécution de la demande de transaction initiale envoyée sans TP ni SL et la demande de transaction suivante qui envoie le TP et le SL . .

         SelectRetryCount = 1;
         if(SetTPandSL)
            {
            while(!PositionSelect(_Symbol) && SelectRetryCount < 10)
               {
               Sleep(SelectRetryCount * 100); // sleep for SelectRetryCount * 100 mS
               SelectRetryCount++;
               }
            }

SetTPandSL est mis à vrai si la demande de transaction initiale est réussie, il n'y a pas de raison d'essayer de définir un TP & SL si ce n'est pas le cas. La position est sélectionnée et si elle échoue, un sommeil de 100 mS se produit, puis la sélection est réessayée, si elle échoue, un sommeil de 200 mS se produit, etc. jusqu'à 9 tentatives (4,5 secondes au total).

Je ne sais pas encore vraiment ce que je fais avec mql5, je ne fais que bidouiller pour essayer de faire fonctionner quelques trucs et j'espère apprendre au fur et à mesure... Est-ce que ce que j'ai trouvé ici est un comportement normal ? J'aurais pensé qu'une fois que la demande initiale de transaction aurait retourné 10009 - TRADE_RETCODE_DONE, je pourrais envoyer la demande de réglage du TP et du SL, n'est-ce pas le cas ?

 
RaptorUK:

J'ai trouvé quelque chose d'autre concernant les Stops invalides. J'ai un EA simple qui place une transaction avec SL & TP à moins que le Symbole soit une exécution de Bourse ou de Marché, alors il envoie la transaction avec SL & TP non défini et envoie ensuite une seconde requête à (TRADE_ACTION_SLTP) pour définir le SL & TP.

Cela fonctionne bien dans le testeur de stratégie, alors aujourd'hui je l'ai essayé sur un compte de démonstration et je n'ai cessé d'obtenir des Stops invalides (erreur 10016). J'ai donc vérifié le niveau des Stops et le niveau de gel, ils sont tous deux à 0, j'ai essayé différents niveaux de SL & TP, rien n'a fonctionné. Je pouvais définir manuellement les mêmes SL & TP pour une position existante sans aucun problème... alors j'ai ajouté un test pour ne placer les SL & TP que si la position pouvait être sélectionnée... et plus de Stops Invalides, plus de demande de transaction TRADE_ACTION_SLTP non plus :-(

J'ai donc ajouté ce code entre l'exécution de la demande de transaction initiale envoyée sans TP ni SL et la demande de transaction suivante qui envoie le TP et le SL . .

SetTPandSL est mis à true si la demande de transaction initiale est réussie, il est inutile d'essayer de définir un TP & SL si ce n'est pas le cas. La position est sélectionnée et si elle échoue, un sommeil de 100 mS se produit, puis la sélection est réessayée, si elle échoue, un sommeil de 200 mS se produit, etc jusqu'à 9 tentatives (4,5 secondes au total).

Je ne sais pas encore vraiment ce que je fais avec mql5, je ne fais que bidouiller pour essayer de faire fonctionner quelques trucs et j'espère apprendre au fur et à mesure... Est-ce que ce que j'ai trouvé ici est un comportement normal ? J'aurais pensé qu'une fois que la demande initiale de transaction aurait retourné 10009 - TRADE_RETCODE_DONE, je serais prêt à envoyer la demande de réglage du TP et du SL, n'est-ce pas le cas ?

Quelles fonctions, classes/méthodes utilisez-vous pour envoyer/modifier vos ordres ?