Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 710

 
Artyom Trishkin:
Ho recentemente pubblicato un modello di indicatore multipiattaforma qui. Guarda qui.
IndicatoreBuffer()

hai bisogno di un blog e di postare le risposte alle stesse domande lì.... Vorrei avere questo tipo di pazienza!

Eccohttps://www.mql5.com/ru/forum/160683/page670#comment_9054670

Любые вопросы новичков по MQL4, помощь и обсуждение по алгоритмам и кодам
Любые вопросы новичков по MQL4, помощь и обсуждение по алгоритмам и кодам
  • 2018.10.18
  • www.mql5.com
В этой ветке я хочу начать свою помощь тем, кто действительно хочет разобраться и научиться программированию на новом MQL4 и желает легко перейти н...
 
Igor Makanu:

dovresti scrivere sul blog e pubblicare le risposte alle stesse domande .... Vorrei avere questo tipo di pazienza!

Forse dovresti. Non ne ho il tempo. E le domande saranno sempre le stesse +/-

 
Il problema è risolto assegnando le variabili ausiliarie agli ultimi numeri d'ordine del buffer, ma senza prescrivere le impostazioni di visualizzazione. Prima di questo, i buffer inutili erano al centro della lista.
 

Aiuto.

Voglio piazzare ordini pendenti su posizioni che sono state chiuse per il giorno.

La funzione mette l'ordine al prezzo dell'ultima posizione chiusa.

Cosa devo fare per mettere ordini pendenti sul prezzo di tutte le posizioni chiuse durante il giorno?

oid PriceTimePos(string sy="",int op=-1,int mn=-1) 
  {
   datetime t;
   bool daa;
   int d,k_=OrdersTotal(),typ_;
   double   r=0;
   int      i,k=OrdersHistoryTotal();

   if(sy=="0") sy=Symbol();
   for(i=0; i<k; i++) 
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) 
        {
         if(OrderSymbol()==Symbol()) 
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL) 
              {
               if(op<0 ||OrderType()==op) 
                 {
                  if(mn<0 || OrderMagicNumber()==mn) 
                    {
                     if(OrderCloseTime()>=TimeCurrent()-1440*60)
                       {
                        t=OrderCloseTime();
                        r=OrderOpenPrice();
                        sl=OrderStopLoss();
                        tp=OrderTakeProfit();
                        lot=OrderLots();
                        typ_=OrderType();
                        //Print("OpenPrice",r);
                       }
                    }
                 }
              }
           }
        }
     }
// ЕСТЬ ОРДЕР ПО ЦЕНЕ ЗАКРЫТОЙ ПОЗИЦИИ?
   daa=false;
   for(i=0; i<k; i++) 
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) 
        {
         if((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) 
           {
            if(OrderType()>1 && OrderType()<6) 
              {
               d=MarketInfo(OrderSymbol(), MODE_DIGITS);
               r=NormalizeDouble(r, d);
               if(r==NormalizeDouble(OrderOpenPrice(),d)) {daa=true;}
              }
           }
        }
     }
   if(daa==false)//ЕСЛИ НЕТ ОРДЕРА ПО ЦЕНЕ, СТАВЛЮ
     {
      double opprord=0;
      for(i=0; i<k_; i++) 
        {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) 
           {
            if((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) 
              {
               if(OrderType()>1 && OrderType()<6) 
                 {
                  d=MarketInfo(OrderSymbol(),MODE_DIGITS);
                  opprord=OrderOpenPrice();
                  // r=NormalizeDouble(r, d);
                  if(r!=NormalizeDouble(opprord,d))
                    {
                     if(r>Ask)
                       {
                        if(typ_==OP_BUY)
                          {
                           Print("OP_BUYSTOP",r);
                           SetOrder(Symbol(),OP_BUYSTOP,lot,r,sl,tp,_MagicNumber,0,"bs");
                          }
                        if(typ_==OP_SELL)
                          {
                           Print("OP_SELLLIMIT",r);
                           SetOrder(Symbol(),OP_SELLLIMIT,lot,r,sl,tp,_MagicNumber,0,"sl");
                          }
                       }

                     //
                     if(Bid>r)
                       {
                        if(typ_==OP_BUY)
                          {
                           Print("OP_BUYLIMIT",r);
                           SetOrder(Symbol(),OP_BUYLIMIT,lot,r,sl,tp,_MagicNumber,0,"bl");
                          }
                        if(typ_==OP_SELL)
                          {
                           Print("OP_SELLSTOP",r);
                           SetOrder(Symbol(),OP_SELLSTOP,lot,r,sl,tp,_MagicNumber,0,"bs");
                          }
                       }
                    }
                 }
              }
           }
        }
     }
//return(r);
  }
 
PolarSeaman:

Aiuto.

Voglio piazzare ordini pendenti su posizioni che sono state chiuse per il giorno.

La funzione mette l'ordine al prezzo dell'ultima posizione chiusa.

Cosa devo fare per mettere ordini pendenti sui prezzi di tutte le posizioni chiuse in un giorno?

  1. Scorrere la lista delle posizioni chiuse nel ciclo, selezionando quelle la cui ora di chiusura è superiore all'ora di inizio del giorno richiesto (e inferiore all'ora di inizio del giorno successivo, se era l'altro ieri per esempio).
  2. Aggiungi tutti i prezzi di chiusura (prezzi aperti - non so a cosa esattamente vuoi impostarli) di tutte le posizioni trovate in un semplice array o in un array di strutture.
  3. Passa attraverso l'array creato nel ciclo e piazza gli ordini in sospeso ai prezzi dell'array (controllando se esiste un ordine a questo prezzo - non è necessario piazzare diversi ordini allo stesso prezzo)
  4. Puoi anche cancellare i prezzi degli ordini già effettuati dall'array nel frattempo, ma è un po' complicato...
 

Ho iniziato a studiare MQL4 dal libro di S. Kovalev. Kovalev, ci sono alcune incongruenze nel codice, poiché il libro è stato scritto per vecchie build di MT4.


Si prega di consigliare come elaborare questo codice per evitare errori.

#property strict

int Count=0;
int init()      
{
   Alert ("Сработала ф-ия init() при запуске");   // Сообщение
   return;                                                                     // Выход из init()
   }   
//--------------------------------------------------------------------
int start()                                                                           // Спец. ф-ия start()
   {
   double Price = Bid;                                                      // Локальная перемен.
   Count++;                                                                      // Счётчик тиков
   Alert("Новый тик ",Count," Цена = ",Price);       // Сообщение
   return;                                                                        // Выход из start()
   }
int deinit()                                                                              // Спец. ф-ия deinit()
   {
   Alert ("Сработала ф-ия deinit() при выгрузке");         // Сообщение
   return;                                                                                 // Выход из deinit()
   }

errore

'return' - la funzione deve restituire un valore

1. È corretto farlo?

#property strict

int Count=0;
int init()      
{
   Alert ("Сработала ф-ия init() при запуске");   // Сообщение
   return(0);                                                                     // Выход из init()
   }   
//--------------------------------------------------------------------
int start()                                                                           // Спец. ф-ия start()
   {
   double Price = Bid;                                                      // Локальная перемен.
   Count++;                                                                      // Счётчик тиков
   Alert("Новый тик ",Count," Цена = ",Price);       // Сообщение
   return(0);                                                                        // Выход из start()
   }
int deinit()                                                                              // Спец. ф-ия deinit()
   {
   Alert ("Сработала ф-ия deinit() при выгрузке");         // Сообщение
   return(0);                                                                                 // Выход из deinit()
   }


2. Domanda, quanto è problematico scrivere codice per nuove build usando le conoscenze date nel tutorial (intendo il fattore età delle informazioni)?



File:
 
Sergey Branin:

Ho iniziato a studiare MQL4 dal libro di S. Kovalev. Kovalev, ci sono alcune incongruenze nel codice, poiché il libro è stato scritto per vecchie build di MT4.


Si prega di consigliare come elaborare questo codice per evitare errori.

errore

'return' - la funzione deve restituire un valore

1. È corretto farlo?


2. Domanda, quanto è problematico scrivere codice per nuove build usando le conoscenze date nel tutorial (intendo il fattore di invecchiamento delle informazioni)?



Usa OnInit(), OnDeinit(), OnTick() e altri dalla lista:

Документация по MQL5: Обработка событий
Документация по MQL5: Обработка событий
  • www.mql5.com
В языке MQL5 предусмотрена обработка некоторых предопределенных событий. Функции для обработки этих событий должны быть определены в программе MQL5: имя функции, тип возвращаемого значения, состав параметров (если они есть) и их типы должны строго соответствовать описанию функции-обработчика события. Именно по типу возвращаемого значения и по...
 
Sergey Branin:

Ho iniziato a studiare MQL4 dal libro di S. Kovalev. Kovalev, ci sono alcune incongruenze nel codice, poiché il libro è stato scritto per vecchie build di MT4.


Si prega di consigliare come elaborare questo codice per evitare errori.

errore

'return' - la funzione deve restituire un valore

1. È corretto farlo?


2. Domanda, quanto è problematico scrivere codice per le nuove build usando la conoscenza dal tutorial (intendo il fattore età delle informazioni)?



  1. Hai ragione a restituire valori da funzioni non nulle, ma è meglio passare a nuove costruzioni - non c'è niente di complicato.
  2. Scrivi, non dimenticare di inserire la direttiva #property strict all'inizio del codice - dove sono scritte tutte le direttive, leggi i codici di errore - le loro descrizioni sono nella documentazione, e tutto andrà bene e non sarà complicato.
 
Artyom Trishkin:
  1. Scorrere la lista delle posizioni chiuse, selezionando quelle con un'ora di chiusura maggiore dell'ora di inizio del giorno desiderato

Grazie, trovo i prezzi aperti delle posizioni chiuse al momento richiesto nel primo ciclo. Appaiono tutti sulla stampante e devo fare degli ordini su di loro.

L'array è un po' un puzzle per me, consigliatemi come inserire i cicli da controllare e impostarli al prezzo di apertura nel primo ciclo di ricerca di questi prezzi.

Quindi, mette sul prezzo di quello più vecchio di cui ho bisogno, come faccio a passare al prossimo prezzo trovato?
void PriceTimePos(string sy="",int op=-1,int mn=-1)
  {
   datetime t;
   bool daa;
   int d,k_=OrdersTotal(),typ_;
   double   r=0;
   int      i,k=OrdersHistoryTotal();

   if(sy=="0") sy=Symbol();
   for(i=0; i<k; i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
        {
         if(OrderSymbol()==Symbol())
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if(op<0 || OrderType()==op)
                 {
                  if(mn<0 || OrderMagicNumber()==mn)
                    {
                     if(OrderCloseTime()>=TimeCurrent()-1440*60)
                       {
                        t=OrderCloseTime();
                        r=OrderOpenPrice();
                        sl=OrderStopLoss();
                        tp=OrderTakeProfit();
                        lot=OrderLots();
                        typ_=OrderType();
                        //Print("OpenPrice",r);

                        // ЕСТЬ ОРДЕР ПО ЦЕНЕ ЗАКРЫТОЙ ПОЗИЦИИ?
                        daa=false;
                        for(i=0; i<k; i++)
                          {
                           if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
                             {
                              if((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op))
                                {
                                 if(OrderType()>1 && OrderType()<6)
                                   {
                                    d=MarketInfo(OrderSymbol(), MODE_DIGITS);
                                    r=NormalizeDouble(r, d);
                                    if(r==NormalizeDouble(OrderOpenPrice(),d)) daa=true; //else continue;
                                   }
                                }
                             }
                          }
                        if(daa==false)//ЕСЛИ НЕТ ОРДЕРА ПО ЦЕНЕ, СТАВЛЮ
                          {

                           if(r>Ask)
                             {
                              if(typ_==OP_BUY)
                                {
                                 Print("OP_BUYSTOP",r);
                                 SetOrder(Symbol(),OP_BUYSTOP,lot,r,sl,tp,_MagicNumber,0,"bs");
                                }
                              if(typ_==OP_SELL)
                                {
                                 Print("OP_SELLLIMIT",r);
                                 SetOrder(Symbol(),OP_SELLLIMIT,lot,r,sl,tp,_MagicNumber,0,"sl");
                                }
                             }

                           //
                           if(Bid>r)
                             {
                              if(typ_==OP_BUY)
                                {
                                 Print("OP_BUYLIMIT",r);
                                 SetOrder(Symbol(),OP_BUYLIMIT,lot,r,sl,tp,_MagicNumber,0,"bl");
                                }
                              if(typ_==OP_SELL)
                                {
                                 Print("OP_SELLSTOP",r);
                                 SetOrder(Symbol(),OP_SELLSTOP,lot,r,sl,tp,_MagicNumber,0,"bs");
                                }
                             }

                          }
                        //return(r);
                       }
                    }
                 }
              }
           }
        }
     }
//
  }
 
PolarSeaman:

Grazie, trovo i prezzi di apertura delle posizioni chiuse al momento giusto nel primo ciclo. Vengono tutti visualizzati sulla stampante e devo fare degli ordini su di loro.

L'array è un labirinto per me, ditemi come mettere i cicli da controllare e impostare al prezzo di apertura nel primo ciclo per trovare questi prezzi.

È più veloce capire e comprendere cosa sono gli array, che correggere quello che avete fatto.

Soprattutto perché gli array non sono semplici, ma molto semplici.

Il caricatore AK contiene 30 cartucce - è una serie di dimensioni 30. E le cartucce sono i dati memorizzati nell'array.

Certamente questo non è un buon esempio - non puoi ottenere il terzo se non ottieni 0, 1 e 2.

Beh, immaginate un foglio di calcolo:

Indice 0
Indice 1
Indice 2
Indice 3
Indice 4
Indice5.Indice6.Indice 7
Indice 8
Indice 9
Valore 1
Valore indice 2
Valore 3
Valore 4
Valore 5
Valore 6
Valore 7
Valore 8
Valore 9
Valore 10

Ecco un semplice array unidimensionale di dimensione 10.

Il valore 1 è memorizzato nella cella con indice 0, il valore 2 è memorizzato nella cella con indice 1, il valore 3 è memorizzato nella cella con indice 2, ...
...
Il valore 8 è memorizzato nella cella di indice 7, il valore 9 è memorizzato nella cella di indice 8, il valore 10 è memorizzato nella cella di indice 9

È così semplice. Per ottenere il valore 3, dovete fare riferimento all'array - la sua cella 2: Value3=Array[2];

Motivazione: