Home Trading Sistematico Post

Cheduecoglioni: Il Tuo Esperto per MetaTrader 5

Allegato
18294.zip (1.98 KB, Scarica 0 volte)

L'autore dell'idea: ef91 (inizio della discussione correlata )

Autore del codice MQL5: Vladimir Karputov.

Questo EA attende che venga attivato un Take Profit (TP) o uno Stop Loss (SL), per poi aprire una posizione nella direzione opposta. Verifica se ci sono fondi sufficienti prima di inviare la richiesta di trade. Utilizza la funzione OnTradeTransaction.

Ad esempio, supponiamo di avere una posizione Buy aperta. Una volta che il TP o SL viene attivato, si apre una nuova posizione Sell. Successivamente, dopo l'attivazione di TP o SL, si apre una nuova posizione Buy.

La chiusura di un affare è monitorata nella funzione OnTradeTransaction:

//+------------------------------------------------------------------+
//| Funzione TradeTransaction                                                |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
//--- ottieni il tipo di transazione come valore enumerativo 
   ENUM_TRADE_TRANSACTION_TYPE type=trans.type;
//--- se la transazione è il risultato di un'aggiunta nella cronologia
   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;
           }
        }
     }
  }

Controlla il volume prima di OrderSend (considerando l'apertura di una posizione Buy come esempio):

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

//--- controlla il volume prima di OrderSend per evitare errore "fondi insufficienti" (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 -> falso. Codice risultato: ",m_trade.ResultRetcode(),
                 ", descrizione del risultato: ",m_trade.ResultRetcodeDescription());
              }
               else
              {
               Print("Buy -> vero. Codice risultato: ",m_trade.ResultRetcode(),
                 ", descrizione del risultato: ",m_trade.ResultRetcodeDescription());
              }
         }
         else
           {
            Print("Buy -> falso. Codice risultato: ",m_trade.ResultRetcode(),
                  ", descrizione del risultato: ",m_trade.ResultRetcodeDescription());
           }
        }
      else
        {
         m_is_trade=false;
        }
     }
   else
     {
      m_is_trade=false;
     }
//---
  }

    Post correlati

    Commento (0)