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

 

Qual è il DecreaseFactor nel consulente MT standard su mashcats?

lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1);
 
Nerd Trader #:

È strano, i pulsanti sono lì ora. E il disordine del codice, perché è una bozza. Comunque, ho già fatto una versione funzionante, l'ultima cosa che resta è cancellare i pulsanti, qui di nuovo è iniziato questo schifo: la funzione di cancellazione non trova nessuno dei 4 oggetti.

Cliccando sul pulsante si creano tutte le linee:

Se il pulsante viene premuto - cancella:

Che mucchio di stronzate è scritto, mi dispiace.

 
Artyom Trishkin #:

E non c'è bisogno di guardare gli eventi. Non funzionano affatto nel tester. Dovete guardare lo stato.

UPD. Non modesto, naturalmente, ma se avessi ascoltato i miei suggerimenti per una volta, avresti già fatto tutto da tempo. In modo corretto e senza le stampelle di un multipiano.

Ma ognuno sceglie l'abisso in cui vuole immergersi.

Mihail Matkovskij #:

Per usare il debug nel tester, imparate a scrivere in MQL5. Lì tutto funziona.

Non c'è rinominazione di oggetti. Pensatelo come la sostituzione di un oggetto esistente con uno nuovo.

Questo non può essere. Il tuo codice sembra un casino di cose. Questo è probabilmente il motivo per cui si verificano dei lag con i pulsanti. Come ti ho detto prima, inizia con qualcosa di semplice. Non complicare troppo le cose. E complicarlo gradualmente quando il semplice comincia a funzionare e si ha fiducia in esso.

E come faccio a vedere gli stati se sono attivati da un evento (da un clic)? Sì, ma sto scrivendo in mql4, è lo stesso che dire "impara a scrivere in c# dove funziona il debug".

"Corretto e senza stampelle a più piani. "Quindi nascondere gli oggetti è solo una stampella.

Tutto quello che ho fatto, tutto funziona https://gist.github.com/satorkain/0cf7a8df8ec1f4b3191defd04c94a418
Cliccando sul pulsante vengono create tutte le linee in una volta, poi vengono nascoste e ne rimane solo una a seconda della posizione del pannello dei pulsanti. Altre linee sono nascoste/mostrate a seconda della posizione del cursore rispetto al prezzo.

P.S.

Se non fosse stato per mql4 storto non avrei dovuto inventarmi questa assurdità con gli oggetti nascosti, tutto avrebbe dovuto funzionare la prima volta con la cancellazione/rinominazione degli oggetti.

stop order button (public).mq4
stop order button (public).mq4
  • gist.github.com
GitHub Gist: instantly share code, notes, and snippets.
 
Nerd Trader #:

E come faccio a vedere gli stati se sono attivati da un evento (da un clic)? Sì, ma io scrivo in mql4, è lo stesso che dire "impara a scrivere in c# dove funziona il debug".

"Corretto e senza stampelle a più piani. "Quindi nascondere gli oggetti è solo una stampella.

Tutto quello che ho fatto, tutto funziona https://gist.github.com/satorkain/0cf7a8df8ec1f4b3191defd04c94a418
Cliccando sul pulsante vengono create tutte le linee in una volta, poi vengono nascoste e ne rimane solo una a seconda della posizione del pannello del pulsante. Altre linee sono nascoste/mostrate a seconda della posizione del cursore rispetto al prezzo.

P.S.

Se non fosse stato per lo storto mql4, non avrei dovuto inventare questa assurdità di nascondere gli oggetti, tutto avrebbe dovuto funzionare la prima volta anche con la cancellazione/rinominazione degli oggetti.

Nascondere un oggetto è solo il metodo raccomandato dallo sviluppatore. E c'è una proprietà speciale per questo. Per vedere lo stato, dovete guardare la proprietà "State" del pulsante.

Ciò che è storto qui è la vostra logica e la sostituzione di nozioni - prendete i mezzi raccomandati dagli sviluppatori come una stampella, e prendete la costante creazione/cancellazione vorace di oggetti come puro codice, ma questo è esattamente ciò che è una stampella, bypassando il metodo veloce raccomandato.

A proposito, per rendere rapidamente un oggetto in cima a tutti gli altri, dovete renderlo invisibile, e immediatamente visibile - questo ridefinirà la sua posizione nella lista degli oggetti, e sarà in cima.

ZS. E anche lì, sul git, hai pubblicato il codice con un C-meno. Completamente incline all'errore. Una sola linea non viene creata e tutto crolla. Questo è stato immediatamente evidente. Si creano linee nel gestore di eventi - per cosa? A cosa vi serve OnInit()? L'hai creato, ne hai controllato il successo, hai impostato una bandiera e l'hai nascosto. In OnDeinit() avete cancellato gli oggetti creati dal vostro programma. Avete anche bisogno del prefisso del nome per questo.

Mostri e nascondi solo nel gestore di eventi - non ci dovrebbe essere nessun edificio. Per il suo caso - esattamente.

Mi vergognerei di pubblicare una cosa del genere in pubblico dominio su git. Ma questo è per me.

E tu? È giusto che la gente se ne approfitti?

 
Artyom Trishkin #:

Nascondere un oggetto è esattamente il metodo raccomandato dallo sviluppatore. E c'è una proprietà speciale per questo. Per vedere lo stato, dovete guardare la proprietà "State" del pulsante.

Ciò che è storto qui è la vostra logica e la sostituzione di nozioni - prendete i mezzi raccomandati dagli sviluppatori come una stampella, e prendete la costante creazione/cancellazione vorace di oggetti come puro codice, ma questo è esattamente ciò che è una stampella per bypassare il metodo rapido raccomandato.

A proposito, per rendere rapidamente un oggetto in cima a tutti gli altri, dovete renderlo invisibile, e immediatamente visibile - questo ridefinirà la sua posizione nella lista degli oggetti, e sarà in cima.

ZS. E anche lì, sul git, hai pubblicato il codice con un C-meno. Completamente incline all'errore. Una volta che una linea non viene creata, tutto crolla. Questo è stato immediatamente evidente. Si creano linee nel gestore di eventi - per cosa? A cosa vi serve OnInit()? Lo si crea, si controlla il suo successo, si imposta una bandiera e lo si nasconde. In OnDeinit() avete cancellato gli oggetti creati dal vostro programma. Avete anche bisogno del prefisso del nome per questo.

Mostri e nascondi solo nel gestore di eventi - non ci dovrebbe essere nessun edificio. Per il suo caso - esattamente.

Mi vergognerei di pubblicare una cosa del genere in pubblico dominio su git. Ma questo è per me.

E tu? È giusto che la gente se ne approfitti?

Vorace di creare 1 linea di 4 come necessario? :) E se ci sono 200 linee? Sarà economico crearli tutti insieme secondo la vostra logica? E come è stato concepito dagli sviluppatori è noto solo a loro, e concepito in un modo molto poco intuitivo. Come se non fosse necessario nulla di incredibile o illogico. Come potevo sapere che avrei dovuto lavorare con gli oggetti solo in questo modo e non in un altro? Forse da un libro di testo su mql4? Dubito che questo punto sia spiegato lì.

Almeno, funziona come previsto :) È tra parentesi nel titolo (pubblico), quindi non è ancora completo, ma sì, non c'è un controllo per creare oggetti, sistemiamolo. E l'ho postato su git solo perché non riuscivo a ricordare incollare bin. Vergogna? Git è stato creato per le persone per imparare, scambiare esperienze, condividere codice, funzionante o no, non fa differenza, chiunque può fare un fork e apportare modifiche se non è soddisfatto di qualcosa.

Ecco, 250 oggetti sono stati creati e conservati in memoria per la durata dell'Expert Advisor. Questo è ciò che intendo per "logica non intuitiva". Per esempio, nel tutorial su OnInit(), si può leggere solo che la funzione viene elaborata durante l'inizializzazione dell'Expert Advisor/indicatore.

 
Nerd Trader #:


Lasciate che vi dica un segreto. Potete creare fino a 1.000 oggetti o più, purché non abbiate una "calcolatrice". Ma può anche farlo. Una calcolatrice è un computer con 4GB di RAM. Tutto ciò che è al di sotto è "la calcolatrice della nonna"... :) Così si possono creare oggetti tutti insieme o uno alla volta. Non fa differenza. Ma senza fanatismo.

In questo modo, tutto funziona per tutti se lo si fa con saggezza!...

 
Nerd Trader #:

Voracità di creare 1 linea di 4 come necessario? :) E se ci sono 200 linee? Sarebbe economico crearli tutti insieme secondo la sua logica? E come è stato concepito dagli sviluppatori è noto solo a loro, e concepito in un modo molto poco intuitivo. Come se non fosse necessario nulla di incredibile o illogico. Come potevo sapere che avrei dovuto lavorare con gli oggetti solo in questo modo e non in un altro? Forse da un libro di testo su mql4? Dubito che questo punto sia spiegato lì.

Almeno, funziona come previsto :) È tra parentesi nel titolo (pubblico), quindi non è ancora completo, ma sì, non c'è un controllo per creare oggetti, sistemiamolo. E l'ho postato su git solo perché non riuscivo a ricordare incollare bin. Vergogna? Git è stato creato per le persone per imparare, scambiare esperienze, condividere codice, funzionante o no, non fa differenza, chiunque può fare un fork e apportare modifiche se non è soddisfatto di qualcosa.

Ecco, 250 oggetti sono stati creati e conservati in memoria per la durata dell'Expert Advisor. Questo è ciò che intendo per "logica non intuitiva". Puoi leggere nel tutorial, per esempio, a proposito di OnInit(), che la funzione viene elaborata durante l'inizializzazione di un EA/indicatore.

Potete creare tutti gli oggetti di cui avete bisogno allo stesso tempo. All'epoca MT non era molto sviluppato in termini di disegno di buffer di indicatori, dovevamo disegnare 400 candele visibili con linee di tendenza, per una candela abbiamo bisogno di 5 linee, 400*5=2000, più un oggetto per ogni candela e così via. In totale abbiamo circa 2500 oggetti. Ha funzionato senza alcuna ottusità.

Non capite bene la logica del lavoro con gli oggetti, ma sapete come argomentare. È meglio fare il contrario.

 
Nerd Trader #:

Voracità di creare 1 linea di 4 come necessario? :) E se ci sono 200 linee? Sarebbe economico crearli tutti insieme secondo la sua logica? E come è stato concepito dagli sviluppatori è noto solo a loro, e concepito in un modo molto poco intuitivo. Come se non fosse necessario nulla di incredibile o illogico. Come potevo sapere che avrei dovuto lavorare con gli oggetti solo in questo modo e non in un altro? Forse da un libro di testo su mql4? Dubito che questo punto sia spiegato lì.

Almeno, funziona come previsto :) È tra parentesi nel titolo (pubblico), quindi non è ancora completo, ma sì, non c'è un controllo per creare oggetti, sistemiamolo. E l'ho postato su git solo perché non riuscivo a ricordare incollare bin. Vergogna? Git è stato creato per le persone per imparare, scambiare esperienze, condividere codice, funzionante o no, non fa differenza, chiunque può fare un fork e apportare modifiche se non è soddisfatto di qualcosa.

Ecco, 250 oggetti sono stati creati e conservati in memoria per la durata dell'Expert Advisor. Questo è ciò che intendo per "logica non intuitiva". L'unica cosa che si può leggere nel tutorial, per esempio, su OnInit(), è che la funzione viene elaborata durante l'inizializzazione dell'Expert Advisor/indicatore.

Benvenuti. Cercherò di spiegarlo in russo semplice.

State andando a pesca.

  1. A casa si apre la dispensa, ci si gratta la testa e la si chiude.
  2. Vai a pescare e hai bisogno di una canna da pesca.
  3. Vai a casa nel magazzino per prendere una canna da pesca.
  4. Sei andato a pescare, hai messo la tua canna da pesca e hai preso un pesce, e hai bisogno di una rete
  5. È andato a casa nel magazzino per la rete
  6. Andavi a pescare, raccoglievi il pesce che avevi catturato e che galleggiava sull'amo con la rete, e avevi bisogno di un contenitore per conservare il pesce che avevi catturato
  7. Torna a casa per ..... Devo continuare?

Oppure puoi prendere subito tutto quello che ti serve dalla dispensa (OnInit), pescare senza correre e, quando arrivi a casa, mettere tutto nella dispensa e nel frigorifero (OnDeinit).

Potresti averlo saputo qui sul forum. Bisogna solo ascoltare e sentire quello che ti viene detto a volte.

Altrimenti si fa una domanda, si ottiene una risposta, si dice "stronzate" e si fa come si crede.

Bisogna prima pensare alla domanda, fare domande, e poi iniziare l'editing.

Sapete che la cosa più semplice nella programmazione è stampare il codice? E la parte del leone dello sviluppo è pensare alla logica.

 

Mi dispiace di tirare fuori questo argomento una seconda volta.

Ma c'è un problema che non posso ancora risolvere, cioè

aprire una serie di ordini (uno dopo l'altro) sulla stessa candela.

Ho bisogno di impedire all'EA di aprire un nuovo ordine sulla stessa candela.

Ho pensato di risolverlo usando Sleep(), ma Makar ha detto che sarebbe stato meglio non fermare il processo.

problema.

Il codice ora assomiglia a questo:

// Параметры советника
input string  sParametersEA = "";     // Параметры советника
input double  Lot           = 0.01;   // Количество лотов
input int     StopLoss      = 30;     // Уровень убытка
input int     TakeProfit    = 30;     // Уровень прибыли
input int     Slippage      = 3;      // Проскальзование (в пунктах)
input int     Magic         = 1;      // Индентификатор советника
input double  K_Martin1     = 2.0;    // Множитель мартин 1
input double  K_Martin2     = 2.0;    // Множитель мартин 2
input double  K_Martin3     = 2.0;    // Множитель мартин 3
input int     OrdersClose   = 5;      // Ограничение лотности мартин1
input int     OrdersClose2  = 5;      // Ограничение лотности мартин2
input int     DigitsLot     = 2;      // Точность лотности
// Параметры индикатора
input string  sParametersMA = "";     // Параметры индикатора
input int     PeriodMA      = 14;     // Период мувинга
input int     MovingShift   = 1;      // Сдвиг мувинга
// Глобальные переменные
string AC;
datetime Start;
double dMA;
double MaxMartinLot;
double MaxMartinLot2;
//+-----------------------------------------------------------------------------------------------+
int OnInit()
  {
Start          = TimeCurrent();
MaxMartinLot   = Lot*MathPow(1.4,OrdersClose);
MaxMartinLot2  = Lot*MathPow(K_Martin2,OrdersClose2);
AC             = StringConcatenate(" ", AccountCurrency());
return(INIT_SUCCEEDED);
  }
//+-----------------------------------------------------------------------------------------------+
void OnDeinit(const int reason)
  {

  }
//+-----------------------------------------------------------------------------------------------+
void OnTick()
  {
// Получим значение индикатора
   dMA = iMA(Symbol(), 0,PeriodMA, MovingShift, MODE_SMA, PRICE_CLOSE, 0); // MODE_SMA - простое усреднение , значение 0. PRICE_CLOSE- цена закрытия, значение 0.

// Если нет открытых ордеров, то входим в условие
      if(CountOrders()==0)
     {
// Если появился сигнал на покупку, то откроем ордер на покупку
      if(bSignalBuy() == true)
         vOrderOpenBuy();

// Если появился сигнал на продажу, то откроем ордер на продажу
      if(bSignalSell() == true)
         vOrderOpenSell();
     }
   }
//+-----------------------------------------------------------------------------------------------+
//|                                                             Функция проверки открытых оредров |
//+-----------------------------------------------------------------------------------------------+
int CountOrders() 
  {
   int cnt=0;
   int i=OrdersTotal()-1;
   for(int pos=i;pos>=0;pos--)
     {
      if(OrderSelect(pos, SELECT_BY_POS, MODE_TRADES))
        {
         if(OrderSymbol()==_Symbol)
           {
            if(OrderMagicNumber()==Magic) cnt++;
           }
        }
     }
   return(cnt);
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                             Функция поиска сигнала на покупку |
//+-----------------------------------------------------------------------------------------------+
bool bSignalBuy()
  {
   if(dMA > Open[1] && dMA < Close[1])  //Open[1] и Close[1]- цены открытия и закрытия каждого бара текущего графика.
      return(true);

   return(false);
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                             Функция поиска сигнала на продажу |
//+-----------------------------------------------------------------------------------------------+
bool bSignalSell()
  {
   if(dMA < Open[1] && dMA > Close[1])
      return(true);

   return(false);
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                            Функция открытия ордера на покупку |
//+-----------------------------------------------------------------------------------------------+
void vOrderOpenBuy()
  {
// Тикет ордера
   int iOTi = 0;   

   iOTi = OrderSend(Symbol(), OP_BUY, LOT(), Ask, Slippage, 0, 0, "", Magic, 0, clrNONE);
   
// Проверим открылся ли ордер
   if(iOTi > 0)
// Есди да, то выставим уровни убытка и прибыли
      vOrderModify(iOTi);
   else
// Если нет, то получим ошибку
      vError(GetLastError());
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                            Функция открытия ордера на продажу |
//+-----------------------------------------------------------------------------------------------+
void vOrderOpenSell()
  {
// Тикет ордера  
   int iOTi = 0;   
//Print(bCheckOrders());
   iOTi = OrderSend(Symbol(), OP_SELL, LOT(), Bid, Slippage, 0, 0, "", Magic, 0, clrNONE);

// Проверим открылся ли ордер
   if(iOTi > 0)
// Есди да, то выставим уровни убытка и прибыли
      vOrderModify(iOTi);
   else
// Если нет, то получим ошибку
      vError(GetLastError());
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                                    Функция модификации ордера |
//+-----------------------------------------------------------------------------------------------+
void vOrderModify(int iOTi)
  {
   int    iOTy = -1;    // Тип ордера
   double dOOP = 0;     // Цена открытия ордера
   double dOSL = 0;     // Стоп Лосс
   int    iMag = 0;     // Идентификатор советника
   double dSL  = 0;     // Уровень убытка
   double dTP  = 0;     // Уровень прибыли

// Выберем по тикету открытый ордер, получим некоторые значения
   if(OrderSelect(iOTi, SELECT_BY_TICKET, MODE_TRADES))
     {
      iOTy = OrderType();
      dOOP = OrderOpenPrice();
      dOSL = OrderStopLoss();
      iMag = OrderMagicNumber();
     }

// Если ордер открыл данный советник, то входим в условие
   if(OrderSymbol() == Symbol() && OrderMagicNumber() == iMag)
     {
// Если Стоп Лосс текущего ордера равен нулю, то модифицируем ордер
      if(dOSL == 0)
        {
         if(iOTy == OP_BUY)
           {
            dSL = NormalizeDouble(dOOP - StopLoss * Point, Digits);
            dTP = NormalizeDouble(dOOP + TakeProfit * Point, Digits);

            bool bOM = OrderModify(iOTi, dOOP, dSL, dTP, 0, clrNONE);
           }

         if(iOTy == OP_SELL)
           {
            dSL = NormalizeDouble(dOOP + StopLoss * Point, Digits);
            dTP = NormalizeDouble(dOOP - TakeProfit * Point, Digits);

            bool bOM = OrderModify(iOTi, dOOP, dSL, dTP, 0, clrNONE);
           }
        }
     }
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                                      Функция обработки ошибок |
//+-----------------------------------------------------------------------------------------------+
void vError(int iErr)
  {
   switch(iErr)
     {
      case 129:   // Неправильная цена
      case 135:   // Цена изменилась
      case 136:   // Нет цен
      case 138:   // Новые цены
         Sleep(1000);
         RefreshRates();
         break;

      case 137:   // Брокер занят
      case 146:   // Подсистема торговли занята
         Sleep(3000);
         RefreshRates();
         break;
     }
  }
//+-----------------------------------------------------------------------------------------------+
double LOT()
{
   int n=0;
   int m=0;
   int v=0;
   double OL=Lot;
   for (int j = OrdersHistoryTotal()-1; j >= 0; j--)
   {
      if (OrderSelect(j, SELECT_BY_POS,MODE_HISTORY))
      {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
         {
            if (OrderProfit()>0) 
            {

               if (n==0) OL=NormalizeDouble(OrderLots()+K_Martin1,DigitsLot);
               n++;
               
               if ((OL>=MaxMartinLot)&& (m==0)) OL=NormalizeDouble(OrderLots()*K_Martin2,DigitsLot);
               m++;
               
               if ((OL>=MaxMartinLot2) && (v==0)) OL=NormalizeDouble(OrderLots()*K_Martin3,DigitsLot);
               v++;
            }
            else
            {
               if (n==0) {return(Lot);}
               else {return(OL);}
            }
         }
      }
   }
   
   return(OL);
}
 
законопослушный гражданин #:

Ho bisogno che l'EA non sia in grado di aprire un nuovo ordine sulla stessa candela.

void OnTick()
  {
  datetime cTime;
  static datetime time = 0;

  cTime = iTime(NULL, PERIOD_CURRENT, 0);

  if (time != cTime)
    time = cTime;
  else
    return;

// Получим значение индикатора
   dMA = iMA(Symbol(), 0,PeriodMA, MovingShift, MODE_SMA, PRICE_CLOSE, 0); // MODE_SMA - простое усреднение , значение 0. PRICE_CLOSE- цена закрытия, значение 0.

// Если нет открытых ордеров, то входим в условие
      if(CountOrders()==0)
     {
// Если появился сигнал на покупку, то откроем ордер на покупку
      if(bSignalBuy() == true)
         vOrderOpenBuy();

// Если появился сигнал на продажу, то откроем ордер на продажу
      if(bSignalSell() == true)
         vOrderOpenSell();
     }
   }
Motivazione: