Home Systeemhandel Bericht

Cheduecoglioni: Een Innovatieve EA voor MetaTrader 5

Bijlage
18294.zip (1.98 KB, Downloaden 0 keer)

De auteur van dit idee: ef91 (begin van de gerelateerde discussie )

MQL5 code auteur: Vladimir Karputov.

Deze EA wacht tot een Take Profit (TP) of Stop Loss (SL) wordt getriggerd en opent dan een positie in de tegenovergestelde richting. Voordat de handelsaanvraag wordt verzonden, controleert het of er voldoende saldo beschikbaar is. Dit wordt gedaan in de functie OnTradeTransaction.

Bijvoorbeeld, als we een open Buy-positie hebben, wordt er een nieuwe Sell-positie geopend zodra TP of SL wordt getriggerd. Vervolgens, na het triggeren van TP of SL, wordt er weer een nieuwe Buy-positie geopend.

De sluiting van een deal wordt gecontroleerd in OnTradeTransaction:

//+------------------------------------------------------------------+
//| TradeTransaction functie                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
//--- krijg het transactie type als enumeratie waarde 
   ENUM_TRADE_TRANSACTION_TYPE type=trans.type;
//--- als de transactie het resultaat is van toevoeging aan de geschiedenis
   if(type==TRADE_TRANSACTION_DEAL_ADD)
     {
      long     deal_entry        =0;
      long     deal_type         =0;
      string   deal_symbol       ="";
      long     deal_magic        =0;
      long     deal_time         =0;
      if(HistoryDealSelect(trans.deal))
        {
         deal_entry=HistoryDealGetInteger(trans.deal,DEAL_ENTRY);
         deal_type=HistoryDealGetInteger(trans.deal,DEAL_TYPE);
         deal_symbol=HistoryDealGetString(trans.deal,DEAL_SYMBOL);
         deal_magic=HistoryDealGetInteger(trans.deal,DEAL_MAGIC);
         deal_time=HistoryDealGetInteger(trans.deal,DEAL_TIME);
        }
      else
         return;
      if(deal_symbol==m_symbol.Name() && deal_magic==m_magic)
        {
         if(deal_entry==DEAL_ENTRY_OUT)
           {
            if(deal_type==DEAL_TYPE_BUY || deal_type==DEAL_TYPE_SELL)
              {
               if(deal_type==DEAL_TYPE_BUY)
                  m_close_pos_type=POSITION_TYPE_SELL;
               else if(deal_type==DEAL_TYPE_SELL)
                  m_close_pos_type=POSITION_TYPE_BUY;
               else
                  return;
               m_is_trade=true;
          }
         }
         else if(deal_entry==DEAL_ENTRY_IN)
           {
            m_is_trade=false;
           }
        }
     }
  }

Controleer het volume voordat je OrderSend uitvoert (neem de opening van een Buy-positie als voorbeeld):

//+------------------------------------------------------------------+
//| Open Buy-positie                                                |
//+------------------------------------------------------------------+
void OpenBuy(double sl,double tp)
  {
   sl=m_symbol.NormalizePrice(sl);
   tp=m_symbol.NormalizePrice(tp);

//--- controleer het volume voordat je OrderSend uitvoert om "niet genoeg geld"-fout te voorkomen (CTrade)
   double check_volume_lot=m_trade.CheckVolume(m_symbol.Name(),InpLots,m_symbol.Ask(),ORDER_TYPE_BUY);

   if(check_volume_lot!=0.0)
     {
      if(check_volume_lot>=InpLots)
        {
         if(m_trade.Buy(InpLots,NULL,m_symbol.Ask(),sl,tp))
           {
            if(m_trade.ResultDeal()==0)
              {
               Print("Buy -> false. Result Retcode: ",m_trade.ResultRetcode(),
                 ", beschrijving van resultaat: ",m_trade.ResultRetcodeDescription());
              }
              }
          }
        else
           {
            Print("Buy -> false. Result Retcode: ",m_trade.ResultRetcode(),
                  ", beschrijving van resultaat: ",m_trade.ResultRetcodeDescription());
           }
        }
      else
        {
         m_is_trade=false;
        }
    }
   else
     {
      m_is_trade=false;
     }
//---
  }

Gerelateerde berichten

Reactie (0)