[ARCHIVIO]Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Non posso andare da nessuna parte senza di te - 5. - pagina 333

 
Ciao cari programmatori!

C'è bisogno della seguente analisi - il programma dovrebbe analizzare i parametri che gli vengono dati e produrre il risultato in una finestra separata sotto forma di una tabella con una serie di date. Significa che il programma dovrebbe analizzare la storia e visualizzare le date necessarie.

È possibile fare questo in MQL4 o è meglio esportare la cronologia e analizzare i dati usando un programma scritto in un altro linguaggio?

Grazie in anticipo!
 
GygaByte:


Corretto, ma come la pratica ha dimostrato - non sempre.

Se la quinta cifra decimale = 5 (1,xxxx5), il valore è ancora distorto:

la domanda è ancora valida...

P.S. In generale, ho bisogno di assegnare un valore di prezzo a MagicNumber... E digitate MagicNumber - int, qui e provate a convertire con

Chi altro può darmi consigli?

Grazie.

Stai emettendo con arrotondamenti diversi - quindi non vedi il numero completo - e pensi che qualcosa sia distorto. Per impostazione predefinita, quando si emettono numeri reali, l'output è arrotondato alla quarta cifra. Per i numeri a 5 cifre, è necessario arrotondare esplicitamente l'output:

Alert ("bid= ",bid," bid_minus= ",DoubleToStr(bid_minus,Digits)," bid_plus= ",DoubleToStr(bid_plus,Digits), " Bid = ",DoubleToStr(Bid,Digits));

Guardate la vostra immagine - offerta di output senza DoubleToStr() e con DoubleToStr().

 
hoz:

Artyom e Boris, grazie per aver "masticato" la mia domanda. Ho dei periodi in cui posso bloccarmi su cose abbastanza semplici, come è successo questa volta...

Ora c'è una nuova domanda.

Ho aggiunto alla funzione che calcola la quantità di ordini aperti t, cerca gli ordini di un tipo specificato con profitti specificati e confronta i loro profitti con qualche valore specificato (attualmente 0). Inoltre, se non ci sono ordini aperti, vengono restituite 2 bandiere con valore True con i parametri della funzione FindOrders(), significa che è possibile inviare un ordine, ma se ci sono ordini, il profitto viene controllato per assicurarsi che sia superiore al valore impostato, se è inferiore al valore impostato, vengono restituite 2 bandiere con valore False con i parametri della funzione FindOrders(), quindi quando ci sono ordini perdenti in qualche direzione, non ci saranno investimenti nella direzione perdente.

Dopo di che chiamo la funzione FindOrders() nella funzione segnale:

Gli ordini si sono aperti del tutto. La logica sembra essere corretta. Forse, potete vedere dove ho sbagliato?

Capisco che tutto può essere fatto più facilmente con una funzione separata e posso farlo. Ma voglio capire perché non funziona in questa versione.

Victor, non posso comprendere appieno il tuo algoritmo, ma posso darti qualche consiglio! Questo mi succede anche quando c'è un errore nella logica. Il programma va in stallo se le vostre condizioni risultano ambigue o si escludono a vicenda. Forse sai cosa vuoi, ma non riesci a costruire correttamente la logica del codice. Cercate questi intoppi, e scrivete tutto l'ordine in cui volete che le condizioni siano eseguite, una per una su un pezzo di carta con delle frecce per chiarezza! Buona fortuna!
 
borilunad:
Victor, non posso comprendere appieno il tuo algoritmo, ma posso darti qualche consiglio! Questo mi succede anche quando c'è un errore nella logica. Il programma va in stallo se le vostre condizioni risultano ambigue o si escludono a vicenda. Forse sai cosa vuoi, ma non riesci a costruire correttamente la logica del codice. Cercate questi intoppi, e scrivete tutto l'ordine in cui volete che le condizioni siano eseguite, una per una su un pezzo di carta con delle frecce per chiarezza! Buona fortuna!


Quindi c'è una logica semplice. Se non ci sono ordini aperti, gli ordini saranno aperti dal segnale.

E se ci sono ordini aperti, allora gli ordini dovrebbero essere aperti da un segnale specifico, se il profitto degli ordini in una determinata direzione (acquisto o vendita) è superiore a un certo valore, cioè almeno non in meno. (Ho impostato 0 lì per i test).

Ho trovato un errore logico. Ecco cosa è venuto fuori:

//+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров                                                                 |
//+-------------------------------------------------------------------------------------+
int FindOrders(bool& long, bool& short)
{
   int t, total = OrdersTotal() - 1;
   
   for (int i=total; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
          if (OrderSymbol() != Symbol()) continue;
              if (OrderMagicNumber() != i_magic) continue;
              {
                 if (OrderType() == OP_BUY)        // Найден ордер типа OP_BUY
                 {
                     if (OrderProfit() < 0)        // Если профит ордера ниже заданного значения,..
                         long = false;              // .. покупка запрещена
                 }

                 if (OrderType() == OP_SELL)       // Найден ордер типа OP_SELL
                 {
                     if (OrderProfit() < 0)        // Если профит ордера ниже заданного значения,..
                         short = false;             // .. продажа запрещена
                 }
                 t++;
              }
   }
   
   return (t);
}

//+-------------------------------------------------------------------------------------+
//| Получаем общий торговый сигнал                                                      |
//+-------------------------------------------------------------------------------------+
int GetGeneralSignal()
{
   bool short = true,
        long = true;
        
   if (FindOrders(short, long) > 3)
       return (-1);

   if (GetRSI(1) < i_RSIToUpLimit)
      if (GetRSI(0) > i_RSIToUpLimit)
      {
         if (long == true)
             return (SIGNAL_BUY);
      }

   if (GetRSI(1) > i_RSIToDnLimit)
      if (GetRSI(0) < i_RSIToDnLimit)
      {
         if (short == true)
             return (SIGNAL_SELL);
      }
            
   return (-1);
}

Ora gli ordini di vendita si aprono correttamente sul sit, ma i long non si aprono affatto. Anche se la bandiera ha il valore di entrambe le variabili 1 cioè vero.

 

Ho questo problema con mt4.

Con il lancio del software del broker mt4 (cioè il 3 che sto usando da una settimana) sul mio computer ottengo una finestra "Esegui come utente" sul mio computer (lo stesso che usa "esegui come utente"). Con qualsiasi selezione di azioni mt4 si apre normalmente.

Come posso far tornare mt4.eh a funzionare senza questa finestra? Forse chi sa o capisce cosa c'è di sbagliato...

 

Buon pomeriggio, ho incontrato la necessità di annullare rapidamente tutti gli ordini in sospeso. OrderClose ignora gli ordini in sospeso. Quale operatore è più comodo da usare, ed è disponibile questa opzione?

 
Notter:

Buon pomeriggio, ho incontrato la necessità di annullare rapidamente tutti gli ordini in sospeso. OrderClose ignora gli ordini in sospeso. Quale operatore è più comodo da usare, ed è disponibile questa opzione?


Puoi chiudere solo gli ordini a mercato e hai bisogno dell'operatore OrderDelete per cancellare gli ordini in sospeso.
 

hoz

Grazie!

 
hoz:


Quindi, tutto è semplice nella sua logica. Abbiamo bisogno che se non ci sono ordini aperti, gli ordini saranno aperti dal segnale.

E se ci sono ordini aperti, allora gli ordini dovrebbero essere aperti da un segnale specifico, se il profitto degli ordini in una determinata direzione (acquisto o vendita) è superiore a un certo valore, cioè almeno non in meno. (Ho impostato 0 lì per i test).

Ho trovato un errore logico. Ecco cosa è venuto fuori:

Ora gli ordini di vendita si aprono correttamente sul sit, ma i long non si aprono affatto. Anche se la bandiera ha il valore di entrambe le variabili 1, cioè vero.

Victor, fai qualche controllo! Commentando il long-buy, guardate nel log per vedere come funziona lo short-sell! E viceversa, poi vedere qual è la differenza e scoprire perché non funziona!
 
borilunad:
Victor, controlliamo! Commentando il lato lungo, controllate come funziona il lato corto nel registro! E viceversa, poi vedi qual è la differenza e scopri perché non funziona!


Boris, se si commenta una delle condizioni in int GetGeneralSignal(), l'apertura è chiara.

L'ho rintracciato. Il flag non cambia il suo valore quando la redditività degli ordini attualmente aperti è in deficit. Ecco la funzione riscritta che dovrebbe impostare i valori dei flags short e long a false, cioè proibirci di aprire una posizione se ci sono ordini in meno:

//+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров                                                                 |
//+-------------------------------------------------------------------------------------+
int FindOrders(bool& long, bool& short)
{
   int t, total = OrdersTotal() - 1;
   double profitL,               // Профит лонговой позиции
          profitS;               // Профит шортовой позиции
   
   for (int i=total; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
          if (OrderSymbol() != Symbol()) continue;
              if (OrderMagicNumber() != i_magic) continue;
              {
                 if (OrderType() == OP_BUY)        // Найден ордер типа OP_BUY
                 {
                     Print("if (OrderType() == OP_BUY)");
                     profitL = OrderProfit();
                     if (profitL < OrderProfit())
                         if (profitL < 0)
                         long = false;
                 }

                 if (OrderType() == OP_SELL)       // Найден ордер типа OP_SELL
                 {
                     Print("if (OrderType() == OP_SELL)");
                     profitS = OrderProfit();
                     if (profitS < OrderProfit())
                         if (profitS < 0)
                         long = false;
                 }
                 t++;
              }
   }
   
   return (t);
}

Ecco la funzione chiamante:

//+-------------------------------------------------------------------------------------+
//| Получаем общий торговый сигнал                                                      |
//+-------------------------------------------------------------------------------------+
int GetGeneralSignal()
{
   bool short = true,
        long = true;
        
   if (FindOrders(short, long) > 15)
       return (SIGNAL_NO);

   Print("long = ", long);
   Print("short = ", short);
      
   if (GetRSI(1) < i_RSIToUpLimit)
      if (GetRSI(0) > i_RSIToUpLimit)
      {
         if (long == true)
             return (SIGNAL_BUY);
      }
           
   if (GetRSI(1) > i_RSIToDnLimit)
      if (GetRSI(0) < i_RSIToDnLimit)
      {
         if (short == true)
             return (SIGNAL_SELL);
      }
            
   return (SIGNAL_NO);
}
Motivazione: