Errori, bug, domande - pagina 52

 
Non era così in MT4, grazie.
 

Durante il test di Expert Advisors:
Exp_TEMA.mq5, dall'articolo: "Creazione di un Expert Advisor che fa trading su diversi simboli". , l'espressione Told[] Tnew[1]ottiene i seguenti valori:
Told[] L'espressione non può essere valutata
Tnew[1] Intervallo di array non valido.

E My_First_EA.mq5, dall'articolo: "A Step-by-Step Guide to Writing MQL5 Expert Advisors for Beginners", l'espressione
New_Time[1] ottiene il valore:Invalid array range

Cosa sono i valori Expression could not be evaluated,Invalid array range, e come influenzano i risultati degli esperti?

 

Told - array vuoto senza dimensione

Tnew[1] - fuori dall'array, l'array è descritto come Tnew[1], quindi i suoi elementi sono accessibili solo come Tnew[0], perché l'indice inizia a zero.

 
Renat:

Told - array vuoto senza dimensione

Tnew[1] - fuori dall'array, l'array è descritto come Tnew[1], quindi i suoi elementi sono accessibili solo come Tnew[0], perché l'indice inizia a zero.


Per quanto riguarda Tnew, ne ho già parlato in un altro thread del forum, forse era necessario un commento da parte degli sviluppatori :)
 

Per favore, ditemi come aprire un solo trade per condizione. Con il mio codice, il terminale apre diverse offerte su questa condizione, ma io ho bisogno di una sola.

       if(Buy_Signal)
        {
         mrequest.price = NormalizeDouble(latest_price.ask,_Digits);           // последняя цена ask
         mrequest.sl = NormalizeDouble(latest_price.ask - STP*_Point,_Digits); // Stop Loss
         mrequest.tp = NormalizeDouble(latest_price.ask + TKP*_Point,_Digits); // Take Profit
         mrequest.type = ORDER_TYPE_BUY;                                       // ордер на покупку
         //--- отсылаем ордер
         OrderSend(mrequest,mresult);        
        }        

       if(Sell_Signal)
        {
         mrequest.price = NormalizeDouble(latest_price.bid,_Digits);           // последняя цена Bid
         mrequest.sl = NormalizeDouble(latest_price.bid + STP*_Point,_Digits); // Stop Loss
         mrequest.tp = NormalizeDouble(latest_price.bid - TKP*_Point,_Digits); // Take Profit
         mrequest.type= ORDER_TYPE_SELL;                                       // ордер на продажу                                          
         //--- отсылаем ордер
         OrderSend(mrequest,mresult);              
        }
      

Il risultato è la seguente immagine:

Come posso controllare se un affare è stato fatto con questa condizione o no? Ho provato in questo modo, ma non funziona:

// в этом цикле поочередно перебираем все открытые позиции
   for(i=0;i<PositionsTotal();i++)
     {
      // выбираем позиции только по "нашему" инструменту
      if(Symbol()==PositionGetSymbol(i))
     ...
     }
 
AM2:

Per favore, ditemi come aprire un solo trade per condizione. Con il mio codice, il terminale apre diverse offerte su questa condizione, ma io ho bisogno di una sola.

Il risultato è la seguente immagine:

Come posso controllare se un affare è stato fatto con questa condizione o no? Ho provato in questo modo, ma non funziona:

E perché organizzare la ricerca nel ciclo se c'è una cosa meravigliosa come PositionSelect?

Controlliamo solo l'esistenza della posizione sul simbolo interessante e se è vero, andiamo a bere cognac e fumare sigari... :)

PS

Da quanto ho capito PositionGetString senzaPositionSelect non dovrebbe funzionare. Non abbiamo bisogno di conoscere i simboli di tutte le pose aperte, giusto?

 
Interesting:

Non c'è bisogno di cercare nel ciclo quando c'è una cosa meravigliosa come PositionSelect?

Basta controllare la presenza di una posizione sullo strumento che ci interessa e se risulta vera andiamo tranquillamente a bere cognac e fumare sigari... :)

PS

Da quanto ho capito PositionGetString senzaPositionSelect non dovrebbe funzionare. Non abbiamo bisogno di conoscere i simboli di tutte le pose aperte, giusto?

Questo codice tiene conto della presenza di una posizione aperta:

   if(Buy_Signal && PositionSelect(Symbol())==false)
     {
         mrequest.type = ORDER_TYPE_BUY;                                       // ордер на покупку
         mrequest.price = NormalizeDouble(latest_price.ask,_Digits);           // последняя цена ask
         mrequest.sl = NormalizeDouble(latest_price.ask - STP*_Point,_Digits); // Stop Loss
         mrequest.tp = NormalizeDouble(latest_price.ask + TKP*_Point,_Digits); // Take Profit
         OrderSend(mrequest,mresult);                                          // отсылаем ордер                
     }

Ma continua ad aprire posizioni quando la condizione Buy_Signal è soddisfatta. Quello che voglio è che prima che si verifichi Sell_Signal una posizione a Buy_Signal non si apra di nuovo. Sto cercando di implementarlo in questo modo:

   Buy_Signal = true;
   Sell_Signal = true;                

   if(Buy_Signal && PositionSelect(Symbol())==false)
     {
         mrequest.type = ORDER_TYPE_BUY;                                       // ордер на покупку
         mrequest.price = NormalizeDouble(latest_price.ask,_Digits);           // последняя цена ask
         mrequest.sl = NormalizeDouble(latest_price.ask - STP*_Point,_Digits); // Stop Loss
         mrequest.tp = NormalizeDouble(latest_price.ask + TKP*_Point,_Digits); // Take Profit
         OrderSend(mrequest,mresult);                                          // отсылаем ордер
         Buy_Signal = false;
         Sell_Signal = true;                
     }


   if(Sell_Signal && PositionSelect(Symbol())==false)
     {
         mrequest.type= ORDER_TYPE_SELL;                                       // ордер на продажу
         mrequest.price = NormalizeDouble(latest_price.bid,_Digits);           // последняя цена Bid
         mrequest.sl = NormalizeDouble(latest_price.bid + STP*_Point,_Digits); // Stop Loss
         mrequest.tp = NormalizeDouble(latest_price.bid - TKP*_Point,_Digits); // Take Profit
         OrderSend(mrequest,mresult);                                          // отсылаем ордер    
         Buy_Signal = true;
         Sell_Signal = false;                
     }
Non va.
 
AM2:

Tale codice tiene conto della presenza di una posizione aperta:

Ma continua ad aprire posizioni quando la condizione Buy_Signal è soddisfatta. Ho bisogno di assicurarmi che prima che si verifichi la condizione Sell_Signal non vengano aperte altre posizioni da Buy_Signal. Sto cercando di implementarlo in questo modo:

Non lo fa.

Perché questo codice? Non assomiglia affatto a quello che intendevo (dubito che tutto sia corretto lì).

   if(Buy_Signal && PositionSelect(Symbol())==false)
     {
         mrequest.type = ORDER_TYPE_BUY;                                     // ордер на покупку
         mrequest.price = NormalizeDouble(latest_price.ask,_Digits);          // последняя цена ask
         mrequest.sl = NormalizeDouble(latest_price.ask - STP*_Point,_Digits); // Stop Loss
         mrequest.tp = NormalizeDouble(latest_price.ask + TKP*_Point,_Digits); // Take Profit 
         OrderSend(mrequest,mresult);                                        // отсылаем ордер                
     }

E intendevo qualcosa del genere:

Ask = SymbolInfoDouble(_Symbol,SYMBOL_ASK);

SL = NormalizeDouble(Ask - 500*_Point,_Digits);  // Stop Loss
TP = NormalizeDouble(Ask + 1500*_Point,_Digits); // Take Profit

  if(Buy_Signal)
  //Получен сигнал на market buy
  {
  
    if(!PositionSelect(_Symbol))
    //Позиции по данному символу отсутствуют
    {
    mrequest.action = TRADE_ACTION_DEAL; //Установка рыночного ордера (позиция)
    mrequest.type   = ORDER_TYPE_BUY;    //Ордер на покупку
    mrequest.magic = 18072010;          //ORDER_MAGIC
    mrequest.symbol = _Symbol;          //Инструмент
    mrequest.volume = 0.1;              //Объем в 0.1 лот
    mrequest.price = Ask;   //Цена открытия
    mrequest.sl = SL;       //Stop Loss
    mrequest.tp = TP;       //Take Profit
    mrequest.deviation = 5; //Отклонение в 5 пунктов   
    OrderSend(mrequest,mresult); //Отсылаем ордер
    }
  
  }

Come minimo potrebbe essere fatto in un blocco

  if((Buy_Signal)&&(!PositionSelect(_Symbol)))
  //Получен сигнал market buy
  {
  ...........................................  
  }
 
Interesting:

Perché questo particolare codice? Non è nemmeno lontanamente simile a quello che intendevo (dubito che sia giusto).

E intendevo qualcosa del genere:

Come minimo tutto può essere fatto in un blocco.

if((Buy_Signal)&&(!PositionSelect(_Symbol)))
  //Получен сигнал market buy
  {
  ...........................................  
  }

Questo e il codice precedente non aprono una posizione finché non viene chiusa, ma la riaprono dopo la chiusura sulla barra successiva se la condizione è soddisfatta. L'ho implementato in questo modo:

bool BuyOne = true, SellOne = true; // только один ордер.  глобальные переменные




   if(Buy_Signal &&                                                         // покупаем если есть сигнал на покупку
      PositionSelect(Symbol())==false &&                                    // ордер закрыт
      BuyOne)                                                               // при условии на покупку ставим только один ордер
     {
      mrequest.type = ORDER_TYPE_BUY;                                       // ордер на покупку
      mrequest.price = NormalizeDouble(latest_price.ask,_Digits);           // последняя цена ask
      mrequest.sl = NormalizeDouble(latest_price.ask - STP*_Point,_Digits); // Stop Loss
      mrequest.tp = NormalizeDouble(latest_price.ask + TKP*_Point,_Digits); // Take Profit
      OrderSend(mrequest,mresult);                                          // отсылаем ордер
      BuyOne = false;                                                       // на покупку только один ордер                                                  
      SellOne = true;                                                       // меняем флаг одного ордера на продажу          
     }

Grazie! Ho preso in considerazione tutti i vostri desideri e ora tutto funziona. Ho inviato l'Expert Advisor per la pubblicazione. Posso fare altre modifiche al codice. Non c'è limite alla seduzione)))

 
Non ho trovato nessuna descrizione dei codici di risposta (Retcode) per la struttura dei risultati del controllo delle richieste di commercio MqlTradeCheckResult nella documentazione. Ce ne saranno?
Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура торгового запроса
Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура торгового запроса
  • www.mql5.com
Стандартные константы, перечисления и структуры / Структуры данных / Структура торгового запроса - Документация по MQL5
Motivazione: