Download MetaTrader 5

error 4756

To add comments, please log in or register
dan5
59
dan5  

my ea make error 4756 

can you help me thanks

//+------------------------------------------------------------------+
//|                                                    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
9553
Konstantin Chernov  
dan5:

my ea make error 4756 

can you help me thanks

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
Konstantin Chernov
9553
Konstantin Chernov  

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

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

- misunderstood design.
Choose among the values ​​of the maximum double and use that instead of the integer index

phi nuts
2181
phi nuts  
dan5:

my ea make error 4756 

can you help me thanks

Error 4756 is "Trade request sending failed". If you have error when sending order, check the return code of 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;
           }

According to Konstantin83 above, you have invalid stop error, which mean you have to place pending order outside SymbolInfoInteger  SYMBOL_TRADE_STOPS_LEVEL and SYMBOL_TRADE_FREEZE_LEVEL.

Simon Gniadkowski
Moderator
18045
Simon Gniadkowski  
phi.nuts:

Error 4756 is "Trade request sending failed". If you have error when sending order, check the return code of MqlTradeResult

According to Konstantin83 above, you have invalid stop error, which mean you have to place pending order outside SymbolInfoInteger  SYMBOL_TRADE_STOPS_LEVEL and SYMBOL_TRADE_FREEZE_LEVEL.

Is invalid stops also returned for an ECN type Broker ?
phi nuts
2181
phi nuts  
RaptorUK:
Is invalid stops also returned for an ECN type Broker ?
Of course you know that the answer is no. But why asking that ?
Simon Gniadkowski
Moderator
18045
Simon Gniadkowski  
phi.nuts:
Of course you know that the answer is no. But why asking that ?
Why do you assume I know the answer is no ?  Invalid stops (error 130) is returned on mql4 when SL or TP are sent with OrderSend() to an ECN Broker so I was asking if the same is true with mql5.  What error is returned ?
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
2181
phi nuts  
RaptorUK:
Why do you assume I know the answer is no ?  Invalid stops (error 130) is returned on mql4 when SL or TP are sent with OrderSend() to an ECN Broker so I was asking if the same is true with mql5.  What error is returned ?
Really ? that's interesting. I have to check it later ;D.
Simon Gniadkowski
Moderator
18045
Simon Gniadkowski  
phi.nuts:
Really ? that's interesting. I have to check it later ;D.
I have been investigating a little while trying to find my way with mql5.  If the Strategy Tester behaviour is similar to what would be returned by a Broker then it seems that SL & TP are ignored when sent for a Symbol whose ENUM_SYMBOL_TRADE_EXECUTION  is Exchange execution or Market execution and no error is returned.  So things are quite different compared to mql4.
Simon Gniadkowski
Moderator
18045
Simon Gniadkowski  
RaptorUK:
I have been investigating a little while trying to find my way with mql5.  If the Strategy Tester behaviour is similar to what would be returned by a Broker then it seems that SL & TP are ignored when sent for a Symbol whose ENUM_SYMBOL_TRADE_EXECUTION  is Exchange execution or Market execution and no error is returned.  So things are quite different compared to mql4.

Something else I have found regarding Invalid Stops.  I have a simple EA that places a trade with SL & TP unless the Symbol is Exchange or Market execution,  then it sends the trade with SL & TP not set and then sends a second request to  (TRADE_ACTION_SLTP) to set the SL & TP.  

 

It works fine in the Strategy tester,  so today I tried it on a Demo account and I kept getting Invalid Stops (error 10016).  So I checked the Stops Level and Freeze Level,  they are both 0,  I tried various levels of SL & TP,  nothing worked.  I could manually set the same SL & TP for an existing position without any problems . . . so then I added a test to only place the SL & TP if the position could be selected . . .  and no more Invalid Stops,  no more TRADE_ACTION_SLTP trade request either  :-(

So I added this code between the completion of the initial trade request sent without TP & SL and the subsequent trade request that sends the TP & SL  . . .

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

 SetTPandSL  is set true if the initial trade request is successful,  there is no point trying to set a TP & SL if it isn't.  The position is selected and if it fails a 100 mS sleep happens,  then the select is retried,  if that fails a 200 mS sleep happens, etc for upto 9 attempts  (4.5 secs total).

 

I don't really know what I'm doing with mql5 yet,   I'm really just hacking about trying to make a few things work and hoping to learn as I go . . .   is what I have found here normal behaviour ?  I would have thought that once the initial trade request returned  10009 - TRADE_RETCODE_DONE  I would be OK to send the request to set the TP & SL,  isn't this the case ?  does anyone know ?

Alain Verleyen
Moderator
33770
Alain Verleyen  
RaptorUK:

Something else I have found regarding Invalid Stops.  I have a simple EA that places a trade with SL & TP unless the Symbol is Exchange or Market execution,  then it sends the trade with SL & TP not set and then sends a second request to  (TRADE_ACTION_SLTP) to set the SL & TP.  

 

It works fine in the Strategy tester,  so today I tried it on a Demo account and I kept getting Invalid Stops (error 10016).  So I checked the Stops Level and Freeze Level,  they are both 0,  I tried various levels of SL & TP,  nothing worked.  I could manually set the same SL & TP for an existing position without any problems . . . so then I added a test to only place the SL & TP if the position could be selected . . .  and no more Invalid Stops,  no more TRADE_ACTION_SLTP trade request either  :-(

So I added this code between the completion of the initial trade request sent without TP & SL and the subsequent trade request that sends the TP & SL  . . .

 SetTPandSL  is set true if the initial trade request is successful,  there is no point trying to set a TP & SL if it isn't.  The position is selected and if it fails a 100 mS sleep happens,  then the select is retried,  if that fails a 200 mS sleep happens, etc for upto 9 attempts  (4.5 secs total).

 

I don't really know what I'm doing with mql5 yet,   I'm really just hacking about trying to make a few things work and hoping to learn as I go . . .   is what I have found here normal behaviour ?  I would have thought that once the initial trade request returned  10009 - TRADE_RETCODE_DONE  I would be OK to send the request to set the TP & SL,  isn't this the case ?  does anyone know ?

What function, classes/method are you using to send/modify your orders ?
To add comments, please log in or register