dan5  

il mio errore fa 4756

potete aiutarmi grazie

 //+------------------------------------------------------------------+
//|                                                    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
    }    
Konstantin Chernov  

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

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

- designincompreso .
Scegliere tra i valori del doppio massimo e usare quello al posto dell' indice intero

phi nuts  
dan5:

il mio ea fa l'errore 4756

potete aiutarmi grazie

L'errore 4756 è "L'invio della richiesta di trading non è riuscito". Se hai un errore durante l'invio dell'ordine, controlla il codice di ritorno di 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;
           }

SecondoKonstantin83sopra, hai un errore di stop non valido, il che significa che devi piazzare un ordine pendente al di fuori diSymbolInfoIntegerSYMBOL_TRADE_STOPS_LEVEL eSYMBOL_TRADE_FREEZE_LEVEL.

Simon Gniadkowski  
phi.nuts:

L'errore 4756 è "L'invio della richiesta di trading non è riuscito". Se hai un errore durante l'invio dell'ordine, controlla il codice di ritorno di MqlTradeResult

SecondoKonstantin83sopra, hai un errore di stop non valido, il che significa che devi piazzare un ordine pendente al di fuori diSymbolInfoIntegerSYMBOL_TRADE_STOPS_LEVEL eSYMBOL_TRADE_FREEZE_LEVEL.

Gli stop non validi vengono restituiti anche per un Broker di tipo ECN?
phi nuts  
RaptorUK:
Gli stop non validi vengono restituiti anche per un Broker di tipo ECN?
Naturalmente sapete che la risposta è no. Ma perché chiederlo?
Simon Gniadkowski  
phi.nuts:
Naturalmente sapete che la risposta è no. Ma perché me lo chiedi?
Perché presumi che io sappia che la risposta è no? Gli stop non validi(errore 130) vengono restituiti su mql4 quando SL o TP vengono inviati con OrderSend() a un broker ECN quindi ti stavo chiedendo se lo stesso è vero con mql5. Quale errore viene restituito?
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
phi nuts  
RaptorUK:
Perché supponi che io sappia che la risposta è no? Gli stop non validi(errore 130) sono restituiti su mql4 quando SL o TP sono inviati con OrderSend() a un broker ECN, quindi stavo chiedendo se lo stesso è vero con mql5. Quale errore viene restituito?
Davvero? Questo è interessante. Devo controllare più tardi ;D.
Simon Gniadkowski  
phi.nuts:
Davvero? È interessante. Devo controllare più tardi ;D.
Ho indagato un po' cercando di trovare la mia strada con mql5. Se il comportamento dello Strategy Tester è simile a quello che verrebbe restituito da un Broker allora sembra che SL & TP siano ignorati quando vengono inviati per un simbolo il cuiENUM_SYMBOL_TRADE_EXECUTION èExchange execution oMarket execution e nessun errore viene restituito. Quindi le cose sono abbastanza diverse rispetto a mql4.
Simon Gniadkowski  
RaptorUK:
Ho indagato un po' cercando di trovare la mia strada con mql5. Se il comportamento dello Strategy Tester è simile a quello che verrebbe restituito da un Broker allora sembra che SL & TP siano ignorati quando vengono inviati per un Symbol il cuiENUM_SYMBOL_TRADE_EXECUTION èExchange execution oMarket execution e nessun errore viene restituito. Quindi le cose sono abbastanza diverse rispetto a mql4.

Ho un semplice EA che piazza un trade con SL & TP a meno che il Symbol sia Exchange o Market execution, quindi invia il trade con SL & TP non impostato e poi invia una seconda richiesta a (TRADE_ACTION_SLTP) per impostare lo SL & TP.

Funziona bene nello Strategy tester, così oggi l'ho provato su un conto Demo e continuavo a ricevere Invalid Stops (errore 10016). Così ho controllato il livello di Stops e Freeze Level, sono entrambi 0, ho provato vari livelli di SL & TP, niente ha funzionato. Potevo impostare manualmente gli stessi SL & TP per una posizione esistente senza problemi. . . quindi ho aggiunto un test per posizionare lo SL & TP solo se la posizione poteva essere selezionata. . . e niente più Invalid Stops, niente più richiesta di trade TRADE_ACTION_SLTP :-(

Così ho aggiunto questo codice tra il completamento della richiesta iniziale di trade inviata senza TP & SL e la successiva richiesta di trade che invia il TP & SL . .

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

SetTPandSL è impostato su true se la richiesta di trading iniziale ha successo, non ha senso cercare di impostare un TP & SL se non lo è. La posizione viene selezionata e se fallisce avviene uno sleep di 100 mS, poi la selezione viene ritentata, se fallisce avviene uno sleep di 200 mS, ecc per un massimo di 9 tentativi (4,5 secondi in totale).

Non so ancora bene cosa sto facendo con mql5, sto solo cercando di far funzionare alcune cose e spero di imparare man mano che vado avanti... è un comportamento normale quello che ho trovato qui? Avrei pensato che una volta che la richiesta iniziale di trading restituisse 10009 - TRADE_RETCODE_DONE sarei stato a posto per inviare la richiesta di impostare il TP & SL, non è questo il caso? Qualcuno lo sa?

Alain Verleyen  
RaptorUK:

Ho un semplice EA che piazza un trade con SL & TP a meno che il Symbol sia Exchange o Market execution, quindi invia il trade con SL & TP non impostato e poi invia una seconda richiesta a (TRADE_ACTION_SLTP) per impostare lo SL & TP.

Funziona bene nello Strategy tester, così oggi l'ho provato su un conto Demo e continuavo a ricevere Invalid Stops (errore 10016). Così ho controllato il livello di Stops e Freeze Level, sono entrambi 0, ho provato vari livelli di SL & TP, niente ha funzionato. Potevo impostare manualmente gli stessi SL & TP per una posizione esistente senza problemi. . . quindi ho aggiunto un test per posizionare lo SL & TP solo se la posizione poteva essere selezionata. . . e niente più Invalid Stops, niente più richiesta di trade TRADE_ACTION_SLTP :-(

Così ho aggiunto questo codice tra il completamento della richiesta iniziale di trade inviata senza TP & SL e la successiva richiesta di trade che invia il TP & SL . .

SetTPandSL è impostato su true se la richiesta di trading iniziale ha successo, non ha senso cercare di impostare un TP & SL se non lo è. La posizione viene selezionata e se fallisce avviene uno sleep di 100 mS, poi la selezione viene ritentata, se fallisce avviene uno sleep di 200 mS, ecc per un massimo di 9 tentativi (4,5 secondi in totale).

Non so ancora bene cosa sto facendo con mql5, sto solo cercando di far funzionare alcune cose, sperando di imparare man mano... è normale quello che ho trovato qui? Avrei pensato che una volta che la richiesta iniziale di trading restituisse 10009 - TRADE_RETCODE_DONE sarei stato a posto per inviare la richiesta di impostare il TP & SL, non è questo il caso? Qualcuno lo sa?

Che funzione, classe/metodo state usando per inviare/modificare i vostri ordini?
Motivazione: