Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 6. - pagina 1104

 
shtr:

Ciao a tutti!

Potete dirmi perché gli ordini non si aprono?

L'init è init, il commercio è init. C'è OnTick per gli EA, non c'è bisogno di ficcare tutto nell'init...

E per inite, ci sono codici di uscita speciali inventati dagli sviluppatori, perché non li usate?

 
evillive:

Initu sta per initu, trade sta per togo. C'è OnTick per gli EA, non c'è bisogno di ficcare tutto nell'init...

E per inite, ci sono codici di uscita speciali inventati dagli sviluppatori, perché non li usiamo?

Probabilmente perché non conosciamo i codici di terminazione inite. Gli esempi nel tutorial sono diversi dal modulo nell'editor. La funzione int start(), per esempio, manca lì. Quando ho incollato l'esempio di semplice Expert Advisor dal tutorial nell'inite, in qualche modo ha funzionato. Ma non importa cosa ho scritto, non ha funzionato. Così ho deciso, dopo due settimane di esperimenti, di consultare un esperto. Grazie per il suggerimento!

Ho messo tutto in OnTick, ma non è cambiato nulla.

 
shtr:

Non lo usiamo, dev'essere perché non conosciamo i codici di completamento init. Gli esempi nel libro di testo differiscono dalla forma nell'editor. La funzione int start(), per esempio, manca lì. Quando ho incollato l'esempio di semplice Expert Advisor dal tutorial nell'inite, in qualche modo ha funzionato. Ma non importa cosa ho scritto, non ha funzionato. Così ho deciso, dopo due settimane di esperimenti, di consultare un esperto. Grazie per il suggerimento!

Ho buttato tutto in OnTick, ma non è cambiato nulla.

Lasciate perdere il tutorial, è scritto usando la vecchia sintassi, molto è cambiato da allora. L'aiuto della consegna del terminale è il più rilevante, e kodobase, se si guarda, è anche una fonte di esempi nella nuova versione di MQL.

E sul fatto di non scrivere tutto il codice nell'inite, era prima, cercate nel forum, ci sono centinaia di messaggi in tutte le lingue di questo forum, solo che ogni volta c'è un nuovo scrittore che non è un lettore ;)

 
evillive:

Lasciate perdere il tutorial, è scritto secondo la vecchia sintassi, molto è cambiato da allora. L'aiuto della consegna del terminale è il più rilevante, e kodobase, se si guarda, è anche una fonte di esempi nella nuova versione di MQL.

E sul fatto di non scrivere tutto il codice nell'inite, era prima, cercate nel forum, ci sono centinaia di messaggi in tutte le lingue di questo forum, solo che ogni volta c'è un nuovo scrittore, che non è un lettore ;)

Grazie!

I vecchi libri di testo, quando perdono la loro attualità, dovrebbero essere immediatamente spenti))

 
shtr:

Grazie!

I vecchi tutorial, quando perdono rilevanza, dovrebbero essere immediatamente fumati))

E non gettare tutto in OnTick, solo ciò che è rilevante per il commercio, la parte del codice che viene eseguito solo all'avvio dovrebbe essere lasciato in OnInit (naturalmente, che i nomi delle funzioni dovrebbero essere scritti in latino, solo pigro per cambiare il layout sul forum ogni volta).

Riguardo al codice stesso, ci sono domande sul ciclo, è strano, penso che non ci siano abbastanza parentesi graffe...

Sì, e anche per il calcolo dei livelli di profitto e perdita, sono prescritti in modo errato. Il server dovrebbe inviare il prezzo, preferibilmente normalizzato, non il valore in pip.

 
evillive:

E non mettere tutto in OnTick, solo ciò che è rilevante per il commercio, parte del codice che si attiva solo all'avvio dovrebbe essere lasciato in OnInit (naturalmente, i nomi delle funzioni dovrebbero essere scritti in latino, solo troppo pigro per cambiare il layout sul forum ogni volta).

Riguardo al codice stesso, ci sono domande sul ciclo, è strano, penso che non ci siano abbastanza parentesi graffe...

Sì, e anche per il calcolo dei livelli di profitto e perdita, sono prescritti in modo errato. Il server dovrebbe inviare il prezzo, preferibilmente normalizzato, non il valore in pip.

Ho capito, grazie. Controllerò le parentesi - l'editor non ha prodotto errori.

Perché l'esempio del libro ha funzionato? Ho tolto tutte le funzioni e ho inserito solo il codice di esempio, a partire da int start. Non ci sono stati errori e le transazioni si sono aperte.

 
shtr:

Capito, grazie. Controllerò le parentesi - l'editor non ha dato alcun errore.

Perché l'esempio del libro ha funzionato...? Ho tolto tutte le funzioni e ho inserito solo il codice di esempio, partendo dall'inizio int. Non ci sono stati errori e le transazioni si sono aperte.

Beh, non avevo bisogno di scambiare ciò che funzionava ))))

Se la tua domanda riguarda la differenza tra start e ontik in modo nuovo, dovresti aver trasferito tutto da start a ontik. O piuttosto, nel vostro caso, da OnInit a OnTick.

Il compilatore tiene traccia degli errori di sintassi, nessuno controllerà la logica se non un umano. In casi particolari, anche l'autore del codice può confondersi :)

 
evillive:

Beh, quello che ha funzionato non doveva essere scambiato ))))

E Int start il vecchio modo e OnTick il nuovo modo per gli EA, quindi dovresti aver spostato tutto da start a OnTick. O piuttosto, nel vostro caso, da OnInit a OnTick.

Il compilatore tiene traccia degli errori di sintassi, nessuno tranne un umano controlla la logica. In casi particolari, anche l'autore del codice può confondersi :)

//+------------------------------------------------------------------+
//| 3333.mq4 |
//| Copyright 2016, MetaQuotes Software Corp.
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#proprietà link "https://www.mql5.com"
#proprietà versione "1.00"
#proprietà rigorosa
extern int MA_1=5;
extern int MA_2=20;
extern MA_3=80;
extern inttern TP=100;
extern int SL=50;
extern double Lot=0.1;
stringa Symb;
//+------------------------------------------------------------------+
//| Funzione di inizializzazione dell'esperto |
//+------------------------------------------------------------------+
int OnInit()
{
//---
//---
return(INIT_SUCCEED);
}

//+------------------------------------------------------------------+
//| Funzione di deinizializzazione esperto |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| Funzione tick esperto |
//+------------------------------------------------------------------+
void OnTick()
{
doppio MA_1_t;
doppio MA_2_t;
doppio MA_3_t;
int totale;
int pos;
Symb=Symbol();
Totale=0;
for( pos=1; pos<=OrdersTotal(); pos++)
pos=OrderSelect(pos-1,MODE_TRADES);
se(pos==0)
MA_1_t=iMA(NULL,0,MA_1,0,MODE_EMA,PRICE_CLOSE,0);
MA_2_t=iMA(NULL,0,MA_2,0,MODE_EMA,PRICE_CLOSE,0);
MA_3_t=iMA(NULL,0,MA_3,0,MODE_EMA,PRICE_CLOSE,0);
if(MA_2_t>MA_3_t&&MA_1_t<MA_2_t&&Open[1]<MA_1_t&&Close[1]>MA_1_t)
{
double stoploss=NormalizeDouble(Ask-SL*Point,Digits);
double takeprofit=NormalizeDouble(Ask+TP*Point,Digits);
pos=OrderSend(Symbol(),OP_BUY,Lot,Ask,3,stoploss,takeprofit, "My order",16384,0,clrGreen);
ritorno;
}
if(MA_2_t<MA_3_t&&MA_1_t>MA_2_t&&Open[1]>MA_1_t&&Close[1]<MA_1_t)
{
double stoploss=NormalizeDouble(SL*Point-Bid,Digits);
double takeprofit=NormalizeDouble(Bid-TP*Point,Digits);
pos=OrderSend(Symbol(),OP_SELL,Lot,Bid,3,stoploss,takeprofit, "My order",16384,0,clrRed);
ritorno;
}
ritorno;
}
//---

//+------------------------------------------------------------------+

"Beh, quello che ha funzionato non aveva bisogno di essere spacciato)))" Beh, vuoi scarabocchiare qualcosa tu stesso).

Il paziente non è tornato in sé dopo la manipolazione.

 
shtr:

"Beh, non avresti dovuto scambiare ciò che ha funzionato")). Beh, vuoi scarabocchiare qualcosa tu stesso).

Il paziente non è tornato in sé dopo la manipolazione.

Beh, la logica e la matematica è zoppa, è chiaro che non funzionerà così.

Per esempio, perché abbiamo bisogno di un ciclo in questo EA? Voglio dire, è chiaro che dobbiamo calcolare quanti ordini per un dato simbolo e mago sono già stati fatti, giusto? Ma quello che vediamo qui è che il ciclo non conta nulla e non può contare perché non ha un "contatore" avvitato in ))))

Total=0;                                   

   for( pos=1; pos<=OrdersTotal(); pos++)         
   pos=OrderSelect(pos-1,MODE_TRADES); И что дальше? Переменная pos всегда или 0, или 1, цикл сбивается постоянно на начало, а то и заглючить может и превратиться в бесконечный цикл.

OrderSelect() restituisce un valore booleano, vero o falso, che non è appropriato per la variabile pos. E il ciclo dovrebbe iniziare meglio dall'ordine più vecchio, cioè in ordine inverso, per evitare di saltare gli ordini.

La variabile Total può essere utile come contatore:

for(pos=OrdersTotal()-1;pos>=0;pos--)
{
  if(OrderSelect(pos,MODE_TRADES)) //Обязательно проверить, выбран ли ордер
  { 
    if(OrderSymbol()==Symbol()) //желательно проверить, тот ли это ордер по символу, ещё можно по магику проверить дополнительно в этой же строке
    {
     Total++; //если это наш ордер, добавляем счётчику единицу
    }
  }
}
if(Total<1)
{
  торгуем
}

Ho rimosso le cose inutili, aggiunto l'output di errore dopo OrderSend, per il tester su conti non ECN gli ordini già aperti:

#property version   "1.00"
#property strict
extern int MA_1=5;
extern int MA_2=20;
extern int MA_3=80;
extern int TP=100;
extern int SL=50;
extern double Lot=0.1;

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
  
   double MA_1_t=0;
   double MA_2_t=0; 
   double MA_3_t=0;
   int Total=0;
   
   for(int pos=OrdersTotal()-1;pos>=0;pos--)
   {
     if(OrderSelect(pos,MODE_TRADES)) //Обязательно проверить, выбран ли ордер
     { 
       if(OrderSymbol()==Symbol()) //желательно проверить, тот ли это ордер по символу, ещё можно по магику проверить дополнительно в этой же строке
       {
        Total++; //если это наш ордер, добавляем счётчику единицу
       }
     }
   }
   if(Total<1)
   {
      MA_1_t=iMA(NULL,0,MA_1,0,MODE_EMA,PRICE_CLOSE,0);
      MA_2_t=iMA(NULL,0,MA_2,0,MODE_EMA,PRICE_CLOSE,0); 
      MA_3_t=iMA(NULL,0,MA_3,0,MODE_EMA,PRICE_CLOSE,0);
  
      if(MA_2_t>MA_3_t&&MA_1_t<MA_2_t&&Open[1]<MA_1_t&&Close[1]>MA_1_t)
      {
         double stoploss=NormalizeDouble(Ask-SL*Point,Digits);
         double takeprofit=NormalizeDouble(Ask+TP*Point,Digits);
         if(OrderSend(Symbol(),OP_BUY,Lot,Ask,6,stoploss,takeprofit,"My order buy",16384,0,clrGreen)<1) 
         Print("OrderSend error #",_LastError," BuySL=",stoploss," BuyTP=",takeprofit);
      }
    
      if(MA_2_t<MA_3_t&&MA_1_t>MA_2_t&&Open[1]>MA_1_t&&Close[1]<MA_1_t)
      {
         double stoploss=NormalizeDouble(Bid+SL*Point,Digits);
         double takeprofit=NormalizeDouble(Bid-TP*Point,Digits);
         if(OrderSend(Symbol(),OP_SELL,Lot,Bid,6,stoploss,takeprofit,"My order sell",16384,0,clrRed)<1)
         Print("OrderSend error #",_LastError," Sell SL=",stoploss," Sell TP=",takeprofit);
      }
   }
}

Oh, sì, anche il calcolo del livello SL per le vendite era sbagliato, dovremmo essere più attenti.

 
evillive:

Beh, la logica e la matematica è zoppa, quindi è chiaro che non funzionerà così.

Per esempio, perché dovrebbe esserci un ciclo in questo EA? Voglio dire, è chiaro che dobbiamo calcolare quanti ordini per un dato simbolo e numero magico abbiamo, giusto? Ma quello che vediamo qui è che il ciclo non conta nulla e non può contare perché non ha un "contatore" avvitato in ))))

OrderSelect() restituisce un valore booleano, vero o falso, che non è appropriato per la variabile pos. E il ciclo dovrebbe iniziare meglio dall'ordine più vecchio, cioè in ordine inverso, per evitare di saltare gli ordini.

La variabile Total può essere utile come contatore:

Ho rimosso le cose inutili, aggiunto l'output di errore dopo OrderSend, per il tester su conti non ECN gli ordini già aperti:

Oh sì, anche il calcolo del livello SL per le vendite era sbagliato, bisogna fare più attenzione.

Wow!!! Grazie!!! Questo richiede un po' di riflessione.

Forse c'è un "self-study" sulle nuove regole da qualche parte? Il numero di pagina a 4 cifre è un po' stressante...