Domande da un "manichino" - pagina 6

 
pusheax:

Alcuni DC nei conti reali assegnano ogni sorta di prefissi come "." o "FXF" ai nomi dei simboli.

Come posso usare questi prefissi?

L'ho fatto:

#define DEF_SPEC "FXF"

stringa SymbolsTrade[] = {"AUDCAD "DEF_SPEC ... -non funziona

stringa SymbolsTrade[] = {"AUDCAD "+DEF_SPEC ... -non funziona nemmeno così

tutto quello che ottengo è FXF invece del richiesto AUDCADFXF.

Potresti dirmi come implementare questo?


In primo luogo, il riempimento di un array con enumerazione è possibile solo nell'ambito globale, quindi nessun + funzionerà lì, solo le costanti di stringa.

In secondo luogo, avete un array statico che non è distribuito, mentre un array dinamico non può essere riempito con un enum.

Il modo più semplice è scrivere una funzione che distribuisce e riempie un array dinamico, può fare tutto, aggiungere definizioni alle costanti, ecc.

 
Urain:

In primo luogo, riempire un array con un'enumerazione è possibile solo nell'ambito globale, quindi nessun + funzionerà lì, solo le costanti di stringa.

In secondo luogo, non avete distribuito l'array statico, e l'array dinamico non può essere riempito dall'enumerazione.

Il modo più semplice è scrivere una funzione che distribuisca e riempia l'array dinamico, può fare tutto, aggiungere definizioni con costanti, ecc.

Puoi anche provare a cercare tutte le coppie di valute esistenti in BC/BROKER e analizzare le valute composte in esse.

Dopo di che è possibile creare un array dinamico di coppie di valute tenendo conto dell'aggiunta di eventuali prefissi.

Per quanto mi ricordo è una delle opzioni universali per MT5.

 
Urain:

In primo luogo, riempire un array con un'enumerazione è possibile solo nell'ambito globale, quindi nessun + funzionerà lì, solo le costanti di stringa.

In secondo luogo, non avete distribuito l'array statico, e l'array dinamico non può essere riempito dall'enumerazione.

Il modo più semplice è scrivere una funzione che distribuisca e riempia l'array dinamico, può fare tutto, aggiungere definizioni alle costanti, ecc.

In breve, se ho capito bene, non si può creare un array statico di stringhe di costanti composte nell'ambito globale, giusto?

 
uncleVic:

Potete vedere il codice nel codice sorgente. Si usano due metodi per trovare la divergenza:

1. Il metodo bool CSignalMACD::ExtState(int ind) prepara i dati per la ricerca;

2. Il metodo bool CSignalMACD::CompareMaps(int map,int count,bool minimax,int start) cerca un modello di mercato con i parametri specificati.

Se aiuta, ecco i commenti ai metodi in russo:

Per il metodo bool CSignalMACD::ExtState(int ind)

Per il metodo bool CSignalMACD::CompareMaps(int map,int count,bool minimax,int start)

Ho anche una domanda - come specificare la variante di divergenza quando si crea un Expert Advisor usando il segnale MACD? Ci sono diverse versioni del segnale nel libro di riferimento.
 
strelec:
Ho anche una domanda, come specificare la variante di divergenza quando si crea un Expert Advisor usando il segnale MACD? Ci sono diverse varianti di segnali nel manuale.

Come tutti hanno già notato, qualsiasi segnale può rilevare più modelli di mercato. Per controllare l'uso dei modelli , chiamate il metodo PatternsUsage(int value), dove value è la mappa di bit dell'uso del modello (il numero di bit e il numero del modello sono gli stessi). Il bit è 1 - il modello è usato, il bit è 0 - il modello non è usato (per default tutti i bit sono 1). La numerazione dei modelli e dei bit inizia da 0.

Così, se volete usare solo la divergenza, dovreste usare PatternsUsage(16);. Perché 16? 16 è binario 10000b (cioè il bit 4 è 1, tutti gli altri bit sono 0). E solo il modello 4 "divergenza dell'oscillatore e del prezzo".

L'unico "ma" è che dovrete farlo "manualmente".

Dopo il completamento della procedura guidata, il codice sorgente verrà aperto nell'editor. Trova un posto come questo nell'editor:

//--- Creating filter CSignalMACD
   CSignalMACD *filter0=new CSignalMACD;
   if(filter0==NULL)
     {
      //--- failed
      printf(__FUNCTION__+": error creating filter0");
      ExtExpert.Deinit();
      return(-3);
     }
   signal.AddFilter(filter0);
//--- Set filter parameters
   filter0.PeriodFast(Signal_MACD_PeriodFast);
   filter0.PeriodSlow(Signal_MACD_PeriodSlow);
   filter0.PeriodSignal(Signal_MACD_PeriodSignal);
   filter0.Applied(Signal_MACD_Applied);
   filter0.Weight(Signal_MACD_Weight);

e aggiungere una linea

filter0.PatternsUsage(16);

l'avrai:

//--- Creating filter CSignalMACD
   CSignalMACD *filter0=new CSignalMACD;
   if(filter0==NULL)
     {
      //--- failed
      printf(__FUNCTION__+": error creating filter0");
      ExtExpert.Deinit();
      return(-3);
     }
   signal.AddFilter(filter0);
//--- Set filter parameters
   filter0.PatternsUsage(16);
   filter0.PeriodFast(Signal_MACD_PeriodFast);
   filter0.PeriodSlow(Signal_MACD_PeriodSlow);
   filter0.PeriodSignal(Signal_MACD_PeriodSignal);
   filter0.Applied(Signal_MACD_Applied);
   filter0.Weight(Signal_MACD_Weight);

Questo è tutto per ora. Se avete domande, non esitate a contattarmi.

 
uncleVic:

Come tutti hanno già notato, qualsiasi segnale può rilevare più modelli di mercato. Per controllare l'uso dei pattern , chiamate il metodo PatternsUsage(int value), dove value è la mappa di bit dell'uso dei pattern (il numero di bit e il numero di pattern sono uguali). Il bit è 1 - il modello è usato, il bit è 0 - il modello non è usato (per default tutti i bit sono 1). La numerazione dei modelli e i bit partono da 0.

Quindi, se volete usare solo la divergenza, dovete usare PatternsUsage(16);. Perché 16? 16 è 10000b in binario (cioè il bit 4 è 1, gli altri bit sono 0). E solo il modello 4 "divergenza dell'oscillatore e del prezzo".

L'unico "ma" è che dovrete farlo "manualmente".

Dopo il completamento della procedura guidata, il codice sorgente verrà aperto nell'editor. Trova un posto come questo nell'editor:

e aggiungere una linea

filter0.PatternsUsage(16);

lo capisci:

Questo è tutto per ora. Se avete domande, non esitate a contattarmi.

Grazie. Capito. E ci sono subito altre domande. In questa variante di divergenza, quale intervallo di tempo tra i picchi vicini (troughs) viene preso in considerazione?
 
strelec:
Grazie. Ha funzionato. E ci sono subito altre domande. In questa variante di divergenza, quale intervallo di tempo tra i top vicini (troughs) viene preso in considerazione?
L'intervallo non viene analizzato.
 

Ho un esperto con cui cerco di affrontare gli eventi.

string event[10]=
{
"CHARTEVENT_KEYDOWN - событие нажатия клавиатуры, когда окно графика находится в фокусе",
"CHARTEVENT_OBJECT_CREATE — событие создания графического объекта",
"CHARTEVENT_OBJECT_CHANGE — событие изменения свойств объекта через диалог свойств",
"CHARTEVENT_OBJECT_DELETE — событие удаления графического объекта",
"CHARTEVENT_CLICK — cобытие щелчка мыши графике",
"CHARTEVENT_OBJECT_CLICK — событие щелчка мыши на графическом объекте, принадлежащего графику",
"CHARTEVENT_OBJECT_DRAG — событие перемещения графического объекта при помощи мыши",
"CHARTEVENT_OBJECT_ENDEDIT — событие окончания редактирования текста в поле ввода графического объекта LabelEdit",
"CHARTEVENT_CHART_CHANGE  — событие изменения графика",
"CHARTEVENT_CUSTOM+n — идентификатор пользовательского события, где n находится в диапазоне от 0 до 65535"
};
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
   Print("id=(",id,") -- ",event[id],"  lparam=",lparam,"   dparam=",dparam,"   sparam=", sparam);
  }
//+------------------------------------------------------------------+

Ricevo eventi che non corrispondono ad azioni.

Esattamente corrispondente a un clic sul grafico e a un clic di un pulsante

Un evento controverso id=9(CHARTEVENT_CUSTOM), che viene generato quando per esempio il grafico viene spostato e ci sono circa 10 eventi simili.

L'eventoCHARTEVENT_OBJECT_ENDEDIT non è stato controllato.

Tutto il resto non è chiaro. O la descrizione non corrisponde al numero dell'evento o l'evento di creazione di un oggetto è generato in modo errato quando si crea un oggetto manualmente.

In generale, per favore aiutatemi.

 
kPVT:

Ho un esperto con cui cerco di affrontare gli eventi.

Ricevo eventi che non corrispondono ad azioni.

Esattamente corrispondente a un clic sul grafico e a un clic di un pulsante

Un evento controverso id=9(CHARTEVENT_CUSTOM), che viene generato quando per esempio il grafico viene spostato e ci sono circa 10 eventi simili.

L'eventoCHARTEVENT_OBJECT_ENDEDIT non è stato controllato.

Non è tutto chiaro con tutto il resto. O la descrizione non corrisponde al numero dell'evento o l'evento di creazione di un oggetto è generato in modo errato quando si crea l'oggetto manualmente.

Tutto sommato, per favore aiutatemi.

Si assegnano inizialmente delle corrispondenze numeriche alle costanti numeriche già assegnate CHARTEVENT_XXXXXXXX...

il problema è questo:

event[id]

è necessario:

//--- нажатие мышкой на графическом объекте
   if(id==CHARTEVENT_OBJECT_CLICK)
     {
      Print("Нажатие кнопки мышки на объекте с именем '"+sparam+"'");
     }
//--- нажатие кнопки на клавиатуре
   if(id==CHARTEVENT_KEYDOWN)
     {
 
kPVT:

Gli altri non sono chiari. O la descrizione non corrisponde al numero dell'evento, o l'evento della creazione di un oggetto, per esempio, non viene generato correttamente quando l'oggetto viene creato manualmente.

Purtroppo la sua domanda non è chiara. Cosa sta andando esattamente storto?