Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 305

 
PokrovMT5:

Buonasera a tutti! Ho deciso di mettere una traccia sui trade aperti nel tester, ho provato a passare attraverso OrderGet....() e mi sono accorto che l'affare è passato dalla categoria degli ordini a una posizione aperta, rispettivamente sono passato attraverso PositionGet....(), ma di nuovo non funziona niente,

La domanda è se devo usare ora HistoryDealGet...() ? O non capisco qualcosa? Quale strada seguire per modificare SL in open trade nel tester? Grazie in anticipo per i commenti.

PositionSelect(Symbol())
 

Per favore indirizzatemi a !!!! come implementare in MQL5 il controllo della presenza (o assenza) di un oggetto grafico, per esempio una linea di tendenza o una linea verticale?

Idealmente, vorrei usare una logica simile a "Se l'ordine non esiste" o "Se l'ordine esiste".

 
aleks557:

Per favore indirizzatemi a !!!! come implementare in MQL5 il controllo della presenza (o assenza) di un oggetto grafico, per esempio una linea di tendenza o una linea verticale?

Idealmente, vorrei usare una logica simile a "Se l'ordine non esiste" o "Se l'ordine esiste".

https://www.mql5.com/ru/docs/constants/chartconstants/enum_chartevents
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы графиков / Типы событий графика
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы графиков / Типы событий графика
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы графиков / Типы событий графика - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
pako:
Grazie! Tutto funziona )).
 

Puoi consigliare come implementare correttamente l'algoritmo di acquisto?

Al momento, l'Expert Advisor deve comprare molte volte, finché non riceve l'informazione che ci sono posizioni aperte, e rimane indietro. Come fare in modo che l'Expert Advisor aspetti la risposta della borsa dopo il primo acquisto (quando arrivano le condizioni).

Il problema ora è che la variabile Bye_opened dovrebbe diventare vera e questo dovrebbe impedire all'EA di fare operazioni inutili fino a quando gli stop non vengono attivati. Ma cambiare la variabile Bye_opened richiede molto tempo e l'EA ha il tempo di fare diversi trade.


Cosa manca nel mio codice? Si prega di indicare le carenze.


 //--- Do we have positions opened already?
   bool Buy_opened=false;  // variable to hold the result of Buy opened position
   bool Sell_opened=false; // variables to hold the result of Sell opened position

   if(PositionSelect(_Symbol)==true) // we have an opened position
     {
      if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
        {
         Buy_opened=true;  //It is a Buy
        }
      else if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
        {
         Sell_opened=true; // It is a Sell
        }
     }

//+------------------------------------------------------------------+
//|   СОВЕРШАЕМ СДЕЛКУ                                               |
//+------------------------------------------------------------------+
                  
     if(last_tick.last < BBLow[2] && Buy_opened == false)
        {
        int znak = last_tick.last - BBLow[2];

      //--- 1. Создать запрос
         
         MqlTradeRequest Trade_reqst={0};            // Инициализация структуры торгового запроса
         Trade_reqst.action=TRADE_ACTION_DEAL;       // Тип: немедленное совершение сделки
         Trade_reqst.symbol=_Symbol;                 // Инструмент: текущий
         Trade_reqst.volume=Lot;                     // Объём: 1 лот
         Trade_reqst.price=SymbolInfoDouble(_Symbol,SYMBOL_ASK)-TakeProfit*_Point; // Цена исполнения
         Trade_reqst.type=ORDER_TYPE_BUY;            // Тип ордера: на продажу
         Trade_reqst.type_filling=ORDER_FILLING_RETURN; // Политика исполнения 
         Trade_reqst.sl=last_tick.last - StopLoss * _Point;  // Stop Loss
         Trade_reqst.tp=SymbolInfoDouble(_Symbol,SYMBOL_ASK) + TakeProfit * _Point; // Take Profit
      // Trade_reqst.tp=Trade_reqst.price + TakeProfit * 2 * _Point; // Take Profit
      //--- 2. Отправить торговый приказ
         MqlTradeResult Trade_reslt={0};             // Инициализация структуры результата торгового запроса
         OrderSend(Trade_reqst,Trade_reslt);         // Отправка торгового запроса на сервер
   //--- выведем в лог ответ сервера  
   //Print(__FUNCTION__," - : - ",Trade_reslt.comment);
   if(Trade_reslt.retcode==10016) Print("Ответ: ",Trade_reslt.bid,Trade_reslt.ask,Trade_reslt.price);
 
mavar:

Il problema ora è che la variabile Bye_opened dovrebbe diventare vera e questo dovrebbe impedire all'EA di fare operazioni inutili fino a quando gli stop non vengono attivati. Ma i cambiamenti della variabile Bye_opened avviene molto tempo e ilconsulente ha il tempo di fare diversi trade.

Solo perché un cambio di variabile richiede molto tempo... come ha fatto a determinarlo? Ok, supponiamo che sia così. Allora la risposta sta nella domanda. Se avete bisogno di un ritardo nell'apertura di una posizione dovete usare Sleep( N ) dove N è calcolato sperimentalmente.

Variante 2. La risposta, di nuovo, è nella domanda. Rendete globale Bye_opened e cambiatelo immediatamente dopo che la posizione è stata aperta con successo, proprio in questo modulo. Azzerare allo stesso modo, come si controlla l'esistenza della posizione.

 
papaklass:
...

Se si inserisce una linea

dopo il comando: OrderSend(), non ci sarà una riapertura delle posizioni.

Forse è meglio controllare se la posizione si è aperta prima, e poi ...

???

 
papaklass:

A quanto pare ha un robot che gira su ogni tick. Tra l'invio dell'ordine al server e la ricezione della risposta dal server, arriveranno diversi altri tick e si aprirà una posizione extra su ogni tick. La mia proposta esclude la situazione di ripetizione delle aperture. Ed è necessario controllare se una posizione è stata aperta o meno.

Questo è quello che voglio dire. Altrimenti, capiranno letteralmente tutto e perderanno un controllo importante.
 
artmedia70:
Questo è quello che sto dicendo. Altrimenti capirebbe letteralmente tutto e perderebbe un controllo importante.

Quindi questo è effettivamente il modo di controllare correttamente? Scusa, non riesco a capire bene.

Ecco il codice (tutto situato nel blocco OnTick):


void OnTick()
  {

      MqlTick last_tick;
     
      if(SymbolInfoTick(Symbol(),last_tick))
        {
        // Print(last_tick.time,": Bid = ",last_tick.bid,
        //       " Ask = ",last_tick.ask,"  Volume = ",last_tick.volume, "  LastPrice = ",last_tick.last );
        }
      else Print("SymbolInfoTick() failed, error = ",GetLastError());
      //---
      
        //---Читаем свечку
   MqlRates rates[];
   ArraySetAsSeries(rates,true);
   int copied=CopyRates(Symbol(),0,0,1,rates);
   if(copied>0)
     {
      //Print("Скопировано баров: "+copied);
      string format="open = %G, high = %G, low = %G, close = %G, volume = %d";
      string out;
      int size=fmin(copied,10);
      for(int i=0;i<size;i++)
        {
         //out=i+":"+TimeToString(rates[i].time);
         out=out+" "+StringFormat(format,
                                  rates[i].open,
                                  rates[i].high,
                                  rates[i].low,
                                  rates[i].close,
                                  rates[i].tick_volume);
        // Print(out);
       
         //Print(rates[i].open - rates[i].close );

        }
     }
   else Print("Не удалось получить исторические данные по символу ",Symbol());

//---=======-----\_____BOLLINGER____/--------========--//
//--- получить хэндл индикатора Bollinger Bands и DEMA
      BolBandsHandle=iBands(NULL,my_timeframe,bands_period,bands_shift,deviation,PRICE_LOW);
      ChartIndicatorAdd(0,0,BolBandsHandle);
   
//--- копируем новые значения индикаторов используя хэндлы
   if(CopyBuffer(BolBandsHandle,0,0,3,BBMidle)<0 || CopyBuffer(BolBandsHandle,1,0,3,BBUp)<0
      || CopyBuffer(BolBandsHandle,2,0,3,BBLow)<0)
     {
      Alert("Ошибка копирования буферов индикатора Bollinger Bands - номер ошибки:",GetLastError(),"!!");
      return;
     }
//********** это цикл надо добавить в код советника, выводит значения при наступлении нового бара
   //for(int nbar=0; nbar < 3; nbar++)
    // Print("nbar=", nbar, "  BBLow[nbar]=", DoubleToString(BBLow[nbar], _Digits), "  BBMidle[nbar]", DoubleToString(BBMidle[nbar], _Digits),
   //                 "  BBUp[nbar]=", DoubleToString(BBUp[nbar], _Digits));
      
      
  //--- Define some MQL5 Structures we will use for our trade
   MqlTick latest_price;      // To be used for getting recent/latest price quotes
   
       
   //--- Do we have positions opened already?
   bool Buy_opened=false;  // variable to hold the result of Buy opened position
   bool Sell_opened=false; // variables to hold the result of Sell opened position

   if(PositionSelect(_Symbol)==true) // we have an opened position
     {
      if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
        {
         Buy_opened=true;  //It is a Buy
        }
      else if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
        {
         Sell_opened=true; // It is a Sell
        }
     }

//+------------------------------------------------------------------+
//|   СОВЕРШАЕМ СДЕЛКУ                                               |
//+------------------------------------------------------------------+
                  
     if(last_tick.last < BBLow[2]-natyajka && Buy_opened == false)
        {
        int znak = last_tick.last - BBLow[2];

      //--- 1. Создать запрос
         
         MqlTradeRequest Trade_reqst={0};            // Инициализация структуры торгового запроса
         Trade_reqst.action=TRADE_ACTION_DEAL;       // Тип: немедленное совершение сделки
         Trade_reqst.symbol=_Symbol;                 // Инструмент: текущий
         Trade_reqst.volume=Lot;                     // Объём: 1 лот
         Trade_reqst.price=SymbolInfoDouble(_Symbol,SYMBOL_ASK)-TakeProfit*_Point; // Цена исполнения
         Trade_reqst.type=ORDER_TYPE_BUY;            // Тип ордера: на продажу
         Trade_reqst.type_filling=ORDER_FILLING_RETURN; // Политика исполнения 
         Trade_reqst.sl=last_tick.last - StopLoss * _Point;  // Stop Loss
         Trade_reqst.tp=SymbolInfoDouble(_Symbol,SYMBOL_ASK) + TakeProfit * _Point; // Take Profit
      // Trade_reqst.tp=Trade_reqst.price + TakeProfit * 2 * _Point; // Take Profit
      //--- 2. Отправить торговый приказ
         MqlTradeResult Trade_reslt={0};             // Инициализация структуры результата торгового запроса
         OrderSend(Trade_reqst,Trade_reslt);         // Отправка торгового запроса на сервер
   //--- выведем в лог ответ сервера  
   //Print(__FUNCTION__," - : - ",Trade_reslt.comment);
   if(Trade_reslt.retcode==10016) Print("Ответ: ",Trade_reslt.bid,Trade_reslt.ask,Trade_reslt.price);

//--- вернем код ответа торгового сервера
        Print("Покупаю. Buy_opened = ", Buy_opened);
        Print( "last_tick.last= ", last_tick.last, 
               " last_tick.ask= ", last_tick.ask, " - ",    
               " BBLow= ",DoubleToString(BBLow[2], _Digits) , 
               " SYMBOL_BID=", SymbolInfoDouble(_Symbol,SYMBOL_BID),
               " SYMBOL_ASK=", SymbolInfoDouble(_Symbol,SYMBOL_ASK), 
               " StopLoss=", StopLoss,
               " TakeProfit=", TakeProfit,
               " Trade_reslt.bid=", Trade_reslt.bid,
               " Trade_reslt.bid=", Trade_reslt.bid,
               " Trade_reslt.ask=", Trade_reslt.ask
            ); 

      
   //return Trade_reslt.retcode;

         
        }

  } 
 
papaklass:

Per evitare di aprire volumi inutili:

Sfortunatamente, questa condizione non funziona quando si apre un trade.

      //проверка выполнения торгового приказа
      if(Trade_reslt.retcode==10009)   //заявка выполнена
      {
         Bye_opened = true;
      }