Salve,
Questo oscillatore è ottimo, ma ho dei problemi con esso.
La fine della linea del segnale, che è calcolata dall'ultima candela, non viene mostrata, quindi mostra sempre il rosso al momento attuale. Quando resetto l'oscillatore, per un momento mostra valori buoni con la fine della linea del segnale, ma poi torna al rosso (anche se deve mostrare il verde).
Cosa devo fare per eliminare questo problema?
Ho provato a rifare il debug ma non è servito.
Saluti,
InfiniteDesign
Grazie mille per questo grande indicatore.
Ho trovato la versione precedente altrettanto interessante e utile di quella nuova, se non addirittura di più...
Potreste per favore portare il vecchio indicatore anche su mq5? Apprezzerei molto se si potesse fare.
Salute e grazie in anticipo!!!
Salve,
Questo oscillatore è ottimo, ma ho dei problemi con esso.
La fine della linea del segnale, che è calcolata dall'ultima candela, non viene mostrata, quindi mostra sempre il rosso al momento attuale. Quando resetto l'oscillatore, per un momento mostra valori buoni con la fine della linea del segnale, ma poi torna al rosso (anche se deve mostrare il verde).
Cosa devo fare per eliminare questo problema?
Ho provato a rifare il debug ma non è servito.
Saluti,
InfiniteDesign
Ho provato a creare un segnale da questo indicatore, ma non ci sono riuscito...
Qualche aiuto?
//+------------------------------------------------------------------+ //|COG.mqh | //|Bruno Pio | //| http://www.mql5.com //+------------------------------------------------------------------+ #property copyright "Bruno Pio" #property link "http://www.mql5.com" #property version "1.00" #include "..\ExpertSignal.mqh" // CExpertSignal si trova nel file ExpertSignal #property tester_indicator "CenterOfGravity.ex5" // avvio della descrizione della procedura guidata //+------------------------------------------------------------------+ //| Descrizione della classe| //| Titolo=Segnali del centro di gravità| //| Tipo=SegnaleAvanzato| //| Nome=Mio_COG| //| Nome breve=CG| //| Classe=COG| //| Pagina=Non necessario| //| Parametro=Periodo_,int,10,Periodo di mediazione dell'indicatore. //| Parametro=SmoothPeriod,int,3,Periodo di lisciatura della linea del segnale | //| Parametro=MA_Method_,ENUM_MA_METHOD,MODE_EMA,Signal Method | //| Parametro=Prezzo applicato,int,1,Prezzo costante | //+------------------------------------------------------------------+ // descrizione della procedura guidata fine //+------------------------------------------------------------------+ //|| //+------------------------------------------------------------------+ class COG : public CExpertSignal { private: CiCustom m_COG; // L'indicatore come oggetto //--- Parametri configurabili del modulo int m_Period_; // Periodo di mediazione dell'indicatore int m_SmoothPeriod; // Periodo di lisciatura della linea del segnale ENUM_MA_METHOD m_MA_Method_; // Metodo di mediazione della linea del segnale int m_AppliedPrice; // Costante di prezzo public: COG(void); ~COG(void); //--- Verifica della correttezza dei dati in ingresso bool ValidationSettings(); //--- Creazione di indicatori e serie temporali per il modulo dei segnali bool InitIndicators(CIndicators *indicators); //--- Accesso ai dati dell'indicatore double CG(const int index) const { return(m_COG.GetData(0,index)); } double Signal(const int index) const { return(m_COG.GetData(1,index)); } //--- Verifica delle condizioni di acquisto e vendita virtual int LongCondition(); virtual int ShortCondition(); //--- Metodi per impostare void Period_(int value) { m_Period_=value; } void SmoothPeriod(int value) { m_SmoothPeriod=value; } void MA_Method_(ENUM_MA_METHOD value) { m_MA_Method_=value; } void AppliedPrice(int value) { m_AppliedPrice=value; } protected: //--- Creazione dell'indicatore bool CreateCOG(CIndicators *indicators); }; //+------------------------------------------------------------------+ //| Costruttore| //+------------------------------------------------------------------+ COG::COG(void) : m_Period_(10), // Periodo di mediazione dell'indicatore m_SmoothPeriod(3), // Periodo di lisciatura della linea del segnale m_MA_Method_(MODE_EMA), // Metodo di mediazione della linea del segnale m_AppliedPrice(1) // Costante di prezzo { } //+------------------------------------------------------------------+ //|| //+------------------------------------------------------------------+ COG::~COG() { } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| Controlla i parametri di input e restituisce true se tutto è OK | //+------------------------------------------------------------------+ bool COG:: ValidationSettings() { //--- Chiamare il metodo della classe base if(!CExpertSignal::ValidationSettings()) return(false); //--- Controllo dei periodi, numero di barre per il calcolo della MA >=1 if(m_Period_<1) { PrintFormat("Incorrect value set for one of the period! Period_=%d", m_Period_); return false; } //--- Controllo dei periodi, numero di barre per il calcolo della MA >=1 if(m_SmoothPeriod<1) { PrintFormat("Incorrect value set for one of the period! m_SmoothPeriod=%d", m_SmoothPeriod); return false; } //--- Il tipo di lisciatura veloce MA deve essere uno dei quattro valori dell'enumerazione if(m_MA_Method_!=MODE_SMA && m_MA_Method_!=MODE_EMA && m_MA_Method_!=MODE_SMMA && m_MA_Method_!=MODE_LWMA) { PrintFormat("Invalid type of smoothing of the fast MA!"); return false; } //--- m_AppliedPrice deve essere valido if(m_AppliedPrice<1 || m_AppliedPrice>11) { PrintFormat("Invalid type of Price!"); return false; } //--- Tutti i controlli sono stati completati, tutto è ok return true; } //+------------------------------------------------------------------+ //| Crea indicatori| //| Ingresso: un puntatore a una collezione di indicatori | //| Uscita: true se ha successo, altrimenti false | //+------------------------------------------------------------------+ bool COG::InitIndicators(CIndicators *indicators) { //--- Controllo standard della collezione di indicatori per NULL if(indicators==NULL) return(false); //--- Inizializzazione degli indicatori e delle serie temporali nei filtri aggiuntivi if(!CExpertSignal::InitIndicators(indicators)) return(false); //--- Creazione degli indicatori if(!CreateCOG(indicators)) return(false); //--- Raggiunta questa parte, la funzione ha avuto successo, restituire true return(true); } //+------------------------------------------------------------------+ //| Crea l'indicatore "COG| //+------------------------------------------------------------------+ bool COG::CreateCOG(CIndicators *indicators) { //--- Controllo del puntatore if(indicators==NULL) return(false); //--- Aggiunta di un oggetto alla collezione if(!indicators.Add(GetPointer(m_COG))) { printf(__FUNCTION__+": Error adding an object of the COG"); return(false); } //--- Impostazione dei parametri del COG MqlParam parameters[5]; //--- parameters[0].type=TYPE_STRING; parameters[0].string_value="CenterOfGravity.ex5"; parameters[1].type=TYPE_INT; parameters[1].integer_value=m_Period_; // Periodo parameters[2].type=TYPE_INT; parameters[2].integer_value=m_SmoothPeriod; // Periodo di lisciatura della linea del segnale parameters[3].type=TYPE_INT; parameters[3].integer_value=m_MA_Method_; // Metodo di mediazione della linea del segnale parameters[4].type=TYPE_INT; parameters[4].integer_value=m_AppliedPrice; // Costante di prezzo //--- Inizializzazione dell'oggetto if(!m_COG.Create(m_symbol.Name(),0,IND_CUSTOM,5,parameters)) { printf(__FUNCTION__+": Error initializing the object of the COG"); return(false); } //--- Numero di buffer if(!m_COG.NumBuffers(2)) return(false); //--- Raggiunta questa parte, la funzione ha avuto successo, restituire true return(true); } //+------------------------------------------------------------------+ //| Restituisce l'intensità del segnale di acquisto| //+------------------------------------------------------------------+ int COG::LongCondition() { int signal=0; //--- Per operazioni con tick idx=0, per operazioni con barre formate idx=1 int idx=StartIndex(); //--- Valori delle COG all'ultima barra formata double last_fast_value=CG(idx); double last_slow_value=Signal(idx); //--- Valori delle COG nella penultima barra formata double prev_fast_value=CG(idx+1); double prev_slow_value=Signal(idx+1); //---Se CG > Segnale && CG-1 < Segnale-1 if((last_fast_value>last_slow_value) && (prev_fast_value<prev_slow_value)) { signal=100; // C'è un segnale di acquisto } //--- Restituzione del valore del segnale return(signal); } //+------------------------------------------------------------------+ //| Restituisce la forza del segnale di vendita| //+------------------------------------------------------------------+ int COG::ShortCondition() { int signal=0; //--- Per operazioni con tick idx=0, per operazioni con barre formate idx=1 int idx=StartIndex(); //--- Valori delle COG all'ultima barra formata double last_fast_value=CG(idx); double last_slow_value=Signal(idx); //--- Valori delle COG nella penultima barra formata double prev_fast_value=CG(idx+1); double prev_slow_value=Signal(idx+1); //---Se CG < Segnale && CG-1 > Segnale-1 if((last_fast_value<last_slow_value) && (prev_fast_value>prev_slow_value)) { signal=100; // C'è un segnale di vendita } //--- Restituzione del valore del segnale return(signal); }
Ho lo stesso problema...
Questo è un indicatore fantastico (se si considerano anche i trend di più ampio respiro). Vi invio la versione migliorata, in cui la parte finale non è più solo rossa e si aggiorna correttamente sul grafico in tempo reale.
Questa volta un moderatore ha corretto la formattazione. In futuro, formattate correttamente il codice; i post con codice formattato in modo errato potrebbero essere rimossi.
/* * Il file SmoothAlgorithms.mqh deve essere inserito * nella cartella terminal_data_folder\MQL5\Include */ //+------------------------------------------------------------------+ //| Center of Gravity.mq4 | //| Copyright © 2007, MetaQuotes Software Corp. | //| http://www.metaquotes.net | //+------------------------------------------------------------------+ #property copyright "Copyright © 2007, MetaQuotes Software Corp." #property link "http://www.metaquotes.net" //---- versione dell'indicatore #property version "1.00" //---- disegno dell'indicatore in una finestra separata #property indicator_separate_window //---- Per il calcolo e la visualizzazione dell'indicatore vengono utilizzati tre buffer #property indicator_buffers 3 //---- vengono utilizzati due grafici #property indicator_plots 2 //+----------------------------------------------+ //| Parametri di disegno degli indicatori | //+----------------------------------------------+ //---- disegno dell'indicatore 1 come linea tricolore #property indicator_type1 DRAW_COLOR_LINE //---- utilizzato come colori per una linea a tre colori #property indicator_color1 Gray,Lime,Red //---- la linea dell'indicatore 1 è una curva continua #property indicator_style1 STYLE_SOLID //---- lo spessore della linea dell'indicatore 1 è pari a 1 #property indicator_width1 1 //---- visualizzazione dell'etichetta dell'indicatore 1 #property indicator_label1 "Center of Gravity" //+----------------------------------------------+ //| Parametri di disegno degli indicatori | //+----------------------------------------------+ //---- disegnare l'indicatore 2 come una linea #property indicator_type2 DRAW_LINE //---- Il blu è il colore utilizzato per la linea indicatrice #property indicator_color2 Blue //---- la linea dell'indicatore 2 è una curva continua #property indicator_style2 STYLE_SOLID //---- lo spessore della linea dell'indicatore 2 è pari a 1 #property indicator_width2 1 //---- visualizzazione dell'etichetta della linea indicatrice 2 #property indicator_label2 "Signal Line" //---- lo stile della linea è una curva a punti e trattini #property indicator_style2 STYLE_DASHDOTDOT //+-----------------------------------+ //| Parametri di input degli indicatori | //+-----------------------------------+ enum Applied_price_ //Tipo di costante { PRICE_CLOSE_ = 1, //PREZZO_DI_CHIUSURA PRICE_OPEN_, //PREZZO_DI_APERTURA PRICE_HIGH_, //PREZZO_MASSIMO PRICE_LOW_, //PREZZO_MINIMO PRICE_MEDIAN_, //PREZZO MEDIO PRICE_TYPICAL_, //PREZZO_INDICATIVO PRICE_WEIGHTED_, //PREZZO_PONDERATO PRICE_SIMPLE_,//PRICE_SIMPLE_ PRICE_QUARTER_, //PREZZO_TRIMESTRALE_ PRICE_TRENDFOLLOW0_, //PRICE_TRENDFOLLOW0_ PRICE_TRENDFOLLOW1_ //PRICE_TRENDFOLLOW1_ }; input int Period_=10; // Periodo di media dell'indicatore input int SmoothPeriod=3; // Periodo di livellamento della linea di segnale input ENUM_MA_METHOD MA_Method_=MODE_SMA; // Metodo di media delle linee di segnale input Applied_price_ AppliedPrice=PRICE_CLOSE_;// Prezzo costante /* , utilizzato per il calcolo dell'indicatore (1-CHIUSURA, 2-APERTURA, 3-MASSIMO, 4-LOW, 5-MEDIAN, 6-TYPICAL, 7-WEIGHTED, 8-SIMPLE, 9-QUARTER, 10-TRENDFOLLOW, 11-0,5 * TRENDFOLLOW.) */ //+-----------------------------------+ //---- dichiarazione di array dinamici che ulteriormente //---- saranno utilizzati come buffer indicatori double Ext1Buffer[]; double Ext2Buffer[]; double ColorExt2Buffer[]; //---- Dichiarazione delle variabili intere per l'avvio del calcolo dei dati int StartBar; //+------------------------------------------------------------------+ //| Descrizione della funzione iPriceSeries | //| Descrizione della classe Moving_Average | //+------------------------------------------------------------------+ #include <SmoothAlgorithms.mqh> //+------------------------------------------------------------------+ //| Funzione di inizializzazione dell'indicatore personalizzato | //+------------------------------------------------------------------+ void OnInit() { //---- inizializzazione delle costanti StartBar=Period_; //---- imposta l'array dinamico MAMABuffer come buffer degli indicatori SetIndexBuffer(0,Ext1Buffer,INDICATOR_DATA); //---- creazione di un'etichetta da visualizzare nella DataWindow PlotIndexSetString(0,PLOT_LABEL,"Center of Gravity"); //---- spostamento del punto di inizio del tracciamento dell'indicatore PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,StartBar); //---- Trasformazione di un array dinamico in un buffer di indici di colore SetIndexBuffer(1,ColorExt2Buffer,INDICATOR_COLOR_INDEX); //---- spostamento del punto di inizio del tracciamento dell'indicatore PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,StartBar+1); //---- imposta l'array dinamico FAMABuffer come array di indicatori SetIndexBuffer(2,Ext2Buffer,INDICATOR_DATA); //---- creazione di un'etichetta da visualizzare nella DataWindow PlotIndexSetString(2,PLOT_LABEL,"Signal Line"); //---- spostamento del punto di inizio del tracciamento dell'indicatore PlotIndexSetInteger(2,PLOT_DRAW_BEGIN,StartBar+1); //---- inizializzazioni delle variabili per il nome abbreviato dell'indicatore string shortname; StringConcatenate(shortname,"Center of Gravity(",Period_,")"); //---- creazione di un nome da visualizzare in una finestra secondaria separata e in un tooltip IndicatorSetString(INDICATOR_SHORTNAME,shortname); //---- imposta la precisione di visualizzazione dei valori dell'indicatore IndicatorSetInteger(INDICATOR_DIGITS,0); //---- } //+------------------------------------------------------------------+ //| Funzione di iterazione dell'indicatore personalizzato | //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, // numero di barre nella cronologia al tick corrente const int prev_calculated,// numero di barre calcolato alla chiamata precedente const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { //---- verifica che il numero di barre sia sufficiente per il calcolo if(rates_total<StartBar) return(0); //---- Dichiarazione di variabili con valore in virgola mobile double price_,sma,lwma; //---- Dichiarazione delle variabili intere int first1,first2,first3,bar; //---- Inizializzazione dell'indicatore nel blocco OnCalculate() if(prev_calculated>rates_total || prev_calculated<=0)// verifica del primo avvio del calcolo di un indicatore { first1=0; // numero iniziale per il calcolo di tutte le battute del primo ciclo first2=Period_+1; // numero iniziale per il calcolo di tutte le barre delle linee di segnale first3=Period_+SmoothPeriod+3; // numero iniziale per il calcolo di tutte le barre del ciclo di colorazione } else // numero iniziale per il calcolo delle nuove barre { first1=prev_calculated-1; first3=first1; } //---- CORREZIONE (aggiuntiva): il parametro "begin" della chiamata alla funzione jelvonal (Signal Line) della serie MASeries è sempre //---- deve essere la stessa soglia di affidabilità FISSA (Period_+1) – originariamente attiva //---- il ticknĂ©l puntava erroneamente al valore "first1" in continua evoluzione (ovvero all'indice della candela corrente) //---- Impostato in modo che ad ogni tick effettivo corrispondesse la candela elaborata, confondendo il //---- La logica della classe "meddig megbízható az adat" di belső simító - per questo motivo era instabile/difettosa //---- il valore iniziale di una linea di riferimento, e per questo motivo "migliora" solo dopo un cambio di TF (ricalcolo completo). first2=Period_+1; //---- dichiarazione delle variabili della classe Moving_Average static CMoving_Average MA,LWMA,SIGN; //---- Ciclo principale di calcolo della linea centrale del canale for(bar=first1; bar<rates_total; bar++) { //---- Richiama la funzione PriceSeries per ottenere la "serie" di prezzi in ingresso price_=PriceSeries(AppliedPrice,bar,open,low,high,close); sma=MA.MASeries(0,prev_calculated,rates_total,Period_,MODE_SMA,price_,bar,false); lwma=LWMA.MASeries(0,prev_calculated,rates_total,Period_,MODE_LWMA,price_,bar,false); Ext1Buffer[bar]=sma*lwma/_Point; Ext2Buffer[bar]=SIGN.MASeries(first2,prev_calculated,rates_total,SmoothPeriod,MA_Method_,Ext1Buffer[bar],bar,false); } //---- Ciclo principale della colorazione della linea di segnale for(bar=first3; bar<rates_total; bar++) { ColorExt2Buffer[bar]=0; if(Ext1Buffer[bar]<Ext2Buffer[bar]) ColorExt2Buffer[bar]=2; else ColorExt2Buffer[bar]=1; } //---- return(rates_total); } //+------------------------------------------------------------------+
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Accetti la politica del sito e le condizioni d’uso


Centro di gravità di Ehlers - Centro di gravità J. F. Ehlers:
Il Centro di gravità è un oscillatore sviluppato da John Ehlers e pubblicato nel numero di maggio 2002 di Stocks & Commodities.
Author: Nikolay Kositsin