Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 1403
Você está perdendo oportunidades de negociação:
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Registro
Login
Você concorda com a política do site e com os termos de uso
Se você não tem uma conta, por favor registre-se
É realmente assim tão difícil tentar você mesmo?
Seria realmente tão difícil tentar você mesmo?
Eu experimentei, funciona.
Devido à ajuda interna de F1 sobre a "troca", tal questão surgiu, pois somente a impressão é especificada ali. E notei anteriormente queComment( ) in void OnTick() atrasamuito a execução do código .
Alguém pode me ajudar em como eu posso fazer isso?
Certifique-se de que você está usando seu login kduarte e que sua senha de conta MQL5 não é maior do que 10 caracteres.
Você não controla os ORDENS de forma alguma, você verifica o número e o tipo da POSIÇÃO no código. Além disso - você trabalha incorretamente com POSIÇÕES (erro para usar 'PositionSelect(_Symbol)' se seu tipo de conta é hedging). Seu algoritmo tem sérios erros de projeto.
O que você deve fazer:
1. Trabalhar EXCLUSIVAMENTE no momento do nascimento de um novo bar. Se não houver uma nova barra - não faça nada, não faça movimentos desnecessários.
2. Este item será divulgado depois que o item 1 for concluído.
Olá Vladimir,
Mais uma vez, muito obrigado pelas dicas que caíram. Levei algum tempo para entender as coisas.
O que eu mudei com base em suas dicas:
- Mudei a lógica de abertura e fechamento para uma versão hedging.
- Agora trabalho com o nascimento de uma nova barra para alguns cálculos/colocação de pedidos.
Como estas mudanças são aplicadas, os pedidos agora só são abertos e fechados uma única vez. Mas agora eu tenho um problema com o retrocesso. Recebo um erro de que o conjunto na linha 121 está fora de alcance. Você pode me apontar na direção certa? Tentei usar um array do tipo duplo para fechar os preços e copyClose, mas ainda assim recebo o erro então.
Também entusiasmado com o item 2 :)
Código até agora:
Em amarelo, destaquei a linha 121.
Verifique o resultado da operação:
Verifique o resultado da operação:
Como alterar o risco em porcentagem para o tamanho do lote ou corrigir o lote no detalhamento do EA Especialistas: detalhamento.
//+------------------------------------------------------------------+ //| breakdown(barabashkakvn's edition).mq5 | //| Arist0 | //| arist0.rr@gmail.com | //+------------------------------------------------------------------+ #property copyright "Arist0" #property link "arist0.rr@gmail.com" #property version "1.001" //--- #include <Trade\PositionInfo.mqh> #include <Trade\Trade.mqh> #include <Trade\SymbolInfo.mqh> #include <Trade\AccountInfo.mqh> #include <Trade\OrderInfo.mqh> #include <Expert\Money\MoneyFixedMargin.mqh> CPositionInfo m_position; // trade position object CTrade m_trade; // trading object CSymbolInfo m_symbol; // symbol info object CAccountInfo m_account; // account info wrapper COrderInfo m_order; // pending orders object CMoneyFixedMargin *m_money; //--- input parameters input ushort InpStopLoss = 50 ; // Stop Loss (in pips) input ushort InpTakeProfit = 50 ; // Take Profit (in pips) input ushort InpTrailingStop = 5 ; // Trailing Stop (in pips) input ushort InpTrailingStep = 5 ; // Trailing Step (in pips) input ushort InpMinDistance = 25 ; // Minimum distance input double Risk = 5 ; // Risk in percent for a deal from a free margin input ulong m_magic = 585000550 ; // magic number //--- ulong m_slippage= 10 ; // slippage double ExtStopLoss= 0.0 ; double ExtTakeProfit= 0.0 ; double ExtTrailingStop= 0.0 ; double ExtTrailingStep= 0.0 ; double ExtMinDistance= 0.0 ; double m_adjusted_point; // point value adjusted for 3 or 5 points bool bln_delete_all= false ; datetime dt_last_delete= 0 ; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit () { if (InpTrailingStop!= 0 && InpTrailingStep== 0 ) { string text=( TerminalInfoString ( TERMINAL_LANGUAGE )== "Russian" )? "Трейлинг невозможен: параметр \"Trailing Step\" равен нулю!" : "Trailing is not possible: parameter \"Trailing Step\" is zero!" ; Alert ( __FUNCTION__ , " ERROR! " ,text); return ( INIT_PARAMETERS_INCORRECT ); } if (!m_symbol.Name( Symbol ())) // sets symbol name return ( INIT_FAILED ); RefreshRates(); //--- m_trade.SetExpertMagicNumber(m_magic); m_trade.SetMarginMode(); m_trade.SetTypeFillingBySymbol(m_symbol.Name()); m_trade.SetDeviationInPoints(m_slippage); //--- tuning for 3 or 5 digits int digits_adjust= 1 ; if (m_symbol. Digits ()== 3 || m_symbol. Digits ()== 5 ) digits_adjust= 10 ; m_adjusted_point=m_symbol. Point ()*digits_adjust; ExtStopLoss = InpStopLoss * m_adjusted_point; ExtTakeProfit = InpTakeProfit * m_adjusted_point; ExtTrailingStop= InpTrailingStop * m_adjusted_point; ExtTrailingStep= InpTrailingStep * m_adjusted_point; ExtMinDistance = InpMinDistance * m_adjusted_point; //--- if (m_money!= NULL ) delete m_money; m_money= new CMoneyFixedMargin; if (m_money!= NULL ) { if (!m_money.Init( GetPointer (m_symbol), Period (),m_symbol. Point ()*digits_adjust)) return ( INIT_FAILED ); m_money.Percent(Risk); } else { Print ( __FUNCTION__ , ", ERROR: Object CMoneyFixedMargin is NULL" ); return ( INIT_FAILED ); } //--- bln_delete_all= false ; dt_last_delete= 0 ; //--- return ( INIT_SUCCEEDED ); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit ( const int reason) { //--- if (m_money!= NULL ) delete m_money; } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick () { //--- if (bln_delete_all) { if (IsPendingOrdersExists()) { DeleteAllPendingOrders(); //dt_last_delete=iTime(m_symbol.Name(),Period(),0); return ; } else { bln_delete_all= false ; dt_last_delete= iTime (m_symbol.Name(), PERIOD_D1 , 0 ); } } //--- if (IsPendingOrdersExists() && dt_last_delete< iTime (m_symbol.Name(), PERIOD_D1 , 0 )) { bln_delete_all= true ; return ; } //--- if (!IsPendingOrdersExists()) { if (!RefreshRates()) return ; //--- double price= iHigh (m_symbol.Name(), PERIOD_D1 , 1 )+ExtMinDistance; double sl=(InpStopLoss== 0 )? 0.0 :price-ExtStopLoss; double tp=(InpTakeProfit== 0 )? 0.0 :price+ExtTakeProfit; PendingBuyStop(price,sl,tp); //--- price= iLow (m_symbol.Name(), PERIOD_D1 , 1 )-ExtMinDistance; sl=(InpStopLoss== 0 )? 0.0 :price+ExtStopLoss; tp=(InpTakeProfit== 0 )? 0.0 :price-ExtTakeProfit; PendingSellStop(price,sl,tp); dt_last_delete= iTime (m_symbol.Name(), PERIOD_D1 , 0 ); return ; } //--- Trailing(); } //+------------------------------------------------------------------+ //| TradeTransaction function | //+------------------------------------------------------------------+ void OnTradeTransaction ( const MqlTradeTransaction &trans, const MqlTradeRequest &request, const MqlTradeResult &result) { //--- double res= 0.0 ; int losses= 0.0 ; //--- get transaction type as enumeration value ENUM_TRADE_TRANSACTION_TYPE type=trans.type; //--- if transaction is result of addition of the transaction in history if (type== TRADE_TRANSACTION_DEAL_ADD ) { long deal_ticket = 0 ; long deal_order = 0 ; long deal_time = 0 ; long deal_time_msc = 0 ; long deal_type =- 1 ; long deal_entry =- 1 ; long deal_magic = 0 ; long deal_reason =- 1 ; long deal_position_id = 0 ; double deal_volume = 0.0 ; double deal_price = 0.0 ; double deal_commission = 0.0 ; double deal_swap = 0.0 ; double deal_profit = 0.0 ; string deal_symbol = "" ; string deal_comment = "" ; string deal_external_id = "" ; if ( HistoryDealSelect (trans.deal)) { deal_ticket = HistoryDealGetInteger (trans.deal, DEAL_TICKET ); deal_order = HistoryDealGetInteger (trans.deal, DEAL_ORDER ); deal_time = HistoryDealGetInteger (trans.deal, DEAL_TIME ); deal_time_msc = HistoryDealGetInteger (trans.deal, DEAL_TIME_MSC ); deal_type = HistoryDealGetInteger (trans.deal, DEAL_TYPE ); deal_entry = HistoryDealGetInteger (trans.deal, DEAL_ENTRY ); deal_magic = HistoryDealGetInteger (trans.deal, DEAL_MAGIC ); deal_reason = HistoryDealGetInteger (trans.deal, DEAL_REASON ); deal_position_id = HistoryDealGetInteger (trans.deal, DEAL_POSITION_ID ); deal_volume = HistoryDealGetDouble (trans.deal, DEAL_VOLUME ); deal_price = HistoryDealGetDouble (trans.deal, DEAL_PRICE ); deal_commission = HistoryDealGetDouble (trans.deal, DEAL_COMMISSION ); deal_swap = HistoryDealGetDouble (trans.deal, DEAL_SWAP ); deal_profit = HistoryDealGetDouble (trans.deal, DEAL_PROFIT ); deal_symbol = HistoryDealGetString (trans.deal, DEAL_SYMBOL ); deal_comment = HistoryDealGetString (trans.deal, DEAL_COMMENT ); deal_external_id = HistoryDealGetString (trans.deal, DEAL_EXTERNAL_ID ); } else return ; if (deal_symbol==m_symbol.Name() && deal_magic==m_magic) if (deal_entry== DEAL_ENTRY_IN ) if (deal_type== DEAL_TYPE_BUY || deal_type== DEAL_TYPE_SELL ) DeleteAllPendingOrders(); } } //+------------------------------------------------------------------+ //| Refreshes the symbol quotes data | //+------------------------------------------------------------------+ bool RefreshRates( void ) { //--- refresh rates if (!m_symbol.RefreshRates()) { Print ( "RefreshRates error" ); return ( false ); } //--- protection against the return value of "zero" if (m_symbol.Ask()== 0 || m_symbol.Bid()== 0 ) return ( false ); //--- return ( true ); } //+------------------------------------------------------------------+ //| Pending order of Buy Stop | //+------------------------------------------------------------------+ void PendingBuyStop( double price, double sl, double tp) { sl=m_symbol.NormalizePrice(sl); tp=m_symbol.NormalizePrice(tp); double check_open_long_lot=m_money.CheckOpenLong(m_symbol.Ask(),sl); Print ( "sl=" , DoubleToString (sl,m_symbol. Digits ()), ", CheckOpenLong: " , DoubleToString (check_open_long_lot, 2 ), ", Balance: " , DoubleToString (m_account.Balance(), 2 ), ", Equity: " , DoubleToString (m_account.Equity(), 2 ), ", FreeMargin: " , DoubleToString (m_account.FreeMargin(), 2 )); if (check_open_long_lot== 0.0 ) { Print ( __FUNCTION__ , ", ERROR: method CheckOpenLong returned the value of \"0.0\"" ); return ; } //--- check volume before OrderSend to avoid "not enough money" error (CTrade) double check_volume_lot=m_trade.CheckVolume(m_symbol.Name(),check_open_long_lot,m_symbol.Ask(), ORDER_TYPE_BUY ); if (check_volume_lot!= 0.0 ) { if (check_volume_lot>=check_open_long_lot) { if (m_trade.BuyStop(check_open_long_lot,m_symbol.NormalizePrice(price), m_symbol.Name(),m_symbol.NormalizePrice(sl),m_symbol.NormalizePrice(tp))) { if (m_trade.ResultOrder()== 0 ) { Print ( "#1 Buy Stop -> false. Result Retcode: " ,m_trade.ResultRetcode(), ", description of result: " ,m_trade.ResultRetcodeDescription()); PrintResultTrade(m_trade,m_symbol); } else { Print ( "#2 Buy Stop -> true. Result Retcode: " ,m_trade.ResultRetcode(), ", description of result: " ,m_trade.ResultRetcodeDescription()); PrintResultTrade(m_trade,m_symbol); } } else { Print ( "#3 Buy Stop -> false. Result Retcode: " ,m_trade.ResultRetcode(), ", description of result: " ,m_trade.ResultRetcodeDescription()); PrintResultTrade(m_trade,m_symbol); } } else { Print ( __FUNCTION__ , ", ERROR: method CheckVolume (" , DoubleToString (check_volume_lot, 2 ), ") " , "< method CheckOpenLong (" + DoubleToString (check_open_long_lot, 2 )+ ")" ); return ; } } else { Print ( __FUNCTION__ , ", ERROR: method CheckVolume returned the value of \"0.0\"" ); return ; } //--- } //+------------------------------------------------------------------+ //| Pending order of Sell Stop | //+------------------------------------------------------------------+ void PendingSellStop( double price, double sl, double tp) { sl=m_symbol.NormalizePrice(sl); tp=m_symbol.NormalizePrice(tp); double check_open_short_lot=m_money.CheckOpenShort(m_symbol.Bid(),sl); Print ( "sl=" , DoubleToString (sl,m_symbol. Digits ()), ", CheckOpenLong: " , DoubleToString (check_open_short_lot, 2 ), ", Balance: " , DoubleToString (m_account.Balance(), 2 ), ", Equity: " , DoubleToString (m_account.Equity(), 2 ), ", FreeMargin: " , DoubleToString (m_account.FreeMargin(), 2 )); if (check_open_short_lot== 0.0 ) { Print ( __FUNCTION__ , ", ERROR: method CheckOpenShort returned the value of \"0.0\"" ); return ; } //--- check volume before OrderSend to avoid "not enough money" error (CTrade) double check_volume_lot=m_trade.CheckVolume(m_symbol.Name(),check_open_short_lot,m_symbol.Bid(), ORDER_TYPE_SELL ); if (check_volume_lot!= 0.0 ) { if (check_volume_lot>=check_open_short_lot) { if (m_trade.SellStop(check_open_short_lot,m_symbol.NormalizePrice(price), m_symbol.Name(),m_symbol.NormalizePrice(sl),m_symbol.NormalizePrice(tp))) { if (m_trade.ResultOrder()== 0 ) { Print ( "#1 Sell Stop -> false. Result Retcode: " ,m_trade.ResultRetcode(), ", description of result: " ,m_trade.ResultRetcodeDescription()); PrintResultTrade(m_trade,m_symbol); } else { Print ( "#2 Sell Stop -> true. Result Retcode: " ,m_trade.ResultRetcode(), ", description of result: " ,m_trade.ResultRetcodeDescription()); PrintResultTrade(m_trade,m_symbol); } } else { Print ( "#3 Sell Stop -> false. Result Retcode: " ,m_trade.ResultRetcode(), ", description of result: " ,m_trade.ResultRetcodeDescription()); PrintResultTrade(m_trade,m_symbol); } } else { Print ( __FUNCTION__ , ", ERROR: method CheckVolume (" , DoubleToString (check_volume_lot, 2 ), ") " , "< method CheckOpenShort (" + DoubleToString (check_open_short_lot, 2 )+ ")" ); return ; } } else { Print ( __FUNCTION__ , ", ERROR: method CheckVolume returned the value of \"0.0\"" ); return ; } //--- } //+------------------------------------------------------------------+ //| Print CTrade result | //+------------------------------------------------------------------+ void PrintResultTrade(CTrade &trade,CSymbolInfo &symbol) { Print ( "Code of request result: " + IntegerToString (trade.ResultRetcode())); Print ( "code of request result as a string: " +trade.ResultRetcodeDescription()); Print ( "Deal ticket: " + IntegerToString (trade.ResultDeal())); Print ( "Order ticket: " + IntegerToString (trade.ResultOrder())); Print ( "Volume of deal or order: " + DoubleToString (trade.ResultVolume(), 2 )); Print ( "Price, confirmed by broker: " + DoubleToString (trade.ResultPrice(),symbol. Digits ())); Print ( "Current bid price: " + DoubleToString (symbol.Bid(),symbol. Digits ())+ " (the requote): " + DoubleToString (trade.ResultBid(),symbol. Digits ())); Print ( "Current ask price: " + DoubleToString (symbol.Ask(),symbol. Digits ())+ " (the requote): " + DoubleToString (trade.ResultAsk(),symbol. Digits ())); Print ( "Broker comment: " +trade.ResultComment()); } //+------------------------------------------------------------------+ //| Is pendinf orders exists | //+------------------------------------------------------------------+ bool IsPendingOrdersExists( void ) { for ( int i= OrdersTotal ()- 1 ;i>= 0 ;i--) // returns the number of current orders if (m_order.SelectByIndex(i)) // selects the pending order by index for further access to its properties if (m_order. Symbol ()==m_symbol.Name() && m_order.Magic()==m_magic) return ( true ); //--- return ( false ); } //+------------------------------------------------------------------+ //| Delete all pending orders | //+------------------------------------------------------------------+ void DeleteAllPendingOrders( void ) { for ( int i= OrdersTotal ()- 1 ;i>= 0 ;i--) // returns the number of current orders if (m_order.SelectByIndex(i)) // selects the pending order by index for further access to its properties if (m_order. Symbol ()==m_symbol.Name() && m_order.Magic()==m_magic) m_trade.OrderDelete(m_order.Ticket()); } //+------------------------------------------------------------------+ //| Trailing | //+------------------------------------------------------------------+ void Trailing() { if (InpTrailingStop== 0 ) return ; for ( int i= PositionsTotal ()- 1 ;i>= 0 ;i--) // returns the number of open positions if (m_position.SelectByIndex(i)) if (m_position. Symbol ()==m_symbol.Name() && m_position.Magic()==m_magic) { if (m_position.PositionType()== POSITION_TYPE_BUY ) { if (m_position.PriceCurrent()-m_position.PriceOpen()>ExtTrailingStop+ExtTrailingStep) if (m_position.StopLoss()<m_position.PriceCurrent()-(ExtTrailingStop+ExtTrailingStep)) { if (!m_trade.PositionModify(m_position.Ticket(), m_symbol.NormalizePrice(m_position.PriceCurrent()-ExtTrailingStop), m_position.TakeProfit())) Print ( "Modify " ,m_position.Ticket(), " Position -> false. Result Retcode: " ,m_trade.ResultRetcode(), ", description of result: " ,m_trade.ResultRetcodeDescription()); RefreshRates(); m_position.SelectByIndex(i); PrintResultModify(m_trade,m_symbol,m_position); continue ; } } else { if (m_position.PriceOpen()-m_position.PriceCurrent()>ExtTrailingStop+ExtTrailingStep) if ((m_position.StopLoss()>(m_position.PriceCurrent()+(ExtTrailingStop+ExtTrailingStep))) || (m_position.StopLoss()== 0 )) { if (!m_trade.PositionModify(m_position.Ticket(), m_symbol.NormalizePrice(m_position.PriceCurrent()+ExtTrailingStop), m_position.TakeProfit())) Print ( "Modify " ,m_position.Ticket(), " Position -> false. Result Retcode: " ,m_trade.ResultRetcode(), ", description of result: " ,m_trade.ResultRetcodeDescription()); RefreshRates(); m_position.SelectByIndex(i); PrintResultModify(m_trade,m_symbol,m_position); } } } } //+------------------------------------------------------------------+ //| Print CTrade result | //+------------------------------------------------------------------+ void PrintResultModify(CTrade &trade,CSymbolInfo &symbol,CPositionInfo &position) { Print ( "Code of request result: " + IntegerToString (trade.ResultRetcode())); Print ( "code of request result as a string: " +trade.ResultRetcodeDescription()); Print ( "Deal ticket: " + IntegerToString (trade.ResultDeal())); Print ( "Order ticket: " + IntegerToString (trade.ResultOrder())); Print ( "Volume of deal or order: " + DoubleToString (trade.ResultVolume(), 2 )); Print ( "Price, confirmed by broker: " + DoubleToString (trade.ResultPrice(),symbol. Digits ())); Print ( "Current bid price: " + DoubleToString (symbol.Bid(),symbol. Digits ())+ " (the requote): " + DoubleToString (trade.ResultBid(),symbol. Digits ())); Print ( "Current ask price: " + DoubleToString (symbol.Ask(),symbol. Digits ())+ " (the requote): " + DoubleToString (trade.ResultAsk(),symbol. Digits ())); Print ( "Broker comment: " +trade.ResultComment()); Print ( "Price of position opening: " + DoubleToString (position.PriceOpen(),symbol. Digits ())); Print ( "Price of position's Stop Loss: " + DoubleToString (position.StopLoss(),symbol. Digits ())); Print ( "Price of position's Take Profit: " + DoubleToString (position.TakeProfit(),symbol. Digits ())); Print ( "Current price by position: " + DoubleToString (position.PriceCurrent(),symbol. Digits ())); } //+------------------------------------------------------------------+
Boa tarde, especialistas, por favor, ajudem-me a entender qual é o erro. Conectou o indicador da vista de negociação via pinconnector à conta demo mt5. Não estou recebendo nenhum sinal. Anexei uma captura de tela da tela de registro