Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 1426

 
vitaliy zamkovoy attuale e lo confrontiamo con una certa costante per la successiva apertura di un ordine, come può essere scritto nell'Expert Advisor?

Guardate questo codice:

//+------------------------------------------------------------------+
//|                                                         Test.mq5 |
//|                                  Copyright 2022, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"

//ВХОДНОЙ ПАРАМЕТР
input ushort Constanta=50; //Константа

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer
   EventSetTimer(20);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   double open_0=iOpen(_Symbol,PERIOD_CURRENT,0);
   if(open_0-SymbolInfoDouble(_Symbol,SYMBOL_BID)>Constanta*_Point)
      Print("Цена прошла вниз расстояние больше чем Константа, поэтому нужно открыть позицию SELL!");
   if(SymbolInfoDouble(_Symbol,SYMBOL_BID)-open_0>Constanta*_Point)
      Print("Цена прошла вверх расстояние больше чем Константа, поэтому нужно открыть позицию BUY!");
   Sleep(20000);
   if(open_0-SymbolInfoDouble(_Symbol,SYMBOL_BID)>Constanta*_Point)
      Print("Цена прошла вниз расстояние больше чем Константа, поэтому нужно открыть позицию SELL!");
   if(SymbolInfoDouble(_Symbol,SYMBOL_BID)-open_0>Constanta*_Point)
      Print("Цена прошла вверх расстояние больше чем Константа, поэтому нужно открыть позицию BUY!");
   Sleep(20000);
   if(open_0-SymbolInfoDouble(_Symbol,SYMBOL_BID)>Constanta*_Point)
      Print("Цена прошла вниз расстояние больше чем Константа, поэтому нужно открыть позицию SELL!");
   if(SymbolInfoDouble(_Symbol,SYMBOL_BID)-open_0>Constanta*_Point)
      Print("Цена прошла вверх расстояние больше чем Константа, поэтому нужно открыть позицию BUY!");
   Sleep(20000);
  }
//+------------------------------------------------------------------+
Saluti, Vladimir.
 
MrBrooklin #:

Guardate questo codice:

Saluti, Vladimir.
Purtroppo i prossimi due giorni non potrò controllarlo, ma ti prego di accettare i miei ringraziamenti!
 
vitaliy zamkovoy #:
Purtroppo non potrò controllarlo per i prossimi due giorni, ma vi prego di accettare i miei ringraziamenti!

Grazie, ma si prega di notare che questo non è un codice pronto, ma solo la direzione del mio pensiero. Potrebbe essere sbagliato. Devi verificarlo. Si può considerare un'altra opzione: rimuovere OnTimer e provare lo stesso codice in OnTick(). In breve, provate.

Saluti, Vladimir.

 
vitaliy zamkovoy attuale e lo confrontate con una certa costante con la successiva apertura di un ordine, come lo registrate?

Registrate il prezzo e l'ora attuali. Confrontate l'ora con quella attuale su ogni tick, se è superiore a 20 secondi ricordate il secondo prezzo. Calcolare la differenza tra il primo e il secondo prezzo. Confrontate il risultato ottenuto con una costante e decidete di aprire un ordine.

 
Valeriy Yastremskiy #:

Ricorda il prezzo e l'ora attuali. Confrontare l'ora con l'ora corrente a ogni tick, se superiore a 20 secondi ricordare il secondo prezzo. Calcolare la differenza tra il primo prezzo e il secondo. Confrontate il risultato ottenuto con una costante e decidete di aprire un ordine.

Ho capito bene: è necessario ricordare il prezzo corrente ogni secondo per confrontarlo con il prezzo corrente quando ogni valore di questa serie viene rimosso per 20 secondi?

Il confronto deve essere continuo.

 
vitaliy zamkovoy #:

Ho capito bene: è necessario ricordare il prezzo corrente ogni secondo, in modo che quando ogni valore di questa serie viene cancellato per 20 secondi, sia possibile confrontarlo con quello corrente?

Il confronto deve essere continuo.

I tick non vanno in modo uniforme, la questione è nell'algoritmo, se è necessario controllare tutti i tick, allora tutti i tick devono essere memorizzati e confrontati. Se è possibile meno spesso secondo l'algoritmo, allora un timer e dopo un secondo ricordare il prezzo e dopo 20 secondi anche ricordare e confrontare. O meglio, si dovrebbero ricordare tutti i prezzi o i prezzi in un secondo entro 20 secondi e confrontarli con un nuovo tick.
Ci può essere 1 tick al secondo, ce ne può essere uno in 5 secondi e ce ne possono essere 100 in un secondo. Dovete decidere come comportarvi quando c'è un tick ogni 5 secondi e quando ci sono 100 tick al secondo.

 
Valeriy Yastremskiy #:

I tick non sono uniformi, il problema è nell'algoritmo, se è necessario controllare tutti i tick, allora tutti i tick devono essere memorizzati e confrontati. Se è possibile essere meno frequenti secondo l'algoritmo, allora un timer e dopo un secondo ricordare il prezzo e dopo 20 secondi anche ricordare e confrontare. O meglio, si dovrebbero ricordare tutti i prezzi o i prezzi in un secondo entro 20 secondi e confrontarli con un nuovo tick.
Può esserci 1 tick al secondo, può essercene uno ogni 5 secondi e possono essercene 100 in un secondo. Dovete decidere come comportarvi quando c'è un tick ogni 5 secondi e quando ci sono 100 tick al secondo.

Non si tratta di scegliere un'opzione, ma della difficoltà per me di scriverla.... Oggi sono qui per la prima volta. Sono un dilettante allo sbaraglio.

Voglio solo provare la mia idea...

 
vitaliy zamkovoy #:

Non si tratta di scegliere un'opzione, ma della difficoltà per me di scriverla..... Questa è la mia prima volta qui oggi. Sono un dilettante allo sbaraglio.

Voglio solo provare la mia idea.

L'algoritmo deve essere preciso e comprendere le condizioni della sua applicazione. Non si può scrivere codice in altro modo. Il codice è la realizzazione di un algoritmo di azioni, non può essere impreciso.

E qui è meglio scriverlo prima da soli, e forse si correggeranno gli errori.

Capite i segni di uguale, più è meno.

 

Buffer ad anello:

Prendiamo un buffer - un array statico abbastanza grande di strutture "prezzo, tempo" (o due array separati).

Prendiamo due variabili - "puntatori" (indici) alla testa e alla coda del buffer.

A ogni tick aggiungiamo un elemento alla testa e facciamo avanzare il puntatore.

Confrontiamo l'ora con l'elemento in coda, se necessario spostiamo il puntatore.

Confrontiamo il prezzo con l'elemento nella coda.

Se un puntatore ha raggiunto la fine dell'array, lo azzeriamo.

 
JRandomTrader array statico abbastanza grande di strutture "prezzo, tempo" (o due array separati).

Prendiamo due variabili - "puntatori" (indici) alla testa e alla coda del buffer.

A ogni tick aggiungiamo un elemento alla testa e spostiamo il puntatore.

Confrontiamo il tempo con l'elemento in coda e, se necessario, spostiamo il puntatore.

Confrontiamo il prezzo con l'elemento in coda.

Se un puntatore ha raggiunto la fine dell'array, azzeratelo.

👍
Motivazione: