ошибка 4756

 

мой ea делает ошибку 4756

можешь мне помочь спасибо

 //+------------------------------------------------------------------+
//|                                                    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:

моя ea выдает ошибку 4756

не могли бы вы мне помочь, спасибо

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); 

- неправильная конструкция.
Выберите одно из значений максимального двойника и используйте его вместо целочисленного индекса

 
dan5:

моя ea выдает ошибку 4756

не могли бы вы мне помочь, спасибо

Ошибка 4756 - это "Не удалось отправить торговый запрос". Если у вас ошибка при отправке ордера, проверьте код возврата 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;
           }

По словамКонстантина83выше, у вас ошибка недействительного стопа, что означает, что вы должны разместить отложенный ордер за пределамиSymbolInfoIntegerSYMBOL_TRADE_STOPS_LEVEL иSYMBOL_TRADE_FREEZE_LEVEL.

 
phi.nuts:

Ошибка 4756 - это "Не удалось отправить торговый запрос". Если у вас возникла ошибка при отправке ордера, проверьте код возврата MqlTradeResult.

По словамКонстантина83выше, у вас ошибка invalid stop, что означает, что вы должны разместить отложенный ордер за пределамиSymbolInfoIntegerSYMBOL_TRADE_STOPS_LEVEL иSYMBOL_TRADE_FREEZE_LEVEL.

Возвращаются ли недействительные стопы также для брокера типа ECN?
 
RaptorUK:
Возвращаются ли недействительные стопы для брокера типа ECN?
Конечно, вы знаете, что ответ - нет. Но зачем это спрашивать?
 
phi.nuts:
Конечно, вы знаете, что ответ - нет. Но зачем вы это спрашиваете?
Почему вы предполагаете, что я знаю ответ "нет"? Недействительные стопы(ошибка 130) возвращаются на mql4, когда SL или TP отправляются с помощью OrderSend() к ECN брокеру, поэтому я спросил, верно ли то же самое на mql5. Какая ошибка возвращается?
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:
Почему вы предполагаете, что я знаю ответ "нет"? Недействительные стопы(ошибка 130) возвращаются на mql4, когда SL или TP отправляются с помощью OrderSend() к ECN брокеру, поэтому я спросил, верно ли то же самое на mql5. Какая ошибка возвращается?
Правда? Это интересно. Я должен проверить это позже ;D.
 
phi.nuts:
Правда? Это интересно. Я должен проверить это позже ;D.
Если поведение тестера стратегий похоже на то, что возвращает брокер, то, похоже, SL и TP игнорируются при отправке для символа, чейENUM_SYMBOL_TRADE_EXECUTION-Exchange execution илиMarket execution, и ошибка не возвращается. Так что все совсем иначе по сравнению с mql4.
 
RaptorUK:
Я немного поизучал mql5. Если поведение тестера стратегий похоже на то, что возвращает брокер, то похоже, что SL и TP игнорируются при отправке для символа, чейENUM_SYMBOL_TRADE_EXECUTION-Exchange execution илиMarket execution, и ошибка не возвращается. Так что все совсем по-другому по сравнению с mql4.

У меня есть простой советник, который размещает сделку с SL и TP, если только символ не является биржевым или рыночным исполнением, тогда он отправляет сделку с неустановленными SL и TP, а затем отправляет второй запрос (TRADE_ACTION_SLTP), чтобы установить SL и TP.

Это отлично работает в тестере стратегий, поэтому сегодня я попробовал это на демо-счете и продолжал получать Invalid Stops (ошибка 10016). Поэтому я проверил Stops Level и Freeze Level, они оба равны 0, я попробовал различные уровни SL и TP, ничего не сработало. Я мог вручную установить те же SL и TP для существующей позиции без каких-либо проблем ... поэтому я добавил тест, чтобы установить SL и TP только если позиция может быть выбрана ... и больше никаких недействительных стопов, никакого торгового запроса TRADE_ACTION_SLTP тоже :-(.

Поэтому я добавил этот код между завершением первоначального торгового запроса, отправленного без TP и SL, и последующим торговым запросом, который отправляет TP и SL ... .

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

SetTPandSL устанавливается true, если начальный торговый запрос успешен, нет смысла пытаться установить TP и SL, если это не так. Позиция выбирается, и если это не удается, происходит 100 мс сна, затем выбор повторяется, если это не удается, происходит 200 мс сна и т.д. до 9 попыток (всего 4.5 секунды).

Я еще не совсем понимаю, что я делаю с mql5, я просто пытаюсь заставить несколько вещей работать и надеюсь научиться по ходу дела... Является ли то, что я нашел здесь, нормальным поведением? Я бы подумал, что после того, как первоначальный торговый запрос вернул 10009 - TRADE_RETCODE_DONE, я могу отправить запрос на установку TP и SL, так ли это? Кто-нибудь знает?

 
RaptorUK:

У меня есть простой советник, который размещает сделку с SL и TP, если только символ не является биржевым или рыночным исполнением, тогда он отправляет сделку с неустановленными SL и TP, а затем отправляет второй запрос (TRADE_ACTION_SLTP), чтобы установить SL и TP.

Это отлично работает в тестере стратегий, поэтому сегодня я попробовал это на демо-счете и продолжал получать Invalid Stops (ошибка 10016). Поэтому я проверил Stops Level и Freeze Level, они оба равны 0, я попробовал различные уровни SL и TP, ничего не сработало. Я мог вручную установить те же SL и TP для существующей позиции без проблем ... поэтому я добавил тест, чтобы установить SL и TP только если позиция может быть выбрана ... и больше никаких недействительных стопов, никакого торгового запроса TRADE_ACTION_SLTP тоже :-(.

Поэтому я добавил этот код между завершением первоначального торгового запроса, отправленного без TP и SL, и последующим торговым запросом, который отправляет TP и SL ... .

SetTPandSL устанавливается true, если начальный торговый запрос успешен, нет смысла пытаться установить TP и SL, если это не так. Позиция выбирается, и если это не удается, происходит 100 мс сна, затем выбор повторяется, если это не удается, происходит 200 мс сна и т.д. до 9 попыток (всего 4.5 секунды).

Я еще не совсем понимаю, что я делаю с mql5, я просто пытаюсь заставить несколько вещей работать и надеюсь научиться по ходу дела... Является ли то, что я нашел здесь, нормальным поведением? Я бы подумал, что после того, как первоначальный торговый запрос вернул 10009 - TRADE_RETCODE_DONE, я могу отправить запрос на установку TP и SL, так ли это? Кто-нибудь знает?

Какую функцию, классы/метод вы используете для отправки/изменения ордеров?